diff --git a/dep/include/mersennetwister/MersenneTwister.h b/dep/include/mersennetwister/MersenneTwister.h
--- a/dep/include/mersennetwister/MersenneTwister.h
+++ b/dep/include/mersennetwister/MersenneTwister.h
@@ -60,79 +60,79 @@
 // Not thread safe (unless auto-initialization is avoided and each thread has
 // its own MTRand object)
 
-#include"Platform/Define.h"
+#include "Platform/Define.h"
 
 #include <limits.h>
 #include <time.h>
 #include <math.h>
 
 class MTRand {
-// Data
-public:
-    typedef ::uint32 uint32;
-	enum { N = 624 };       // length of state vector
-	enum { SAVE = N + 1 };  // length of array for save()
+     // Data
+     public:
+         typedef ::uint32 uint32;
+ 	    enum { N = 624 };       // length of state vector
+ 	    enum { SAVE = N + 1 };  // length of array for save()
 
-protected:
-	enum { M = 397 };  // period parameter
+     protected:
+ 	    enum { M = 397 };  // period parameter
 	
-	uint32 state[N];   // internal state
-	uint32 *pNext;     // next value to get from state
-	int left;          // number of values left before reload needed
+ 	    uint32 state[N];   // internal state
+ 	    uint32 *pNext;     // next value to get from state
+ 	    int left;          // number of values left before reload needed
 
 
-//Methods
-public:
-	MTRand( const uint32& oneSeed );  // initialize with a simple uint32
-	MTRand( uint32 *const bigSeed, uint32 const seedLength = N );  // or an array
-	MTRand();                         // auto-initialize with /dev/urandom or time() and clock()
-	MTRand(const MTRand&);            // prevent copy constructor
-	MTRand& operator=(const MTRand&); // no-op operator=
-	
-	// Do NOT use for CRYPTOGRAPHY without securely hashing several returned
-	// values together, otherwise the generator state can be learned after
-	// reading 624 consecutive values.
-	
-	// Access to 32-bit random numbers
-	double rand();                          // real number in [0,1]
-	double rand( const double& n );         // real number in [0,n]
-	double randExc();                       // real number in [0,1)
-	double randExc( const double& n );      // real number in [0,n)
-	double randDblExc();                    // real number in (0,1)
-	double randDblExc( const double& n );   // real number in (0,n)
-	uint32 randInt();                       // integer in [0,2^32-1]
-	uint32 randInt( const uint32& n );      // integer in [0,n] for n < 2^32
-	double operator()() { return rand(); }  // same as rand()
-	
-	// Access to 53-bit random numbers (capacity of IEEE double precision)
-	double rand53();  // real number in [0,1)
-	
-	// Access to nonuniform random number distributions
-	double randNorm( const double& mean = 0.0, const double& variance = 0.0 );
-	
-	// Re-seeding functions with same behavior as initializers
-	void seed( const uint32 oneSeed );
-	void seed( uint32 *const bigSeed, const uint32 seedLength = N );
-	void seed();
-	
-	// Saving and loading generator state
-	void save( uint32* saveArray ) const;  // to array of size SAVE
-	void load( uint32 *const loadArray );  // from such array
-    /* Mangos not use streams for random values output
-	friend std::ostream& operator<<( std::ostream& os, const MTRand& mtrand );
-	friend std::istream& operator>>( std::istream& is, MTRand& mtrand );
-    */
-protected:
-	void initialize( const uint32 oneSeed );
-	void reload();
-	uint32 hiBit( const uint32& u ) const { return u & 0x80000000UL; }
-	uint32 loBit( const uint32& u ) const { return u & 0x00000001UL; }
-	uint32 loBits( const uint32& u ) const { return u & 0x7fffffffUL; }
-	uint32 mixBits( const uint32& u, const uint32& v ) const
-		{ return hiBit(u) | loBits(v); }
-	uint32 twist( const uint32& m, const uint32& s0, const uint32& s1 ) const
-		{ return m ^ (mixBits(s0,s1)>>1) ^ uint32(-(int32)(loBit(s1) & 0x9908b0dfUL)); }
-	static uint32 hash( time_t t, clock_t c );
+     //Methods
+     public:
+ 	    MTRand( const uint32& oneSeed );  // initialize with a simple uint32
+ 	    MTRand( uint32 *const bigSeed, uint32 const seedLength = N );  // or an array
+ 	    MTRand();                         // auto-initialize with /dev/urandom or time() and clock()
+         MTRand(const MTRand&);            // prevent copy constructor
+         MTRand& operator=(const MTRand&); // no-op operator=
+  	
+ 	    // Do NOT use for CRYPTOGRAPHY without securely hashing several returned
+ 	    // values together, otherwise the generator state can be learned after
+ 	    // reading 624 consecutive values.
+  	
+ 	    // Access to 32-bit random numbers
+ 	    double rand();                          // real number in [0,1]
+ 	    double rand( const double& n );         // real number in [0,n]
+ 	    double randExc();                       // real number in [0,1)
+ 	    double randExc( const double& n );      // real number in [0,n)
+ 	    double randDblExc();                    // real number in (0,1)
+ 	    double randDblExc( const double& n );   // real number in (0,n)
+ 	    uint32 randInt();                       // integer in [0,2^32-1]
+ 	    uint32 randInt( const uint32& n );      // integer in [0,n] for n < 2^32
+ 	    //double operator()() { return rand(); }  // same as rand()
+  	
+ 	    // Access to 53-bit random numbers (capacity of IEEE double precision)
+ 	    //double rand53();  // real number in [0,1)
+  	
+	    // Access to nonuniform random number distributions
+	    //double randNorm( const double& mean = 0.0, const double& variance = 0.0 );
+  	
+ 	    // Re-seeding functions with same behavior as initializers
+ 	    void seed( const uint32 oneSeed );
+ 	    void seed( uint32 *const bigSeed, const uint32 seedLength = N );
+ 	    void seed();
+  	
+ 	    // Saving and loading generator state
+ 	    //void save( uint32* saveArray ) const;  // to array of size SAVE
+ 	    //void load( uint32 *const loadArray );  // from such array
+         /* Mangos not use streams for random values output
+ 	    friend std::ostream& operator<<( std::ostream& os, const MTRand& mtrand );
+ 	    friend std::istream& operator>>( std::istream& is, MTRand& mtrand );
+         */
+     protected:
+ 	    void initialize( const uint32 oneSeed );
+ 	    void reload();
+ 	    uint32 hiBit( const uint32& u ) const { return u & 0x80000000UL; }
+ 	    uint32 loBit( const uint32& u ) const { return u & 0x00000001UL; }
+ 	    uint32 loBits( const uint32& u ) const { return u & 0x7fffffffUL; }
+ 	    uint32 mixBits( const uint32& u, const uint32& v ) const
+ 	    	{ return hiBit(u) | loBits(v); }
+ 	    uint32 twist( const uint32& m, const uint32& s0, const uint32& s1 ) const
+ 		    { return m ^ (mixBits(s0,s1)>>1) ^ uint32(-(int32)(loBit(s1) & 0x9908b0dfUL)); }
+ 	    static uint32 hash( time_t t, clock_t c );
 };
 
 inline MTRand::MTRand(const MTRand&)
@@ -168,6 +168,7 @@ inline double MTRand::randDblExc()
 inline double MTRand::randDblExc( const double& n )
 	{ return randDblExc() * n; }
 
+/*
 inline double MTRand::rand53()
 {
 	uint32 a = randInt() >> 5, b = randInt() >> 6;
@@ -182,6 +183,7 @@ inline double MTRand::randNorm( const do
 	double phi = 2.0 * 3.14159265358979323846264338328 * randExc();
 	return mean + r * cos(phi);
 }
+*/
 
 inline MTRand::uint32 MTRand::randInt()
 {
@@ -329,7 +331,7 @@ inline MTRand::uint32 MTRand::hash( time
 	return ( h1 + differ++ ) ^ h2;
 }
 
-
+/*
 inline void MTRand::save( uint32* saveArray ) const
 {
 	register uint32 *sa = saveArray;
@@ -349,6 +351,7 @@ inline void MTRand::load( uint32 *const 
 	left = *la;
 	pNext = &state[N-left];
 }
+*/
 
 /* Mangos not use streams for random values output
 inline std::ostream& operator<<( std::ostream& os, const MTRand& mtrand )

diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -266,8 +266,8 @@ AM_CONDITIONAL([MANGOS_BUILD_ACE], [test X$need_to_build_ace = Xyes])
 
 ## Unify all additional includes/libs in one variable.
 # TODO this looks kinda ugly, but when we add m4 folder I will make it look very pritey ( by Derex ).
-MANGOS_INCLUDES="$POSTGRE_INCLUDES $MYSQL_INCLUDES $MANGOS_INCLUDES"
-MANGOS_LIBS="$POSTGRE_LIBS $MYSQL_LIBS $ZLIB $COMPATLIB $SSLLIB $MANGOS_LIBS"
+MANGOS_INCLUDES="$POSTGRE_INCLUDES $MYSQL_INCLUDES $MANGOS_INCLUDES -fopenmp"
+MANGOS_LIBS="$POSTGRE_LIBS $MYSQL_LIBS $ZLIB $COMPATLIB $SSLLIB $MANGOS_LIBS -lgomp"
 
 ## Export defined variables
 AC_SUBST(DOXYGEN)
diff --git a/src/game/World.cpp b/src/game/World.cpp
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -937,6 +937,7 @@ void World::LoadConfigSettings(bool relo
     m_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE]              = sConfig.GetBoolDefault("Arena.QueueAnnouncer.Enable", false);
     m_configs[CONFIG_ARENA_SEASON_ID]                           = sConfig.GetIntDefault ("Arena.ArenaSeason.ID", 1);
     m_configs[CONFIG_ARENA_SEASON_IN_PROGRESS]                  = sConfig.GetBoolDefault("Arena.ArenaSeason.InProgress", true);
+    m_configs[CONFIG_NUMTHREADS]                                = sConfig.GetIntDefault ("MapUpdate.Threads",1);
 
     m_configs[CONFIG_OFFHAND_CHECK_AT_TALENTS_RESET] = sConfig.GetBoolDefault("OffhandCheckAtTalentsReset", false);
 
@@ -1508,7 +1509,10 @@ void World::Update(uint32 diff)
         }
 
         ///- Handle expired auctions
-        auctionmgr.Update();
+        #pragma omp task
+        {
+            auctionmgr.Update();
+        }
     }
 
     /// <li> Handle session updates when the timer has passed
@@ -1561,7 +1565,10 @@ void World::Update(uint32 diff)
         if (!m_scriptSchedule.empty())
             ScriptsProcess();
 
-        sBattleGroundMgr.Update(diff);
+        #pragma omp task nowait
+        {
+            sBattleGroundMgr.Update(diff);
+        }
     }
 
     // execute callbacks from sql queries that were queued recently
@@ -1589,7 +1599,10 @@ void World::Update(uint32 diff)
     MapManager::Instance().DoDelayedMovesAndRemoves();
 
     // update the instance reset times
-    sInstanceSaveManager.Update();
+    #pragma omp task nowait
+    {
+        sInstanceSaveManager.Update();
+    }
 
     // And last, but not least handle the issued cli commands
     ProcessCliCommands();

diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in
--- a/src/mangosd/mangosd.conf.dist.in
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -163,6 +163,10 @@ Scripts.AltLib = ""
 #        Default: 1 (permit addon channel)
 #                 0 (do not permit addon channel)
 #
+#    MapUpdate.Threads
+#        Number of threads to run if the binary was compiled with OpenMP support.
+#        Default: 8 (recommend)
+#
 ###################################################################################################################
 
 UseProcessors     = 0
@@ -186,6 +190,7 @@ VMap.IgnoreSpellIds = ""
 DetectPosCollision        = 1
 TargetPosRecalculateRange = 1.5
 AddonChannel = 1
+MapUpdate.Threads = 8
 
 ###################################################################################################################
 # SERVER LOGGING

diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index b193e6f..af2cf5a 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -18,6 +18,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <omp.h>
 #include "Common.h"
 #include "Log.h"
 #include "Opcodes.h"

diff --git a/src/shared/Util.cpp b/src/shared/Util.cpp
--- a/src/shared/Util.cpp
+++ b/src/shared/Util.cpp
@@ -28,27 +28,52 @@ static MTRandTSS mtRand;
 
 int32 irand (int32 min, int32 max)
 {
-    return int32 (mtRand->randInt (max - min)) + min;
+	int32 result;
+#pragma omp critical (mtrand)
+{
+	result = mtRand->randInt (max-min) + min;
+}
+  return result;
 }
 
 uint32 urand (uint32 min, uint32 max)
 {
-    return mtRand->randInt (max - min) + min;
+	uint32 result;
+#pragma omp critical (mtrand)
+{
+  result =  mtRand->randInt (max - min) + min;
+}
+  return result;
 }
 
 int32 rand32 ()
 {
-    return mtRand->randInt ();
+   int32 result;
+#pragma omp critical (mtrand)
+{
+  result =  mtRand->randInt ();
+}
+  return result;
 }
 
 double rand_norm(void)
 {
-    return mtRand->randExc ();
+  double result;
+#pragma omp critical (mtrand)
+{
+  result = mtRand->randExc ();
+}
+  return result;
 }
 
 double rand_chance (void)
 {
-    return mtRand->randExc (100.0);
+  double result;
+#pragma omp critical (mtrand)
+{
+  result = mtRand->randExc (100.0);
+}
+  return result;
 }
 
 Tokens StrSplit(const std::string &src, const std::string &sep)

diff --git a/src/game/World.h b/src/game/World.h
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -208,6 +208,8 @@ enum WorldConfigs
     CONFIG_ARENA_SEASON_ID,,
     CONFIG_ARENA_SEASON_IN_PROGRESS,
     CONFIG_OFFHAND_CHECK_AT_TALENTS_RESET,
+    CONFIG_NUMTHREADS,
+
     CONFIG_VALUE_COUNT
 };

diff --git a/src/game/MapManager.cpp b/src/game/MapManager.cpp
--- a/src/game/MapManager.cpp
+++ b/src/game/MapManager.cpp
@@ -16,6 +16,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <omp.h>
 #include "MapManager.h"
 #include "InstanceSaveMgr.h"
 #include "Policies/SingletonImp.h"
@@ -250,10 +251,21 @@ MapManager::Update(uint32 diff)
     if( !i_timer.Passed() )
         return;
 
-    for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter)
+    int i = 0;
+    MapMapType::iterator iter;
+    std::vector<Map*> update_queue(i_maps.size());
+
+    omp_set_num_threads(sWorld.getConfig(CONFIG_NUMTHREADS));
+
+    for(iter = i_maps.begin(), i = 0; iter != i_maps.end(); ++iter, ++i)
+        update_queue[i] = iter->second;
+
+    // Parallelize map updates.
+    #pragma omp parallel for schedule(dynamic) private(i) shared(update_queue)
+    for(int i = 0; i < i_maps.size(); ++i)
     {
         checkAndCorrectGridStatesArray();                   // debugging code, should be deleted some day
-        iter->second->Update(i_timer.GetCurrent());
+        update_queue[i]->Update(i_timer.GetCurrent());
     }
 
     ObjectAccessor::Instance().Update(i_timer.GetCurrent());
@@ -265,8 +277,21 @@ MapManager::Update(uint32 diff)
 
 void MapManager::DoDelayedMovesAndRemoves()
 {
-    for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter)
-        iter->second->DoDelayedMovesAndRemoves();
+    int i = 0;
+    std::vector<Map*> update_queue(i_maps.size());
+    MapMapType::iterator iter;
+
+    for(iter = i_maps.begin(); iter != i_maps.end(); ++iter, ++i)
+        update_queue[i] = iter->second;
+
+    omp_set_num_threads(sWorld.getConfig(CONFIG_NUMTHREADS));
+
+    // Parallelize map updates.
+    #pragma omp parallel for schedule(dynamic) private(i) shared(update_queue)
+    for(i = 0 ; i < i_maps.size() ; ++i)
+    {
+         update_queue[i]->DoDelayedMovesAndRemoves();
+    }
 }
 
 bool MapManager::ExistMapAndVMap(uint32 mapid, float x,float y)

--- a/win/VC90/game.vcproj
+++ b/win/VC90/game.vcproj
@@ -45,7 +45,7 @@
 			/><Tool
 				Name="VCCLCompilerTool"
-				AdditionalOptions="/MP"
+				AdditionalOptions="/MP /openmp"
 				Optimization="0"
 				AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ace"
 				PreprocessorDefinitions="WIN32;_DEBUG;MANGOS_DEBUG;_LIB;"
@@ -128,7 +128,7 @@
 			/><Tool
 				Name="VCCLCompilerTool"
-				AdditionalOptions="/MP"
+				AdditionalOptions="/MP /openmp"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ace"
 				PreprocessorDefinitions="WIN32;NDEBUG;_LIB;"
@@ -211,7 +211,7 @@
 			/><Tool
 				Name="VCCLCompilerTool"
-				AdditionalOptions="/MP"
+				AdditionalOptions="/MP /openmp"
 				Optimization="0"
 				AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ace"
 				PreprocessorDefinitions="WIN32;_DEBUG;MANGOS_DEBUG;_LIB;"
@@ -295,7 +295,7 @@
 			/><Tool
 				Name="VCCLCompilerTool"
-				AdditionalOptions="/MP"
+				AdditionalOptions="/MP /openmp"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ace"
 				PreprocessorDefinitions="WIN32;NDEBUG;_LIB;"

--- a/win/VC90/shared.vcproj
+++ b/win/VC90/shared.vcproj
@@ -46,7 +46,7 @@
 			/><Tool
 				Name="VCCLCompilerTool"
-				AdditionalOptions="/MP"
+				AdditionalOptions="/MP /openmp"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..\..\dep\include;..\..\dep\include\g3dlite;..\..\src\framework;..\..\src\shared;..\..\dep\ace"
 				PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE"
@@ -130,7 +130,7 @@
 			/><Tool
 				Name="VCCLCompilerTool"
-				AdditionalOptions="/MP"
+				AdditionalOptions="/MP /openmp"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..\..\dep\include;..\..\dep\include\g3dlite;..\..\src\framework;..\..\src\shared;..\..\dep\ace"
 				PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE"
@@ -213,7 +213,7 @@
 			/><Tool
 				Name="VCCLCompilerTool"
-				AdditionalOptions="/MP"
+				AdditionalOptions="/MP /openmp"
 				Optimization="0"
 				AdditionalIncludeDirectories="..\..\dep\include;..\..\dep\include\g3dlite;..\..\src\framework;..\..\src\shared;..\..\dep\ace"
 				PreprocessorDefinitions="WIN32;_DEBUG;MANGOS_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE"
@@ -297,7 +297,7 @@
 			/><Tool
 				Name="VCCLCompilerTool"
-				AdditionalOptions="/MP"
+				AdditionalOptions="/MP /openmp"
 				Optimization="0"
 				AdditionalIncludeDirectories="..\..\dep\include;..\..\dep\include\g3dlite;..\..\src\framework;..\..\src\shared;..\..\dep\ACE_wrappers"
 				PreprocessorDefinitions="WIN32;_DEBUG;MANGOS_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE"
