diff --git a/src/Components/Modules/Command.cpp b/src/Components/Modules/Command.cpp
index c1fb3bdc..48c7719d 100644
--- a/src/Components/Modules/Command.cpp
+++ b/src/Components/Modules/Command.cpp
@@ -2,7 +2,6 @@
 
 namespace Components
 {
-	Utils::Memory::Allocator Command::MemAllocator;
 	std::unordered_map<std::string, Utils::Slot<Command::Callback>> Command::FunctionMap;
 	std::unordered_map<std::string, Utils::Slot<Command::Callback>> Command::FunctionMapSV;
 
@@ -130,7 +129,7 @@ namespace Components
 
 	Game::cmd_function_t* Command::Allocate()
 	{
-		return Command::MemAllocator.allocate<Game::cmd_function_t>();
+		return Loader::GetAlloctor()->allocate<Game::cmd_function_t>();
 	}
 
 	void Command::MainCallback()
@@ -265,7 +264,6 @@ namespace Components
 
 	Command::~Command()
 	{
-		Command::MemAllocator.clear();
 		Command::FunctionMap.clear();
 		Command::FunctionMapSV.clear();
 	}
diff --git a/src/Components/Modules/Command.hpp b/src/Components/Modules/Command.hpp
index 318bf997..e1cccecd 100644
--- a/src/Components/Modules/Command.hpp
+++ b/src/Components/Modules/Command.hpp
@@ -65,7 +65,6 @@ namespace Components
 		static Game::cmd_function_t* Find(std::string command);
 
 	private:
-		static Utils::Memory::Allocator MemAllocator;
 		static std::unordered_map<std::string, Utils::Slot<Callback>> FunctionMap;
 		static std::unordered_map<std::string, Utils::Slot<Callback>> FunctionMapSV;
 
diff --git a/src/Components/Modules/Localization.cpp b/src/Components/Modules/Localization.cpp
index 8258eaef..8141c522 100644
--- a/src/Components/Modules/Localization.cpp
+++ b/src/Components/Modules/Localization.cpp
@@ -4,40 +4,40 @@ namespace Components
 {
 	std::recursive_mutex Localization::LocalizeMutex;
 	Dvar::Var Localization::UseLocalization;
-	Utils::Memory::Allocator Localization::MemAllocator;
 	std::unordered_map<std::string, Game::LocalizeEntry*> Localization::LocalizeMap;
 	std::unordered_map<std::string, Game::LocalizeEntry*> Localization::TempLocalizeMap;
 
 	void Localization::Set(std::string key, std::string value)
 	{
 		std::lock_guard<std::recursive_mutex> _(Localization::LocalizeMutex);
+		Utils::Memory::Allocator* allocator = Loader::GetAlloctor();
 
 		if (Localization::LocalizeMap.find(key) != Localization::LocalizeMap.end())
 		{
 			Game::LocalizeEntry* entry = Localization::LocalizeMap[key];
 
-			char* newStaticValue = Localization::MemAllocator.duplicateString(value);
+			char* newStaticValue = allocator->duplicateString(value);
 			if (!newStaticValue) return;
-			if (entry->value) Localization::MemAllocator.free(entry->value);
+			if (entry->value) allocator->free(entry->value);
 			entry->value = newStaticValue;
 			return;
 		}
 
-		Game::LocalizeEntry* entry = Localization::MemAllocator.allocate<Game::LocalizeEntry>();
+		Game::LocalizeEntry* entry = allocator->allocate<Game::LocalizeEntry>();
 		if (!entry) return;
 
-		entry->name = Localization::MemAllocator.duplicateString(key);
+		entry->name = allocator->duplicateString(key);
 		if (!entry->name)
 		{
-			Localization::MemAllocator.free(entry);
+			allocator->free(entry);
 			return;
 		}
 
-		entry->value = Localization::MemAllocator.duplicateString(value);
+		entry->value = allocator->duplicateString(value);
 		if (!entry->value)
 		{
-			Localization::MemAllocator.free(entry->name);
-			Localization::MemAllocator.free(entry);
+			allocator->free(entry->name);
+			allocator->free(entry);
 			return;
 		}
 
@@ -76,30 +76,31 @@ namespace Components
 	void Localization::SetTemp(std::string key, std::string value)
 	{
 		std::lock_guard<std::recursive_mutex> _(Localization::LocalizeMutex);
+		Utils::Memory::Allocator* allocator = Loader::GetAlloctor();
 
 		if (Localization::TempLocalizeMap.find(key) != Localization::TempLocalizeMap.end())
 		{
 			Game::LocalizeEntry* entry = Localization::TempLocalizeMap[key];
-			if(entry->value) Localization::MemAllocator.free(entry->value);
-			entry->value = Localization::MemAllocator.duplicateString(value);
+			if(entry->value) allocator->free(entry->value);
+			entry->value = allocator->duplicateString(value);
 		}
 		else
 		{
-			Game::LocalizeEntry* entry = Localization::MemAllocator.allocate<Game::LocalizeEntry>();
+			Game::LocalizeEntry* entry = allocator->allocate<Game::LocalizeEntry>();
 			if (!entry) return;
 
-			entry->name = Localization::MemAllocator.duplicateString(key);
+			entry->name = allocator->duplicateString(key);
 			if (!entry->name)
 			{
-				Localization::MemAllocator.free(entry);
+				allocator->free(entry);
 				return;
 			}
 
-			entry->value = Localization::MemAllocator.duplicateString(value);
+			entry->value = allocator->duplicateString(value);
 			if (!entry->value)
 			{
-				Localization::MemAllocator.free(entry->name);
-				Localization::MemAllocator.free(entry);
+				allocator->free(entry->name);
+				allocator->free(entry);
 				return;
 			}
 
@@ -110,14 +111,15 @@ namespace Components
 	void Localization::ClearTemp()
 	{
 		std::lock_guard<std::recursive_mutex> _(Localization::LocalizeMutex);
+		Utils::Memory::Allocator* allocator = Loader::GetAlloctor();
 
 		for (auto i = Localization::TempLocalizeMap.begin(); i != Localization::TempLocalizeMap.end(); ++i)
 		{
 			if (i->second)
 			{
-				if (i->second->name)  Localization::MemAllocator.free(i->second->name);
-				if (i->second->value) Localization::MemAllocator.free(i->second->value);
-				Localization::MemAllocator.free(i->second);
+				if (i->second->name)  allocator->free(i->second->name);
+				if (i->second->value) allocator->free(i->second->value);
+				allocator->free(i->second);
 			}
 		}
 
@@ -289,8 +291,6 @@ namespace Components
 	Localization::~Localization()
 	{
 		Localization::ClearTemp();
-
 		Localization::LocalizeMap.clear();
-		Localization::MemAllocator.clear();
 	}
 }
diff --git a/src/Components/Modules/Localization.hpp b/src/Components/Modules/Localization.hpp
index 913efe91..8aa31afb 100644
--- a/src/Components/Modules/Localization.hpp
+++ b/src/Components/Modules/Localization.hpp
@@ -20,7 +20,6 @@ namespace Components
 
 	private:
 		static std::recursive_mutex LocalizeMutex;
-		static Utils::Memory::Allocator MemAllocator;
 		static std::unordered_map<std::string, Game::LocalizeEntry*> LocalizeMap;
 		static std::unordered_map<std::string, Game::LocalizeEntry*> TempLocalizeMap;
 		static Dvar::Var UseLocalization;
diff --git a/src/Components/Modules/Menus.cpp b/src/Components/Modules/Menus.cpp
index 9917c956..16221294 100644
--- a/src/Components/Modules/Menus.cpp
+++ b/src/Components/Modules/Menus.cpp
@@ -55,6 +55,8 @@ namespace Components
 
 	int Menus::LoadMenuSource(std::string name, std::string buffer)
 	{
+		Utils::Memory::Allocator* allocator = Loader::GetAlloctor();
+
 		int handle = Menus::ReserveSourceHandle();
 		if (!Menus::IsValidSourceHandle(handle)) return 0; // No free source slot!
 
@@ -68,7 +70,7 @@ namespace Components
 
 		script->next = nullptr;
 
-		Game::source_t *source = Utils::Memory::Allocate<Game::source_t>();
+		Game::source_t *source = allocator->allocate<Game::source_t>();
 		if (!source)
 		{
 			Game::FreeMemory(script);
@@ -81,7 +83,7 @@ namespace Components
 		source->defines = nullptr;
 		source->indentstack = nullptr;
 		source->skip = 0;
-		source->definehash = static_cast<Game::define_t**>(Utils::Memory::Allocate(4096));
+		source->definehash = static_cast<Game::define_t**>(allocator->allocate(4096));
 
 		Game::sourceFiles[handle] = source;
 
@@ -112,21 +114,23 @@ namespace Components
 
 	Game::menuDef_t* Menus::ParseMenu(int handle)
 	{
-		Game::menuDef_t* menu = Utils::Memory::Allocate<Game::menuDef_t>();
+		Utils::Memory::Allocator* allocator = Loader::GetAlloctor();
+
+		Game::menuDef_t* menu = allocator->allocate<Game::menuDef_t>();
 		if (!menu) return nullptr;
 
-		menu->items = Utils::Memory::AllocateArray<Game::itemDef_t*>(512);
+		menu->items = allocator->allocateArray<Game::itemDef_t*>(512);
 		if (!menu->items)
 		{
-			Utils::Memory::Free(menu);
+			allocator->free(menu);
 			return nullptr;
 		}
 
 		Game::pc_token_t token;
 		if (!Game::PC_ReadTokenHandle(handle, &token) || token.string[0] != '{')
 		{
-			Utils::Memory::Free(menu->items);
-			Utils::Memory::Free(menu);
+			allocator->free(menu->items);
+			allocator->free(menu);
 			return nullptr;
 		}
 
@@ -235,21 +239,23 @@ namespace Components
 
 	Game::MenuList* Menus::LoadScriptMenu(const char* menu)
 	{
+		Utils::Memory::Allocator* allocator = Loader::GetAlloctor();
+
 		std::vector<std::pair<bool, Game::menuDef_t*>> menus = Menus::LoadMenu(menu);
 		if (menus.empty()) return nullptr;
 
 		// Allocate new menu list
-		Game::MenuList* newList = Utils::Memory::Allocate<Game::MenuList>();
+		Game::MenuList* newList = allocator->allocate<Game::MenuList>();
 		if (!newList) return nullptr;
 
-		newList->menus = Utils::Memory::AllocateArray<Game::menuDef_t*>(menus.size());
+		newList->menus = allocator->allocateArray<Game::menuDef_t*>(menus.size());
 		if (!newList->menus)
 		{
-			Utils::Memory::Free(newList);
+			allocator->free(newList);
 			return nullptr;
 		}
 
-		newList->name = Utils::Memory::DuplicateString(menu);
+		newList->name = allocator->duplicateString(menu);
 		newList->menuCount = menus.size();
 
 		// Copy new menus
@@ -312,6 +318,8 @@ namespace Components
 
 	Game::MenuList* Menus::LoadMenuList(Game::MenuList* menuList)
 	{
+		Utils::Memory::Allocator* allocator = Loader::GetAlloctor();
+
 		std::vector<std::pair<bool, Game::menuDef_t*>> menus;
 
 		for (int i = 0; i < menuList->menuCount; ++i)
@@ -340,18 +348,18 @@ namespace Components
 		}
 
 		// Allocate new menu list
-		Game::MenuList* newList = Utils::Memory::Allocate<Game::MenuList>();
+		Game::MenuList* newList = allocator->allocate<Game::MenuList>();
 		if (!newList) return menuList;
 
 		size_t size = menus.size();
-		newList->menus = Utils::Memory::AllocateArray<Game::menuDef_t*>(size);
+		newList->menus = allocator->allocateArray<Game::menuDef_t*>(size);
 		if (!newList->menus)
 		{
-			Utils::Memory::Free(newList);
+			allocator->free(newList);
 			return menuList;
 		}
 
-		newList->name = Utils::Memory::DuplicateString(menuList->name);
+		newList->name = allocator->duplicateString(menuList->name);
 		newList->menuCount = size;
 
 		// Copy new menus
@@ -368,6 +376,8 @@ namespace Components
 
 	void Menus::FreeMenuSource(int handle)
 	{
+		Utils::Memory::Allocator* allocator = Loader::GetAlloctor();
+
 		if (!Menus::IsValidSourceHandle(handle)) return;
 
 		Game::source_t *source = Game::sourceFiles[handle];
@@ -397,18 +407,20 @@ namespace Components
 		{
 			Game::indent_t* indent = source->indentstack;
 			source->indentstack = source->indentstack->next;
-			Utils::Memory::Free(indent);
+			allocator->free(indent);
 		}
 
-		if (source->definehash) Utils::Memory::Free(source->definehash);
+		if (source->definehash) allocator->free(source->definehash);
 
-		Utils::Memory::Free(source);
+		allocator->free(source);
 
 		Game::sourceFiles[handle] = nullptr;
 	}
 
 	void Menus::FreeMenu(Game::menuDef_t* menudef)
 	{
+		Utils::Memory::Allocator* allocator = Loader::GetAlloctor();
+
 		// Do i need to free expressions and strings?
 		// Or does the game take care of it?
 		// Seems like it does...
@@ -423,30 +435,31 @@ namespace Components
 			//	Game::Menu_FreeItemMemory(menudef->items[i]);
 			//}
 
-			Utils::Memory::Free(menudef->items);
+			allocator->free(menudef->items);
 		}
 
-		Utils::Memory::Free(menudef);
+		allocator->free(menudef);
 	}
 
 	void Menus::FreeMenuList(Game::MenuList* menuList)
 	{
 		if (!menuList) return;
+		Utils::Memory::Allocator* allocator = Loader::GetAlloctor();
 
 		// Keep our compiler happy
 		Game::MenuList list = { menuList->name, menuList->menuCount, menuList->menus };
 
 		if (list.name)
 		{
-			Utils::Memory::Free(list.name);
+			allocator->free(list.name);
 		}
 
 		if (list.menus)
 		{
-			Utils::Memory::Free(list.menus);
+			allocator->free(list.menus);
 		}
 
-		Utils::Memory::Free(menuList);
+		allocator->free(menuList);
 	}
 
 	void Menus::RemoveMenu(std::string menu)
diff --git a/src/Components/Modules/StringTable.cpp b/src/Components/Modules/StringTable.cpp
index a40582d5..a1f36451 100644
--- a/src/Components/Modules/StringTable.cpp
+++ b/src/Components/Modules/StringTable.cpp
@@ -2,7 +2,6 @@
 
 namespace Components
 {
-	Utils::Memory::Allocator StringTable::MemAllocator;
 	std::unordered_map<std::string, Game::StringTable*> StringTable::StringTableMap;
 
 	int StringTable::Hash(const char* data)
@@ -21,6 +20,8 @@ namespace Components
 
 	Game::StringTable* StringTable::LoadObject(std::string filename)
 	{
+		Utils::Memory::Allocator* allocator = Loader::GetAlloctor();
+
 		filename = Utils::String::ToLower(filename);
 
 		Game::StringTable* table = nullptr;
@@ -30,15 +31,15 @@ namespace Components
 		{
 			Utils::CSV parsedTable(rawTable.getBuffer(), false, false);
 
-			table = StringTable::MemAllocator.allocate<Game::StringTable>();
+			table = allocator->allocate<Game::StringTable>();
 
 			if (table)
 			{
-				table->name = StringTable::MemAllocator.duplicateString(filename);
+				table->name = allocator->duplicateString(filename);
 				table->columnCount = parsedTable.getColumns();
 				table->rowCount = parsedTable.getRows();
 
-				table->values = StringTable::MemAllocator.allocateArray<Game::StringTableCell>(table->columnCount * table->rowCount);
+				table->values = allocator->allocateArray<Game::StringTableCell>(table->columnCount * table->rowCount);
 
 				if (!table->values)
 				{
@@ -53,7 +54,7 @@ namespace Components
 
 						Game::StringTableCell* cell = &table->values[i * table->columnCount + j];
 						cell->hash = StringTable::Hash(value.data());
-						cell->string = StringTable::MemAllocator.duplicateString(value);
+						cell->string = allocator->duplicateString(value);
 						//if (!cell->string) cell->string = ""; // We have to assume it allocated successfully
 					}
 				}
@@ -93,6 +94,5 @@ namespace Components
 	StringTable::~StringTable()
 	{
 		StringTable::StringTableMap.clear();
-		StringTable::MemAllocator.clear();
 	}
 }
diff --git a/src/Components/Modules/StringTable.hpp b/src/Components/Modules/StringTable.hpp
index b55040f0..48b65299 100644
--- a/src/Components/Modules/StringTable.hpp
+++ b/src/Components/Modules/StringTable.hpp
@@ -13,7 +13,6 @@ namespace Components
 #endif
 
 	private:
-		static Utils::Memory::Allocator MemAllocator;
 		static std::unordered_map<std::string, Game::StringTable*> StringTableMap;
 
 		static int Hash(const char* data);
diff --git a/src/Components/Modules/Zones.cpp b/src/Components/Modules/Zones.cpp
index 62098d7f..edc5f552 100644
--- a/src/Components/Modules/Zones.cpp
+++ b/src/Components/Modules/Zones.cpp
@@ -1190,7 +1190,7 @@ namespace Components
 				AssertSize(image359, 52);
 
 				// Copy to new struct
-				memcpy(&image359, buffer, sizeof(image359));
+				std::memcpy(&image359, buffer, sizeof(image359));
 
 				// Convert to old struct
 				Game::GfxImage* image = reinterpret_cast<Game::GfxImage*>(buffer);
@@ -1212,7 +1212,7 @@ namespace Components
 			}
 			else
 			{
-				memcpy(buffer + 28, buffer + (size - 4), 4);
+				std::memcpy(buffer + 28, buffer + (size - 4), 4);
 			}
 		}
 
diff --git a/src/Utils/Memory.hpp b/src/Utils/Memory.hpp
index 685a8b24..0fb8e148 100644
--- a/src/Utils/Memory.hpp
+++ b/src/Utils/Memory.hpp
@@ -125,10 +125,10 @@ namespace Utils
 			}
 
 		private:
-			std::vector<void*> pool;
-			std::map<void*, FreeCallback> refMemory;
 			std::mutex mutex;
-			std::map<void*, void*> ptrMap;
+			std::vector<void*> pool;
+			std::unordered_map<void*, void*> ptrMap;
+			std::unordered_map<void*, FreeCallback> refMemory;
 		};
 
 		static void* AllocateAlign(size_t length, size_t alignment);