diff -urN psi/src/mainwin.cpp psi_new/src/mainwin.cpp
--- psi/src/mainwin.cpp	2009-12-22 12:43:37.473216788 +0200
+++ psi_new/src/mainwin.cpp	2009-12-22 12:25:19.000000000 +0200
@@ -53,6 +53,8 @@
 #include "serverinfomanager.h"
 #include "applicationinfo.h"
 #include "psiaccount.h"
+#include "psievent.h"
+#include "psitooltip.h"
 #include "psitrayicon.h"
 #include "psitoolbar.h"
 #include "aboutdlg.h"
@@ -129,6 +131,8 @@
 	void registerActions();
 	IconAction* getAction( QString name );
 	void updateMenu(QStringList actions, QMenu* menu);
+
+	QString ToolTipText;
 };
 
 MainWin::Private::Private(PsiCon* _psi, MainWin* _mainWin) : psi(_psi), mainWin(_mainWin), splitter(NULL), mainTabs(NULL), viewToolBar(0)
@@ -653,7 +657,8 @@
 		connect(d->tray, SIGNAL(clicked(const QPoint &, int)), SLOT(trayClicked(const QPoint &, int)));
 		connect(d->tray, SIGNAL(doubleClicked(const QPoint &)), SLOT(trayDoubleClicked()));
 		d->tray->setIcon(PsiIconset::instance()->statusPtr(STATUS_OFFLINE));
-		d->tray->setToolTip(ApplicationInfo::name());
+		setTrayToolTip();
+		connect(d->tray, SIGNAL(doToolTip(QObject *, QPoint)), this, SLOT(doTrayToolTip(QObject *, QPoint)));
 
 		updateReadNext(d->nextAnim, d->nextAmount);
 
@@ -1032,12 +1037,86 @@
 #endif
 }
 
-void MainWin::setTrayToolTip(int status)
+void MainWin::setTrayToolTip()
 {
 	if (!d->tray) {
 		return;
 	}
-	d->tray->setToolTip(QString("Psi - " + status2txt(status)));
+	QString s = ApplicationInfo::name();
+	QString str = "<qt>";
+	QString imgTag = "icon name";
+	str += QString("<div style='white-space:pre'><b>%1</b></div>").arg(Qt::escape(ApplicationInfo::name()));
+	QString Tip = "";
+	QString TipPlain = "";
+	QString Events = "";
+	QString EventsPlain = "";
+	foreach(PsiAccount *pa, d->psi->contactList()->enabledAccounts()) {
+		Status stat = pa->status();
+		int status = makeSTATUS(stat);
+		QString istr = "status/offline";
+		if(status == STATUS_ONLINE)
+			istr = "status/online";
+		else if(status == STATUS_AWAY)
+			istr = "status/away";
+		else if(status == STATUS_XA)
+			istr = "status/xa";
+		else if(status == STATUS_DND)
+			istr = "status/dnd";
+		else if(status == STATUS_CHAT)
+ 			istr = "status/chat";
+		else if(status == STATUS_INVISIBLE)
+			istr = "status/invisible";
+		Tip += QString("<div style='white-space:pre'>") + QString("<%1=\"%2\"> ").arg(imgTag).arg(istr) + QString("<b>%1</b>").arg(Qt::escape(pa->name())) + "</div>";
+		TipPlain += "\n" + pa->name() + " (" + stat.typeString() + ")";
+		QString text = stat.status();		
+		if(!text.isEmpty()) {
+			text = clipStatus(text, 40, 1);
+			Tip += QString("<div style='white-space:pre'>%1: %2</div>").arg(tr("Status Message")).arg(Qt::escape(text));
+		}
+
+		PsiEvent *e = 0;
+		e = pa->eventQueue()->peekNext();
+		if(e) {
+			Jid jid = e->jid();
+			QString from;
+			if(!jid.isEmpty()) {
+				LiveRoster Roster = pa->client()->roster();
+				while(!Roster.isEmpty()) {
+					LiveRosterItem item = Roster.takeFirst();
+					if(item.jid().compare(jid)) {
+						from = item.name();
+						break;
+					}
+				}
+				if(from.isEmpty()) {
+					from = jid.full();
+				}
+			}
+			if(!from.isEmpty()) {
+				Events += QString("<div style='white-space:pre'>%1</div>").arg(Qt::escape(from));
+				EventsPlain += "\n" + from;
+			}
+		}
+	}
+
+	if(!Tip.isEmpty()) {
+		str += QString("<div style='white-space:pre'><u><b>%1</b></u></div>").arg(Qt::escape(tr("Active accounts:"))) + Tip;
+		s += tr("\nActive accounts:") + TipPlain;
+	}
+
+	if(!Events.isEmpty()) {
+		str += QString("<div style='white-space:pre'><u><b>%1</b></u></div>").arg(Qt::escape(tr("Incoming event(s) from:"))) + Events;
+		s += tr("\nIncoming event(s) from:") + EventsPlain;
+	}
+
+	str += "</qt>";
+
+	d->ToolTipText = str;
+	d->tray->setToolTip(s);
+}
+
+void MainWin::doTrayToolTip(QObject *, QPoint p) {
+	PsiToolTip::showText(p, d->ToolTipText);
 }
 
 void MainWin::decorateButton(int status)
@@ -1048,6 +1127,8 @@
 		action->setChecked ( d->statusActions[action] == status );
 	}
 
+	setTrayToolTip();
+
 	if(d->lastStatus == status) {
 		return;
 	}
@@ -1228,25 +1309,13 @@
 	}
 }
 
-void MainWin::setTrayToolTip(const Status& status, bool)
+void MainWin::setTrayToolTip(const Status&, bool)
 {
 	if (!d->tray) {
 		return;
 	}
-	QString s = "Psi";
-
- 	QString show = status.show();
-	if(!show.isEmpty()) {
-		show[0] = show[0].toUpper();
-		s += " - "+show;
-	}
-
-	QString text = status.status();
-	if(!text.isEmpty()) {
-		s += ": "+text;
-	}
 
-	d->tray->setToolTip(s);
+	setTrayToolTip();
 }
 
 void MainWin::trayClicked(const QPoint &, int button)
@@ -1321,6 +1390,7 @@
 
 	updateTray();
 	updateCaption();
+	setTrayToolTip();
 }
 
 QString MainWin::numEventsString(int x) const
@@ -1374,6 +1444,7 @@
 void MainWin::numAccountsChanged()
 {
 	d->statusButton->setEnabled(d->psi->contactList()->haveEnabledAccounts());
+	setTrayToolTip();
 }
 
 void MainWin::accountFeaturesChanged()
diff -urN psi/src/mainwin.h psi_new/src/mainwin.h
--- psi/src/mainwin.h	2009-12-22 12:43:37.413216964 +0200
+++ psi_new/src/mainwin.h	2009-12-21 12:23:15.000000000 +0200
@@ -95,7 +95,7 @@
 	void buildMainMenu();
 	void buildToolsMenu();
 
-	void setTrayToolTip(int);
+	void setTrayToolTip();
 
 	void activatedStatusAction(int);
 
@@ -138,6 +138,8 @@
 
 	void registerAction( IconAction * );
 
+	void doTrayToolTip(QObject *, QPoint);
+
 public slots:
 	void setWindowIcon(const QPixmap&);
 	void showNoFocus();
diff -urN psi/src/psitrayicon.cpp psi_new/src/psitrayicon.cpp
--- psi/src/psitrayicon.cpp	2009-11-07 21:41:00.000000000 +0200
+++ psi_new/src/psitrayicon.cpp	2009-12-22 09:57:26.000000000 +0200
@@ -2,6 +2,7 @@
 #include <QPixmapCache>
 #include <QApplication> // old
 #include <QSystemTrayIcon>
+#include <QHelpEvent>
 
 #include "psitrayicon.h"
 #include "iconset.h"
@@ -20,6 +21,7 @@
 	trayicon_->setContextMenu(popup);
 	setToolTip(tip);
 	connect(trayicon_,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),SLOT(trayicon_activated(QSystemTrayIcon::ActivationReason)));
+	trayicon_->installEventFilter(this);
 }
 
 PsiTrayIcon::~PsiTrayIcon()
@@ -188,3 +190,11 @@
 	}
 	trayicon_->setIcon(p);
 }
+
+bool PsiTrayIcon::eventFilter(QObject *obj, QEvent *event) {
+	if(event->type() == QEvent::ToolTip) {
+		doToolTip(obj, ((QHelpEvent*)event)->globalPos());
+		return true;
+	}
+	return false;
+}
diff -urN psi/src/psitrayicon.h psi_new/src/psitrayicon.h
--- psi/src/psitrayicon.h	2009-11-07 21:41:00.000000000 +0200
+++ psi_new/src/psitrayicon.h	2009-12-22 09:57:26.000000000 +0200
@@ -29,6 +29,7 @@
 	void clicked(const QPoint &, int);
 	void doubleClicked(const QPoint &);
 	void closed();
+	void doToolTip(QObject *, QPoint);
 
 public slots:
 	void show();
@@ -41,6 +42,7 @@
 protected:
 	QPixmap makeIcon();
 	QRgb pixelBlend(QRgb p1, QRgb p2);
+	bool eventFilter( QObject *, QEvent * );
 
 private:
 	PsiIcon* icon_;
