diff --git a/BizHawk.MultiClient/GlobalWinF.cs b/BizHawk.MultiClient/GlobalWinF.cs
new file mode 100644
index 0000000000..ce1b5ef693
--- /dev/null
+++ b/BizHawk.MultiClient/GlobalWinF.cs
@@ -0,0 +1,90 @@
+using BizHawk.DiscSystem;
+using SlimDX.Direct3D9;
+using SlimDX.DirectSound;
+
+using BizHawk.Client.Common;
+
+namespace BizHawk.MultiClient
+{
+ public static class GlobalWinF
+ {
+ public static MainForm MainForm;
+#if WINDOWS
+ public static DirectSound DSound;
+ public static Direct3D Direct3D;
+#endif
+ public static Sound Sound;
+ public static IRenderer RenderPanel;
+ public static OSDManager OSD = new OSDManager();
+ public static DisplayManager DisplayManager = new DisplayManager();
+ public static CoreComm CoreComm;
+
+ public static Controller NullControls;
+ public static AutofireController AutofireNullControls;
+
+ ///
+ /// whether throttling is force-disabled by use of fast forward
+ ///
+ public static bool ForceNoThrottle;
+
+ //the movie will be spliced inbetween these if it is present
+ public static CopyControllerAdapter MovieInputSourceAdapter = new CopyControllerAdapter();
+ public static CopyControllerAdapter MovieOutputHardpoint = new CopyControllerAdapter();
+
+ //dont take my word for it, since the final word is actually in RewireInputChain, but here is a guide...
+ //user -> Input -> ActiveController -> UDLR -> StickyXORPlayerInputAdapter -> TurboAdapter(TBD) -> Lua(?TBD?) -> ..
+ //.. -> MultitrackRewiringControllerAdapter -> MovieInputSourceAdapter -> (MovieSession) -> MovieOutputAdapter -> ControllerOutput(1) -> Game
+ //(1)->Input Display
+
+ //the original source controller, bound to the user, sort of the "input" port for the chain, i think
+ public static Controller ActiveController;
+
+ //rapid fire version on the user controller, has its own key bindings and is OR'ed against ActiveController
+ public static AutofireController AutoFireController;
+
+ //the "output" port for the controller chain.
+ public static CopyControllerAdapter ControllerOutput = new CopyControllerAdapter();
+
+ //input state which has been destined for game controller inputs are coalesced here
+ public static ControllerInputCoalescer ControllerInputCoalescer = new ControllerInputCoalescer();
+ //input state which has been destined for client hotkey consumption are colesced here
+ public static InputCoalescer HotkeyCoalescer = new InputCoalescer();
+
+ public static UD_LR_ControllerAdapter UD_LR_ControllerAdapter = new UD_LR_ControllerAdapter();
+
+ ///
+ /// provides an opportunity to mutate the player's input in an autohold style
+ ///
+ public static StickyXORAdapter StickyXORAdapter = new StickyXORAdapter();
+
+ public static AutoFireStickyXORAdapter AutofireStickyXORAdapter = new AutoFireStickyXORAdapter();
+
+ ///
+ /// Forces any controller button to Off, useful for things like Joypad.Set
+ ///
+ public static ForceOffAdaptor ForceOffAdaptor = new ForceOffAdaptor();
+
+ ///
+ /// will OR together two IControllers
+ ///
+ public static ORAdapter OrControllerAdapter = new ORAdapter();
+
+ ///
+ /// fire off one-frame logical button clicks here. useful for things like ti-83 virtual pad and reset buttons
+ ///
+ public static ClickyVirtualPadController ClickyVirtualPadController = new ClickyVirtualPadController();
+
+ public static SimpleController MovieOutputController = new SimpleController();
+
+ public static Controller ClientControls;
+
+ public static string GetOutputControllersAsMnemonic()
+ {
+ MnemonicsGenerator mg = new MnemonicsGenerator();
+ mg.SetSource(ControllerOutput);
+ return mg.GetControllersAsMnemonic();
+ }
+
+ public static DiscHopper DiscHopper = new DiscHopper();
+ }
+}