Index: oscarstatusmanager.cpp
===================================================================
--- oscarstatusmanager.cpp	(revision 778707)
+++ oscarstatusmanager.cpp	(working copy)
@@ -37,6 +37,7 @@
 	QList<Oscar::PresenceOverlay> presenceOverlayList;
 
 	Oscar::Presence::Flags mask;
+	QHash<int, int> moodXtrazHash;
 };
 
 OscarStatusManager::OscarStatusManager( OscarProtocol* protocol )
@@ -44,6 +45,15 @@
 {
 	d->protocol = protocol;
 	d->mask = ~(Oscar::Presence::Flags)Oscar::Presence::None;
+
+	d->moodXtrazHash[0] = 17;
+	d->moodXtrazHash[17] = 18;
+	d->moodXtrazHash[18] = 19;
+	d->moodXtrazHash[19] = 20;
+	d->moodXtrazHash[20] = 21;
+	d->moodXtrazHash[21] = 22;
+	d->moodXtrazHash[22] = 23;
+	d->moodXtrazHash[23] = 0;
 }
 
 OscarStatusManager::~OscarStatusManager()
@@ -103,7 +113,7 @@
 {
 	Oscar::Presence pres( presence.internalStatus() & d->mask );
 	
-	if ( (pres.flags() & Oscar::Presence::XStatus) == Oscar::Presence::XStatus )
+	if ( (pres.flags() & Oscar::Presence::XStatus) || (pres.flags() & Oscar::Presence::ExtStatus2) )
 	{
 		kDebug() << "Creating Kopete::OnlineStatus for XStatus, internal status: " << pres.internalStatus();
 		// XStatus, we have to create new KOS
@@ -111,11 +121,17 @@
 		const Oscar::PresenceType &type = pscTypeForType( pres.type() );
 
 		QString desc = kosDescription( pres );
-		QString xtrazIcon = QString( "icq_xstatus%1" ).arg( pres.xtrazStatus() );
+		QStringList icons;
+
+		if ( pres.flags() & Oscar::Presence::XStatus )
+			icons << QString( "icq_xstatus%1" ).arg( pres.iconId() );
+		else
+			icons << QString( "icq_xstatus%1" ).arg( d->moodXtrazHash.value( pres.iconId(), pres.iconId() ) );
+
 		return Kopete::OnlineStatus( type.onlineStatusType(), 0, d->protocol, pres.internalStatus(),
-		                             QStringList( xtrazIcon ) + overlay.icons(), desc );
+		                             icons + overlay.icons(), desc );
 	}
-	else if ( (pres.flags() & Oscar::Presence::ExtStatus) == Oscar::Presence::ExtStatus )
+	else if ( pres.flags() & Oscar::Presence::ExtStatus )
 	{
 		kDebug() << "Creating Kopete::OnlineStatus for ExtStatus, internal status: " << pres.internalStatus();
 		// ExtStatus, we have to create new KOS
@@ -194,6 +210,14 @@
 	return Presence( type, flags );
 }
 
+int OscarStatusManager::moodIconOf( int xtraz ) const
+{
+	if ( -1 < xtraz && xtraz <= 23 )
+		return d->moodXtrazHash.key( xtraz, xtraz );
+	else
+		return -1;
+}
+
 unsigned long OscarStatusManager::basicOscarStatus( Oscar::Presence::Type type ) const
 {
 	const Oscar::PresenceType &data = pscTypeForType( type );
Index: liboscar/tasks/senddcinfotask.h
===================================================================
--- liboscar/tasks/senddcinfotask.h	(revision 778707)
+++ liboscar/tasks/senddcinfotask.h	(working copy)
@@ -30,10 +30,16 @@
 public:
 	SendDCInfoTask( Task* parent, Oscar::DWORD status );
 	~SendDCInfoTask();
+
+	void setIcqMoodIcon( int moodIcon );
+
 	virtual void onGo();
-	
+
 private:
 	Oscar::DWORD mStatus;
+
+	bool mSendMood;
+	int mMoodIcon;
 };
 
 #endif
Index: liboscar/tasks/senddcinfotask.cpp
===================================================================
--- liboscar/tasks/senddcinfotask.cpp	(revision 778707)
+++ liboscar/tasks/senddcinfotask.cpp	(working copy)
@@ -27,6 +27,8 @@
 
 SendDCInfoTask::SendDCInfoTask(Task* parent, Oscar::DWORD status): Task(parent), mStatus(status)
 {
+	mSendMood = false;
+	mMoodIcon = -1;
 }
 
 
@@ -34,6 +36,11 @@
 {
 }
 
+void SendDCInfoTask::setIcqMoodIcon( int moodIcon )
+{
+	mMoodIcon = moodIcon;
+	mSendMood = true;
+}
 
 void SendDCInfoTask::onGo()
 {
@@ -94,10 +101,18 @@
 
 	buffer->addTLV16( 0x0008, 0x0A06 ); // we support online status messages
 
+	if ( mSendMood )
+	{
+		QString moodIcon = QString( "icqmood%1" ).arg( mMoodIcon );
+
+		Buffer tlv1D;
+		tlv1D.addTLV( 0x000E, moodIcon.toLatin1() );
+		buffer->addTLV( 0x001D, tlv1D.buffer() );
+	}
+
 	Transfer* t = createTransfer( f, s, buffer );
 	send( t );
 	setSuccess( 0, QString() );
 }
 
-
 // kate: tab-width 4; indent-mode csands;
Index: liboscar/client.cpp
===================================================================
--- liboscar/client.cpp	(revision 778707)
+++ liboscar/client.cpp	(working copy)
@@ -138,6 +138,7 @@
 		Oscar::DWORD status;
 		QString message;     // for away-,DND-message etc., and for Xtraz status
 		int xtraz;           // Xtraz status
+		int moodIcon;
 		QString description; // Xtraz description
 		bool sent;
 	} status;
@@ -171,6 +172,7 @@
     d->currentRedirect = 0;
 	d->status.status = 0x0; // default to online
 	d->status.xtraz = -1; // default to no Xtraz
+	d->status.moodIcon = -1;
 	d->status.sent = false;
 	d->ssiManager = new ContactManager( this );
 	d->settings = new Oscar::Settings();
@@ -251,6 +253,7 @@
 	{
 		d->status.status = 0x0;
 		d->status.xtraz = -1;
+		d->status.moodIcon = -1;
 		d->status.sent = false;
 		d->status.message.clear();
 		d->status.description.clear();
@@ -263,16 +266,18 @@
     d->ssiManager->clear();
 }
 
-void Client::setStatus( Oscar::DWORD status, const QString &message, int xtraz, const QString &description )
+void Client::setStatus( Oscar::DWORD status, const QString &message, int xtraz, const QString &description, int moodIcon )
 {
 	kDebug(OSCAR_RAW_DEBUG) << "Setting status message to "<< message;
 
 	// remember the values to reply with, when requested
 	bool xtrazChanged = (xtraz > -1 || d->status.xtraz != xtraz);
+	bool moodChanged = (moodIcon > -1 || d->status.moodIcon != moodIcon);
 	bool statusInfoChanged = ( !d->status.sent || message != d->status.message || description != d->status.description );
 	d->status.status = status;
 	d->status.message = message;
 	d->status.xtraz = xtraz;
+	d->status.moodIcon = moodIcon;
 	d->status.description = description;
 	d->status.sent = false;
 
@@ -304,6 +309,9 @@
 			return;
 
 		SendDCInfoTask* sdcit = new SendDCInfoTask( c->rootTask(), status );
+		if ( d->isIcq && moodChanged )
+			sdcit->setIcqMoodIcon( moodIcon );
+
 		sdcit->go( Task::AutoDelete ); //autodelete
 
 		QString msg;
@@ -449,7 +457,7 @@
 {
 	d->active = true;
 
-	setStatus( d->status.status, d->status.message, d->status.xtraz, d->status.description );
+	setStatus( d->status.status, d->status.message, d->status.xtraz, d->status.description, d->status.moodIcon );
 	d->ownStatusTask->go();
 
 	if ( isIcq() )
@@ -531,6 +539,11 @@
 	return d->status.xtraz;
 }
 
+int Client::moodIcon() const
+{
+	return d->status.moodIcon;
+}
+
 QString Client::statusDescription() const
 {
 	return d->status.description;
Index: liboscar/userdetails.cpp
===================================================================
--- liboscar/userdetails.cpp	(revision 778707)
+++ liboscar/userdetails.cpp	(working copy)
@@ -32,11 +32,23 @@
 UserDetails::UserDetails()
 {
     m_capabilities.resize(CAP_LAST);
+	clear();
+}
+
+
+UserDetails::~UserDetails()
+{
+}
+
+void UserDetails::clear()
+{
+	m_capabilities.fill( false );
 	m_warningLevel = 0;
 	m_userClass = 0;
 	m_idleTime = 0;
 	m_extendedStatus = 0;
 	m_xtrazStatus = -1;
+	m_statusMood = -1;
 	m_dcPort = 0;
 	m_dcType = 0;
 	m_dcProtoVersion = 0;
@@ -55,17 +67,13 @@
 	m_idleTimeSpecified = false;
 	m_extendedStatusSpecified = false;
 	m_xtrazStatusSpecified = false;
+	m_statusMoodSpecified = false;
 	m_capabilitiesSpecified = false;
 	m_dcOutsideSpecified = false;
 	m_dcInsideSpecified = false;
 	m_iconSpecified = false;
 }
 
-
-UserDetails::~UserDetails()
-{
-}
-
 int UserDetails::warningLevel() const
 {
 	return m_warningLevel;
@@ -126,6 +134,11 @@
 	return m_xtrazStatus;
 }
 
+int UserDetails::statusMood() const
+{
+	return m_statusMood;
+}
+
 Oscar::WORD UserDetails::iconType() const
 {
 	return m_iconType;
@@ -390,6 +403,17 @@
 						else
 							kDebug(OSCAR_RAW_DEBUG) << "not enough bytes for available message";
 						break;
+					case 0x000E:
+						if ( length > 0 )
+						{
+							QString mood( b.getBlock( length ) );
+							m_statusMood = mood.mid( 7 ).toInt();
+						}
+						m_statusMoodSpecified = true;
+#ifdef OSCAR_USERINFO_DEBUG
+						kDebug(OSCAR_RAW_DEBUG) << "status mood:" << m_statusMood;
+#endif
+						break;
 					default:
 						b.skipBytes( length );
 						break;
@@ -784,6 +808,11 @@
 		m_xtrazStatus = ud.m_xtrazStatus;
 		m_xtrazStatusSpecified = true;
 	}
+	if ( ud.m_statusMoodSpecified )
+	{
+		m_statusMood = ud.m_statusMood;
+		m_statusMoodSpecified = true;
+	}
 	if ( ud.m_capabilitiesSpecified )
 	{
 		m_capabilities = ud.m_capabilities;
Index: liboscar/client.h
===================================================================
--- liboscar/client.h	(revision 778707)
+++ liboscar/client.h	(working copy)
@@ -129,11 +129,12 @@
 	 * \param message the status message or Xtraz status message
 	 * \param xtraz the Xtraz status
 	 * \param description the Xtraz status description
-	 * @note If you want XStatus you have to set status, message, xtraz and description,
-	 * for ExtStatus (ICQ6 status) you have to set status, message and description, xtraz have to be -1.
+	 * @note If you want XStatus you should set status, message, xtraz and description,
+	 * for ExtStatus (ICQ6 status) you should set status, message and description, xtraz have to be -1.
+	 * For ExtStatus2 (ICQ6 status with icons)
 	 * If you want normal status than you should set only status and message.
 	 */
-	void setStatus( Oscar::DWORD status, const QString &message = QString(), int xtraz = -1, const QString &description = QString() );
+	void setStatus( Oscar::DWORD status, const QString &message = QString(), int xtraz = -1, const QString &description = QString(), int moodIcon = -1 );
 
 	/** Retrieve our user info */
 	UserDetails ourInfo() const;
@@ -427,10 +428,13 @@
 
 	/** The current Xtraz status */
 	int statusXtraz() const;
-	
+
+	/** The current mood icon */
+	int moodIcon() const;
+
 	/** The current Xtraz status description */
 	QString statusDescription() const;
-	
+
 	/** The current status message (a.k.a. away message or Xtraz message) */
 	QString statusMessage() const;
 
Index: liboscar/userdetails.h
===================================================================
--- liboscar/userdetails.h	(revision 778707)
+++ liboscar/userdetails.h	(working copy)
@@ -35,6 +35,8 @@
 public:
 	UserDetails();
 	~UserDetails();
+
+	void clear();
 	
 	QString userId() const; //! User ID accessor
 	int warningLevel() const; //! Warning level accessor
@@ -48,6 +50,7 @@
 	int userClass() const; //! User class accessor
 	Oscar::DWORD extendedStatus() const; //!User status accessor
 	int xtrazStatus() const;
+	int statusMood() const;
 	Oscar::WORD iconType() const; //!Buddy icon type
 	Oscar::BYTE iconCheckSumType() const; //!Buddy icon hash type
 	QByteArray buddyIconHash() const; //! Buddy icon md5 hash accessor
@@ -74,6 +77,7 @@
 	bool idleTimeSpecified() const { return m_idleTimeSpecified; }
 	bool extendedStatusSpecified() const { return m_extendedStatusSpecified; }
 	bool xtrazStatusSpecified() const { return m_xtrazStatusSpecified; }
+	bool statusMoodSpecified() const { return m_statusMoodSpecified; }
 	bool capabilitiesSpecified() const { return m_capabilitiesSpecified; }
 	bool dcOutsideSpecified() const { return m_dcOutsideSpecified; }
 	bool dcInsideSpecified() const { return m_dcInsideSpecified; }
@@ -108,6 +112,7 @@
 	Oscar::WORD m_idleTime; /// the idle time of the contact - TLV 0x0F
 	Oscar::DWORD m_extendedStatus; /// the extended status of the contact - TLV 0x06
 	int m_xtrazStatus;
+	int m_statusMood;
 	QBitArray m_capabilities; //TLV 0x05
 	QString m_clientVersion; /// the version of client they're using
 	QString m_clientName; /// the name of the client they're using
@@ -136,6 +141,7 @@
 	bool m_idleTimeSpecified;
 	bool m_extendedStatusSpecified;
 	bool m_xtrazStatusSpecified;
+	bool m_statusMoodSpecified;
 	bool m_capabilitiesSpecified;
 	bool m_dcOutsideSpecified;
 	bool m_dcInsideSpecified;
Index: icqcontactbase.cpp
===================================================================
--- icqcontactbase.cpp	(revision 778707)
+++ icqcontactbase.cpp	(working copy)
@@ -47,7 +47,7 @@
 	OscarProtocol* p = static_cast<OscarProtocol *>(protocol());
 	Oscar::Presence presence = p->statusManager()->presenceOf( this->onlineStatus() );
 	presence.setFlags( presence.flags() | Oscar::Presence::XStatus );
-	presence.setXtrazStatus( icon );
+	presence.setIconId( icon );
 	setPresenceTarget( presence );
 
 	Kopete::StatusMessage statusMessage;
Index: aim/aimcontact.cpp
===================================================================
--- aim/aimcontact.cpp	(revision 778707)
+++ aim/aimcontact.cpp	(working copy)
@@ -183,6 +183,8 @@
 {
 	if ( Oscar::normalize( userId ) == Oscar::normalize( contactId() ) )
 	{
+		m_details.clear();
+
 		kDebug(OSCAR_AIM_DEBUG) << "Setting " << userId << " offline";
 		setPresenceTarget( Oscar::Presence( Oscar::Presence::Offline ) );
 		removeProperty( mProtocol->statusMessage );
Index: aim/icqcontact.cpp
===================================================================
--- aim/icqcontact.cpp	(revision 778707)
+++ aim/icqcontact.cpp	(working copy)
@@ -126,6 +126,8 @@
 	if ( Oscar::normalize( userId ) != Oscar::normalize( contactId() ) )
 		return;
 
+	m_details.clear();
+
 	kDebug(OSCAR_AIM_DEBUG) << "Setting " << userId << " offline";
 	if ( m_ssiItem.waitingAuth() )
 		setOnlineStatus( mProtocol->statusManager()->waitingForAuth() );
Index: icq/xtrazstatusaction.cpp
===================================================================
--- icq/xtrazstatusaction.cpp	(revision 778707)
+++ icq/xtrazstatusaction.cpp	(working copy)
@@ -35,7 +35,7 @@
 void StatusAction::triggered()
 {
 	Oscar::Presence presence( Oscar::Presence::Online, Oscar::Presence::XStatus );
-	presence.setXtrazStatus( mStatus.status() );
+	presence.setIconId( mStatus.status() );
 
 	Kopete::StatusMessage statusMessage;
 	statusMessage.setTitle( mStatus.description() );
Index: icq/xtrazstatus.cpp
===================================================================
--- icq/xtrazstatus.cpp	(revision 778707)
+++ icq/xtrazstatus.cpp	(working copy)
@@ -48,7 +48,7 @@
 Oscar::Presence Status::presence() const
 {
 	Oscar::Presence presence( Oscar::Presence::Online, Oscar::Presence::XStatus );
-	presence.setXtrazStatus( mStatus );
+	presence.setIconId( mStatus );
 	return presence;
 }
 
Index: icq/aimcontact.cpp
===================================================================
--- icq/aimcontact.cpp	(revision 778707)
+++ icq/aimcontact.cpp	(working copy)
@@ -153,6 +153,8 @@
 	if ( Oscar::normalize( userId ) != Oscar::normalize( contactId() ) )
 		return;
 
+	m_details.clear();
+
 	kDebug(OSCAR_ICQ_DEBUG) << "Setting " << userId << " offline";
 	setPresenceTarget( Oscar::Presence( Oscar::Presence::Offline, Oscar::Presence::AIM ) );
 }
Index: icq/icqcontact.cpp
===================================================================
--- icq/icqcontact.cpp	(revision 778707)
+++ icq/icqcontact.cpp	(working copy)
@@ -115,8 +115,6 @@
 	kDebug( OSCAR_ICQ_DEBUG ) << "extendedStatus is " << details.extendedStatus();
 	Oscar::Presence presence = mProtocol->statusManager()->presenceOf( details.extendedStatus(), details.userClass() );
 
-	refreshStatus( details, presence );
-
 	if ( details.dcOutsideSpecified() )
 		setProperty( mProtocol->ipAddress, details.dcExternalIp().toString() );
 
@@ -124,6 +122,8 @@
 		setProperty( mProtocol->clientFeatures, details.clientName() );
 
 	OscarContact::userInfoUpdated( contact, details );
+
+	refreshStatus( m_details, presence );
 }
 
 void ICQContact::refreshStatus( const UserDetails& details, Oscar::Presence presence )
@@ -131,13 +131,18 @@
 	// Filter our XStatus and ExtStatus
 	presence.setFlags( presence.flags() & ~Oscar::Presence::StatusTypeMask );
 
+	if ( details.statusMood() != -1 )
+	{
+		presence.setFlags( presence.flags() | Oscar::Presence::ExtStatus2 );
+		presence.setIconId( details.statusMood() );
+	}
 	// XStatus don't support offline status so don't show it (xtrazStatusSpecified can be true if contact was online)
-	if ( details.xtrazStatus() != -1 && presence.type() != Oscar::Presence::Offline )
+	else if ( details.xtrazStatus() != -1 && presence.type() != Oscar::Presence::Offline )
 	{
 		presence.setFlags( presence.flags() | Oscar::Presence::XStatus );
-		presence.setXtrazStatus( details.xtrazStatus() );
+		presence.setIconId( details.xtrazStatus() );
 	}
-	else if ( !m_statusDescription.isEmpty() )
+	else if ( !m_statusTitle.isEmpty() )
 	{
 		presence.setFlags( presence.flags() | Oscar::Presence::ExtStatus );
 	}
@@ -217,6 +222,8 @@
 	if ( Oscar::normalize( userId ) != Oscar::normalize( contactId() ) )
 		return;
 
+	m_details.clear();
+
 	kDebug(OSCAR_ICQ_DEBUG) << "Setting " << userId << " offline";
 	if ( m_ssiItem.waitingAuth() )
 		setOnlineStatus( mProtocol->statusManager()->waitingForAuth() );
@@ -381,9 +388,9 @@
 	if ( m_ssiItem.alias().isEmpty() && !info.nickName.get().isEmpty() )
 		setNickName( QString::fromUtf8( info.nickName.get() ) );
 
-	m_statusDescription = QString::fromUtf8( info.statusDescription.get() );
-	if ( !m_statusDescription.isEmpty() )
-		setProperty( mProtocol->statusTitle, m_statusDescription );
+	m_statusTitle = QString::fromUtf8( info.statusDescription.get() );
+	if ( !m_statusTitle.isEmpty() )
+		setProperty( mProtocol->statusTitle, m_statusTitle );
 	else
 		removeProperty( mProtocol->statusTitle );
 
Index: icq/icqaccount.cpp
===================================================================
--- icq/icqaccount.cpp	(revision 778707)
+++ icq/icqaccount.cpp	(working copy)
@@ -66,10 +66,15 @@
 	Oscar::Presence presence = p->statusManager()->presenceOf( extendedStatus, details().userClass() );
 
 	ICQAccount* icqAccount = static_cast<ICQAccount*>( account() );
-	if ( details().xtrazStatus() != -1 )
+	if ( details().statusMood() != -1 )
 	{
+		presence.setFlags( presence.flags() | Oscar::Presence::ExtStatus2 );
+		presence.setIconId( details().statusMood() );
+	}
+	else if ( details().xtrazStatus() != -1 )
+	{
 		presence.setFlags( presence.flags() | Oscar::Presence::XStatus );
-		presence.setXtrazStatus( details().xtrazStatus() );
+		presence.setIconId( details().xtrazStatus() );
 	}
 	else if ( !icqAccount->engine()->statusDescription().isEmpty() )
 	{
@@ -173,7 +178,7 @@
 	actionMenu->addAction( mEditInfoAction );
 
 	Oscar::Presence pres( presence().type(), presence().flags() | Oscar::Presence::Invisible );
-	pres.setXtrazStatus( presence().xtrazStatus() );
+	pres.setIconId( presence().iconId() );
 	mActionInvisible->setIcon( KIcon( protocol()->statusManager()->onlineStatusOf( pres ).iconFor( this ) ) );
 	mActionInvisible->setChecked( (presence().flags() & Oscar::Presence::Invisible) == Oscar::Presence::Invisible );
 	actionMenu->addAction( mActionInvisible );
@@ -253,8 +258,9 @@
 		if ( mWebAware )
 			status |= Oscar::StatusCode::WEBAWARE;
 
+		int moodIcon = protocol()->statusManager()->moodIconOf( pres.iconId() );
 		engine()->setStatus( status, mInitialStatusMessage.message(),
-		                     pres.xtrazStatus(), mInitialStatusMessage.title() );
+		                     pres.iconId(), mInitialStatusMessage.title(), moodIcon );
 		updateVersionUpdaterStamp();
 
 		Connection* c = setupConnection();
@@ -411,7 +417,8 @@
 	else
 	{
 		Oscar::DWORD status = protocol()->statusManager()->oscarStatusOf( newPres );
-		engine()->setStatus( status, reason.message(), newPres.xtrazStatus(), reason.title() );
+		int moodIcon = protocol()->statusManager()->moodIconOf( newPres.iconId() );
+		engine()->setStatus( status, reason.message(), newPres.iconId(), reason.title(), moodIcon );
 	}
 }
 
Index: icq/icqcontact.h
===================================================================
--- icq/icqcontact.h	(revision 778707)
+++ icq/icqcontact.h	(working copy)
@@ -86,7 +86,7 @@
 	KToggleAction *m_actionVisibleTo;
 	KToggleAction *m_actionInvisibleTo;
 
-	QString m_statusDescription;
+	QString m_statusTitle;
 	enum { InfoNone = 0, InfoShort, InfoMediumTlv } m_requestingInfo;
 
 private slots:
Index: oscarpresence.h
===================================================================
--- oscarpresence.h	(revision 778707)
+++ oscarpresence.h	(working copy)
@@ -59,6 +59,7 @@
 		Invisible     = 0x00000200,
 		XStatus       = 0x00001000,
 		ExtStatus     = 0x00002000,
+		ExtStatus2    = 0x00004000,
 
 		FlagsMask     = 0x0000FFF0,
 		StatusTypeMask= 0x0000F000
@@ -66,7 +67,7 @@
 	Q_DECLARE_FLAGS(Flags, Flag)
 
 	enum {
-		XtrazMask     = 0xFF000000
+		IconMask     = 0xFF000000
 	};
 
 	explicit Presence( Type type, Flags flags = None );
@@ -89,15 +90,15 @@
 	bool operator!=( const Presence &other ) const { return !(*this == other); }
 
 	/**
-	 * Sets Xtraz status
+	 * Sets status icon id
 	 */
-	void setXtrazStatus( int xtraz );
+	void setIconId( int id );
 
 	/**
-	 * Returns Xtraz status
-	 * @note If Presence::XStatus flag is not set function returns -1.
+	 * Returns status icon id
+	 * @note If Presence::XStatus or Presence::ExtStatus2 flags are not set function returns -1.
 	 */
-	int xtrazStatus() const;
+	int iconId() const;
 
 private:
 	friend class ::OscarStatusManager;
Index: oscarstatusmanager.h
===================================================================
--- oscarstatusmanager.h	(revision 778707)
+++ oscarstatusmanager.h	(working copy)
@@ -90,6 +90,8 @@
 	 */
 	Oscar::Presence presenceOf( unsigned long oStatus, int oClass ) const;
 
+	int moodIconOf( int xtraz ) const;
+
 	virtual Kopete::OnlineStatus connectingStatus() const = 0;
 	virtual Kopete::OnlineStatus unknownStatus() const = 0;
 	virtual Kopete::OnlineStatus waitingForAuth() const = 0;
Index: oscarpresence.cpp
===================================================================
--- oscarpresence.cpp	(revision 778707)
+++ oscarpresence.cpp	(working copy)
@@ -42,16 +42,16 @@
 	mInternalStatus |= flags;
 }
 
-void Presence::setXtrazStatus( int xtraz )
+void Presence::setIconId( int id )
 {
-	mInternalStatus &= ~XtrazMask; 
-	mInternalStatus |= (xtraz << 24);
+	mInternalStatus &= ~IconMask; 
+	mInternalStatus |= (id << 24);
 }
 
-int Presence::xtrazStatus() const
+int Presence::iconId() const
 {
-	if ( mInternalStatus & Oscar::Presence::XStatus )
-		return ((mInternalStatus & XtrazMask) >> 24);
+	if ( (mInternalStatus & Oscar::Presence::XStatus) || (mInternalStatus & Oscar::Presence::ExtStatus2) )
+		return ((mInternalStatus & IconMask) >> 24);
 	else
 		return -1;
 }
