diff --git a/src/Components/Modules/AssetHandler.cpp b/src/Components/Modules/AssetHandler.cpp
index 3a443a80..06094078 100644
--- a/src/Components/Modules/AssetHandler.cpp
+++ b/src/Components/Modules/AssetHandler.cpp
@@ -4,7 +4,7 @@ namespace Components
 {
 	bool AssetHandler::BypassState = false;
 	std::map<Game::XAssetType, AssetHandler::IAsset*> AssetHandler::AssetInterfaces;
-	std::map<Game::XAssetType, AssetHandler::Callback> AssetHandler::TypeCallbacks;
+	std::map<Game::XAssetType, wink::slot<AssetHandler::Callback>> AssetHandler::TypeCallbacks;
 	wink::signal<wink::slot<AssetHandler::RestrictCallback>> AssetHandler::RestrictSignal;
 
 	std::map<void*, void*> AssetHandler::Relocations;
@@ -140,12 +140,12 @@ namespace Components
 		}
 	}
 
-	void AssetHandler::OnFind(Game::XAssetType type, AssetHandler::Callback callback)
+	void AssetHandler::OnFind(Game::XAssetType type, AssetHandler::Callback* callback)
 	{
 		AssetHandler::TypeCallbacks[type] = callback;
 	}
 
-	void AssetHandler::OnLoad(RestrictCallback* callback)
+	void AssetHandler::OnLoad(AssetHandler::RestrictCallback* callback)
 	{
 		AssetHandler::RestrictSignal.connect(callback);
 	}
diff --git a/src/Components/Modules/AssetHandler.hpp b/src/Components/Modules/AssetHandler.hpp
index ad0fdc36..469316ec 100644
--- a/src/Components/Modules/AssetHandler.hpp
+++ b/src/Components/Modules/AssetHandler.hpp
@@ -13,14 +13,14 @@ namespace Components
 			virtual void Load(Game::XAssetHeader* header, std::string name, ZoneBuilder::Zone* builder) { /*ErrorTypeNotSupported(this);*/ };
 		};
 
-		typedef Game::XAssetHeader(*Callback)(Game::XAssetType type, std::string name);
+		typedef Game::XAssetHeader(Callback)(Game::XAssetType type, std::string name);
 		typedef void(RestrictCallback)(Game::XAssetType type, Game::XAssetHeader asset, std::string name, bool* restrict);
 
 		AssetHandler();
 		~AssetHandler();
 		const char* GetName() { return "AssetHandler"; };
 
-		static void OnFind(Game::XAssetType type, Callback callback);
+		static void OnFind(Game::XAssetType type, Callback* callback);
 		static void OnLoad(RestrictCallback* callback);
 
 		static void Relocate(void* start, void* to, DWORD size = 4);
@@ -49,7 +49,7 @@ namespace Components
 		static std::map<std::string, Game::XAssetHeader> TemporaryAssets[Game::XAssetType::ASSET_TYPE_COUNT];
 
 		static std::map<Game::XAssetType, IAsset*> AssetInterfaces;
-		static std::map<Game::XAssetType, Callback> TypeCallbacks;
+		static std::map<Game::XAssetType, wink::slot<Callback>> TypeCallbacks;
 		static wink::signal<wink::slot<RestrictCallback>> RestrictSignal;
 
 		static std::map<void*, void*> Relocations;
diff --git a/src/Components/Modules/Command.cpp b/src/Components/Modules/Command.cpp
index 9978f826..0b76bdcd 100644
--- a/src/Components/Modules/Command.cpp
+++ b/src/Components/Modules/Command.cpp
@@ -3,7 +3,7 @@
 namespace Components
 {
 	std::vector<Game::cmd_function_t*> Command::Functions;
-	std::map<std::string, Command::Callback> Command::FunctionMap;
+	std::map<std::string, wink::slot<Command::Callback>> Command::FunctionMap;
 
 	char* Command::Params::operator[](size_t index)
 	{
@@ -20,17 +20,7 @@ namespace Components
 		return Game::cmd_argc[this->CommandId];
 	}
 
-	Command::~Command()
-	{
-		for (auto command : Command::Functions)
-		{
-			delete command;
-		}
-
-		Command::Functions.clear();
-	}
-
-	void Command::Add(const char* name, Command::Callback callback)
+	void Command::Add(const char* name, Command::Callback* callback)
 	{
 		Command::FunctionMap[Utils::StrToLower(name)] = callback;
 		Game::Cmd_AddCommand(name, Command::MainCallback, Command::Allocate(), 0);
@@ -74,4 +64,14 @@ namespace Components
 	{
 		// TODO: Add commands here?
 	}
+
+	Command::~Command()
+	{
+		for (auto command : Command::Functions)
+		{
+			delete command;
+		}
+
+		Command::Functions.clear();
+	}
 }
diff --git a/src/Components/Modules/Command.hpp b/src/Components/Modules/Command.hpp
index 6d173e62..9fac3c70 100644
--- a/src/Components/Modules/Command.hpp
+++ b/src/Components/Modules/Command.hpp
@@ -17,20 +17,19 @@ namespace Components
 			DWORD CommandId;
 		};
 
-		typedef void(*Callback)(Command::Params params);
+		typedef void(Callback)(Command::Params params);
 
 		Command();
 		~Command();
 		const char* GetName() { return "Command"; };
 
-		static void Add(const char* name, Callback callback);
-
+		static void Add(const char* name, Callback* callback);
 		static void Execute(std::string command, bool sync = true);
 
 	private:
 		static Game::cmd_function_t* Allocate();
 		static std::vector<Game::cmd_function_t*> Functions;
-		static std::map<std::string, Callback> FunctionMap;
+		static std::map<std::string, wink::slot<Callback>> FunctionMap;
 		static void MainCallback();
 	};
 }
diff --git a/src/Components/Modules/Network.cpp b/src/Components/Modules/Network.cpp
index 7076e334..b82d6d6a 100644
--- a/src/Components/Modules/Network.cpp
+++ b/src/Components/Modules/Network.cpp
@@ -3,7 +3,7 @@
 namespace Components
 {
 	std::string Network::SelectedPacket;
-	std::map<std::string, Network::Callback> Network::PacketHandlers;
+	std::map<std::string, wink::slot<Network::Callback>> Network::PacketHandlers;
 
 	Network::Address::Address(std::string addrString)
 	{
@@ -16,7 +16,7 @@ namespace Components
 	void Network::Address::SetPort(unsigned short port)
 	{
 		this->address.port = htons(port);
-	};
+	}
 	unsigned short Network::Address::GetPort()
 	{
 		return ntohs(this->address.port);
@@ -82,7 +82,7 @@ namespace Components
 		return false;
 	}
 
-	void Network::Handle(std::string packet, Network::Callback callback)
+	void Network::Handle(std::string packet, Network::Callback* callback)
 	{
 		Network::PacketHandlers[Utils::StrToLower(packet)] = callback;
 	}
diff --git a/src/Components/Modules/Network.hpp b/src/Components/Modules/Network.hpp
index 85f5f8f2..2efbe26b 100644
--- a/src/Components/Modules/Network.hpp
+++ b/src/Components/Modules/Network.hpp
@@ -34,13 +34,13 @@ namespace Components
 			Game::netadr_t address;
 		};
 
-		typedef void(*Callback)(Address address, std::string data);
+		typedef void(Callback)(Address address, std::string data);
 
 		Network();
 		~Network();
 		const char* GetName() { return "Network"; };
 
-		static void Handle(std::string packet, Callback callback);
+		static void Handle(std::string packet, Callback* callback);
 
 		// Send quake-styled binary data
 		static void Send(Address target, std::string data);
@@ -61,7 +61,7 @@ namespace Components
 	private:
 		static SOCKET TcpSocket;
 		static std::string SelectedPacket;
-		static std::map<std::string, Callback> PacketHandlers;
+		static std::map<std::string, wink::slot<Callback>> PacketHandlers;
 		static int PacketInterceptionHandler(const char* packet);
 		static void DeployPacket(Game::netadr_t* from, Game::msg_t* msg);
 		static void DeployPacketStub();
diff --git a/src/Components/Modules/UIScript.cpp b/src/Components/Modules/UIScript.cpp
index 18479378..9f72bbc3 100644
--- a/src/Components/Modules/UIScript.cpp
+++ b/src/Components/Modules/UIScript.cpp
@@ -2,8 +2,8 @@
 
 namespace Components
 {
-	std::map<std::string, UIScript::Callback> UIScript::UIScripts;
-	std::map<int, UIScript::CallbackRaw> UIScript::UIOwnerDraws;
+	std::map<std::string, wink::slot<UIScript::Callback>> UIScript::UIScripts;
+	std::map<int, wink::slot<UIScript::CallbackRaw>> UIScript::UIOwnerDraws;
 
 	template<> int UIScript::Token::Get()
 	{
@@ -48,17 +48,17 @@ namespace Components
 		}
 	}
 
-	void UIScript::Add(std::string name, UIScript::Callback callback)
+	void UIScript::Add(std::string name, UIScript::Callback* callback)
 	{
 		UIScript::UIScripts[name] = callback;
 	}
 
-	void UIScript::Add(std::string name, UIScript::CallbackRaw callback)
+	void UIScript::Add(std::string name, UIScript::CallbackRaw* callback)
 	{
-		UIScript::Add(name, reinterpret_cast<UIScript::Callback>(callback));
+		UIScript::Add(name, reinterpret_cast<UIScript::Callback*>(callback));
 	}
 
-	void UIScript::AddOwnerDraw(int ownerdraw, UIScript::CallbackRaw callback)
+	void UIScript::AddOwnerDraw(int ownerdraw, UIScript::CallbackRaw* callback)
 	{
 		UIScript::UIOwnerDraws[ownerdraw] = callback;
 	}
diff --git a/src/Components/Modules/UIScript.hpp b/src/Components/Modules/UIScript.hpp
index d6641add..43ec341e 100644
--- a/src/Components/Modules/UIScript.hpp
+++ b/src/Components/Modules/UIScript.hpp
@@ -23,20 +23,20 @@ namespace Components
 			void Parse(const char** args);
 		};
 
-		typedef void(*Callback)(Token token);
-		typedef void(*CallbackRaw)();
+		typedef void(Callback)(Token token);
+		typedef void(CallbackRaw)();
 
-		static void Add(std::string name, Callback callback);
-		static void Add(std::string name, CallbackRaw callback);
+		static void Add(std::string name, Callback* callback);
+		static void Add(std::string name, CallbackRaw* callback);
 
-		static void AddOwnerDraw(int ownerdraw, CallbackRaw callback);
+		static void AddOwnerDraw(int ownerdraw, CallbackRaw* callback);
 
 	private:
 		static void OwnerDrawHandleKeyStub(int ownerDraw, int flags, float *special, int key);
 		static bool RunMenuScript(const char* name, const char** args);
 		static void RunMenuScriptStub();
 
-		static std::map<std::string, Callback> UIScripts;
-		static std::map<int, CallbackRaw> UIOwnerDraws;
+		static std::map<std::string, wink::slot<Callback>> UIScripts;
+		static std::map<int, wink::slot<CallbackRaw>> UIOwnerDraws;
 	};
 }