diff --git a/sflphone-common/src/sip/im/InstantMessaging.cpp b/sflphone-common/src/sip/im/InstantMessaging.cpp
index 4d78b7aed7ba15aa83255161007b327a2627b078..48def96ed34f8d65672b010a746f9f2ab654205e 100644
--- a/sflphone-common/src/sip/im/InstantMessaging.cpp
+++ b/sflphone-common/src/sip/im/InstantMessaging.cpp
@@ -15,37 +15,36 @@ static inline char* duplicateString (char dst[], const char src[], size_t len)
 static void XMLCALL startElementCallback (void *userData, const char *name, const char **atts)
 {
 
-    std::cout << "startElement " << name << std::endl;
-
     int *depthPtr = (int *) userData;
 
-    char attribute[50];
-    char value[50];
+    char attribute[100];
+    char value[100];
 
     const char **att;
     const char **val;
 
-    for (att = atts; *att; att += 2) {
+    if (strcmp (name, "entry") == 0) {
 
-        const char **val = att+1;
+        sfl::InstantMessaging::UriList *list = static_cast<sfl::InstantMessaging::UriList *> (userData);
+        sfl::InstantMessaging::UriEntry *entry = new sfl::InstantMessaging::UriEntry();
 
-        duplicateString (attribute, *att, strlen (*att));
-        std::cout << "att: " << attribute << std::endl;
+        for (att = atts; *att; att += 2) {
 
-        duplicateString (value, *val, strlen (*val));
-        std::cout << "val: " << value << std::endl;
-    }
+            const char **val = att+1;
+            duplicateString (attribute, *att, strlen (*att));
+            duplicateString (value, *val, strlen (*val));
+
+            entry->insert (std::pair<std::string, std::string> (attribute, value));
+        }
 
-    *depthPtr += 1;
+        list->push_back (entry);
+    }
 
 }
 
 static void XMLCALL endElementCallback (void *userData, const char *name)
 {
     // std::cout << "endElement " << name << std::endl;
-
-    int *depthPtr = (int *) userData;
-    *depthPtr -= 1;
 }
 
 
@@ -237,8 +236,8 @@ std::string InstantMessaging::generateXmlUriList (UriList& list)
 
     while (iterEntry != list.end()) {
         xmlbuffer.append ("<entry uri=");
-        UriEntry entry = static_cast<UriEntry> (*iterEntry);
-        iterAttr = entry.find (sfl::IM_XML_URI);
+        UriEntry *entry = static_cast<UriEntry *> (*iterEntry);
+        iterAttr = entry->find (sfl::IM_XML_URI);
         xmlbuffer.append (iterAttr->second);
         xmlbuffer.append (" cp:copyControl=\"to\" />");
 
@@ -258,7 +257,7 @@ InstantMessaging::UriList InstantMessaging::parseXmlUriList (std::string& urilis
 
     XML_Parser parser = XML_ParserCreate (NULL);
     int depth = 0;
-    XML_SetUserData (parser, &depth);
+    XML_SetUserData (parser, &list);
     XML_SetElementHandler (parser, startElementCallback, endElementCallback);
 
     if (XML_Parse (parser, urilist.c_str(), urilist.size(), 1) == XML_STATUS_ERROR) {
diff --git a/sflphone-common/src/sip/im/InstantMessaging.h b/sflphone-common/src/sip/im/InstantMessaging.h
index 5bbe7bbfcc339926351919e4e009927206f6bb27..0c5a9336f4481030c7a6b62a25744465266ed916 100644
--- a/sflphone-common/src/sip/im/InstantMessaging.h
+++ b/sflphone-common/src/sip/im/InstantMessaging.h
@@ -36,7 +36,7 @@ class InstantMessaging
     public:
 
         typedef std::map <std::string, std::string> UriEntry;
-        typedef std::list <UriEntry> UriList;
+        typedef std::list <UriEntry *> UriList;
 
         /*
          * Class constructor
diff --git a/sflphone-common/test/instantmessagingtest.cpp b/sflphone-common/test/instantmessagingtest.cpp
index fc2b0e0871ee8f542cfe8d4d674469f9b2b95907..4b60cd4a37d12c98a56d3682085c7c9707232abf 100644
--- a/sflphone-common/test/instantmessagingtest.cpp
+++ b/sflphone-common/test/instantmessagingtest.cpp
@@ -195,6 +195,7 @@ void InstantMessagingTest::testGenerateXmlUriList ()
     
     std::cout << std::endl;
 
+    // Create a test list with two entries
     sfl::InstantMessaging::UriList list;
 
     sfl::InstantMessaging::UriEntry entry1;
@@ -203,14 +204,15 @@ void InstantMessagingTest::testGenerateXmlUriList ()
     sfl::InstantMessaging::UriEntry entry2;
     entry2[sfl::IM_XML_URI] = "\"sip:manu@example.com\"";
 
-    list.push_front(entry1);
-    list.push_front(entry2);
+    list.push_front(&entry1);
+    list.push_front(&entry2);
 
     std::string buffer = _im->generateXmlUriList(list);
     CPPUNIT_ASSERT(buffer.size() != 0);
 
     std::cout << buffer << std::endl;
-
+	
+    // parse the resuling xml (further tests are performed in callbacks)
     XML_Parser parser = XML_ParserCreate(NULL);
     int nbEntry = 0;
     XML_SetUserData(parser, &nbEntry);
@@ -229,8 +231,38 @@ void InstantMessagingTest::testGenerateXmlUriList ()
 
 void InstantMessagingTest::testXmlUriListParsing ()
 {
-    
+    std::string xmlbuffer = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+    xmlbuffer.append ("<resource-lists xmlns=\"urn:ietf:params:xml:ns:resource-lists\" xmlns:cp=\"urn:ietf:params:xml:ns:copycontrol\">");
+    xmlbuffer.append ("<list>");
+    xmlbuffer.append ("<entry uri=\"sip:alex@example.com\" cp:copyControl=\"to\" />");
+    xmlbuffer.append ("<entry uri=\"sip:manu@example.com\" cp:copyControl=\"to\" />");
+    xmlbuffer.append ("</list>");
+    xmlbuffer.append ("</resource-lists>");
+
+
+    sfl::InstantMessaging::UriList list = _im->parseXmlUriList(xmlbuffer);
+    CPPUNIT_ASSERT(list.size() == 2);
 
+    // An iterator over xml attribute
+    sfl::InstantMessaging::UriEntry::iterator iterAttr;
+
+    // An iterator over list entries
+    sfl::InstantMessaging::UriList::iterator iterEntry = list.begin();
+
+    
+    while (iterEntry != list.end()) {
+        sfl::InstantMessaging::UriEntry *entry = static_cast<sfl::InstantMessaging::UriEntry *> (*iterEntry);
+        iterAttr = entry->find (sfl::IM_XML_URI);
+	
+/*	
+        if((iterAttr->second == std::string("sip:alex@example.com")) ||
+           (iterAttr->second == std::string("sip:manu@example.com")))
+	    CPPUNIT_ASSERT(1==1);
+	else
+	    CPPUNIT_ASSERT(0==1);
+	*/
+        iterEntry++;
+    }
 }
 
 void InstantMessagingTest::tearDown()