Index: /branches/new_class_id/src/lib/coord/p_node.cc
===================================================================
--- /branches/new_class_id/src/lib/coord/p_node.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/coord/p_node.cc	(revision 9691)
@@ -729,5 +729,5 @@
   if (likely(PNode::nullParent == NULL))
   {
-    PNode::nullParent = new PNode(NULL, PNODE_PARENT_MODE_DEFAULT | PNODE_REPARENT_TO_NULL);
+    PNode::nullParent = new NullParent();
     //PNode::nullParent->registerObject(, CL_NULL_PARENT);
     PNode::nullParent->setName("NullParent");
@@ -1105,3 +1105,9 @@
 }
 
-
+NewObjectListDefinition(NullParent);
+
+NullParent::NullParent()
+  : PNode(NULL, PNODE_PARENT_MODE_DEFAULT | PNODE_REPARENT_TO_NULL)
+{
+  this->registerObject(this, NullParent::_objectList);
+}
Index: /branches/new_class_id/src/lib/coord/p_node.h
===================================================================
--- /branches/new_class_id/src/lib/coord/p_node.h	(revision 9690)
+++ /branches/new_class_id/src/lib/coord/p_node.h	(revision 9691)
@@ -50,5 +50,5 @@
   PNODE_REPARENT_DELETE_CHILDREN       = 0x0040,    //!< Deletes the Children of the node when This Node is Removed. (Use with care).
   /// FIXME
-   PNODE_REPARENT_KEEP_POSITION         = 0x0080,    //!< Tries to keep the Position if the Node is reparented.
+  PNODE_REPARENT_KEEP_POSITION         = 0x0080,    //!< Tries to keep the Position if the Node is reparented.
 
 
@@ -73,8 +73,9 @@
 
 //! Patent Node is a Engine to calculate the position of an Object in respect to the position of its parent.
-class PNode : virtual public BaseObject, virtual public Synchronizeable {
+class PNode : virtual public BaseObject, virtual public Synchronizeable
+{
   NewObjectListDeclaration(PNode);
 
-  public:
+public:
   PNode (PNode* parent = PNode::getNullParent(), long nodeFlags = PNODE_PARENT_MODE_DEFAULT);
   virtual ~PNode ();
@@ -97,5 +98,5 @@
   inline const Vector& getRelCoor () const { return this->prevRelCoordinate; };
   /** @returns the Relative Coordinate Destination */
-  inline const Vector& getRelCoorSoft2D() const { return (this->toCoordinate)? *this->toCoordinate : this->relCoordinate; };
+inline const Vector& getRelCoorSoft2D() const { return (this->toCoordinate)? *this->toCoordinate : this->relCoordinate; };
   void setAbsCoor (const Vector& absCoord);
   void setAbsCoor (float x, float y, float z);
@@ -132,5 +133,5 @@
   inline const Quaternion& getRelDir () const { return this->prevRelDirection; };
   /** @returns the Relative Directional Destination */
-  inline const Quaternion& getRelDirSoft2D() const { return (this->toDirection)? *this->toDirection : this->relDirection; };
+inline const Quaternion& getRelDirSoft2D() const { return (this->toDirection)? *this->toDirection : this->relDirection; };
   /** @returns a Vector pointing into the relative Direction */
   inline Vector getRelDirV() const { return this->prevRelDirection.apply(Vector(0,1,0)); };
@@ -180,7 +181,6 @@
   void removeNodeFlags(unsigned short nodeFlags);
 
-  // NULL_PARENT //
   /** @returns the NullParent, the (main) ROOT of the PNode Tree. If it does not yet exist, it will be created. */
-  static PNode* getNullParent()  { return (PNode::nullParent != NULL)? PNode::nullParent : PNode::createNullParent(); };
+static PNode* getNullParent()  { return (PNode::nullParent != NULL) ? PNode::nullParent : PNode::createNullParent(); };
 
   // UPDATING //
@@ -197,13 +197,13 @@
   float distance(const PNode* node) const { return (this->getAbsCoor() - node->getAbsCoor()).len(); };
 
- private:
+private:
   /** tells the child that the parent's Coordinate has changed */
   inline void parentCoorChanged () { this->bRelCoorChanged = true; }
   /** tells the child that the parent's Direction has changed */
   inline void parentDirChanged () { this->bRelDirChanged = true; }
- public:
+public:
   /** @returns the last calculated coordinate */
   inline Vector getLastAbsCoor() { return this->lastAbsCoordinate; }
- private:
+private:
   static PNode* createNullParent();
   void reparent();
@@ -211,5 +211,5 @@
   void eraseChild(PNode* child);
 
- private:
+private:
   bool               bRelCoorChanged;    //!< If Relative Coordinate has changed since last time we checked
   bool               bRelDirChanged;     //!< If Relative Direction has changed since last time we checked
@@ -223,5 +223,5 @@
   Vector             lastAbsCoordinate;  //!< this is used for speedcalculation, it stores the last coordinate
   Quaternion         prevRelDirection;   //!< The last Relative Direciton from the last update-Cycle.
-//  Quaternion         lastAbsDirection;
+  //  Quaternion         lastAbsDirection;
 
   Vector             velocity;           //!< Saves the velocity.
@@ -240,23 +240,32 @@
   static PNode*      nullParent;         //!< The ROOT of the main PNode Tree.
 
-  private:
-    float coorx;
-    float coory;
-    float coorz;
-
-    float rotw;
-    float rotx;
-    float roty;
-    float rotz;
-
-  private:
-    int relCoordinate_handle;
-    int relDirection_handle;
-    Vector relCoordinate_write;
-    Quaternion relDirection_write;
-
-  public:
-    virtual void varChangeHandler( std::list<int> & id );
+private:
+  float coorx;
+  float coory;
+  float coorz;
+
+  float rotw;
+  float rotx;
+  float roty;
+  float rotz;
+
+private:
+  int relCoordinate_handle;
+  int relDirection_handle;
+  Vector relCoordinate_write;
+  Quaternion relDirection_write;
+
+public:
+  virtual void varChangeHandler( std::list<int> & id );
 };
 
+// NULL_PARENT //
+class NullParent : public PNode
+{
+  NewObjectListDeclaration(NullParent);
+  friend class PNode;
+  NullParent();
+};
+
+
 #endif /* _P_NODE_H */
Index: /branches/new_class_id/src/lib/lang/base_object.cc
===================================================================
--- /branches/new_class_id/src/lib/lang/base_object.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/lang/base_object.cc	(revision 9691)
@@ -21,4 +21,6 @@
 #include "util/loading/load_param.h"
 
+NewObjectListDefinition(BaseObject);
+
 /**
  * @brief sets the name from a LoadXML-Element
@@ -26,4 +28,5 @@
  */
 BaseObject::BaseObject(const std::string& objectName)
+  : _leafClassID(&BaseObject::classID())
 {
   this->className = "BaseObject";
Index: /branches/new_class_id/src/lib/lang/base_object.h
===================================================================
--- /branches/new_class_id/src/lib/lang/base_object.h	(revision 9690)
+++ /branches/new_class_id/src/lib/lang/base_object.h	(revision 9691)
@@ -26,5 +26,5 @@
 class BaseObject : public sigslot::has_slots<>
 {
-
+  NewObjectListDeclaration(BaseObject);
 public:
   BaseObject (const std::string& objectName = "");
@@ -49,5 +49,5 @@
 
   /** @returns the ID of the Topmost object of the ClassStack */
-  inline int getLeafClassID() const { return _classes.front()._objectList->id(); }
+  inline const int& getLeafClassID() const { return _leafClassID->id(); }
 
   bool isA(const NewObjectListBase& objectList) const;
@@ -88,5 +88,5 @@
   std::string                         className;    //!< the name of the class
   ClassList                           _classes;     //!< All Classes this object is part of.
-
+  const NewClassID*                       _leafClassID;  //!< Topmost ClassID.
 };
 
@@ -104,4 +104,5 @@
 inline void BaseObject::registerObject(T* object, NewObjectList<T>& objectList)
 {
+  this->_leafClassID = &objectList.identity();
   this->_classes.push_front(ClassEntry(&objectList, objectList.registerObject(object)));
 }
Index: /branches/new_class_id/src/lib/lang/new_class_id.h
===================================================================
--- /branches/new_class_id/src/lib/lang/new_class_id.h	(revision 9690)
+++ /branches/new_class_id/src/lib/lang/new_class_id.h	(revision 9691)
@@ -17,5 +17,5 @@
   NewClassID(int id, const std::string& name) : _id(id), _name(name) { };
   // the copy constructor is also defined.
-  int id() const { return _id; };
+  const int& id() const { return _id; };
   const std::string& name() const { return _name; };
 
@@ -23,4 +23,7 @@
   bool operator==(int id) const { return _id == id; };
   bool operator==(const std::string& name) const { return _name == name; };
+  bool operator!=(NewClassID id) const { return _id != id._id && _name != id._name; };
+  bool operator!=(int id) const { return _id != id; };
+  bool operator!=(const std::string& name) const { return _name != name; };
 
 private:
Index: /branches/new_class_id/src/lib/lang/new_object_list.h
===================================================================
--- /branches/new_class_id/src/lib/lang/new_object_list.h	(revision 9690)
+++ /branches/new_class_id/src/lib/lang/new_object_list.h	(revision 9691)
@@ -25,5 +25,5 @@
   public: \
    static inline const NewObjectList<ClassName>& objectList() { return ClassName::_objectList; }; \
-   static inline const NewClassID classID() { return ClassName::_objectList.identity(); }; \
+   static inline const NewClassID& classID() { return ClassName::_objectList.identity(); }; \
   private: \
    static NewObjectList<ClassName> _objectList
Index: /branches/new_class_id/src/lib/network/data_stream.cc
===================================================================
--- /branches/new_class_id/src/lib/network/data_stream.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/data_stream.cc	(revision 9691)
@@ -27,5 +27,4 @@
 DataStream::DataStream()
 {
-  this->setClassID(CL_DATA_STREAM, "DataStream");
   this->upBuffer = new byte[DATA_STREAM_BUFFER_SIZE];
   this->downBuffer = new byte[DATA_STREAM_BUFFER_SIZE];
@@ -37,5 +36,5 @@
 DataStream::DataStream(DataStream& inStream, DataStream& outStream)
 {
-    this->setClassID(CL_DATA_STREAM, "DataStream");
+  this->registerObject(this, DataStream::_objectList);
     this->downStream = &outStream;
     this->upStream = &inStream;
Index: /branches/new_class_id/src/lib/network/handshake.cc
===================================================================
--- /branches/new_class_id/src/lib/network/handshake.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/handshake.cc	(revision 9691)
@@ -30,5 +30,5 @@
 {
   /* set the class id for the base object */
-  this->setClassID(CL_HANDSHAKE, "Handshake");
+  this->registerObject(this, Handshake::_objectList);
 
 
Index: /branches/new_class_id/src/lib/network/message_manager.cc
===================================================================
--- /branches/new_class_id/src/lib/network/message_manager.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/message_manager.cc	(revision 9691)
@@ -37,5 +37,5 @@
 MessageManager::MessageManager ()
 {
-  this->setClassID( CL_MESSAGE_MANAGER, "MessageManager" );
+  this->registerObject(this, MessageManager::_objectList);
   newNumber = 1;
   setSynchronized( true );
Index: /branches/new_class_id/src/lib/network/monitor/connection_monitor.cc
===================================================================
--- /branches/new_class_id/src/lib/network/monitor/connection_monitor.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/monitor/connection_monitor.cc	(revision 9691)
@@ -31,5 +31,5 @@
 {
   /* set the class id for the base object and add ist to class list*/
-  this->setClassID(CL_CONNECTION_MONITOR, "ConnectionMonitor");
+  this->registerObject(this, ConnectionMonitor::_objectList);
 
   this->userId = userId;
Index: /branches/new_class_id/src/lib/network/monitor/network_monitor.cc
===================================================================
--- /branches/new_class_id/src/lib/network/monitor/network_monitor.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/monitor/network_monitor.cc	(revision 9691)
@@ -46,5 +46,5 @@
   : Synchronizeable()
 {
-  this->setClassID(CL_NETWORK_MONITOR, "NetworkMonitor");
+  this->registerObject(this, NetworkMonitor::_objectList);
 
   this->networkStream = networkStream;
Index: /branches/new_class_id/src/lib/network/monitor/network_stats_widget.cc
===================================================================
--- /branches/new_class_id/src/lib/network/monitor/network_stats_widget.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/monitor/network_stats_widget.cc	(revision 9691)
@@ -274,16 +274,13 @@
 NetworkStatsWidget* NetworkStatsWidget::_statsWidget = NULL;
 
-#include "class_list.h"
-
 void NetworkStatsWidget::toggleGUI()
 {
-  BaseObject* bo = NULL;
-  const std::list<BaseObject*>* ls = ClassList::getList(CL_NETWORK_MONITOR);
-  if (ls != NULL && !ls->empty())
-    bo = ls->front();
-
-  if (bo != NULL && NetworkStatsWidget::_statsWidget == NULL)
-  {
-    NetworkStatsWidget::_statsWidget = new NetworkStatsWidget(dynamic_cast<NetworkMonitor*> (bo));
+  NetworkMonitor* monitor;
+  if (!NetworkMonitor::objectList().empty())
+    monitor = NetworkMonitor::objectList().front();
+
+  if (monitor != NULL && NetworkStatsWidget::_statsWidget == NULL)
+  {
+    NetworkStatsWidget::_statsWidget = new NetworkStatsWidget(monitor);
     NetworkStatsWidget::_statsWidget->showAll();
   }
Index: /branches/new_class_id/src/lib/network/monitor/network_stats_widget.h
===================================================================
--- /branches/new_class_id/src/lib/network/monitor/network_stats_widget.h	(revision 9690)
+++ /branches/new_class_id/src/lib/network/monitor/network_stats_widget.h	(revision 9691)
@@ -20,5 +20,4 @@
 class HostWidget : public OrxGui::GLGuiBox
 {
-  NewObjectListDeclaration(HostWidget);
   public:
     HostWidget(const std::string& name, const IP& ip);
@@ -82,4 +81,5 @@
 class NetworkStatsWidget : public OrxGui::GLGuiFixedpositionBox
 {
+  NewObjectListDeclaration(NetworkStatsWidget);
   public:
     static void toggleGUI();
Index: /branches/new_class_id/src/lib/network/network_game_manager.cc
===================================================================
--- /branches/new_class_id/src/lib/network/network_game_manager.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/network_game_manager.cc	(revision 9691)
@@ -23,5 +23,4 @@
 #include "util/loading/factory.h"
 #include "state.h"
-#include "class_list.h"
 #include "debug.h"
 
@@ -59,5 +58,5 @@
 
   /* set the class id for the base object */
-  this->setClassID(CL_NETWORK_GAME_MANAGER, "NetworkGameManager");
+  this->registerObject(this, NetworkGameManager::_objectList);
 
   this->setSynchronized(true);
@@ -93,10 +92,10 @@
   assert( SharedNetworkData::getInstance()->isMasterServer());
   assert( State::getGameRules() );
-  assert( State::getGameRules()->isA( CL_NETWORK_GAME_RULES ) );
+  assert( State::getGameRules()->isA( NetworkGameRules::classID()) );
 
   NetworkGameRules & rules = *(dynamic_cast<NetworkGameRules*>(State::getGameRules()));
 
   int          team = rules.getTeamForNewUser();
-  ClassID      playableClassId = rules.getPlayableClassId( userId, team );
+  NewClassID   playableClassId = rules.getPlayableClassId( userId, team );
   std::string  playableModel = rules.getPlayableModelFileName( userId, team, playableClassId );
   std::string  playableTexture = rules.getPlayableModelFileName( userId, team, playableClassId );
@@ -106,5 +105,5 @@
 
   assert( bo != NULL );
-  assert( bo->isA( CL_PLAYABLE ) );
+  assert( bo->isA( Playable::classID()) );
 
   Playable & playable = *(dynamic_cast<Playable*>(bo));
@@ -131,5 +130,5 @@
     stats->setNickName( Preferences::getInstance()->getString( "multiplayer", "nickname", "Server" ) );
 
-  if ( rules.isA( CL_MULTIPLAYER_TEAM_DEATHMATCH ) )
+  if ( rules.isA( MultiplayerTeamDeathmatch::classID()) )
     dynamic_cast<MultiplayerTeamDeathmatch*>(&rules)->respawnPlayable( &playable, team, 0.0f );
 
@@ -187,11 +186,11 @@
   }
 
-  const std::list<BaseObject*> * list = ClassList::getList( CL_SYNCHRONIZEABLE );
-
-  for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
-  {
-    if ( dynamic_cast<Synchronizeable*>(*it)->getUniqueID() == uniqueId )
+  for (NewObjectList<Synchronizeable>::const_iterator it = Synchronizeable::objectList().begin();
+       it != Synchronizeable::objectList().end();
+      ++it)
+  {
+    if ( (*it)->getUniqueID() == uniqueId )
     {
-      if ( (*it)->isA(CL_PLAYABLE) )
+      if ( (*it)->isA(Playable::classID()) )
       {
         getInstance()->playablesToDelete.push_back( dynamic_cast<Playable*>(*it) );
@@ -199,5 +198,5 @@
       }
 
-      delete dynamic_cast<Synchronizeable*>(*it);
+      delete (*it);
       return true;
     }
@@ -297,7 +296,5 @@
     if ( State::getPlayer()->getPlayable() != *it )
     {
-      const std::list<BaseObject*> * list = ClassList::getList( CL_PLAYABLE );
-
-      if ( list && std::find( list->begin(), list->end(), *it ) != list->end() )
+      if ( std::find( Playable::objectList().begin(), Playable::objectList().end(), *it ) != Playable::objectList().end() )
       {
         PRINTF(0)("Delete unused playable: %s owner: %d\n", (*it)->getClassCName(), (*it)->getOwner() );
@@ -324,5 +321,5 @@
 
   assert( State::getGameRules() );
-  assert( State::getGameRules()->isA( CL_NETWORK_GAME_RULES ) );
+  assert( State::getGameRules()->isA( NetworkGameRules::classID()) );
 
   NetworkGameRules & rules = *(dynamic_cast<NetworkGameRules*>(State::getGameRules()));
Index: /branches/new_class_id/src/lib/network/network_manager.cc
===================================================================
--- /branches/new_class_id/src/lib/network/network_manager.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/network_manager.cc	(revision 9691)
@@ -20,5 +20,4 @@
 #define DEBUG_MODULE_NETWORK
 
-#include "class_list.h"
 #include "debug.h"
 #include "shell_command.h"
@@ -50,5 +49,5 @@
 {
   /* set the class id for the base object */
-  this->setClassID(CL_NETWORK_MANAGER, "NetworkManager");
+  this->registerObject(this, NetworkManager::_objectList);
   PRINTF(0)("START\n");
 
Index: /branches/new_class_id/src/lib/network/network_protocol.cc
===================================================================
--- /branches/new_class_id/src/lib/network/network_protocol.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/network_protocol.cc	(revision 9691)
@@ -35,5 +35,5 @@
 
 
-NewObjectListDefinition(NetworkManager);
+NewObjectListDefinition(NetworkProtocol);
 /**
   standard constructor
@@ -42,5 +42,5 @@
 {
   /* set the class id for the base object */
-  this->setClassID(CL_NETWORK_PROTOCOL, "NetworkProtocol");
+  this->registerObject(this, NetworkProtocol::_objectList);
   this->headerLength = INTSIZE+FLOATSIZE;
 }
Index: /branches/new_class_id/src/lib/network/network_stream.cc
===================================================================
--- /branches/new_class_id/src/lib/network/network_stream.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/network_stream.cc	(revision 9691)
@@ -45,7 +45,4 @@
 
 #include "debug.h"
-#include "class_list.h"
-#include <algorithm>
-
 
 #include "network_stream.h"
@@ -118,5 +115,5 @@
 {
   /* set the class id for the base object */
-  this->setClassID(CL_NETWORK_STREAM, "NetworkStream");
+  this->registerObject(this, NetworkStream::_objectList);
   this->clientSocket = NULL;
   this->clientSoftSocket = NULL;
@@ -970,5 +967,5 @@
 
       // if handshake not finished only sync handshake
-      if ( peer->second.handshake && sync.getLeafClassID() != CL_HANDSHAKE )
+      if ( peer->second.handshake && Handshake::classID() != sync.getLeafClassID())
         continue;
 
@@ -976,10 +973,10 @@
       if ( ( SharedNetworkData::getInstance()->isMasterServer() ||
              SharedNetworkData::getInstance()->isProxyServerActive() &&  peer->second.isClient())
-             && sync.getLeafClassID() == CL_HANDSHAKE && sync.getUniqueID() != peer->second.userId )
+	     && Handshake::classID() == sync.getLeafClassID() && sync.getUniqueID() != peer->second.userId )
         continue;
 
       /* list of synchronizeables that will never be synchronized over the network: */
       // do not sync null parent
-      if ( sync.getLeafClassID() == CL_NULL_PARENT )
+      if ( NullParent::classID() == sync.getLeafClassID())
         continue;
 
@@ -1190,5 +1187,5 @@
           /* These are some small exeptions in creation: Not all objects can/should be created via Factory */
           /* Exception 1: NullParent */
-          if( leafClassId == CL_NULL_PARENT || leafClassId == CL_SYNCHRONIZEABLE || leafClassId == CL_NETWORK_GAME_MANAGER )
+	  if( NullParent::classID() == leafClassId || Synchronizeable::classID() == leafClassId || NetworkGameManager::classID() == leafClassId)
           {
             PRINTF(1)("Don't create Object with ID %x, ignored!\n", (int)leafClassId);
@@ -1197,5 +1194,5 @@
           }
           else
-            b = Factory::fabricate( (ClassID)leafClassId );
+            b = Factory::fabricate( leafClassId );
 
           if ( !b )
@@ -1206,5 +1203,5 @@
           }
 
-          if ( b->isA(CL_SYNCHRONIZEABLE) )
+	  if ( b->isA(Synchronizeable::classID()) )
           {
             sync = dynamic_cast<Synchronizeable*>(b);
Index: /branches/new_class_id/src/lib/network/player_stats.cc
===================================================================
--- /branches/new_class_id/src/lib/network/player_stats.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/player_stats.cc	(revision 9691)
@@ -16,8 +16,8 @@
 #include "player_stats.h"
 
-#include "class_list.h"
 #include "src/lib/util/loading/factory.h"
 
 #include "player.h"
+#include "playable.h"
 #include "state.h"
 #include "shared_network_data.h"
@@ -55,5 +55,5 @@
 void PlayerStats::init( )
 {
-  this->setClassID( CL_PLAYER_STATS, "PlayerStats" );
+  this->registerObject(this, PlayerStats::_objectList);
 
   this->assignedUserId = 0;
@@ -123,21 +123,11 @@
 PlayerStats * PlayerStats::getStats( int userId )
 {
-  const std::list<BaseObject*> * list = ClassList::getList( CL_PLAYER_STATS );
-
-  if ( !list )
-  {
-    return NULL;
-  }
-
-  for ( std::list<BaseObject*>::const_iterator it = list->
-        begin();
-        it != list->end();
-        it++ )
-  {
-
-
-    if ( dynamic_cast<PlayerStats*>(*it)->getAssignedUserId() == userId )
+  for (NewObjectList<PlayerStats>::const_iterator it = PlayerStats::objectList().begin();
+       it != PlayerStats::objectList().end();
+       ++it)
+  {
+    if ( (*it)->getAssignedUserId() == userId )
     {
-      return dynamic_cast<PlayerStats*>(*it);
+      return (*it);
     }
   }
@@ -151,22 +141,12 @@
 void PlayerStats::setPlayableUniqueId( int uniqueId )
 {
-  const std::list<BaseObject*> * list = ClassList::getList( CL_PLAYABLE );
-
-  if ( !list )
-  {
-    this->playableUniqueId = uniqueId;
-    return;
-  }
-
   this->playable = NULL;
-  for ( std::list<BaseObject*>::const_iterator it = list->
-        begin();
-        it != list->end();
-        it++ )
-  {
-    if ( dynamic_cast<Playable*>(*it)->
-         getUniqueID() == uniqueId )
+  for (NewObjectList<Playable>::const_iterator it = Playable::objectList().begin();
+       it != Playable::objectList().end();
+       ++it)
+  {
+    if ( (*it)->getUniqueID() == uniqueId )
     {
-      this->playable = dynamic_cast<Playable*>(*it);
+      this->playable = (*it);
       //TODO when OM_PLAYERS is ticked add line:
       //this->playable->toList( OM_PLAYERS );
@@ -175,6 +155,5 @@
   }
 
-  if ( this->playable && this->assignedUserId == SharedNetworkData::getInstance()
-       ->getHostID() )
+  if ( this->playable && this->assignedUserId == SharedNetworkData::getInstance()->getHostID() )
   {
     State::getPlayer()->setPlayable( this->playable );
@@ -273,8 +252,7 @@
 void PlayerStats::deleteAllPlayerStats( )
 {
-  const std::list<BaseObject*> * list;
-
-  while ( (list  = ClassList::getList( CL_PLAYER_STATS )) != NULL && list->begin() != list->end() )
-    delete *list->begin();
+
+  while(!PlayerStats::objectList().empty())
+    delete PlayerStats::objectList().front();
 }
 
@@ -288,17 +266,9 @@
   ScoreList result;
 
-  const std::list<BaseObject*> * list = ClassList::getList( CL_PLAYER_STATS );
-
-  if ( !list )
-  {
-    return result;
-  }
-
-  for ( std::list<BaseObject*>::const_iterator it = list->
-        begin();
-        it != list->end();
-        it++ )
-  {
-    PlayerStats & stats = *dynamic_cast<PlayerStats*>(*it);
+  for (NewObjectList<PlayerStats>::const_iterator it = PlayerStats::objectList().begin();
+       it != PlayerStats::objectList().end();
+       ++it)
+  {
+    PlayerStats& stats = *(*it);
 
     TeamScoreList::iterator it = result[stats.getTeamId()].begin();
Index: /branches/new_class_id/src/lib/network/player_stats.h
===================================================================
--- /branches/new_class_id/src/lib/network/player_stats.h	(revision 9690)
+++ /branches/new_class_id/src/lib/network/player_stats.h	(revision 9691)
@@ -58,5 +58,5 @@
 
     inline int getPlayableClassId(){ return playableClassId; }
-    void setPlayableClassId( int classId ){ this->playableClassId = classId; };
+    void setPlayableClassId( const NewClassID& classId ){ this->playableClassId = classId.id(); };
 
     inline int getPlayableUniqueId(){ return playableUniqueId; }
Index: /branches/new_class_id/src/lib/network/proxy/network_settings.cc
===================================================================
--- /branches/new_class_id/src/lib/network/proxy/network_settings.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/proxy/network_settings.cc	(revision 9691)
@@ -37,5 +37,5 @@
 {
   /* set the class id for the base object */
-  this->setClassID(CL_NETWORK_SETTINGS, "NetworkSettings");
+  this->registerObject(this, NetworkSettings::_objectList);
 
   // suggest a good standard max players value
Index: /branches/new_class_id/src/lib/network/proxy/proxy_control.cc
===================================================================
--- /branches/new_class_id/src/lib/network/proxy/proxy_control.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/proxy/proxy_control.cc	(revision 9691)
@@ -15,5 +15,4 @@
 #include "proxy_control.h"
 
-#include "class_list.h"
 #include "shell_command.h"
 
@@ -48,5 +47,5 @@
 ProxyControl::ProxyControl()
 {
-  this->setClassID( CL_PROXY_CONTROL, "ProxyControl" );
+  this->registerObject(this, ProxyControl::_objectList);
 
   this->setSynchronized(false);
Index: /branches/new_class_id/src/lib/network/shared_network_data.cc
===================================================================
--- /branches/new_class_id/src/lib/network/shared_network_data.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/shared_network_data.cc	(revision 9691)
@@ -34,5 +34,5 @@
 {
   /* set the class id for the base object */
-  this->setClassID(CL_SHARED_NETWORK_DATA, "SharedNetworkData");
+  this->registerObject(this, SharedNetworkData::_objectList);
 
   this->nodeType = NET_MASTER_SERVER;
Index: /branches/new_class_id/src/lib/network/synchronizeable.cc
===================================================================
--- /branches/new_class_id/src/lib/network/synchronizeable.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/synchronizeable.cc	(revision 9691)
@@ -75,5 +75,5 @@
     // remove the message manager only by the server
     if ( (SharedNetworkData::getInstance()->isMasterServer() )
-           && this->beSynchronized() && this->getUniqueID() > 0 && !this->isA( CL_MESSAGE_MANAGER ) )
+	  && this->beSynchronized() && this->getUniqueID() > 0 && !this->isA( MessageManager::classID() ) )
       NetworkGameManager::getInstance()->removeSynchronizeable( this->getUniqueID() );
   }
Index: /branches/new_class_id/src/lib/network/tcp_server_socket.cc
===================================================================
--- /branches/new_class_id/src/lib/network/tcp_server_socket.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/tcp_server_socket.cc	(revision 9691)
@@ -49,5 +49,5 @@
 {
   /* set the class id for the base object */
-  this->setClassID(CL_SERVER_SOCKET, "TcpServerSocket");
+  this->registerObject(this, TcpServerSocket::_objectList);
 
   terminateThread = false;
Index: /branches/new_class_id/src/lib/network/tcp_socket.cc
===================================================================
--- /branches/new_class_id/src/lib/network/tcp_socket.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/tcp_socket.cc	(revision 9691)
@@ -61,5 +61,5 @@
 {
   /* set the class id for the base object */
-  this->setClassID(CL_NETWORK_SOCKET, "TcpSocket");
+  this->registerObject(this, TcpSocket::_objectList);
 
   tcpSocket = NULL;
Index: /branches/new_class_id/src/lib/network/udp_broadcast.cc
===================================================================
--- /branches/new_class_id/src/lib/network/udp_broadcast.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/network/udp_broadcast.cc	(revision 9691)
@@ -18,5 +18,4 @@
 #include "udp_broadcast.h"
 
-NewObjectListDefinition(UdpBroadcast);
 /**
  * standard constructor
Index: /branches/new_class_id/src/lib/network/udp_broadcast.h
===================================================================
--- /branches/new_class_id/src/lib/network/udp_broadcast.h	(revision 9690)
+++ /branches/new_class_id/src/lib/network/udp_broadcast.h	(revision 9691)
@@ -15,5 +15,4 @@
 class UdpBroadcast
 {
-  NewObjectListDeclaration(UdpBroadcast);
   public:
     UdpBroadcast();
Index: /branches/new_class_id/src/lib/util/loading/factory.cc
===================================================================
--- /branches/new_class_id/src/lib/util/loading/factory.cc	(revision 9690)
+++ /branches/new_class_id/src/lib/util/loading/factory.cc	(revision 9691)
@@ -165,2 +165,13 @@
   return NULL;
 }
+
+
+/**
+ * @brief Creates a new Object of type classID
+ * @param classID the ClassID to match for the newly created Object
+ * @returns a new Object of Type classID on match, NULL otherwise
+ */
+BaseObject* Factory::fabricate(const NewClassID& classID)
+{
+  Factory::fabricate(classID.id());
+}
Index: /branches/new_class_id/src/lib/util/loading/factory.h
===================================================================
--- /branches/new_class_id/src/lib/util/loading/factory.h	(revision 9690)
+++ /branches/new_class_id/src/lib/util/loading/factory.h	(revision 9691)
@@ -47,4 +47,5 @@
 
   static  BaseObject* fabricate(const std::string& className);
+  static  BaseObject* fabricate(const NewClassID& classID);
   static  BaseObject* fabricate(int classID);
   static  BaseObject* fabricate(const TiXmlElement* root = NULL);
Index: /branches/new_class_id/src/util/multiplayer_team_deathmatch.h
===================================================================
--- /branches/new_class_id/src/util/multiplayer_team_deathmatch.h	(revision 9690)
+++ /branches/new_class_id/src/util/multiplayer_team_deathmatch.h	(revision 9691)
@@ -38,8 +38,8 @@
 
     virtual int getTeamForNewUser();
-    virtual ClassID getPlayableClassId( int userId, int team );
-    virtual std::string getPlayableModelTextureFileName( int userId, int team, ClassID classId );
-    virtual std::string getPlayableModelFileName( int userId, int team, ClassID classId );
-    virtual float getPlayableScale( int userId, int team, ClassID classId );
+    virtual const NewClassID& getPlayableClassId( int userId, int team );
+    virtual std::string getPlayableModelTextureFileName( int userId, int team, const NewClassID& classId );
+    virtual std::string getPlayableModelFileName( int userId, int team, const NewClassID& classId );
+    virtual float getPlayableScale( int userId, int team, const NewClassID& classId );
 
     virtual void registerSpawn( WorldEntity * we );
@@ -50,17 +50,17 @@
     inline void setDeathPenaltyTimeout(float time) { this->deathTimeout = time; }
     inline void setMaxKills(int kills) { this->maxKills = kills; }
-    
+
     inline void setNumTeams( int numTeams ){ this->numTeams = numTeams; }
     inline int getNumTeams(){ return this->numTeams; }
-    
+
     int getRandomTeam();
-    
+
     virtual void process(const Event &event);
-    
+
     void onKill( WorldEntity * victim, WorldEntity * killer );
     void onRespawn( int userId );
-    
+
     virtual void handleChatMessage( int userId, const std::string & message, int messageType );
-    
+
     void respawnPlayable( Playable * playable, int teamId, float delay );
 
@@ -84,7 +84,7 @@
 
     OrxGui::GLGuiBox* box;
-    
+
     OrxGui::GLGuiInputLine* input;
-    
+
     void calculateTeamScore();
     void nextGameState();
@@ -92,5 +92,5 @@
     void teamChange( int userId );
     void assignPlayable();
-    
+
     void onButtonSpectator();
     void onButtonRandom();
@@ -99,11 +99,11 @@
     void onButtonCancel();
     void onButtonExit();
-    
+
     void onInputEnter( const std::string & text );
-    
+
     OrxGui::GLGuiBox* statsBox;
     OrxGui::GLGuiTable* table;
     void tickStatsTable();
-    
+
     void showStats();
     void hideStats();
Index: /branches/new_class_id/src/util/network_game_rules.h
===================================================================
--- /branches/new_class_id/src/util/network_game_rules.h	(revision 9690)
+++ /branches/new_class_id/src/util/network_game_rules.h	(revision 9691)
@@ -19,15 +19,15 @@
     NetworkGameRules( const TiXmlElement* root );
     virtual ~NetworkGameRules();
-    
+
     virtual int getTeamForNewUser();
-    virtual ClassID getPlayableClassId( int userId, int team );
-    virtual std::string getPlayableModelFileName( int userId, int team, ClassID classId );
-    virtual std::string getPlayableModelTextureFileName( int userId, int team, ClassID classId );
-    virtual float getPlayableScale( int userId, int team, ClassID classId );
-    
+    virtual const NewClassID& getPlayableClassId( int userId, int team );
+    virtual std::string getPlayableModelFileName( int userId, int team, const NewClassID& classId );
+    virtual std::string getPlayableModelTextureFileName( int userId, int team, const NewClassID& classId );
+    virtual float getPlayableScale( int userId, int team, const NewClassID& classId );
+
     virtual PlayerStats * getNewPlayerStats( int userId ){ return new PlayerStats( userId ); }
-    
+
     virtual void handleChatMessage( int userId, const std::string & message, int messageType ) = 0;
-    
+
     void shellSay( const std::string & message );
 
Index: /branches/new_class_id/src/world_entities/playable.cc
===================================================================
--- /branches/new_class_id/src/world_entities/playable.cc	(revision 9690)
+++ /branches/new_class_id/src/world_entities/playable.cc	(revision 9691)
@@ -41,5 +41,5 @@
 SHELL_COMMAND_STATIC(orxoWeapon, Playable, Playable::addSomeWeapons_CHEAT)
   ->setAlias("orxoWeapon");
-
+NewObjectListDefinition(Playable)
 
 Playable::Playable()
@@ -48,5 +48,5 @@
     playmode(Playable::Full3D)
 {
-  this->setClassID(CL_PLAYABLE, "Playable");
+  this->registerObject(this, Playable::_classID);
   PRINTF(4)("PLAYABLE INIT\n");
 
Index: /branches/new_class_id/src/world_entities/playable.h
===================================================================
--- /branches/new_class_id/src/world_entities/playable.h	(revision 9690)
+++ /branches/new_class_id/src/world_entities/playable.h	(revision 9691)
@@ -27,4 +27,5 @@
 class Playable : public WorldEntity, public Extendable
 {
+  NewObjectListDeclaration(Playable);
 public:
   //! Defines the Playmode of an Entity.
