diff --git a/src/BizHawk.Client.Common/config/Config.cs b/src/BizHawk.Client.Common/config/Config.cs
index ea0b0313c1..5c9a199019 100644
--- a/src/BizHawk.Client.Common/config/Config.cs
+++ b/src/BizHawk.Client.Common/config/Config.cs
@@ -245,6 +245,8 @@ namespace BizHawk.Client.Common
 		public RecentFiles RecentLua { get; set; } = new RecentFiles(8);
 		public RecentFiles RecentLuaSession { get; set; } = new RecentFiles(8);
 		public bool DisableLuaScriptsOnLoad { get; set; }
+
+		// luaconsole-refactor TODO: move this to LuaConsole settings
 		public bool RunLuaDuringTurbo { get; set; } = true;
 
 		// Watch Settings
diff --git a/src/BizHawk.Client.EmuHawk/Api/Libraries/SaveStateAPI.cs b/src/BizHawk.Client.EmuHawk/Api/Libraries/SaveStateAPI.cs
index 723fdbc7f6..14aff2821d 100644
--- a/src/BizHawk.Client.EmuHawk/Api/Libraries/SaveStateAPI.cs
+++ b/src/BizHawk.Client.EmuHawk/Api/Libraries/SaveStateAPI.cs
@@ -24,12 +24,13 @@ namespace BizHawk.Client.EmuHawk
 				LogCallback($"could not find file: {path}");
 				return;
 			}
-			GlobalWin.MainForm.LoadState(path, Path.GetFileName(path), true, suppressOSD);
+
+			GlobalWin.MainForm.LoadState(path, Path.GetFileName(path), suppressOSD);
 		}
 
 		public void LoadSlot(int slotNum, bool suppressOSD)
 		{
-			if (0.RangeTo(9).Contains(slotNum)) GlobalWin.MainForm.LoadQuickSave($"QuickSave{slotNum}", true, suppressOSD);
+			if (0.RangeTo(9).Contains(slotNum)) GlobalWin.MainForm.LoadQuickSave($"QuickSave{slotNum}", suppressOSD);
 		}
 
 		public void Save(string path, bool suppressOSD) => GlobalWin.MainForm.SaveState(path, path, true, suppressOSD);
diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs
index a0c1384fe0..58199e2e24 100644
--- a/src/BizHawk.Client.EmuHawk/MainForm.cs
+++ b/src/BizHawk.Client.EmuHawk/MainForm.cs
@@ -582,7 +582,7 @@ namespace BizHawk.Client.EmuHawk
 				// autohold/autofire must not be affected by the following inputs
 				Global.InputManager.ActiveController.Overrides(Global.InputManager.ButtonOverrideAdapter);
 
-				if (Tools.Has<LuaConsole>() && !SuppressLua)
+				if (Tools.Has<LuaConsole>())
 				{
 					Tools.LuaConsole.ResumeScripts(false);
 				}
@@ -704,9 +704,6 @@ namespace BizHawk.Client.EmuHawk
 		/// </summary>
 		public bool InvisibleEmulation { get; set; }
 
-		// runloop won't exec lua
-		public bool SuppressLua { get; set; }
-
 		public long MouseWheelTracker { get; private set; }
 
 		private int? _pauseOnFrame;
@@ -721,9 +718,8 @@ namespace BizHawk.Client.EmuHawk
 
 				if (value == null) // TODO: make an Event handler instead, but the logic here is that after turbo seeking, tools will want to do a real update when the emulator finally pauses
 				{
-					bool skipScripts = !(Config.TurboSeek && !Config.RunLuaDuringTurbo && !SuppressLua);
-					Tools.UpdateToolsBefore(skipScripts);
-					Tools.UpdateToolsAfter(skipScripts);
+					Tools.UpdateToolsBefore();
+					Tools.UpdateToolsAfter();
 				}
 			}
 		}
@@ -1577,9 +1573,9 @@ namespace BizHawk.Client.EmuHawk
 			}
 		}
 
-		private void UpdateToolsAfter(bool fromLua = false)
+		private void UpdateToolsAfter()
 		{
-			Tools.UpdateToolsAfter(fromLua);
+			Tools.UpdateToolsAfter();
 			HandleToggleLightAndLink();
 		}
 
@@ -2916,11 +2912,6 @@ namespace BizHawk.Client.EmuHawk
 				InputManager.ClickyVirtualPadController.FrameTick();
 				Global.InputManager.ButtonOverrideAdapter.FrameTick();
 
-				if (Tools.Has<LuaConsole>() && !SuppressLua)
-				{
-					Tools.LuaConsole.LuaImp.CallFrameBeforeEvent();
-				}
-
 				if (IsTurboing)
 				{
 					Tools.FastUpdateBefore();
@@ -3002,18 +2993,13 @@ namespace BizHawk.Client.EmuHawk
 
 				PressFrameAdvance = false;
 
-				if (Tools.Has<LuaConsole>() && !SuppressLua)
-				{
-					Tools.LuaConsole.LuaImp.CallFrameAfterEvent();
-				}
-
 				if (IsTurboing)
 				{
-					Tools.FastUpdateAfter(SuppressLua);
+					Tools.FastUpdateAfter();
 				}
 				else
 				{
-					UpdateToolsAfter(SuppressLua);
+					UpdateToolsAfter();
 				}
 
 				if (!PauseAvi && newFrame && !InvisibleEmulation)
@@ -4042,7 +4028,7 @@ namespace BizHawk.Client.EmuHawk
 			return int.Parse(slot.Substring(slot.Length - 1, 1));
 		}
 
-		public void LoadState(string path, string userFriendlyStateName, bool fromLua = false, bool suppressOSD = false) // Move to client.common
+		public void LoadState(string path, string userFriendlyStateName, bool suppressOSD = false) // Move to client.common
 		{
 			if (!Emulator.HasSavestates())
 			{
@@ -4055,14 +4041,6 @@ namespace BizHawk.Client.EmuHawk
 				return;
 			}
 
-			// If from lua, disable counting rerecords
-			bool wasCountingRerecords = MovieSession.Movie.IsCountingRerecords;
-
-			if (fromLua)
-			{
-				MovieSession.Movie.IsCountingRerecords = false;
-			}
-
 			if (SavestateManager.LoadStateFile(Emulator, path))
 			{
 				GlobalWin.OSD.ClearGuiText();
@@ -4074,8 +4052,8 @@ namespace BizHawk.Client.EmuHawk
 				}
 
 				SetMainformMovieInfo();
-				Tools.UpdateToolsBefore(fromLua);
-				UpdateToolsAfter(fromLua);
+				Tools.UpdateToolsBefore();
+				UpdateToolsAfter();
 				UpdateToolsLoadstate();
 				InputManager.AutoFireController.ClearStarts();
 
@@ -4093,11 +4071,9 @@ namespace BizHawk.Client.EmuHawk
 			{
 				AddOnScreenMessage("Loadstate error!");
 			}
-
-			MovieSession.Movie.IsCountingRerecords = wasCountingRerecords;
 		}
 
-		public void LoadQuickSave(string quickSlotName, bool fromLua = false, bool suppressOSD = false)
+		public void LoadQuickSave(string quickSlotName, bool suppressOSD = false)
 		{
 			if (!Emulator.HasSavestates())
 			{
@@ -4124,7 +4100,7 @@ namespace BizHawk.Client.EmuHawk
 				return;
 			}
 
-			LoadState(path, quickSlotName, fromLua, suppressOSD);
+			LoadState(path, quickSlotName, suppressOSD);
 		}
 
 		public void SaveState(string path, string userFriendlyStateName, bool fromLua = false, bool suppressOSD = false)
diff --git a/src/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs b/src/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs
index 30fe963046..9c55c79e81 100644
--- a/src/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs
@@ -449,7 +449,7 @@ namespace BizHawk.Client.EmuHawk
 			StopBot();
 			_replayMode = true;
 			_doNotUpdateValues = true;
-			MainForm.LoadQuickSave(SelectedSlot, false, true); // Triggers an UpdateValues call
+			MainForm.LoadQuickSave(SelectedSlot, true); // Triggers an UpdateValues call
 			_doNotUpdateValues = false;
 			_startFrame = Emulator.Frame;
 			SetNormalSpeed();
@@ -797,7 +797,7 @@ namespace BizHawk.Client.EmuHawk
 					}
 
 					_currentBotAttempt = new BotAttempt { Attempt = Attempts };
-					MainForm.LoadQuickSave(SelectedSlot, false, true);
+					MainForm.LoadQuickSave(SelectedSlot, true);
 				}
 
 				// Before this would have 2 additional hits before the frame even advanced, making the amount of inputs greater than the number of frames to test.
@@ -936,7 +936,7 @@ namespace BizHawk.Client.EmuHawk
 			}
 
 			_doNotUpdateValues = true;
-			MainForm.LoadQuickSave(SelectedSlot, false, true); // Triggers an UpdateValues call
+			MainForm.LoadQuickSave(SelectedSlot, true); // Triggers an UpdateValues call
 			_doNotUpdateValues = false;
 
 			_targetFrame = Emulator.Frame + (int)FrameLengthNumeric.Value;
diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/ClientLuaLibrary.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/ClientLuaLibrary.cs
index aa90f467b9..c4c351da9b 100644
--- a/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/ClientLuaLibrary.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/ClientLuaLibrary.cs
@@ -136,13 +136,13 @@ namespace BizHawk.Client.EmuHawk
 			bool wasPaused = MainForm.EmulatorPaused;
 
 			// can't re-enter lua while doing this
-			MainForm.SuppressLua = true;
+			GlobalWin.Tools.LuaConsole.LuaImp.SuppressLua = true;
 			while (Emulator.Frame != frame)
 			{
 				MainForm.SeekFrameAdvance();
 			}
 
-			MainForm.SuppressLua = false;
+			GlobalWin.Tools.LuaConsole.LuaImp.SuppressLua = false;
 
 			if (!wasPaused)
 			{
diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/SavestateLuaLibrary.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/SavestateLuaLibrary.cs
index 98c8e04039..9d1b31d83f 100644
--- a/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/SavestateLuaLibrary.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/SavestateLuaLibrary.cs
@@ -17,12 +17,44 @@ namespace BizHawk.Client.EmuHawk
 		public override string Name => "savestate";
 
 		[LuaMethodExample("savestate.load( \"C:\\state.bin\" );")]
-		[LuaMethod("load", "Loads a savestate with the given path. If EmuHawk is deferring quicksaves, to TAStudio for example, that form will do what it likes (and the path is ignored).")]
-		public void Load(string path, bool suppressOSD = false) => APIs.SaveState.Load(path, suppressOSD);
+		[LuaMethod("load"
+			, "Loads a savestate with the given path. If EmuHawk is deferring quicksaves, to TAStudio for example, that form will do what it likes (and the path is ignored).")]
+		public void Load(string path, bool suppressOSD = false)
+		{
+			// TODO: find a non-global way to access LuaImp from Lua libraries!
+			var luaImp = GlobalWin.Tools.LuaConsole?.LuaImp;
+			if (luaImp != null)
+			{
+				luaImp.SuppressLua = true;
+			}
+
+			APIs.SaveState.Load(path, suppressOSD);
+			
+			if (luaImp != null)
+			{
+				luaImp.SuppressLua = false;
+			}
+		}
 
 		[LuaMethodExample("savestate.loadslot( 7 );")]
-		[LuaMethod("loadslot", "Loads the savestate at the given slot number (must be an integer between 0 and 9). If EmuHawk is deferring quicksaves, to TAStudio for example, that form will do what it likes with the slot number.")]
-		public void LoadSlot(int slotNum, bool suppressOSD = false) => APIs.SaveState.LoadSlot(slotNum, suppressOSD);
+		[LuaMethod("loadslot"
+			, "Loads the savestate at the given slot number (must be an integer between 0 and 9). If EmuHawk is deferring quicksaves, to TAStudio for example, that form will do what it likes with the slot number.")]
+		public void LoadSlot(int slotNum, bool suppressOSD = false)
+		{
+			// TODO: find a non-global way to access LuaImp from Lua libraries!
+			var luaImp = GlobalWin.Tools.LuaConsole?.LuaImp;
+			if (luaImp != null)
+			{
+				luaImp.SuppressLua = true;
+			}
+
+			APIs.SaveState.LoadSlot(slotNum, suppressOSD);
+			
+			if (luaImp != null)
+			{
+				luaImp.SuppressLua = false;
+			}
+		}
 
 		[LuaMethodExample("savestate.save( \"C:\\state.bin\" );")]
 		[LuaMethod("save", "Saves a state at the given path. If EmuHawk is deferring quicksaves, to TAStudio for example, that form will do what it likes (and the path is ignored).")]
diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs
index e238fff727..3bb507e41e 100644
--- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs
@@ -520,6 +520,45 @@ namespace BizHawk.Client.EmuHawk
 			return result;
 		}
 
+		protected override void UpdateBefore()
+		{
+			if (LuaImp.SuppressLua)
+			{
+				return;
+			}
+
+			LuaImp.CallFrameBeforeEvent();
+			LuaImp.StartLuaDrawing();
+		}
+
+		protected override void UpdateAfter()
+		{
+			if (LuaImp.SuppressLua)
+			{
+				return;
+			}
+
+			LuaImp.CallFrameAfterEvent();
+			ResumeScripts(true);
+			LuaImp.EndLuaDrawing();
+		}
+
+		protected override void FastUpdateBefore()
+		{
+			if (Config.RunLuaDuringTurbo)
+			{
+				UpdateBefore();
+			}
+		}
+
+		protected override void FastUpdateAfter()
+		{
+			if (Config.RunLuaDuringTurbo)
+			{
+				UpdateAfter();
+			}
+		}
+
 		/// <summary>
 		/// resumes suspended Co-routines
 		/// </summary>
@@ -531,6 +570,16 @@ namespace BizHawk.Client.EmuHawk
 				return;
 			}
 
+			if (LuaImp.SuppressLua)
+			{
+				return;
+			}
+
+			if (MainForm.IsTurboing && !Config.RunLuaDuringTurbo)
+			{
+				return;
+			}
+
 			if (LuaImp.GuiLibrary?.SurfaceIsNull == true)
 			{
 				LuaImp.GuiLibrary.DrawNew("emu");
diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs
index 3443e3ebaa..4f13afdcaa 100644
--- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs
@@ -18,6 +18,7 @@ namespace BizHawk.Client.EmuHawk
 		public readonly LuaFileList ScriptList = new LuaFileList();
 
 		public bool IsRebootingCore { get; set; } // pretty hacky.. we don't want a lua script to be able to restart itself by rebooting the core
+		public bool SuppressLua { get; set; }
 		public EventWaitHandle LuaWait { get; protected set; }
 
 		public abstract void CallExitEvent(LuaFile lf);
diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs
index 4456858baa..834217990b 100644
--- a/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/Lua/Win32LuaLibraries.cs
@@ -122,7 +122,7 @@ namespace BizHawk.Client.EmuHawk
 
 		public override void StartLuaDrawing()
 		{
-			if (ScriptList.Count != 0 && GuiLibrary.SurfaceIsNull)
+			if (ScriptList.Count != 0 && GuiLibrary.SurfaceIsNull && !SuppressLua)
 			{
 				GuiLibrary.DrawNew("emu");
 			}
@@ -130,7 +130,7 @@ namespace BizHawk.Client.EmuHawk
 
 		public override void EndLuaDrawing()
 		{
-			if (ScriptList.Count != 0)
+			if (ScriptList.Count != 0 && !SuppressLua)
 			{
 				GuiLibrary.DrawFinish();
 			}
@@ -157,12 +157,18 @@ namespace BizHawk.Client.EmuHawk
 
 		public override void CallFrameBeforeEvent()
 		{
-			EventsLibrary.CallFrameBeforeEvent();
+			if (!SuppressLua)
+			{
+				EventsLibrary.CallFrameBeforeEvent();
+			}
 		}
 
 		public override void CallFrameAfterEvent()
 		{
-			EventsLibrary.CallFrameAfterEvent();
+			if (!SuppressLua)
+			{
+				EventsLibrary.CallFrameAfterEvent();
+			}
 		}
 
 		public override void CallExitEvent(LuaFile lf)
diff --git a/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs b/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs
index e508198616..ee44e8e394 100644
--- a/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs
+++ b/src/BizHawk.Client.EmuHawk/tools/ToolManager.cs
@@ -461,30 +461,6 @@ namespace BizHawk.Client.EmuHawk
 			.Where(t => typeof(IToolForm).IsAssignableFrom(t))
 			.Where(t => !t.IsInterface)
 			.Where(IsAvailable);
-		
-		private void UpdateBefore()
-		{
-			foreach (var tool in _tools)
-			{
-				if (!tool.IsDisposed
-					|| (tool is RamWatch && _config.DisplayRamWatch)) // RAM Watch hack, on screen display should run even if RAM Watch is closed
-				{
-					tool.UpdateValues(ToolFormUpdateType.PreFrame);
-				}
-			}
-		}
-
-		private void UpdateAfter()
-		{
-			foreach (var tool in _tools)
-			{
-				if (!tool.IsDisposed
-					|| (tool is RamWatch && _config.DisplayRamWatch)) // RAM Watch hack, on screen display should run even if RAM Watch is closed
-				{
-					tool.UpdateValues(ToolFormUpdateType.PostFrame);
-				}
-			}
-		}
 
 		/// <summary>
 		/// Calls UpdateValues() on an instance of T, if it exists
@@ -665,33 +641,26 @@ namespace BizHawk.Client.EmuHawk
 			return tool;
 		}
 
-		public void UpdateToolsBefore(bool fromLua = false)
+		public void UpdateToolsBefore()
 		{
-			if (Has<LuaConsole>())
+			foreach (var tool in _tools)
 			{
-				if (!fromLua)
+				if (!tool.IsDisposed
+					|| (tool is RamWatch && _config.DisplayRamWatch)) // RAM Watch hack, on screen display should run even if RAM Watch is closed
 				{
-					LuaConsole.LuaImp.StartLuaDrawing();
+					tool.UpdateValues(ToolFormUpdateType.PreFrame);
 				}
 			}
-
-			UpdateBefore();
 		}
 
-		public void UpdateToolsAfter(bool fromLua = false)
+		public void UpdateToolsAfter()
 		{
-			if (!fromLua && Has<LuaConsole>())
+			foreach (var tool in _tools)
 			{
-				LuaConsole.ResumeScripts(true);
-			}
-
-			UpdateAfter();
-
-			if (Has<LuaConsole>())
-			{
-				if (!fromLua)
+				if (!tool.IsDisposed
+					|| (tool is RamWatch && _config.DisplayRamWatch)) // RAM Watch hack, on screen display should run even if RAM Watch is closed
 				{
-					LuaConsole.LuaImp.EndLuaDrawing();
+					tool.UpdateValues(ToolFormUpdateType.PostFrame);
 				}
 			}
 		}
@@ -708,13 +677,8 @@ namespace BizHawk.Client.EmuHawk
 			}
 		}
 
-		public void FastUpdateAfter(bool fromLua = false)
+		public void FastUpdateAfter()
 		{
-			if (!fromLua && _config.RunLuaDuringTurbo && Has<LuaConsole>())
-			{
-				LuaConsole.ResumeScripts(true);
-			}
-
 			foreach (var tool in _tools)
 			{
 				if (!tool.IsDisposed
@@ -723,11 +687,6 @@ namespace BizHawk.Client.EmuHawk
 					tool.UpdateValues(ToolFormUpdateType.FastPostFrame);
 				}
 			}
-
-			if (_config.RunLuaDuringTurbo && Has<LuaConsole>())
-			{
-				LuaConsole.LuaImp.EndLuaDrawing();
-			}
 		}
 
 		private static readonly Lazy<List<string>> LazyAsmTypes = new Lazy<List<string>>(() =>