diff -urN -X psidiff.ignore sources/options/default.xml work/options/default.xml
--- sources/options/default.xml	2009-03-07 01:53:09.000000000 +0500
+++ work/options/default.xml	2009-03-07 01:53:09.000000000 +0500
@@ -142,6 +142,7 @@
 				<show-mood-icons type="bool">true</show-mood-icons>
 				<show-tune-icons type="bool">true</show-tune-icons>
 				<show-client-icons type="bool">false</show-client-icons>
+				<show-all-client-icons type="bool">false</show-all-client-icons>
 				<toolbars/>
 				<toolbars-state type="QByteArray"/>
 				<use-left-click type="bool">false</use-left-click>
diff -urN -X psidiff.ignore sources/src/options/opt_appearance.cpp work/src/options/opt_appearance.cpp
--- sources/src/options/opt_appearance.cpp	2009-03-07 01:53:04.000000000 +0500
+++ work/src/options/opt_appearance.cpp	2009-03-07 01:53:09.000000000 +0500
@@ -74,6 +74,7 @@
 	addTab( new OptionsTabAppearanceGeneral(this) );
 	addTab( new OptionsTabIconsetEmoticons(this) );
 	addTab( new OptionsTabIconsetMoods(this) );
+	addTab( new OptionsTabIconsetClients(this) );
 	addTab( new OptionsTabIconsetRoster(this) );
 	addTab( new OptionsTabIconsetSystem(this) );
 	addTab( new OptionsTabAppearanceMisc(this) );
diff -urN -X psidiff.ignore sources/src/options/opt_iconset_client.ui work/src/options/opt_iconset_client.ui
--- sources/src/options/opt_iconset_client.ui	1970-01-01 05:00:00.000000000 +0500
+++ work/src/options/opt_iconset_client.ui	2009-03-07 01:53:09.000000000 +0500
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IconsetClient</class>
+ <widget class="QWidget" name="IconsetClient">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>256</width>
+    <height>195</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>IconsetClientUI</string>
+  </property>
+  <layout class="QVBoxLayout">
+   <property name="spacing">
+    <number>6</number>
+   </property>
+   <property name="margin">
+    <number>9</number>
+   </property>
+   <item>
+    <widget class="QGroupBox" name="groupBox9">
+     <property name="title">
+      <string>Client iconsets</string>
+     </property>
+     <layout class="QGridLayout">
+      <property name="margin">
+       <number>8</number>
+      </property>
+      <property name="spacing">
+       <number>6</number>
+      </property>
+      <item row="1" column="2">
+       <spacer>
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeType">
+         <enum>QSizePolicy::Expanding</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>204</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="1" column="3">
+       <widget class="IconButton" name="pb_clientDetails" native="true">
+        <property name="text" stdset="0">
+         <string>&amp;Show Details</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="0" colspan="4">
+       <widget class="IconsetSelect" name="iss_clients" native="true"/>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QProgressBar" name="progress">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <customwidgets>
+  <customwidget>
+   <class>IconButton</class>
+   <extends></extends>
+   <header>iconbutton.h</header>
+  </customwidget>
+  <customwidget>
+   <class>IconsetSelect</class>
+   <extends></extends>
+   <header>iconsetselect.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff -urN -X psidiff.ignore sources/src/options/opt_iconset.cpp work/src/options/opt_iconset.cpp
--- sources/src/options/opt_iconset.cpp	2009-03-07 01:53:04.000000000 +0500
+++ work/src/options/opt_iconset.cpp	2009-03-07 01:53:09.000000000 +0500
@@ -24,6 +24,7 @@
 
 #include "ui_opt_iconset_emo.h"
 #include "ui_opt_iconset_mood.h"
+#include "ui_opt_iconset_client.h"
 #include "ui_opt_iconset_system.h"
 #include "ui_opt_iconset_roster.h"
 #include "ui_ui_isdetails.h"
@@ -40,6 +41,12 @@
 	IconsetMoodUI() : QWidget() { setupUi(this); }
 };
 
+class IconsetClientUI : public QWidget, public Ui::IconsetClient
+{
+public:
+	IconsetClientUI() : QWidget() { setupUi(this); }
+};
+
 class IconsetSystemUI : public QWidget, public Ui::IconsetSystem
 {
 public:
@@ -873,6 +880,154 @@
 }
 
 //----------------------------------------------------------------------------
+// OptionsTabIconsetClients
+//----------------------------------------------------------------------------
+
+OptionsTabIconsetClients::OptionsTabIconsetClients(QObject *parent)
+: OptionsTab(parent, "iconset_clients", "", tr("Clients"), tr("Select your clients iconset"))
+{
+	w = 0;
+	thread = 0;
+}
+
+OptionsTabIconsetClients::~OptionsTabIconsetClients()
+{
+	cancelThread();
+}
+
+QWidget *OptionsTabIconsetClients::widget()
+{
+	if ( w )
+		return 0;
+
+	w = new IconsetClientUI;
+	IconsetClientUI *d = (IconsetClientUI *)w;
+
+	connect(d->pb_clientDetails, SIGNAL(clicked()), SLOT(previewIconset()));
+
+	return w;
+}
+
+void OptionsTabIconsetClients::applyOptions()
+{
+	if ( !w || thread )
+		return;
+
+	IconsetClientUI *d = (IconsetClientUI *)w;
+
+	const Iconset *is = d->iss_clients->iconset();
+	if ( is ) {
+		QFileInfo fi( is->fileName() );
+		PsiOptions::instance()->setOption("options.iconsets.clients", fi.fileName());
+	}
+}
+
+void OptionsTabIconsetClients::restoreOptions()
+{
+	if ( !w || thread )
+		return;
+
+	IconsetClientUI *d = (IconsetClientUI *)w;
+
+	d->iss_clients->clear();
+	QStringList loaded;
+
+	d->setCursor(Qt::WaitCursor);
+
+	QPalette customPal = d->palette();
+	customPal.setDisabled(customPal.inactive());
+	d->iss_clients->setEnabled(false);
+	d->iss_clients->setPalette(customPal);
+
+	d->pb_clientDetails->setEnabled(false);
+	d->pb_clientDetails->setPalette(customPal);
+
+	d->progress->show();
+	d->progress->setValue( 0 );
+
+	numIconsets = countIconsets("/clients", loaded);
+	iconsetsLoaded = 0;
+
+	cancelThread();
+
+	thread = new IconsetLoadThread(this, "/clients");
+	thread->start();
+}
+
+bool OptionsTabIconsetClients::event(QEvent *e)
+{
+	IconsetClientUI *d = (IconsetClientUI *)w;
+	if ( e->type() == QEvent::User ) { // iconset load event
+		IconsetLoadEvent *le = (IconsetLoadEvent *)e;
+
+		if ( thread != le->thread() )
+			return false;
+
+		if ( !numIconsets )
+			numIconsets = 1;
+		d->progress->setValue( (int)((float)100 * ++iconsetsLoaded / numIconsets) );
+
+		Iconset *i = le->iconset();
+		if ( i ) {
+			PsiIconset::instance()->stripFirstAnimFrame(i);
+			d->iss_clients->insert(*i);
+
+			QFileInfo fi( i->fileName() );
+			if ( fi.fileName() == PsiOptions::instance()->getOption("options.iconsets.clients").toString() )
+				d->iss_clients->setItemSelected(d->iss_clients->lastItem(), true);
+
+			delete i;
+		}
+
+		return true;
+	}
+	else if ( e->type() == QEvent::User + 1 ) { // finish event
+		d->iss_clients->setEnabled(true);
+		d->iss_clients->unsetPalette();
+
+		d->pb_clientDetails->setEnabled(true);
+		d->pb_clientDetails->unsetPalette();
+
+		connect(d->iss_clients, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), SIGNAL(dataChanged()));
+
+		d->progress->hide();
+
+		d->unsetCursor();
+		thread = 0;
+
+		return true;
+	}
+
+	return false;
+}
+
+void OptionsTabIconsetClients::previewIconset()
+{
+	IconsetClientUI *d = (IconsetClientUI *)w;
+	const Iconset *is = d->iss_clients->iconset();
+	if (is) {
+		isDetails(*is, parentWidget->parentWidget(), psi);
+	}
+}
+
+void OptionsTabIconsetClients::setData(PsiCon *psicon, QWidget *p)
+{
+	psi = psicon;
+	parentWidget = p;
+}
+
+void OptionsTabIconsetClients::cancelThread()
+{
+	if ( thread ) {
+		threadCancelled.lock();
+		thread->cancelled = true;
+		threadCancelled.unlock();
+
+		thread = 0;
+	}
+}
+
+//----------------------------------------------------------------------------
 // OptionsTabIconsetRoster
 //----------------------------------------------------------------------------
 
diff -urN -X psidiff.ignore sources/src/options/opt_iconset.h work/src/options/opt_iconset.h
--- sources/src/options/opt_iconset.h	2009-03-07 01:53:04.000000000 +0500
+++ work/src/options/opt_iconset.h	2009-03-07 01:53:09.000000000 +0500
@@ -94,6 +94,34 @@
 	IconsetLoadThread *thread;
 };
 
+class OptionsTabIconsetClients : public OptionsTab
+{
+	Q_OBJECT
+public:
+	OptionsTabIconsetClients(QObject *parent);
+	~OptionsTabIconsetClients();
+
+	QWidget *widget();
+	void applyOptions();
+	void restoreOptions();
+	bool stretchable() const { return true; }
+
+private slots:
+	void setData(PsiCon *, QWidget *);
+	void previewIconset();
+
+protected:
+	bool event(QEvent *);
+	void cancelThread();
+
+private:
+	QWidget *w, *parentWidget;
+	PsiCon *psi;
+
+	int numIconsets, iconsetsLoaded;
+	IconsetLoadThread *thread;
+};
+
 class OptionsTabIconsetRoster : public OptionsTab
 {
 	Q_OBJECT
diff -urN -X psidiff.ignore sources/src/options/options.pri work/src/options/options.pri
--- sources/src/options/options.pri	2009-03-07 01:53:08.000000000 +0500
+++ work/src/options/options.pri	2009-03-07 01:53:09.000000000 +0500
@@ -56,6 +56,7 @@
 	$$PWD/ui_isdetails.ui \
 	$$PWD/opt_iconset_emo.ui \
 	$$PWD/opt_iconset_mood.ui \
+	$$PWD/opt_iconset_client.ui \
 	$$PWD/opt_iconset_system.ui \
 	$$PWD/opt_iconset_roster.ui \
 	$$PWD/opt_general_groupchat.ui \
diff -urN -X psidiff.ignore sources/src/options/opt_roster.cpp work/src/options/opt_roster.cpp
--- sources/src/options/opt_roster.cpp	2009-03-07 01:53:08.000000000 +0500
+++ work/src/options/opt_roster.cpp	2009-03-07 01:53:09.000000000 +0500
@@ -44,7 +44,7 @@
 	d->ck_showMenubar->setWhatsThis(
 		tr("Shows the menubar in the application window."));
 
-
+	connect(d->ck_showClientIcons, SIGNAL(toggled(bool)), d->cb_showAllClientIcons, SLOT(setEnabled(bool)));
 #ifdef Q_WS_MAC
 	d->ck_alwaysOnTop->hide();
 	d->ck_showMenubar->hide();
@@ -71,6 +71,7 @@
 	PsiOptions::instance()->setOption("options.ui.contactlist.show-mood-icons", d->ck_showMoodIcons->isChecked());
 	PsiOptions::instance()->setOption("options.ui.contactlist.show-tune-icons", d->ck_showTuneIcons->isChecked());
 	PsiOptions::instance()->setOption("options.ui.contactlist.show-client-icons", d->ck_showClientIcons->isChecked());
+	PsiOptions::instance()->setOption("options.ui.contactlist.show-all-client-icons", (d->cb_showAllClientIcons->currentIndex() == 0)?true:false);
 
 	//avatars settings
 	PsiOptions::instance()->setOption("options.ui.contactlist.avatars-fixed-height", d->ck_avatarsFixedHeight->isChecked());
@@ -97,7 +98,8 @@
 	d->ck_showMoodIcons->setChecked( PsiOptions::instance()->getOption("options.ui.contactlist.show-mood-icons").toBool() );
 	d->ck_showTuneIcons->setChecked( PsiOptions::instance()->getOption("options.ui.contactlist.show-tune-icons").toBool() );
 	d->ck_showClientIcons->setChecked( PsiOptions::instance()->getOption("options.ui.contactlist.show-client-icons").toBool() );
-
+	d->cb_showAllClientIcons->setEnabled(PsiOptions::instance()->getOption("options.ui.contactlist.show-client-icons").toBool());
+	d->cb_showAllClientIcons->setCurrentIndex(PsiOptions::instance()->getOption("options.ui.contactlist.show-all-client-icons").toBool()?0:1);
 	//avatars settings
 	d->ck_avatarsFixedHeight->setChecked( PsiOptions::instance()->getOption("options.ui.contactlist.avatars-fixed-height").toBool() );
 	d->sb_avatarsHeight->setValue( PsiOptions::instance()->getOption("options.ui.contactlist.avatars-height").toInt() );
diff -urN -X psidiff.ignore sources/src/options/opt_roster.ui work/src/options/opt_roster.ui
--- sources/src/options/opt_roster.ui	2009-03-07 01:53:08.000000000 +0500
+++ work/src/options/opt_roster.ui	2009-03-07 01:53:09.000000000 +0500
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
  <class>OptRoster</class>
  <widget class="QWidget" name="OptRoster">
@@ -104,6 +103,11 @@
        </widget>
       </item>
       <item>
+       <layout class="QHBoxLayout" >
+        <property name="spacing" >
+         <number>5</number>
+        </property>
+        <item>
        <widget class="QCheckBox" name="ck_showClientIcons">
         <property name="whatsThis">
          <string>Show icon of user client</string>
@@ -113,6 +117,22 @@
         </property>
        </widget>
       </item>
+        <item>
+         <widget class="QComboBox" name="cb_showAllClientIcons" >
+          <item>
+           <property name="text" >
+            <string>all client icons</string>
+           </property>
+          </item>
+          <item>
+           <property name="text" >
+            <string>only highest priority client icon</string>
+           </property>
+          </item>
+         </widget>
+        </item>
+       </layout>
+      </item>
      </layout>
     </widget>
    </item>
@@ -192,5 +212,4 @@
   <tabstop>ck_showTuneIcons</tabstop>
  </tabstops>
  <resources/>
- <connections/>
 </ui>
diff -urN -X psidiff.ignore sources/src/psiiconset.cpp work/src/psiiconset.cpp
--- sources/src/psiiconset.cpp	2009-03-07 01:53:04.000000000 +0500
+++ work/src/psiiconset.cpp	2009-03-07 01:53:09.000000000 +0500
@@ -42,8 +42,8 @@
 private:
 	PsiIconset *psi;
 public:
-	Iconset system, psiplus, moods;
-	QString cur_system, cur_status, cur_psiplus, cur_moods;
+	Iconset system, psiplus, moods, clients;
+	QString cur_system, cur_status, cur_psiplus, cur_moods, cur_clients;
 	QStringList cur_emoticons;
 	QMap<QString, QString> cur_service_status;
 	QMap<QString, QString> cur_custom_status;
@@ -253,6 +253,23 @@
 		return def;
 	}
 
+	Iconset clientsIconset(bool *ok)
+	{
+		Iconset def;
+		*ok = def.load( iconsetPath("clients/default") );
+
+		if ( PsiOptions::instance()->getOption("options.iconsets.clients").toString() != "default" ) {
+			Iconset is;
+			is.load ( iconsetPath("clients/" + PsiOptions::instance()->getOption("options.iconsets.clients").toString()) );
+
+			loadIconset(&def, &is);
+		}
+
+		stripFirstAnimFrame( def );
+
+		return def;
+	}
+
 	QList<Iconset*> emoticons()
 	{
 		QList<Iconset*> emo;
@@ -380,6 +397,21 @@
 	return ok;
 }
 
+bool PsiIconset::loadClients()
+{
+	bool ok = true;
+	QString cur_clients = PsiOptions::instance()->getOption("options.iconsets.clients").toString();
+	if (d->cur_clients != cur_clients) {
+		Iconset clients = d->clientsIconset(&ok);
+		d->loadIconset(&d->clients, &clients);
+		d->clients.addToFactory();
+
+		d->cur_clients = cur_clients;
+	}
+
+	return ok;
+}
+
 bool PsiIconset::loadAll()
 {
 	if (!loadSystem() || !loadRoster())
@@ -387,6 +419,7 @@
 
 	loadEmoticons();
 	loadMoods();
+	loadClients();
 	return true;
 }
 
@@ -401,6 +434,9 @@
 	else if (option == "options.iconsets.moods") {
 		loadMoods();
 	}
+	else if (option == "options.iconsets.clients") {
+		loadClients();
+	}
 
 	// currently we rely on PsiCon calling reloadRoster() when
 	// all options are already applied. otherwise we risk the chance
diff -urN -X psidiff.ignore sources/src/psiiconset.h work/src/psiiconset.h
--- sources/src/psiiconset.h	2009-03-07 01:53:04.000000000 +0500
+++ work/src/psiiconset.h	2009-03-07 01:53:09.000000000 +0500
@@ -46,6 +46,7 @@
 	Q3PtrList<Iconset> emoticons;
 	Iconset psiplus;
 	Iconset moods;
+	Iconset clients;
 	const Iconset &system() const;
 	void stripFirstAnimFrame(Iconset *);
 	static void removeAnimation(Iconset *);
@@ -96,6 +96,7 @@
 	bool loadRoster();
 	void loadEmoticons();
 	bool loadMoods();
+	bool loadClients();
 };
 
 #endif
diff -urN -X psidiff.ignore sources/src/userlist.cpp work/src/userlist.cpp
--- sources/src/userlist.cpp	2009-03-07 01:53:09.000000000 +0500
+++ work/src/userlist.cpp	2009-03-07 01:53:09.000000000 +0500
@@ -320,6 +320,149 @@
 	return v_mood;
 }
 
+QStringList UserListItem::clients() const
+{
+	QStringList res;
+
+	if(isMuc()) return res;
+	if(!userResourceList().isEmpty()) {
+		UserResourceList srl = userResourceList();
+		srl.sort();
+
+		for(UserResourceList::ConstIterator rit = srl.begin(); rit != srl.end(); ++rit) {
+			QString name = (*rit).clientName().toLower();
+			if(name.startsWith("adium"))
+				res += "adium";
+			else if(name.startsWith("bitlbee"))
+				res += "bitlbee";
+			else if(name.startsWith("bayanicq") || name.startsWith("barobin.com"))
+				res += "bayanicq";
+			else if(name.startsWith("barracuda"))
+				res += "barracuda-im";
+			else if(name.startsWith("bombusmod-qd.wen.ru") || name.startsWith("bombusqd"))
+				res += "bombusqd";
+			else if(name.startsWith("bombusmod"))
+				res += "bombusmod";
+			else if(name.startsWith("bombus-ng"))
+				res += "bombusng";
+			else if(name.startsWith("bombus.pl"))
+				res += "bombuspl";
+			else if(name.startsWith("bombus+") || name.startsWith("voffk.org.ru"))
+				res += "bombusplus";
+			else if(name.startsWith("bombus-im.org") || name.startsWith("bombus"))
+				res += "bombus";
+			else if(name.startsWith("centerim"))
+				res += "centerim";
+			else if(name.startsWith("coccinella"))
+				res += "coccinella";
+			else if(name.startsWith("exodus"))
+				res += "exodus";
+			else if(name.startsWith("freqbot"))
+				res += "freqbot";
+			else if(name.startsWith("gajim"))
+				res += "gajim";
+			else if(name.contains("gismeteo.ru"))
+				res += "gismeteo";
+			else if(name.startsWith("google.com"))
+				res += "google.com";
+			else if(name.startsWith("gluxibot"))
+				res += "gluxibot";
+			else if(name.startsWith("gizmo"))
+				res += "gizmo";
+			else if(name.startsWith("hotcoffee"))
+				res += "mirandahotcoffee";
+			else if(name.startsWith("ichat"))
+				res += "ichat";
+			else if(name.startsWith("isida"))
+				res += "isida-bot";
+			else if(name.startsWith("jabbim"))
+				res += "jabbim";
+			else if(name.startsWith("jabber weather.com transport"))
+				res += "weather.com";
+			else if(name.startsWith("jabber.el"))
+				res += "jabber.el";
+			else if(name.startsWith("jajc") || name.startsWith("just another jabber client"))
+				res += "jajc";
+			else if(name.contains("japyt"))
+				res += "japyt";
+			else if(name.startsWith("jimm"))
+				res += "jimm";
+			else if(name.startsWith("jbot"))
+				res += "jbother";
+			else if(name.startsWith("juick"))
+				res += "juick";
+			else if(name.startsWith("kopete"))
+				res += "kopete";
+			else if(name.startsWith("mchat"))
+				res += "mchat";
+			else if(name.startsWith("miranda"))
+				res += "miranda";
+			else if(name.startsWith("mail.google.com"))
+				res += "mail.google.com";
+			else if(name.startsWith("mcabber"))
+				res += "mcabber";
+			else if(name.startsWith("mobileagent"))
+				res += "mailruagent.sis";
+			else if(name.startsWith("mrim") || name.startsWith("svn.xmpp.ru") || name.startsWith("none") || name.contains("mail.ru") || name.contains("list.ru") || name.contains("bk.ru") || name.contains("inbox.ru"))
+				res += "mailruagent";
+			else if(name.startsWith("nimbuzz"))
+				res += "nimbuzz";
+			else if(name.startsWith("omnipresence") || name.startsWith("home.gna.org"))
+				res += "omnipresence";
+			else if(name.startsWith("om"))
+				res += "om.beeonline.ru";
+			else if(name.startsWith("pandion"))
+				res += "pandion";
+			else if(name.startsWith("psi+"))
+				res += "psiplus";
+			else if(name.startsWith("psi"))
+				res += "psi";
+			else if(name.startsWith("pidgin") || name.startsWith(QString::fromUtf8(QByteArray::fromHex("d0bfd0b8d0b4d0b6d0b8d0bd"))))
+				res += "pidgin";
+			else if(name.startsWith("pyicqt.googlecode.com") || name.startsWith("icq transport"))
+				res += "pyicq-t";
+			else if(name.startsWith("pyvk-t") || name.startsWith("vkontakte.ru transport"))
+				res += "pyvk-t";
+			else if(name.startsWith("process-one.net"))
+				res += "oneteamiphone";
+			else if(name.startsWith("qip.ru") || name.startsWith("pda.qip.ru") || name.startsWith("qip pda symbian"))
+				res += "qippda";
+			else if(name.startsWith("qip infium"))
+				res += "qipinfium";
+			else if(name.startsWith("qutim"))
+				res += "qutim";
+			else if(name.startsWith("xmpp4moz") || name.startsWith("hyperstruct.net"))
+				res += "sameplace";
+			else if(name.startsWith("sapo messenger mac") || name.startsWith("messenger.sapo.pt"))
+				res += "sapo";
+			else if(name.startsWith("siemens native jabber client"))
+				res += "siejc";
+			else if(name.startsWith("spark im client"))
+				res += "spark";
+			else if(name.startsWith("talkonaut"))
+				res += "talkonaut";
+			else if(name.startsWith("talkgadget.google.com"))
+				res += "talkgadget.google.com";
+			else if(name.startsWith("talk.google.com"))
+				res += "talk.google.com";
+			else if(name.startsWith("tkabber"))
+				res += "tkabber";
+			else if(name.startsWith("telepathy"))
+				res += "telepathy.freedesktop.org";
+			else if(name.startsWith(QString::fromUtf8(QByteArray::fromHex("d18f2ed0bed0bdd0bbd0b0d0b9d0bd"))) || name.startsWith("online.yandex.ru"))
+				res += "yaonline";
+			else if(name.startsWith("ya.online"))
+				res += "yaonlinej2me";
+			else if(name.startsWith("yabber instant messenger"))
+				res += "yabber";
+			else if(name.startsWith("yaonline"))
+				res += "yaonlinesymbian";
+			else res += "unknown";
+		}
+	}
+	return res;
+}
+
 void UserListItem::setActivity(const Activity& activity)
 {
 	v_activity = activity;
diff -urN -X psidiff.ignore sources/src/userlist.h work/src/userlist.h
--- sources/src/userlist.h	2009-03-07 01:53:09.000000000 +0500
+++ work/src/userlist.h	2009-03-07 01:53:09.000000000 +0500
@@ -126,6 +126,7 @@
 	QString makeDesc() const;
 	bool isPrivate() const;
 	const Mood& mood() const;
+	QStringList clients() const;
 	const Activity& activity() const;
 
 	void setJid(const XMPP::Jid &);
