diff --git a/src/chatroom-discovery-dialog.cpp b/src/chatroom-discovery-dialog.cpp
index 327e4e7..738eb84 100644
--- a/src/chatroom-discovery-dialog.cpp
+++ b/src/chatroom-discovery-dialog.cpp
@@ -3,7 +3,6 @@
 
 namespace chronos {
 
-using std::vector;
 using ndn::Name;
 
 ChatroomDiscoveryDialog::ChatroomDiscoveryDialog(QWidget* parent)
@@ -67,7 +66,7 @@
 
     QString content;
 
-    for (vector<Name>::const_iterator nameIt = it->second.getParticipants().begin();
+    for (std::list<Name>::const_iterator nameIt = it->second.getParticipants().begin();
          nameIt != it->second.getParticipants().end(); nameIt++) {
       content.append(QString::fromStdString(nameIt->toUri())).append(",");
     }
diff --git a/src/chatroom-discovery-logic.cpp b/src/chatroom-discovery-logic.cpp
index 048d121..8d8590b 100644
--- a/src/chatroom-discovery-logic.cpp
+++ b/src/chatroom-discovery-logic.cpp
@@ -151,18 +151,18 @@
                                       const ndn::Data& data,
                                       const bool isRefreshing)
 {
-  Name::Component chatroomName = data.getName().get(OFFSET_CHATROOM_NAME);
+  // Name::Component chatroomName = data.getName().get(OFFSET_CHATROOM_NAME);
 
   ChatroomInfo chatroom;
   chatroom.wireDecode(data.getContent().blockFromValue());
-  chatroom.setName(chatroomName);
+  // chatroom.setName(chatroomName);
 
   // Tmp Disabled
   // if (chatroom.getTrustModel() == ChatroomInfo::TRUST_MODEL_WEBOFTRUST)
   //   addContacts(chatroom);
 
 
-  m_chatrooms[chatroomName] = chatroom;
+  m_chatrooms[chatroom.getName()] = chatroom;
   m_onUpdate(chatroom, true); //add
 
   time::milliseconds refreshingTime;
@@ -172,7 +172,8 @@
     refreshingTime = DEFAULT_REFRESHING_TIMER;
 
   m_scheduler.scheduleEvent(refreshingTime,
-                            bind(&ChatroomDiscoveryLogic::refreshChatroom, this, chatroomName));
+                            bind(&ChatroomDiscoveryLogic::refreshChatroom, this,
+                                 chatroom.getName()));
 
   if (!isRefreshing)
     sendDiscoveryInterest();
@@ -218,4 +219,4 @@
 }
 
 
-} //namespace chronos
+} // namespace chronos
diff --git a/src/chatroom-discovery-view-dialog.cpp b/src/chatroom-discovery-view-dialog.cpp
index 7eff07b..ac6c775 100644
--- a/src/chatroom-discovery-view-dialog.cpp
+++ b/src/chatroom-discovery-view-dialog.cpp
@@ -13,7 +13,6 @@
 
 namespace chronos {
 
-using std::vector;
 using ndn::Name;
 
 ChatroomDiscoveryViewDialog::ChatroomDiscoveryViewDialog(QWidget* parent)
@@ -52,10 +51,10 @@
 }
 
 void
-ChatroomDiscoveryViewDialog::setChatroomParticipants(const vector<Name>& participants)
+ChatroomDiscoveryViewDialog::setChatroomParticipants(const std::list<Name>& participants)
 {
   QString content;
-  for (vector<Name>::const_iterator it = participants.begin();
+  for (std::list<Name>::const_iterator it = participants.begin();
        it != participants.end(); it++) {
     content.append(QString::fromStdString(it->toUri())).append("\n");
   }
diff --git a/src/chatroom-discovery-view-dialog.hpp b/src/chatroom-discovery-view-dialog.hpp
index d074e71..bb29b7a 100644
--- a/src/chatroom-discovery-view-dialog.hpp
+++ b/src/chatroom-discovery-view-dialog.hpp
@@ -39,7 +39,7 @@
   setChatroomTrustModel(QString chatroomTrustModel);
 
   void
-  setChatroomParticipants(const std::vector<ndn::Name>& chatroomParticipants);
+  setChatroomParticipants(const std::list<ndn::Name>& chatroomParticipants);
 
 
 private slots:
diff --git a/src/chatroom-info.cpp b/src/chatroom-info.cpp
index 2b23719..f6b81e3 100644
--- a/src/chatroom-info.cpp
+++ b/src/chatroom-info.cpp
@@ -27,27 +27,62 @@
 {
   size_t totalLength = 0;
 
-  //Chatroom := CHATROOM-TYPE TLV-LENGTH
-  //              TrustModel
-  //              Participant+
+  // ChatroomInfo := CHATROOM-INFO-TYPE TLV-LENGTH
+  //                   ChatroomName
+  //                   TrustModel
+  //                   ChatroomPrefix
+  //                   ManagerPrefix
+  //                   Participants
+  //
+  // ChatroomName := CHATROOM-NAME-TYPE TLV-LENGTH
+  //                   NameComponent
+  //
+  // TrustModel := TRUST-MODEL-TYPE TLV-LENGTH
+  //                 nonNegativeInteger
+  //
+  // ChatroomPrefix := CHATROOM-PREFIX-TYPE TLV-LENGTH
+  //                     Name
+  //
+  // ManagerPrefix := MANAGER-PREFIX-TYPE TLV-LENGTH
+  //                    Name
+  //
+  // Participants := PARTICIPANTS-TYPE TLV-LENGTH
+  //                   Name+
 
-  //Participants
-  for (std::vector<Name>::const_reverse_iterator it = m_participants.rbegin();
+  // Participants
+  size_t participantsLength = 0;
+  for (std::list<Name>::const_reverse_iterator it = m_participants.rbegin();
        it != m_participants.rend(); ++it) {
-    size_t entryLength = 0;
-
-    entryLength += it->wireEncode(block);
-    entryLength += block.prependVarNumber(entryLength);
-    entryLength += block.prependVarNumber(tlv::PARTICIPANT);
-    totalLength += entryLength;
+    participantsLength += it->wireEncode(block);
   }
+  participantsLength += block.prependVarNumber(participantsLength);
+  participantsLength += block.prependVarNumber(tlv::Participants);
+  totalLength += participantsLength;
 
-  //TrustModel
-  totalLength += prependNonNegativeIntegerBlock(block, tlv::TRUSTMODEL, m_trustModel);
+  // Manager Prefix
+  size_t managerLength = m_manager.wireEncode(block);
+  totalLength += managerLength;
+  totalLength += block.prependVarNumber(managerLength);
+  totalLength += block.prependVarNumber(tlv::ManagerPrefix);
 
-  //type = TYPE_CHATROOM;
+  // Chatroom Sync Prefix
+  size_t chatroomSyncPrefixLength = m_syncPrefix.wireEncode(block);
+  totalLength += chatroomSyncPrefixLength;
+  totalLength += block.prependVarNumber(chatroomSyncPrefixLength);
+  totalLength += block.prependVarNumber(tlv::ChatroomPrefix);
+
+  // Trust Model
+  totalLength += prependNonNegativeIntegerBlock(block, tlv::TrustModel, m_trustModel);
+
+  // Chatroom Name
+  size_t chatroomNameLength = m_chatroomName.wireEncode(block);
+  totalLength += chatroomNameLength;
+  totalLength += block.prependVarNumber(chatroomNameLength);
+  totalLength += block.prependVarNumber(tlv::ChatroomName);
+
+  // Chatroom Info
   totalLength += block.prependVarNumber(totalLength);
-  totalLength += block.prependVarNumber(tlv::CHATROOM);
+  totalLength += block.prependVarNumber(tlv::ChatroomInfo);
 
   return totalLength;
 }
@@ -75,37 +110,102 @@
 
   m_participants.clear();
 
-  //Chatroom := CHATROOM-TYPE TLV-LENGTH
-  //              TrustModel
-  //              Participant+
+  // ChatroomInfo := CHATROOM-INFO-TYPE TLV-LENGTH
+  //                   ChatroomName
+  //                   TrustModel
+  //                   ChatroomPrefix
+  //                   ManagerPrefix
+  //                   Participants
+  //
+  // ChatroomName := CHATROOM-NAME-TYPE TLV-LENGTH
+  //                   NameComponent
+  //
+  // TrustModel := TRUST-MODEL-TYPE TLV-LENGTH
+  //                 nonNegativeInteger
+  //
+  // ChatroomPrefix := CHATROOM-PREFIX-TYPE TLV-LENGTH
+  //                     Name
+  //
+  // ManagerPrefix := MANAGER-PREFIX-TYPE TLV-LENGTH
+  //                    Name
+  //
+  // Participants := PARTICIPANTS-TYPE TLV-LENGTH
+  //                   Name+
 
-  if (m_wire.type() != tlv::CHATROOM)
+  if (m_wire.type() != tlv::ChatroomInfo)
     throw Error("Unexpected TLV number when decoding chatroom packet");
 
+  // Chatroom Info
   Block::element_const_iterator i = m_wire.elements_begin();
 
-  //TrustModel
-  if (i == m_wire.elements_end() || i->type() != tlv::TRUSTMODEL)
+  if (i == m_wire.elements_end() || i->type() != tlv::ChatroomName)
+    throw Error("Missing Chatroom Name Info");
+  m_chatroomName.wireDecode(i->blockFromValue());
+
+  ++i;
+
+  // Trust Model
+  if (i == m_wire.elements_end() || i->type() != tlv::TrustModel)
     throw Error("Missing TrustModel");
   m_trustModel =
       static_cast<TrustModel>(readNonNegativeInteger(*i));
 
   ++i;
 
-  //Participants
-  for (; i != m_wire.elements_end() && i->type() == tlv::PARTICIPANT; ++i) {
-    Name name;
-    name.wireDecode(i->blockFromValue());
-    m_participants.push_back(name);
+  // Chatroom Sync Prefix
+  if (i == m_wire.elements_end() || i->type() != tlv::ChatroomPrefix)
+    throw Error("Missing Chatroom Prefix");
+  m_syncPrefix.wireDecode(i->blockFromValue());
+
+  ++i;
+
+  // Manager Prefix
+  if (i == m_wire.elements_end() || i->type() != tlv::ManagerPrefix)
+    throw Error("Missing Manager Prefix");
+  m_manager.wireDecode(i->blockFromValue());
+  ++i;
+
+  // Participants
+  if (i == m_wire.elements_end() || i->type() != tlv::Participants)
+    throw Error("Missing Participant");
+
+  Block temp = *i;
+  temp.parse();
+
+  Block::element_const_iterator j = temp.elements_begin();
+
+  while (j != temp.elements_end() && j->type() == tlv::Name) {
+    m_participants.push_back(Name(*j));
+    ++j;
   }
+  if (j != temp.elements_end())
+    throw Error("Unexpected element");
+
   if (m_participants.empty())
     throw Error("Missing Participant");
+
+  ++i;
+
   if (i != m_wire.elements_end()) {
     throw Error("Unexpected element");
   }
 }
 
 void
+ChatroomInfo::setName(const Name::Component& name)
+{
+  m_wire.reset();
+  m_chatroomName = name;
+}
+
+void
+ChatroomInfo::setTrustModel(const TrustModel trustModel)
+{
+  m_wire.reset();
+  m_trustModel = trustModel;
+}
+
+void
 ChatroomInfo::addParticipant(const Name& participant)
 {
   m_wire.reset();
@@ -113,24 +213,24 @@
 }
 
 void
-ChatroomInfo::addContact(const Name& contact)
+ChatroomInfo::removeParticipant(const Name& participant)
 {
   m_wire.reset();
-  m_contacts.push_back(contact);
+  m_participants.remove(participant);
 }
 
 void
-ChatroomInfo::setName(const Name::Component& name)
+ChatroomInfo::setSyncPrefix(const Name& prefix)
 {
   m_wire.reset();
-  m_name = name;
+  m_syncPrefix = prefix;
 }
 
 void
-ChatroomInfo::setTrustModel(const TrustModel trustModel)
+ChatroomInfo::setManager(const Name& manager)
 {
   m_wire.reset();
-  m_trustModel = trustModel;
+  m_manager = manager;
 }
 
-} //namespace chronos
+} // namespace chronos
diff --git a/src/chatroom-info.hpp b/src/chatroom-info.hpp
index e182713..fc7c707 100644
--- a/src/chatroom-info.hpp
+++ b/src/chatroom-info.hpp
@@ -22,6 +22,7 @@
 #include <ndn-cxx/encoding/encoding-buffer.hpp>
 #include <ndn-cxx/exclude.hpp>
 #include <boost/concept_check.hpp>
+#include <list>
 
 namespace chronos {
 
@@ -44,7 +45,6 @@
     }
   };
 
-
   enum TrustModel {
     TRUST_MODEL_HIERARCHICAL = 2,
     TRUST_MODEL_WEBOFTRUST = 1,
@@ -67,26 +67,35 @@
   const Name::Component&
   getName() const;
 
+  const TrustModel
+  getTrustModel() const;
+
+  const Name&
+  getSyncPrefix() const;
+
+  const Name&
+  getManagerPrefix() const;
+
+  const std::list<Name>&
+  getParticipants() const;
+
   void
   setName(const Name::Component& name);
 
-  const std::vector<Name>&
-  getParticipants() const;
+  void
+  setTrustModel(const TrustModel trustModel);
 
   void
   addParticipant(const Name& participant);
 
-  const std::vector<Name>&
-  getContacts() const;
+  void
+  removeParticipant(const Name& participant);
 
   void
-  addContact(const Name& contact);
-
-  const TrustModel
-  getTrustModel() const;
+  setSyncPrefix(const Name& prefix);
 
   void
-  setTrustModel(const TrustModel trustModel);
+  setManager(const Name& manager);
 
 private:
   template<bool T>
@@ -95,29 +104,18 @@
 
 private:
   mutable Block m_wire;
-  Name::Component m_name;
-  std::vector<Name> m_participants;
+  Name::Component m_chatroomName;
+  std::list<Name> m_participants;
+  Name m_manager;
+  Name m_syncPrefix;
   TrustModel m_trustModel;
-  std::vector<Name> m_contacts;
 
 };
 
 inline const Name::Component&
 ChatroomInfo::getName() const
 {
-  return m_name;
-}
-
-inline const std::vector<Name>&
-ChatroomInfo::getParticipants() const
-{
-  return m_participants;
-}
-
-inline const std::vector<Name>&
-ChatroomInfo::getContacts() const
-{
-  return m_contacts;
+  return m_chatroomName;
 }
 
 inline const ChatroomInfo::TrustModel
@@ -126,6 +124,25 @@
   return m_trustModel;
 }
 
+
+inline const Name&
+ChatroomInfo::getManagerPrefix() const
+{
+  return m_manager;
+}
+
+inline const Name&
+ChatroomInfo::getSyncPrefix() const
+{
+  return m_syncPrefix;
+}
+
+inline const std::list<Name>&
+ChatroomInfo::getParticipants() const
+{
+  return m_participants;
+}
+
 BOOST_CONCEPT_ASSERT((ndn::WireEncodable<ChatroomInfo>));
 BOOST_CONCEPT_ASSERT((ndn::WireDecodable<ChatroomInfo>));
 
diff --git a/src/chatroom-tlv.hpp b/src/chatroom-tlv.hpp
index 954fbb5..c69c639 100644
--- a/src/chatroom-tlv.hpp
+++ b/src/chatroom-tlv.hpp
@@ -6,13 +6,16 @@
 namespace tlv {
 
 enum {
-  PARTICIPANT = 128,
-  CHATROOM = 129,
-  TRUSTMODEL = 130
+  ChatroomInfo = 128,
+  ChatroomName = 129,
+  TrustModel = 130,
+  ChatroomPrefix = 131,
+  ManagerPrefix = 132,
+  Participants = 133,
 };
 
-} //namespace tlv
+} // namespace tlv
 
-} //namespace chronos
+} // namespace chronos
 
-#endif //CHRONOCHAT_CHATROOM_TLV_HPP
+#endif // CHRONOCHAT_CHATROOM_TLV_HPP
