diff -urN -X psidiff.ignore sources/src/groupchatdlg.cpp work/src/groupchatdlg.cpp
--- sources/src/groupchatdlg.cpp	2009-03-07 01:53:07.000000000 +0500
+++ work/src/groupchatdlg.cpp	2009-03-07 01:53:08.000000000 +0500
@@ -80,6 +80,7 @@
 #include "gcuserview.h"
 #include "mucreasonseditor.h"
 #include "mcmdmanager.h"
+#include "lastactivitytask.h"
 
 #include "mcmdsimplesite.h"
 
@@ -301,6 +302,24 @@
 			.arg(version->jid().resource(), version->name(), version->version(), version->os()), false);
 	}
 
+	void lastactivity_finished()
+	{
+		LastActivityTask *idle = (LastActivityTask *)sender();
+		
+		if (!idle->success()) {
+			dlg->appendSysMsg(QString("Error in idle getter from %1!").arg(idle->jid().resource()), false);
+			return;
+		}
+
+		if (idle->status().isEmpty()) {
+			dlg->appendSysMsg(QString("Last activity from %1 @ %2")
+				.arg(idle->jid().resource(), idle->time().toString()), false);
+		} else {
+			dlg->appendSysMsg(QString("Last activity from %1 @ %2 (%3)")
+				.arg(idle->jid().resource(), idle->time().toString(), idle->status()), false);
+		}
+	}
+
 	void doSPing()
 	{
 		Jid full = dlg->jid().withResource(self);
@@ -384,6 +403,13 @@
 				version->get(target);
 				version->go();
 				newstate = 0;
+			} else if (cmd == "idle" && command.count() > 1) {
+				QString nick = command[1].stripWhiteSpace();
+				Jid target = dlg->jid().withResource(nick);
+				LastActivityTask *idle = new LastActivityTask(target, dlg->account()->client()->rootTask());
+				connect(idle, SIGNAL(finished()), SLOT(lastactivity_finished()));
+				idle->go();
+				newstate = 0;
 			} else if (cmd == "quote") {
 				dlg->appendSysMsg(command.join("|"), false);
 				preset = command;
@@ -405,8 +431,8 @@
 		if (state->getName() == MCMDMUC) {
 			QString spaceAtEnd = QString(QChar(0));
 			if (item == 0) {
-				all << "clear" + spaceAtEnd << "nick" + spaceAtEnd << "sping" + spaceAtEnd << "version" + spaceAtEnd << "quote" + spaceAtEnd;
-			} else if (item == 1 && partcommand[0] == "version") {
+				all << "clear" + spaceAtEnd << "nick" + spaceAtEnd << "sping" + spaceAtEnd << "version" + spaceAtEnd << "idle" + spaceAtEnd << "quote" + spaceAtEnd;
+			} else if (item == 1 && (partcommand[0] == "version" || partcommand[0] == "idle")) {
 				all = dlg->ui_.lv_users->nickList();
 			}
 		}
diff -urN -X psidiff.ignore sources/src/lastactivitytask.cpp work/src/lastactivitytask.cpp
--- sources/src/lastactivitytask.cpp	2009-03-07 01:25:53.000000000 +0500
+++ work/src/lastactivitytask.cpp	2009-03-07 01:53:08.000000000 +0500
@@ -33,6 +33,14 @@
 	iq_.appendChild(query);
 }
 
+/**
+ * \brief Queried entity's JID.
+ */
+const Jid & LastActivityTask::jid() const
+{
+	return jid_;
+}
+
 void LastActivityTask::onGo()
 {
 	send(iq_);
diff -urN -X psidiff.ignore sources/src/lastactivitytask.h work/src/lastactivitytask.h
--- sources/src/lastactivitytask.h	2009-03-07 01:25:53.000000000 +0500
+++ work/src/lastactivitytask.h	2009-03-07 01:53:08.000000000 +0500
@@ -35,6 +35,7 @@
 
 	void onGo();
 	bool take(const QDomElement &);
+	const XMPP::Jid & jid() const;
 
 	const QString& status() const;
 	const QDateTime& time() const;
diff -urN -X psidiff.ignore sources/src/psichatdlg.cpp work/src/psichatdlg.cpp
--- sources/src/psichatdlg.cpp	2009-03-07 01:53:06.000000000 +0500
+++ work/src/psichatdlg.cpp	2009-03-07 01:53:08.000000000 +0500
@@ -40,6 +40,7 @@
 #include "jidutil.h"
 #include "textutil.h"
 #include "xmpp_tasks.h"
+#include "lastactivitytask.h"
 
 
 #define MCMDCHAT		"http://psi-im.org/ids/mcmd#chatmain"
@@ -64,6 +65,11 @@
 				version->get(dlg_->jid());
 				version->go();
 				newstate = 0;
+			} else if (cmd == "idle") {
+				LastActivityTask *idle = new LastActivityTask(dlg_->jid(), dlg_->account()->client()->rootTask());
+				connect(idle, SIGNAL(finished()), SLOT(lastactivity_finished()));
+				idle->go();
+				newstate = 0;
 			} else if (cmd == "clear") {
 				dlg_->doClear();
 				newstate = 0;
@@ -106,7 +112,7 @@
 		QStringList all;
 		if (state->getName() == MCMDCHAT) {
 			if (item == 0) {
-				all << "version" << "clear" << "vcard" << "auth" << "compact";
+				all << "version" << "idle" << "clear" << "vcard" << "auth" << "compact";
 			}
 		}
 		QStringList res;
@@ -133,6 +139,24 @@
 			.arg(version->name(), version->version(), version->os()));
 	};
 
+	void lastactivity_finished()
+	{
+		LastActivityTask *idle = (LastActivityTask *)sender();
+
+		if (!idle->success()) {
+			dlg_->appendSysMsg("Error in idle getter!");
+			return;
+		}
+
+		if (idle->status().isEmpty()) {
+			dlg_->appendSysMsg(QString("Last activity @ %1")
+				.arg(idle->time().toString()));
+		} else {
+			dlg_->appendSysMsg(QString("Last activity @ %1 (%2)")
+				.arg(idle->time().toString(), idle->status()));
+		}
+	}
+
 private:
 	PsiChatDlg *dlg_;
 };
