Index: iris/xmpp-im/xmpp_tasks.h
===================================================================
--- iris/xmpp-im/xmpp_tasks.h	(revision 499691)
+++ iris/xmpp-im/xmpp_tasks.h	(working copy)
@@ -459,6 +459,27 @@
 		class Private;
 		Private *d;
 	};
+	
+	class JT_PrivateStorage : public Task
+	{
+		Q_OBJECT
+	public:
+		JT_PrivateStorage(Task *parent);
+		~JT_PrivateStorage();
+
+		void set(const QDomElement &);
+		void get(const QString &tag, const QString& xmlns);
+		
+		QDomElement element();
+
+		void onGo();
+		bool take(const QDomElement &);
+		
+	private:
+		class Private;
+		Private *d;
+	};
+	
 }
 
 #endif
Index: iris/xmpp-im/xmpp_tasks.cpp
===================================================================
--- iris/xmpp-im/xmpp_tasks.cpp	(revision 499691)
+++ iris/xmpp-im/xmpp_tasks.cpp	(working copy)
@@ -2028,3 +2028,93 @@
 	send(tag);
 	setSuccess();
 }
+
+
+//----------------------------------------------------------------------------
+// JT_PrivateStorage
+//----------------------------------------------------------------------------
+class JT_PrivateStorage::Private
+{
+	public:
+		Private() : type(-1) {}
+
+		QDomElement iq;
+		QDomElement elem;
+		int type;
+};
+
+JT_PrivateStorage::JT_PrivateStorage(Task *parent)
+	:Task(parent)
+{
+	d = new Private;
+}
+
+JT_PrivateStorage::~JT_PrivateStorage()
+{
+	delete d;
+}
+
+void JT_PrivateStorage::get(const QString& tag, const QString& xmlns)
+{
+	d->type = 0;
+	d->iq = createIQ(doc(), "get" , QString() , id() );
+	QDomElement query = doc()->createElement("query");
+	query.setAttribute("xmlns", "jabber:iq:private");
+	d->iq.appendChild(query);
+	QDomElement s = doc()->createElement(tag);
+	if(!xmlns.isEmpty())
+		s.setAttribute("xmlns", xmlns);
+	query.appendChild(s);
+}
+
+void JT_PrivateStorage::set(const QDomElement& element)
+{
+	d->type = 1;
+	d->elem=element;
+	QDomNode n=doc()->importNode(element,true);
+
+	d->iq = createIQ(doc(), "set" , QString() , id() );
+	QDomElement query = doc()->createElement("query");
+	query.setAttribute("xmlns", "jabber:iq:private");
+	d->iq.appendChild(query);
+	query.appendChild(n);
+}
+
+void JT_PrivateStorage::onGo()
+{
+	send(d->iq);
+}
+
+bool JT_PrivateStorage::take(const QDomElement &x)
+{
+	QString to = client()->host();
+	if(!iqVerify(x, to, id()))
+		return false;
+
+	if(x.attribute("type") == "result") {
+		if(d->type == 0) {
+			QDomElement q = queryTag(x);
+			for(QDomNode n = q.firstChild(); !n.isNull(); n = n.nextSibling()) {
+				QDomElement i = n.toElement();
+				if(i.isNull())
+					continue;
+				d->elem=i;
+				break;
+			}
+		}
+		setSuccess();
+		return true;
+	}
+	else {
+		setError(x);
+	}
+
+	return true;
+}
+
+
+QDomElement JT_PrivateStorage::element( )
+{
+	return d->elem;
+}
+
