Index: sipchatserver/chatroom.py
===================================================================
--- sipchatserver/chatroom.py	(revision 2)
+++ sipchatserver/chatroom.py	(revision 10)
@@ -49,16 +49,21 @@
 class ChatRoom:
 
-    def __init__(self, traffic_logger):
+    def __init__(self, room_id, reception, traffic_logger):
+        self.room_id = room_id
+        self.reception = reception
         self.traffic_logger = traffic_logger
         self.sessions = []
         self.accept_incoming_job = None
         self.incoming_queue = queue()
-        self.message_dispatcher_job = proc.spawn_link(self._message_dispatcher)
+        self.message_dispatcher_job = proc.spawn_link_exception(self._message_dispatcher)
 
     def _message_dispatcher(self):
         """Read from self.incoming_queue and dispatch the messages to other participants"""
-        while True:
-            session, message = self.incoming_queue.wait()
-            self._dispatch_message(session, message)
+        try:
+            while True:
+                session, message = self.incoming_queue.wait()
+                self._dispatch_message(session, message)
+        except proc.ProcExit, ex:
+            return ex
 
     def _dispatch_message(self, session, message):
@@ -71,4 +76,5 @@
                     self.remove_session(session)
                 except:
+                    self.remove_session(session)
                     import traceback
                     traceback.print_exc()
@@ -81,28 +87,21 @@
         self.sessions = []
 
-    def start_accept_incoming(self, *args, **kwargs):
-        assert not self.accept_incoming_job, self.accept_incoming_job
-        self.accept_incoming_job = proc.spawn(self._accept_incoming, *args, **kwargs)
-
-    def stop_accept_incoming(self):
-        if self.accept_incoming_job:
-            self.accept_incoming_job.kill()
-            self.accept_incoming_job = None
-
-    def add_session(self, session, msrp):
-        proc.spawn(self._forwarder, msrp, session)
+    def add_session(self, session):
+        proc.spawn(self._forwarder, session)
         self.sessions.append(session)
 
     def remove_session(self, session):
         try:
-            #session.end()
+            session.end()
             self.sessions.remove(session)
         except ValueError:
             pass
+        if not self.sessions:
+            self.reception.remove_room(self)
 
-    def _forwarder(self, msrp, session):
+    def _forwarder(self, session):
         while True:
             try:
-                chunk = msrp.receive_chunk()
+                chunk = session.msrp.receive_chunk()
             except ConnectionClosed:
                 self.remove_session(session)
@@ -114,5 +113,5 @@
         def new_session(sip, msrp):
             session = MSRPSession(sip, msrp)
-            self.add_session(session, msrp)
+            self.add_session(session)
         acceptor = MSRPAcceptFactory.new(relay, self.traffic_logger)
         handler1 = JoinHandler(acceptor, new_session)
@@ -125,2 +124,39 @@
                 print ex
                 sleep(1)
+
+
+class Reception:
+
+    def __init__(self, traffic_logger):
+        self.traffic_logger = traffic_logger
+        self.rooms = {} # maps room_id -> ChatRoom
+
+    def add_session(self, session):
+        room_id = '%s@%s' % (session.local_uri.user, session.local_uri.host)
+        room = self.rooms.get(room_id)
+        if room is None:
+            print 'Creating a room %s' % room_id
+            room = ChatRoom(room_id, self, self.traffic_logger)
+            self.rooms[room_id] = room
+        room.add_session(session)
+
+    def remove_room(self, room):
+        self.rooms.pop(room.room_id, None)
+
+    def accept_incoming_loop(self, e, relay=None, local_uri=None):
+        def new_session(sip, msrp):
+            session = MSRPSession(sip, msrp)
+            self.add_session(session)
+        acceptor = MSRPAcceptFactory.new(relay, self.traffic_logger)
+        handler1 = JoinHandler(acceptor, new_session)
+        handler = IncomingSessionHandler()
+        handler.add_handler(handler1)
+        while True:
+            try:
+                handler.wait_and_handle(e, local_uri)
+            except MSRPSessionErrors, ex:
+                print ex
+                sleep(1)
+            except proc.ProcExit:
+                return
+
Index: sipchatserver/server.py
===================================================================
--- sipchatserver/server.py	(revision 3)
+++ sipchatserver/server.py	(revision 10)
@@ -10,5 +10,5 @@
 
 import sipchatserver
-from sipchatserver.chatroom import ChatRoom
+from sipchatserver.chatroom import Reception
 from sipchatserver.tls import Certificate, PrivateKey
 
@@ -59,6 +59,6 @@
         reactor.addSystemEventTrigger('before', 'shutdown', shutdown)
         logger = TrafficLogger.to_file(is_enabled_func = lambda: options.trace_msrp)
-        room = ChatRoom(logger)
-        room.start_accept_incoming(e, options.relay, server_uri)
+        reception = Reception(logger)
+        proc.spawn_link_exception(reception.accept_incoming_loop, e, options.relay, server_uri)
 
     def run_reactor(self):
Index: debian/control
===================================================================
--- debian/control	(revision 9)
+++ debian/control	(revision 11)
@@ -10,3 +10,3 @@
 Architecture: all
 Depends: ${python:Depends}, sipclient, python-msrplib, python-application, python-gnutls
-Description: SIP Chat Server
+Description: SIP Chat Server - Conference bridge for MSRP chat and RTP audio sessions
Index: debian/copyright
===================================================================
--- debian/copyright	(revision 9)
+++ debian/copyright	(revision 11)
@@ -1,4 +1,6 @@
 Copyright (c) 2008-2009 AG Projects 
 http://ag-projects.com
+
+Author: Denis Bilenko
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY EXPRESS
@@ -13,4 +15,3 @@
 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-SIP Chat Server is licensed under GNU General Public License version 2.
-
+SIP chatserver is licensed under GNU General Public License version 2.
