roster done
diff --git a/chatdialog.cpp b/chatdialog.cpp
index 89e1710..636ba1a 100644
--- a/chatdialog.cpp
+++ b/chatdialog.cpp
@@ -38,6 +38,7 @@
   QRectF rect = m_scene->itemsBoundingRect();
   m_scene->setSceneRect(rect);
 
+  listView->setStyleSheet("QListView { alternate-background-color: white; background: #F0F0F0; color: darkGreen; font: bold large; }");
   m_rosterModel = new QStringListModel(this);
   listView->setModel(m_rosterModel);
 
@@ -89,14 +90,14 @@
 void
 ChatDialog::replot()
 {
-  boost::mutex::scoped_lock lock(m_sceneMutex);
+  boost::recursive_mutex::scoped_lock lock(m_sceneMutex);
   m_scene->plot(m_sock->getRootDigest().c_str());
 }
 
 void
 ChatDialog::updateRosterList()
 {
-  boost::mutex::scoped_lock lock(m_sceneMutex);
+  boost::recursive_mutex::scoped_lock lock(m_sceneMutex);
   QStringList rosterList = m_scene->getRosterList();
   m_rosterModel->setStringList(rosterList);
 }
@@ -144,7 +145,7 @@
 void
 ChatDialog::appendMessage(const SyncDemo::ChatMessage msg) 
 {
-  boost::mutex::scoped_lock lock(m_msgMutex);
+  boost::recursive_mutex::scoped_lock lock(m_msgMutex);
 
   if (msg.type() != SyncDemo::ChatMessage::CHAT) {
     return;
@@ -237,7 +238,7 @@
 
   // reflect the changes on digest tree
   {
-    boost::mutex::scoped_lock lock(m_sceneMutex);
+    boost::recursive_mutex::scoped_lock lock(m_sceneMutex);
     m_scene->processUpdate(v, m_sock->getRootDigest().c_str());
   }
 
@@ -313,7 +314,7 @@
   std::cout <<"<<< updating scene for" << prefix << ": " << msg.from()  << std::endl;
 #endif
   {
-    boost::mutex::scoped_lock lock(m_sceneMutex);
+    boost::recursive_mutex::scoped_lock lock(m_sceneMutex);
     m_scene->msgReceived(prefix.c_str(), msg.from().c_str());
   }
   fitView();
@@ -334,7 +335,7 @@
   bool removed = m_scene->removeNode(prefix);
   if (removed)
   {
-    boost::mutex::scoped_lock lock(m_sceneMutex);
+    boost::recursive_mutex::scoped_lock lock(m_sceneMutex);
     m_scene->plot(m_sock->getRootDigest().c_str());
   }
 }
@@ -460,7 +461,7 @@
   std::vector<Sync::MissingDataInfo> v;
   v.push_back(mdi);
   {
-    boost::mutex::scoped_lock lock(m_sceneMutex);
+    boost::recursive_mutex::scoped_lock lock(m_sceneMutex);
     m_scene->processUpdate(v, m_sock->getRootDigest().c_str());
     m_scene->msgReceived(m_user.getPrefix(), m_user.getNick());
   }
@@ -520,7 +521,7 @@
     needWrite = true;
 
     {
-      boost::mutex::scoped_lock lock(m_sceneMutex);
+      boost::recursive_mutex::scoped_lock lock(m_sceneMutex);
       m_scene->clearAll();
       m_scene->plot("Empty");
     }
@@ -637,7 +638,7 @@
 void
 ChatDialog::fitView()
 {
-  boost::mutex::scoped_lock lock(m_sceneMutex);
+  boost::recursive_mutex::scoped_lock lock(m_sceneMutex);
   QRectF rect = m_scene->itemsBoundingRect();
   m_scene->setSceneRect(rect);
   treeViewer->fitInView(m_scene->itemsBoundingRect(), Qt::KeepAspectRatio);
diff --git a/chatdialog.h b/chatdialog.h
index dc7b390..902316f 100644
--- a/chatdialog.h
+++ b/chatdialog.h
@@ -1,7 +1,7 @@
 #ifndef CHATDIALOG_H
 #define CHATDIALOG_H
 #include <boost/function.hpp>
-#include <boost/thread/mutex.hpp>
+#include <boost/thread/recursive_mutex.hpp>
 #include <vector>
 #include "digesttreescene.h"
 #include "ui_chatdialog.h"
@@ -80,8 +80,8 @@
   Sync::SyncAppSocket *m_sock;
   uint32_t m_session;
   DigestTreeScene *m_scene;
-  boost::mutex m_msgMutex;
-  boost::mutex m_sceneMutex;
+  boost::recursive_mutex m_msgMutex;
+  boost::recursive_mutex m_sceneMutex;
   time_t m_lastMsgTime;
   int m_randomizedInterval;
   QTimer *m_timer;
diff --git a/chatdialog.ui b/chatdialog.ui
index 517e105..e36ed32 100644
--- a/chatdialog.ui
+++ b/chatdialog.ui
@@ -5,7 +5,7 @@
       <rect>
       <x>0</x>
       <y>0</y>
-      <width>600</width>
+      <width>800</width>
       <height>600</height>
       </rect>
     </property>
@@ -105,38 +105,41 @@
                   <property name="focusPolicy">
                     <enum>Qt::NoFocus</enum>
                   </property>
+                  <property name="minimumWidth">
+                    <number>600</number>
+                  </property>
                   <property name="readOnly">
                     <bool>true</bool>
                   </property>
                 </widget>
               </item>
+              <!-- start of input line widget -->
+              <item>
+                <layout class="QHBoxLayout">
+                  <property name="margin">
+                    <number>0</number>
+                  </property>
+                  <property name="spacing">
+                    <number>6</number>
+                  </property>
+                  <item>
+                    <widget class="QLabel" name="label">
+                      <property name="text">
+                        <string>Message:</string>
+                      </property>
+                    </widget>
+                  </item>
+                  <item>
+                    <widget class="QLineEdit" name="lineEdit" />
+                  </item>
+                </layout>
+              </item>
+              <!-- end of input line widget -->
             </layout>
           </item>
         </layout>
       </item>
       <!-- end of display area -->
-      <!-- start of input line widget -->
-      <item>
-        <layout class="QHBoxLayout">
-          <property name="margin">
-            <number>0</number>
-          </property>
-          <property name="spacing">
-            <number>6</number>
-          </property>
-          <item>
-            <widget class="QLabel" name="label">
-              <property name="text">
-                <string>Message:</string>
-              </property>
-            </widget>
-          </item>
-          <item>
-            <widget class="QLineEdit" name="lineEdit" />
-          </item>
-        </layout>
-      </item>
-      <!-- end of input line widget -->
     </layout>
   </widget>
   <resources/>
diff --git a/digesttreescene.cpp b/digesttreescene.cpp
index b79962e..5364f0f 100644
--- a/digesttreescene.cpp
+++ b/digesttreescene.cpp
@@ -71,9 +71,21 @@
   emit replot();
 }
 
-void
+QStringList
 DigestTreeScene::getRosterList()
 {
+  QStringList rosterList;
+  RosterIterator it(m_roster);
+  while(it.hasNext())
+  {
+    it.next();
+    DisplayUserPtr p = it.value();
+    if (p != DisplayUserNullPtr)
+    {
+      rosterList << "- " + p->getNick();
+    }
+  }
+  return rosterList;
 }
 
 void
@@ -95,6 +107,7 @@
       QRectF rectBR = nickRectItem->boundingRect();
       QRectF nickBR = nickItem->boundingRect();
       nickItem->setPos(rectBR.x() + (rectBR.width() - nickBR.width())/2, rectBR.y() + 5);
+      emit rosterChanged();
     }
 
     reDrawNode(p, Qt::red);
diff --git a/sync-demo.pro b/sync-demo.pro
index c82c20b..8c5d1b8 100644
--- a/sync-demo.pro
+++ b/sync-demo.pro
@@ -20,7 +20,7 @@
 
 QMAKE_CXXFLAGS *= -g 
 QMAKE_CFLAGS *= -g 
-LIBS += -lboost_system-mt -lboost_random
+LIBS += -lboost_system-mt -lboost_random-mt
 
 CONFIG += console