diff --git a/bootstrap/boot.lua b/bootstrap/boot.lua
index 9b650331e6957bcac181da7a97729cdbbb26fc9d..ac47f42f40ee88ef1df13d225d365828dd0dbc8a 100644
--- a/bootstrap/boot.lua
+++ b/bootstrap/boot.lua
@@ -25,7 +25,9 @@ else
 end
 
 -- Look for a core
-function get_core(type, id)
+function get_core(coretype, id)
+	coretype = coretype or "te4core"
+
 	local homepath = fs.getUserPath()..fs.getPathSeparator()..fs.getHomePath()..fs.getPathSeparator().."4.0"
 	fs.mount(homepath, "/", 1)
 
@@ -33,20 +35,23 @@ function get_core(type, id)
 	local usable = {}
 	for i, file in ipairs(fs.list("/engines/cores/")) do
 		if file:find("%.tec$") then
-			print("Possible engine core", file)
-			if id > 0 and file == type.."-"..id..".tec" then usable[#usable+1] = {file=file, id=id}
-			elseif id == -1 and file:find(type) then
+			print("Looking for cores", coretype, id, " <=> ", file)
+			if id > 0 and file == coretype.."-"..id..".tec" then
+				usable[#usable+1] = {file=file, id=id}
+				print("Possible engine core", file)
+			elseif id == -1 and file:find(coretype) then
 				local _, _, cid = file:find("%-([0-9]+)%.tec$")
 				cid = tonumber(cid)
 				if cid then
 					usable[#usable+1] = {file=file, id=cid}
+					print("Possible engine core", file)
 				end
 			end
 		end
 	end
 	-- Order the cores to find the newest
 	table.sort(usable, function(a, b) return b.id < a.id end)
-	for i, file in ipairs(usable) do print("Selected cores:", file.file) end
+	for i, file in ipairs(usable) do print("Selected cores:", file.id, file.file) end
 
 	-- Check for sanity and tell the runner to use it
 	local core = "/engines/cores/"..usable[1].file
diff --git a/game/engines/default/engine/utils.lua b/game/engines/default/engine/utils.lua
index f8931b16bbac533a05844a9cd4c378654a25096b..9abee7c82ab4e982bf6d064d5a8fa817867b381a 100644
--- a/game/engines/default/engine/utils.lua
+++ b/game/engines/default/engine/utils.lua
@@ -949,7 +949,7 @@ function util.showMainMenu(no_reboot, reboot_engine, reboot_engine_version, rebo
 	else
 		-- Tell the C engine to discard the current lua state and make a new one
 		print("[MAIN] rebooting lua state: ", reboot_engine, reboot_engine_version, reboot_module, reboot_name, reboot_new)
-		core.game.reboot(-1, reboot_engine or "te4", reboot_engine_version or "LATEST", reboot_module or "boot", reboot_name or "player", reboot_new, reboot_einfo or "")
+		core.game.reboot("te4core", -1, reboot_engine or "te4", reboot_engine_version or "LATEST", reboot_module or "boot", reboot_name or "player", reboot_new, reboot_einfo or "")
 	end
 end
 
diff --git a/src/core_lua.c b/src/core_lua.c
index dba15b726f631baf6bc4caf98147a02d37b309bf..f463c4e743db731f7fac54eb039eb9ea303e25b4 100644
--- a/src/core_lua.c
+++ b/src/core_lua.c
@@ -142,33 +142,22 @@ static int lua_exit_engine(lua_State *L)
 	exit_engine = TRUE;
 	return 0;
 }
-extern int reboot_lua;
-extern bool reboot_new;
-extern char *reboot_engine, *reboot_engine_version, *reboot_module, *reboot_name, *reboot_einfo;
 static int lua_reboot_lua(lua_State *L)
 {
-	if (reboot_engine) free(reboot_engine);
-	if (reboot_engine_version) free(reboot_engine_version);
-	if (reboot_module) free(reboot_module);
-	if (reboot_name) free(reboot_name);
-	if (reboot_einfo) free(reboot_einfo);
-
-	reboot_lua = luaL_checknumber(L, 1);
-	reboot_engine = (char *)luaL_checkstring(L, 2);
-	reboot_engine_version = (char *)luaL_checkstring(L, 3);
-	reboot_module = (char *)luaL_checkstring(L, 4);
-	reboot_name = (char *)luaL_checkstring(L, 5);
-	reboot_new = lua_toboolean(L, 6);
-	reboot_einfo = (char *)luaL_checkstring(L, 7);
+	core_def->define(
+		core_def,
+		luaL_checkstring(L, 1),
+		luaL_checknumber(L, 2),
+		luaL_checkstring(L, 3),
+		luaL_checkstring(L, 4),
+		luaL_checkstring(L, 5),
+		luaL_checkstring(L, 6),
+		lua_toboolean(L, 7),
+		luaL_checkstring(L, 8)
+		);
 
 	// By default reboot the same core -- this skips some initializations
-	if (reboot_lua == -1) reboot_lua = TE4CORE_VERSION;
-
-	if (reboot_engine) reboot_engine = strdup(reboot_engine);
-	if (reboot_engine_version) reboot_engine_version = strdup(reboot_engine_version);
-	if (reboot_module) reboot_module = strdup(reboot_module);
-	if (reboot_name) reboot_name = strdup(reboot_name);
-	if (reboot_einfo) reboot_einfo = strdup(reboot_einfo);
+	if (core_def->corenum == -1) core_def->corenum = TE4CORE_VERSION;
 
 	return 0;
 }
diff --git a/src/main.c b/src/main.c
index 9f3c063f56d6154754b0e03256b904772b3a3d6c..da86f814bf449df3b98626a89191e7938fca2d51 100644
--- a/src/main.c
+++ b/src/main.c
@@ -53,10 +53,7 @@ bool no_debug = FALSE;
 int current_mousehandler = LUA_NOREF;
 int current_keyhandler = LUA_NOREF;
 int current_game = LUA_NOREF;
-int reboot_lua = 0;
-bool reboot_new = FALSE;
-char *request_profile = "default";
-char *reboot_engine = NULL, *reboot_engine_version = NULL, *reboot_module = NULL, *reboot_name = NULL, *reboot_einfo = NULL;
+core_boot_type *core_def = NULL;
 bool exit_engine = FALSE;
 bool no_sound = FALSE;
 bool isActive = TRUE;
@@ -668,7 +665,7 @@ void do_resize(int w, int h, bool fullscreen)
 
 void boot_lua(int state, bool rebooting, int argc, char *argv[])
 {
-	reboot_lua = 0;
+	core_def->corenum = 0;
 
 	if (state == 1)
 	{
@@ -776,14 +773,13 @@ void boot_lua(int state, bool rebooting, int argc, char *argv[])
 		// And run the lua engine scripts
 		if (!luaL_loadfile(L, "/loader/init.lua"))
 		{
-			if (reboot_engine) lua_pushstring(L, reboot_engine); else lua_pushnil(L);
-			if (reboot_engine_version) lua_pushstring(L, reboot_engine_version); else lua_pushnil(L);
-			if (reboot_module) lua_pushstring(L, reboot_module); else lua_pushnil(L);
-			if (reboot_name) lua_pushstring(L, reboot_name); else lua_pushnil(L);
-			lua_pushboolean(L, reboot_new);
-			if (reboot_einfo) lua_pushstring(L, reboot_einfo); else lua_pushnil(L);
-			if (request_profile) lua_pushstring(L, request_profile); else lua_pushnil(L);
-			docall(L, 7, 0);
+			if (core_def->reboot_engine) lua_pushstring(L, core_def->reboot_engine); else lua_pushnil(L);
+			if (core_def->reboot_engine_version) lua_pushstring(L, core_def->reboot_engine_version); else lua_pushnil(L);
+			if (core_def->reboot_module) lua_pushstring(L, core_def->reboot_module); else lua_pushnil(L);
+			if (core_def->reboot_name) lua_pushstring(L, core_def->reboot_name); else lua_pushnil(L);
+			lua_pushboolean(L, core_def->reboot_new);
+			if (core_def->reboot_einfo) lua_pushstring(L, core_def->reboot_einfo); else lua_pushnil(L);
+			docall(L, 6, 0);
 		}
 		else
 		{
@@ -795,8 +791,9 @@ void boot_lua(int state, bool rebooting, int argc, char *argv[])
 /**
  * Core entry point.
  */
-void _te4_export te4main(int argc, char *argv[], core_boot_type *core_def)
+void _te4_export te4main(int argc, char *argv[], core_boot_type *given_core_def)
 {
+	core_def = given_core_def;
 	core_def->corenum = 0;
 
 	// Get cpu cores
@@ -811,13 +808,7 @@ void _te4_export te4main(int argc, char *argv[], core_boot_type *core_def)
 	for (i = 1; i < argc; i++)
 	{
 		char *arg = argv[i];
-		if (!strncmp(arg, "-P", 2)) request_profile = strdup(arg+2);
-		if (!strncmp(arg, "-M", 2)) reboot_module = strdup(arg+2);
-		if (!strncmp(arg, "-u", 2)) reboot_name = strdup(arg+2);
-		if (!strncmp(arg, "-E", 2)) reboot_einfo = strdup(arg+2);
-		if (!strncmp(arg, "-n", 2)) reboot_new = TRUE;
-		if (!strncmp(arg, "--no-debug", 10)) no_debug = TRUE;
-		if (!strncmp(arg, "--flush-stdout", 14)) setvbuf(stdout, (char *) NULL, _IOLBF, 0);;
+		if (!strncmp(arg, "--no-debug", 10)) no_debug = 0;
 	}
 
 	// initialize engine and set up resolution and depth
@@ -949,10 +940,10 @@ void _te4_export te4main(int argc, char *argv[], core_boot_type *core_def)
 		if (!realtime_timer_id && isActive && !tickPaused) on_tick();
 
 		/* Reboot the lua engine */
-		if (reboot_lua)
+		if (core_def->corenum)
 		{
 			// Just reboot the lua VM
-			if (reboot_lua == TE4CORE_VERSION && 0)
+			if (core_def->corenum == TE4CORE_VERSION && 0)
 			{
 				tickPaused = FALSE;
 				setupRealtime(0);
@@ -962,13 +953,10 @@ void _te4_export te4main(int argc, char *argv[], core_boot_type *core_def)
 			// Clean up and tell the runner to run a different core
 			else
 			{
+				lua_close(L);
 				free_particles_thread();
 				free_profile_thread();
-				lua_close(L);
 				PHYSFS_deinit();
-
-				core_def->corenum = reboot_lua;
-
 				break;
 			}
 		}
diff --git a/src/main.h b/src/main.h
index 28116e75eb84d8ca5099192197ad9d1570b06293..cd28c3751e62cbc84b78fec809d241d1c8debb4b 100644
--- a/src/main.h
+++ b/src/main.h
@@ -21,6 +21,8 @@
 #ifndef _MAIN_H_
 #define _MAIN_H_
 
+#include "runner/core.h"
+
 #if defined(SELFEXE_LINUX)
 #define _te4_export
 #elif defined(SELFEXE_WINDOWS)
@@ -51,6 +53,7 @@ struct lua_err_type_s {
 typedef struct lua_err_type_s lua_err_type;
 extern lua_err_type *last_lua_error_head, *last_lua_error_tail;
 extern void del_lua_error();
+extern core_boot_type *core_def;
 
 #endif
 
diff --git a/src/runner/core.h b/src/runner/core.h
index 795b844feeca9b33848f0ed4d9a447bbe6bd1048..a4b994cba1309525ef285b2517cf92d4a660dfdb 100644
--- a/src/runner/core.h
+++ b/src/runner/core.h
@@ -21,7 +21,9 @@
 #ifndef TE4CORE_H
 #define TE4CORE_H
 
-typedef struct {
+struct core_def_s {
+	void (*define)(struct core_def_s *core_def, const char *coretype, int id, const char *reboot_engine, const char *reboot_engine_version, const char *reboot_module, const char *reboot_name, int reboot_new, const char *reboot_einfo);
+
 	int corenum;
 	char *coretype;
 
@@ -31,6 +33,8 @@ typedef struct {
 	char *reboot_name;
 	char *reboot_einfo;
 	int reboot_new;
-} core_boot_type;
+};
+
+typedef struct core_def_s core_boot_type;
 
 #endif
diff --git a/src/runner/main.c b/src/runner/main.c
index bd33d8e6a5fbbe814a1477bffb042e2d3dfd341a..637c64b918fda17d336181d18178c34923ffa192 100644
--- a/src/runner/main.c
+++ b/src/runner/main.c
@@ -21,6 +21,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 #ifdef SELFEXE_WINDOWS
 #include <windows.h>
@@ -35,6 +36,26 @@
 #include "core.h"
 #include "getself.h"
 
+// Update core to run
+void define_core(core_boot_type *core_def, const char *coretype, int id, const char *reboot_engine, const char *reboot_engine_version, const char *reboot_module, const char *reboot_name, int reboot_new, const char *reboot_einfo)
+{
+	if (core_def->coretype) free(core_def->coretype);
+	if (core_def->reboot_engine) free(core_def->reboot_engine);
+	if (core_def->reboot_engine_version) free(core_def->reboot_engine_version);
+	if (core_def->reboot_module) free(core_def->reboot_module);
+	if (core_def->reboot_name) free(core_def->reboot_name);
+	if (core_def->reboot_einfo) free(core_def->reboot_einfo);
+
+	core_def->corenum = id;
+	core_def->coretype = coretype ? strdup(coretype) : NULL;
+	core_def->reboot_engine = reboot_engine ? strdup(reboot_engine) : NULL;
+	core_def->reboot_engine_version = reboot_engine_version ? strdup(reboot_engine_version) : NULL;
+	core_def->reboot_module = reboot_module ? strdup(reboot_module) : NULL;
+	core_def->reboot_name = reboot_name ? strdup(reboot_name) : NULL;
+	core_def->reboot_einfo = reboot_einfo ? strdup(reboot_einfo) : NULL;
+	core_def->reboot_new = reboot_new;
+}
+
 // Load the shared lib containing the core and calls te4main inside it, passing control to that core
 void run_core(core_boot_type *core_def, int argc, char **argv)
 {
@@ -78,7 +99,7 @@ void run_core(core_boot_type *core_def, int argc, char **argv)
 
 	// Get the core
 	lua_getglobal(L, "get_core");
-	lua_pushstring(L, core_def->coretype);
+	if (core_def->coretype) lua_pushstring(L, core_def->coretype); else lua_pushnil(L);
 	lua_pushnumber(L, core_def->corenum);
 	lua_call(L, 2, 1);
 	char *core = strdup((char*)lua_tostring(L, -1));
@@ -160,19 +181,25 @@ void run_core(core_boot_type *core_def, int argc, char **argv)
 
 int main(int argc, char **argv)
 {
-	core_boot_type core_def;
+	core_boot_type *core_def = calloc(1, sizeof(core_boot_type));
 
-	core_def.corenum = -1; // Start with latest core
-	core_def.coretype = "te4core";
-	core_def.reboot_engine = NULL;
-	core_def.reboot_engine_version = NULL;
-	core_def.reboot_module = NULL;
-	core_def.reboot_name = NULL;
-	core_def.reboot_einfo = NULL;
-	core_def.reboot_new = 0;
+	core_def->define = &define_core;
+	core_def->define(core_def, "te4core", -1, NULL, NULL, NULL, NULL, 0, NULL);
+
+	// Parse arguments
+	int i;
+	for (i = 1; i < argc; i++)
+	{
+		char *arg = argv[i];
+		if (!strncmp(arg, "-M", 2)) core_def->reboot_module = strdup(arg+2);
+		if (!strncmp(arg, "-u", 2)) core_def->reboot_name = strdup(arg+2);
+		if (!strncmp(arg, "-E", 2)) core_def->reboot_einfo = strdup(arg+2);
+		if (!strncmp(arg, "-n", 2)) core_def->reboot_new = 0;
+		if (!strncmp(arg, "--flush-stdout", 14)) setvbuf(stdout, (char *) NULL, _IOLBF, 0);;
+	}
 
 	// Run the requested cores until we want no more
-	while (core_def.corenum) run_core(&core_def, argc, argv);
+	while (core_def->corenum) run_core(core_def, argc, argv);
 
 	exit(EXIT_SUCCESS);
 }