diff --git a/src/core/thread.c b/src/core/thread.c
index ee46569cd..530ee6f6f 100644
--- a/src/core/thread.c
+++ b/src/core/thread.c
@@ -273,7 +273,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) {
 	}
 #ifdef ENABLE_SCRIPTING
 	// startCallback could add a script context
-	if (!scriptContext) {
+	if (scriptContext != threadContext->scriptContext) {
 		scriptContext = threadContext->scriptContext;
 		if (scriptContext) {
 			_mCoreThreadAddCallbacks(threadContext);
@@ -294,7 +294,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) {
 
 #ifdef ENABLE_SCRIPTING
 	// resetCallback could add a script context
-	if (!scriptContext) {
+	if (scriptContext != threadContext->scriptContext) {
 		scriptContext = threadContext->scriptContext;
 		if (scriptContext) {
 			_mCoreThreadAddCallbacks(threadContext);
@@ -351,7 +351,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) {
 				}
 			}
 #ifdef ENABLE_SCRIPTING
-			if (!scriptContext) {
+			if (scriptContext != threadContext->scriptContext) {
 				scriptContext = threadContext->scriptContext;
 				if (scriptContext) {
 					_mCoreThreadAddCallbacks(threadContext);
diff --git a/src/platform/qt/ScriptingController.cpp b/src/platform/qt/ScriptingController.cpp
index 8585a33f7..2113df29f 100644
--- a/src/platform/qt/ScriptingController.cpp
+++ b/src/platform/qt/ScriptingController.cpp
@@ -13,10 +13,6 @@ using namespace QGBA;
 ScriptingController::ScriptingController(QObject* parent)
 	: QObject(parent)
 {
-	mScriptContextInit(&m_scriptContext);
-	mScriptContextAttachStdlib(&m_scriptContext);
-	mScriptContextRegisterEngines(&m_scriptContext);
-
 	m_logger.p = this;
 	m_logger.log = [](mLogger* log, int, enum mLogLevel level, const char* format, va_list args) {
 		Logger* logger = static_cast<Logger*>(log);
@@ -37,17 +33,7 @@ ScriptingController::ScriptingController(QObject* parent)
 		}
 	};
 
-	mScriptContextAttachLogger(&m_scriptContext, &m_logger);
-	mScriptContextSetTextBufferFactory(&m_scriptContext, &ScriptingController::createTextBuffer, this);
-
-	HashTableEnumerate(&m_scriptContext.engines, [](const char* key, void* engine, void* context) {
-	ScriptingController* self = static_cast<ScriptingController*>(context);
-		self->m_engines[QString::fromUtf8(key)] = static_cast<mScriptEngineContext*>(engine);
-	}, this);
-
-	if (m_engines.count() == 1) {
-		m_activeEngine = *m_engines.begin();
-	}
+	init();
 }
 
 ScriptingController::~ScriptingController() {
@@ -99,6 +85,18 @@ void ScriptingController::clearController() {
 	m_controller.reset();
 }
 
+void ScriptingController::reset() {
+	CoreController::Interrupter interrupter(m_controller);
+	mScriptContextDetachCore(&m_scriptContext);
+	mScriptContextDeinit(&m_scriptContext);
+	m_engines.clear();
+	m_activeEngine = nullptr;
+	init();
+	if (m_controller && m_controller->hasStarted()) {
+		mScriptContextAttachCore(&m_scriptContext, m_controller->thread()->core);
+	}
+}
+
 void ScriptingController::runCode(const QString& code) {
 	VFileDevice vf(code.toUtf8());
 	load(vf, "*prompt");
@@ -110,3 +108,21 @@ mScriptTextBuffer* ScriptingController::createTextBuffer(void* context) {
 	emit self->textBufferCreated(buffer);
 	return buffer->textBuffer();
 }
+
+void ScriptingController::init() {
+	mScriptContextInit(&m_scriptContext);
+	mScriptContextAttachStdlib(&m_scriptContext);
+	mScriptContextRegisterEngines(&m_scriptContext);
+
+	mScriptContextAttachLogger(&m_scriptContext, &m_logger);
+	mScriptContextSetTextBufferFactory(&m_scriptContext, &ScriptingController::createTextBuffer, this);
+
+	HashTableEnumerate(&m_scriptContext.engines, [](const char* key, void* engine, void* context) {
+	ScriptingController* self = static_cast<ScriptingController*>(context);
+		self->m_engines[QString::fromUtf8(key)] = static_cast<mScriptEngineContext*>(engine);
+	}, this);
+
+	if (m_engines.count() == 1) {
+		m_activeEngine = *m_engines.begin();
+	}
+}
diff --git a/src/platform/qt/ScriptingController.h b/src/platform/qt/ScriptingController.h
index d7603f4a4..0ccd9f67d 100644
--- a/src/platform/qt/ScriptingController.h
+++ b/src/platform/qt/ScriptingController.h
@@ -42,9 +42,12 @@ signals:
 
 public slots:
 	void clearController();
+	void reset();
 	void runCode(const QString& code);
 
 private:
+	void init();
+
 	static mScriptTextBuffer* createTextBuffer(void* context);
 
 	struct Logger : mLogger {
diff --git a/src/platform/qt/ScriptingView.cpp b/src/platform/qt/ScriptingView.cpp
index b870d0e61..46857d219 100644
--- a/src/platform/qt/ScriptingView.cpp
+++ b/src/platform/qt/ScriptingView.cpp
@@ -29,6 +29,7 @@ ScriptingView::ScriptingView(ScriptingController* controller, QWidget* parent)
 
 	connect(m_ui.buffers, &QListWidget::currentRowChanged, this, &ScriptingView::selectBuffer);
 	connect(m_ui.load, &QAction::triggered, this, &ScriptingView::load);
+	connect(m_ui.reset, &QAction::triggered, controller, &ScriptingController::reset);
 }
 
 void ScriptingView::submitRepl() {
diff --git a/src/platform/qt/ScriptingView.ui b/src/platform/qt/ScriptingView.ui
index a0cf7ed1a..3b30ba9b2 100644
--- a/src/platform/qt/ScriptingView.ui
+++ b/src/platform/qt/ScriptingView.ui
@@ -80,6 +80,7 @@
      <string>File</string>
     </property>
     <addaction name="load"/>
+    <addaction name="reset"/>
    </widget>
    <addaction name="menuFile"/>
   </widget>
@@ -89,6 +90,11 @@
     <string>Load script...</string>
    </property>
   </action>
+  <action name="reset">
+   <property name="text">
+    <string>&amp;Reset</string>
+   </property>
+  </action>
  </widget>
  <customwidgets>
   <customwidget>