diff -ruN psi-0.9-test2.orig/src/contactview.cpp psi-0.9-test2/src/contactview.cpp
--- psi-0.9-test2.orig/src/contactview.cpp	2003-06-01 05:03:46.000000000 +0200
+++ psi-0.9-test2/src/contactview.cpp	2003-06-11 22:41:53.000000000 +0200
@@ -1993,7 +1993,10 @@
 
 	setProfileState(STATUS_OFFLINE);
 	setText(0, profileName);
-	setOpen(true);
+
+	QString display = cp->d->pa->userAccount().contactViewData[profileName];
+    bool viewState = (display == QString::null) || (display.compare("open") == 0);
+    setOpen(viewState);
 }
 
 ContactViewItem::ContactViewItem(const QString &groupName, int groupType, ContactProfile *cp, ContactView *parent)
@@ -2008,7 +2011,9 @@
 
 	drawGroupIcon();
 	resetGroupName();
-	setOpen(true);
+	QString display = cp->d->pa->userAccount().contactViewData[groupName];
+    bool viewState = (display == QString::null) || (display.compare("open") == 0);
+    setOpen(viewState);
 	setDropEnabled(true);
 }
 
@@ -2027,7 +2032,9 @@
 
 	drawGroupIcon();
 	resetGroupName();
-	setOpen(true);
+	QString display = cp->d->pa->userAccount().contactViewData[groupName];
+    bool viewState = (display == QString::null) || (display.compare("open") == 0);
+    setOpen(viewState);
 	setDropEnabled(true);
 }
 
diff -ruN psi-0.9-test2.orig/src/profiles.cpp psi-0.9-test2/src/profiles.cpp
--- psi-0.9-test2.orig/src/profiles.cpp	2003-05-26 02:40:13.000000000 +0200
+++ psi-0.9-test2/src/profiles.cpp	2003-06-11 22:41:53.000000000 +0200
@@ -314,6 +314,15 @@
 		r.appendChild(tag);
 	}
 
+	QDomElement cd = doc.createElement("contactviewlistdata");
+	a.appendChild(cd);
+    for (QMap<QString, QString>::ConstIterator itr = contactViewData.begin(); itr != contactViewData.end(); itr++) {
+		QDomElement tag = doc.createElement("viewitemdata");
+        tag.setAttribute("group", itr.key());
+        tag.setAttribute("display", itr.data());
+        cd.appendChild(tag);
+    }
+
 	a.appendChild(textTag(doc, "proxyindex", QString::number(proxy_index)));
 	//a.appendChild(textTag(doc, "proxytype", QString::number(proxy_type)));
 	//a.appendChild(textTag(doc, "proxyhost", proxy_host));
@@ -396,6 +405,19 @@
 	else
 		opt_passphrase = false;
 
+	QDomElement cd = findSubTag(a, "contactviewlistdata", &found);
+	if(found) {
+		for(QDomNode n = cd.firstChild(); !n.isNull(); n = n.nextSibling()) {
+			QDomElement i = n.toElement();
+			if(i.isNull())
+				continue;
+
+			if(i.tagName() == "viewitemdata") {
+                contactViewData[i.attribute("group")] = i.attribute("display");
+			}
+		}
+	}
+
 	QDomElement r = findSubTag(a, "roster", &found);
 	if(found) {
 		for(QDomNode n = r.firstChild(); !n.isNull(); n = n.nextSibling()) {
diff -ruN psi-0.9-test2.orig/src/profiles.h psi-0.9-test2/src/profiles.h
--- psi-0.9-test2.orig/src/profiles.h	2003-05-26 02:40:13.000000000 +0200
+++ psi-0.9-test2/src/profiles.h	2003-06-11 22:41:53.000000000 +0200
@@ -52,6 +52,7 @@
 
 	QString olr_string;
 	Jabber::Roster roster;
+    QMap<QString, QString> contactViewData;
 
 	bool opt_passphrase;
 	QString pgpPassphrase;
diff -ruN psi-0.9-test2.orig/src/psiaccount.cpp psi-0.9-test2/src/psiaccount.cpp
--- psi-0.9-test2.orig/src/psiaccount.cpp	2003-06-09 20:24:14.000000000 +0200
+++ psi-0.9-test2/src/psiaccount.cpp	2003-06-11 22:41:53.000000000 +0200
@@ -222,6 +222,8 @@
 
 	d->gcbank.setAutoDelete(true);
 
+    d->acc.contactViewData = acc.contactViewData;
+
 	// create Jabber::Client
 	d->client = new Client;
 	d->client->setOSName(getOSName());
@@ -279,6 +281,9 @@
 	connect(d->cp, SIGNAL(actionAssignKey(const Jid &)),SLOT(actionAssignKey(const Jid &)));
 	connect(d->cp, SIGNAL(actionUnassignKey(const Jid &)),SLOT(actionUnassignKey(const Jid &)));
 
+ 	connect(d->cp->contactView(), SIGNAL(expanded(QListViewItem*)), SLOT(listStateChage(QListViewItem*)));
+ 	connect(d->cp->contactView(), SIGNAL(collapsed(QListViewItem*)), SLOT(listStateChage(QListViewItem*)));
+
 	// restore cached roster
 	for(Roster::ConstIterator it = acc.roster.begin(); it != acc.roster.end(); ++it)
 		client_rosterItemUpdated(*it);
@@ -2877,6 +2882,22 @@
 		d->cp->removeSelf();
 }
 
+void PsiAccount::listStateChage(QListViewItem* litem)
+{
+    ContactViewItem* cvi = (ContactViewItem*)litem;
+    if (cvi->contactProfile()->name() != d->cp->name())
+        return;
+
+    QString isOpen = cvi->isOpen() ? "open" : "close";
+ 	int type = cvi->type();
+    if (type == ContactViewItem::Profile) {
+        d->acc.contactViewData[cvi->contactProfile()->name()] = isOpen;
+    }
+    else if (type == ContactViewItem::Group) {
+        d->acc.contactViewData[cvi->groupName()] = isOpen;
+    }
+}
+
 QString PsiAccount::resultToString(int result)
 {
 	QString s;
diff -ruN psi-0.9-test2.orig/src/psiaccount.h psi-0.9-test2/src/psiaccount.h
--- psi-0.9-test2.orig/src/psiaccount.h	2003-05-22 21:12:55.000000000 +0200
+++ psi-0.9-test2/src/psiaccount.h	2003-06-11 22:41:53.000000000 +0200
@@ -305,6 +305,8 @@
 
 	void optionsUpdate();
 
+    void listStateChage(QListViewItem*);
+
 private:
 	class Private;
 	Private *d;
