Index: pokernetwork/pokertable.py
===================================================================
--- pokernetwork/pokertable.py	(revision 6417)
+++ pokernetwork/pokertable.py	(working copy)
@@ -692,7 +692,7 @@
                 for (serial, seat) in quitters:
                     self.factory.leavePlayer(serial, game.id, self.currency_serial)
                     for avatar in self.avatar_collection.get(serial)[:]:
-                        self.seated2observer(avatar)
+                        self.seated2observer(avatar, serial)
 
     def cashGame_kickPlayerSittingOutTooLong(self, historyToSearch):
         if self.tourney: return
@@ -955,8 +955,10 @@
     def isRunning(self):
         return self.game.isRunning()
 
-    def seated2observer(self, avatar):
-        self.avatar_collection.remove(avatar.getSerial(), avatar)
+    def seated2observer(self, avatar, serial):
+        if avatar.getSerial() != serial:
+            self.error("pokertable.seated2observer: avatar.user.serial (%d) doesn't match serial argument (%d)" % (avatar.getSerial(), serial))
+        self.avatar_collection.remove(serial, avatar)
         self.observers.append(avatar)
 
     def observer2seated(self, avatar):
@@ -976,7 +978,7 @@
             #
             if self.isOpen():
                 if avatar.removePlayer(self, serial):
-                    self.seated2observer(avatar)
+                    self.seated2observer(avatar, serial)
                     self.factory.leavePlayer(serial, game.id, self.currency_serial)
                     self.factory.updateTableStats(game, len(self.observers), len(self.waiting))
                 else:
@@ -1007,7 +1009,7 @@
         self.factory.updateTableStats(game, len(self.observers), len(self.waiting))
 
         for avatar in self.avatar_collection.get(serial)[:]:
-            self.seated2observer(avatar)
+            self.seated2observer(avatar, serial)
 
         self.broadcast(PacketPokerPlayerLeave(game_id = game.id,
                                               serial = serial,
@@ -1023,7 +1025,7 @@
                 # If not on a closed table, stand up.
                 #
                 if avatar.removePlayer(self, serial):
-                    self.seated2observer(avatar)
+                    self.seated2observer(avatar, serial)
                     self.factory.leavePlayer(serial, game.id, self.currency_serial)
                     self.factory.updateTableStats(game, len(self.observers), len(self.waiting))
                 else:
@@ -1057,7 +1059,7 @@
             #
             if self.isOpen():
                 if avatar.removePlayer(self, serial):
-                    self.seated2observer(avatar)
+                    self.seated2observer(avatar, serial)
                     self.factory.leavePlayer(serial, game.id, self.currency_serial)
                     self.factory.updateTableStats(game, len(self.observers), len(self.waiting))
                 else:
Index: tests/test-pokertable.py.in
===================================================================
--- tests/test-pokertable.py.in	(revision 6417)
+++ tests/test-pokertable.py.in	(working copy)
@@ -1289,7 +1289,7 @@
     def test40_destroy_table_with_observers(self):
         """Test table destruction with observers at the table"""
         p1 = self.createPlayer(1, clientClass=MockClientWithTableDict)
-        self.table.seated2observer(p1)
+        self.table.seated2observer(p1, 1)
         d = p1.waitFor(PACKET_POKER_TABLE_DESTROY)
         self.table.destroy()
          # Make sure we can't update once table is destroyed.
@@ -1457,7 +1457,17 @@
         self.table.syncDatabase = lambda: None
         self.table.muckTimeoutTimer()
         self.assertEquals([], self.table.game.muckable_serials)
-
+    # -------------------------------------------------------------------
+    def test49_seated2observer_bug(self):
+        a = self.createPlayer(1)
+        a.getSerial = lambda: 0
+        self.message = ""
+        def error(message):
+            self.message = message
+        self.table.error = error
+        self.table.seated2observer(a, 1)
+        self.assertEquals("pokertable.seated2observer: avatar.user.serial (0) doesn't match serial argument (1)", self.message)
+    
 # -------------------------------------------------------------------
 
 # I seriously considered not having *all* the same tests run with
