diff --git a/BizHawk.Client.Common/BizHawk.Client.Common.csproj b/BizHawk.Client.Common/BizHawk.Client.Common.csproj
index d3766ece21..04447545af 100644
--- a/BizHawk.Client.Common/BizHawk.Client.Common.csproj
+++ b/BizHawk.Client.Common/BizHawk.Client.Common.csproj
@@ -129,6 +129,7 @@
+
diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Genesis.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Genesis.cs
new file mode 100644
index 0000000000..939d4edd5b
--- /dev/null
+++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Genesis.cs
@@ -0,0 +1,101 @@
+using System.ComponentModel;
+using BizHawk.Emulation.Common;
+using BizHawk.Emulation.Cores.Consoles.Sega.gpgx;
+using LuaInterface;
+using System;
+
+namespace BizHawk.Client.Common
+{
+ [Description("Functions specific to GenesisHawk (functions may not run when an Genesis game is not loaded)")]
+ public sealed class GenesisLuaLibrary : LuaLibraryBase
+ {
+ [OptionalService]
+ private GPGX Genesis { get; set; }
+
+ public GenesisLuaLibrary(Lua lua)
+ : base(lua) { }
+
+ public GenesisLuaLibrary(Lua lua, Action logOutputCallback)
+ : base(lua, logOutputCallback) { }
+
+ public override string Name { get { return "genesis"; } }
+
+ private GPGX.GPGXSettings GetSettings()
+ {
+ if (Genesis != null)
+ {
+ return Genesis.GetSettings();
+ }
+
+ return new GPGX.GPGXSettings();
+ }
+
+ private void PutSettings(GPGX.GPGXSettings settings)
+ {
+ if (Genesis != null)
+ {
+ Genesis.PutSettings(settings);
+ }
+ }
+
+ [LuaMethodAttributes(
+ "getlayer_bga",
+ "Returns whether the bg layer A is displayed"
+ )]
+ public bool GetLayerBgA()
+ {
+ return GetSettings().DrawBGA;
+ }
+
+ [LuaMethodAttributes(
+ "getlayer_bgb",
+ "Returns whether the bg layer B is displayed"
+ )]
+ public bool GetLayerBgB()
+ {
+ return GetSettings().DrawBGB;
+ }
+
+ [LuaMethodAttributes(
+ "getlayer_bgw",
+ "Returns whether the bg layer W is displayed"
+ )]
+ public bool GetLayerBgW()
+ {
+ return GetSettings().DrawBGW;
+ }
+
+ [LuaMethodAttributes(
+ "setlayer_bga",
+ "Sets whether the bg layer A is displayed"
+ )]
+ public void SetLayerBgA(bool value)
+ {
+ var s = GetSettings();
+ s.DrawBGA = value;
+ PutSettings(s);
+ }
+
+ [LuaMethodAttributes(
+ "setlayer_bgb",
+ "Sets whether the bg layer B is displayed"
+ )]
+ public void SetLayerBgB(bool value)
+ {
+ var s = GetSettings();
+ s.DrawBGB = value;
+ PutSettings(s);
+ }
+
+ [LuaMethodAttributes(
+ "setlayer_bgw",
+ "Sets whether the bg layer W is displayed"
+ )]
+ public void SetLayerBgW(bool value)
+ {
+ var s = GetSettings();
+ s.DrawBGW = value;
+ PutSettings(s);
+ }
+ }
+}