diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt
index 41b09782..4e9d0f6c 100644
--- a/engine/CMakeLists.txt
+++ b/engine/CMakeLists.txt
@@ -34,4 +34,19 @@ add_test(
 	NAME run
 	COMMAND ${NAME}
 	WORKING_DIRECTORY "$<TARGET_FILE_DIR:${NAME}>"
+)
+
+
+set(LIBNAME ce_module)
+
+add_library(${LIBNAME}
+	SHARED
+	"./ce_module_api.cpp"
+)
+target_link_libraries(${LIBNAME}
+	${CE_LIBS}
+)
+include_directories(${LIBNAME}
+	${CMAKE_CURRENT_SOURCE_DIR}
+	${CE_INCLUDES}
 )
\ No newline at end of file
diff --git a/engine/ce_module_api.cpp b/engine/ce_module_api.cpp
new file mode 100644
index 00000000..85df827a
--- /dev/null
+++ b/engine/ce_module_api.cpp
@@ -0,0 +1,9 @@
+/**
+ * Cinnabar Module API
+ * Author: Cameron Trow <tumblegamer@gmail.com>
+ *
+ * Entry point for the version of the module api for use during module development
+ * 
+ */
+
+#include "core/module.h"
\ No newline at end of file
diff --git a/engine/core/module.h b/engine/core/module.h
new file mode 100644
index 00000000..5c0fcbd7
--- /dev/null
+++ b/engine/core/module.h
@@ -0,0 +1,18 @@
+/**
+ * API FOR CREATING MODULES FOR  CINNABAR ENGINE
+ */
+
+#pragma once
+
+namespace ce {
+	class Module {
+	 private:
+	 public:
+		virtual void tick(float deltaTime) = 0;
+	};
+	typedef Module* init_module_t();
+	typedef void delete_module_t(Module*);
+}
+#define CE_MODULE(X)                                      \
+	extern "C" ce::Module* init_module() { return new X; } \
+	extern "C" void delete_module(ce::Module* m) { delete m; }
\ No newline at end of file
diff --git a/engine/main.cpp b/engine/main.cpp
index 151f31bf..b8e3e1dc 100644
--- a/engine/main.cpp
+++ b/engine/main.cpp
@@ -174,6 +174,9 @@ int main(int argc, char* argv[]) {
 				}
 			}
 		}
+
+		moduleManager->tickModules(time->getDeltaTime());
+
 		// Rotate cube
 		cubePos->roll(25.0f * time->getDeltaTime());
 		cubePos->yaw(50.0f * time->getDeltaTime());
diff --git a/engine/managers/module_manager.cpp b/engine/managers/module_manager.cpp
index f1cc50f8..1a12d1bf 100644
--- a/engine/managers/module_manager.cpp
+++ b/engine/managers/module_manager.cpp
@@ -20,18 +20,28 @@ void ce::ModuleManger::loadModules() {
 		}
 		//reset Errors
 		dlerror();
+		const char* error;
 		LOG_ERROR("Loading Symbols for: " + path);
-		module_t module = (module_t)dlsym(lib, "hello");
-		const char* error = dlerror();
+		// Get a function called "Hello"
+		init_module_t* init_module = (init_module_t*)dlsym(lib, "init_module");
+		// Handle any errors
+		error = dlerror();
 		if (error) {
 			LOG_ERROR(dlerror());
 			dlclose(lib);
 			continue;
 		}
-
-		module();
-
-		dlclose(lib);
+		delete_module_t* delete_module = (delete_module_t*)dlsym(lib, "delete_module");
+		error = dlerror();
+		if (error) {
+			LOG_ERROR(dlerror());
+			dlclose(lib);
+			continue;
+		}
+		Module* module = init_module();
+		m_modules.push_back({module, lib, init_module, delete_module});
+		//delete_module(module);
+		//dlclose(lib);
 	}
 }
 
@@ -40,4 +50,14 @@ ce::ModuleManger::ModuleManger() {
 }
 
 ce::ModuleManger::~ModuleManger() {
+	for (int i = 0; i < m_modules.size(); i++) {
+		ModuleRef module = m_modules[i];
+		module.delete_module(module.module);
+		dlclose(module.lib);
+	}
 }
+
+void ce::ModuleManger::tickModules(float deltaTime) {
+	for (int i = 0; i < m_modules.size(); i++)
+		m_modules[i].module->tick(deltaTime);
+}
\ No newline at end of file
diff --git a/engine/managers/module_manager.h b/engine/managers/module_manager.h
index 179f8292..1ec6d43d 100644
--- a/engine/managers/module_manager.h
+++ b/engine/managers/module_manager.h
@@ -1,18 +1,30 @@
 #pragma once
 
 #include <string>
+#include <vector>
+
+#include <core/module.h>
 
 namespace ce {
-	typedef void (*module_t)();
 	class ModuleManger {
-
 	 private:
+		struct ModuleRef {
+			Module* module;
+			void* lib;
+			init_module_t* inti_module;
+			delete_module_t* delete_module;
+		};
+
 		inline static const std::string MODULE_FOLDER = "modules";
 
+		std::vector<ModuleRef> m_modules;
+
 		void loadModules();
 
 	 public:
 		ModuleManger();
 		~ModuleManger();
+
+		void tickModules(float deltaTime);
 	};
 }
\ No newline at end of file
diff --git a/res/modules/libhello.so b/res/modules/libhello.so
deleted file mode 100644
index f135fb00..00000000
Binary files a/res/modules/libhello.so and /dev/null differ
diff --git a/res/modules/libsample_module.so b/res/modules/libsample_module.so
new file mode 100644
index 00000000..193eda3c
Binary files /dev/null and b/res/modules/libsample_module.so differ