Index: code/branches/objecthierarchy2/src/network/packet/Packet.cc
===================================================================
--- code/branches/objecthierarchy2/src/network/packet/Packet.cc	(revision 2174)
+++ code/branches/objecthierarchy2/src/network/packet/Packet.cc	(revision 2175)
@@ -129,7 +129,4 @@
       return false;
     }
-    // Assures we don't create a packet and destroy it right after in another thread
-    // without having a reference in the packetMap_
-    boost::recursive_mutex::scoped_lock lock(Packet::packetMap_mutex);
     // We deliver ENet the data address so that it doesn't memcpy everything again.
     // --> We have to delete data_ ourselves!
@@ -138,5 +135,10 @@
     // Add the packet to a global list so we can access it again once enet calls our
     // deletePacket method. We can of course only give a one argument function to the ENet C library.
-    packetMap_[(size_t)(void*)enetPacket_] = this;
+    {
+      // Assures we don't create a packet and destroy it right after in another thread
+      // without having a reference in the packetMap_
+      boost::recursive_mutex::scoped_lock lock(Packet::packetMap_mutex);
+      packetMap_[(size_t)(void*)enetPacket_] = this;
+    }
   }
 #ifndef NDEBUG
Index: code/branches/objecthierarchy2/src/orxonox/gamestates/GSDedicated.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/gamestates/GSDedicated.cc	(revision 2174)
+++ code/branches/objecthierarchy2/src/orxonox/gamestates/GSDedicated.cc	(revision 2175)
@@ -33,6 +33,12 @@
 #include "core/Core.h"
 #include "core/Iterator.h"
+#include "core/CoreIncludes.h"
+#include "core/ConfigValueIncludes.h"
+#include "util/Sleep.h"
 #include "network/Server.h"
 #include "objects/Tickable.h"
+
+const unsigned int  DEFAULT_DEDICATED_SERVER_TICKRATE = 25;
+const float         MIN_WIN32_SLEEP_TIME = 0.01; // scheduler limited
 
 namespace orxonox
@@ -42,4 +48,7 @@
         , server_(0)
     {
+        RegisterObject(GSDedicated);
+        
+        this->setConfigValues();
     }
 
@@ -53,5 +62,5 @@
 
         this->server_ = new Server(CommandLine::getValue("port"));
-        COUT(0) << "Loading scene in server mode" << std::endl;
+        COUT(0) << "Loading scene in dedicated server mode" << std::endl;
 
         GSLevel::enter(0);
@@ -72,7 +81,40 @@
     void GSDedicated::ticked(const Clock& time)
     {
+        static int timeSinceLastTick = 0; // in microseconds
+        const int tickPeriod = 1000000. / this->tickrate_; // in microseconds
+        
         GSLevel::ticked(time);
-        server_->tick(time.getDeltaTime());
+        
+        timeSinceLastTick += time.getDeltaTimeMicroseconds();
+        if ( timeSinceLastTick >= tickPeriod )
+        {
+            server_->tick( timeSinceLastTick );
+            //timeSinceLastTick -= static_cast<unsigned int>( timeSinceLastTick / tickPeriod ) * tickPeriod;
+            timeSinceLastTick = 0;
+        }
+        else
+        {
+            unsigned int sleepTime;
+            
+#if ORXONOX_PLATFORM == ORXONOX_PLATFORM_WIN32
+            if ( tickPeriod-timeSinceLastTick < MIN_WIN32_SLEEP_TIME )
+                sleepTime = MIN_WIN32_SLEEP_TIME*1000000;
+            else
+                sleepTime = tickPeriod - timeSinceLastTick;
+            msleep( sleepTime / 1000 );
+            
+#else /* unix */
+            sleepTime = tickPeriod - timeSinceLastTick;
+            usleep( sleepTime );
+#endif
+            
+        }
+        
         this->tickChild(time);
     }
+    
+    void GSDedicated::setConfigValues()
+    {
+        SetConfigValue ( tickrate_, DEFAULT_DEDICATED_SERVER_TICKRATE );
+    }
 }
Index: code/branches/objecthierarchy2/src/orxonox/gamestates/GSDedicated.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/gamestates/GSDedicated.h	(revision 2174)
+++ code/branches/objecthierarchy2/src/orxonox/gamestates/GSDedicated.h	(revision 2175)
@@ -39,7 +39,9 @@
     class _OrxonoxExport GSDedicated : public GameState<GSRoot>, public GSLevel
     {
+    friend class ClassIdentifier<GSDedicated>;
     public:
         GSDedicated();
         ~GSDedicated();
+        
 
     private:
@@ -47,6 +49,9 @@
         void leave();
         void ticked(const Clock& time);
+        
+        void setConfigValues();
 
         Server*      server_;
+        unsigned int tickrate_;
     };
 }
