diff --git a/lib/SDL b/lib/SDL
index 87a83787..c9aec268 160000
--- a/lib/SDL
+++ b/lib/SDL
@@ -1 +1 @@
-Subproject commit 87a83787a3a0a9922b02b35ba809d9da86930fc8
+Subproject commit c9aec268fa7f892e183219683160599a4a2b86db
diff --git a/lib/openal-soft b/lib/openal-soft
index d66107e9..fde74453 160000
--- a/lib/openal-soft
+++ b/lib/openal-soft
@@ -1 +1 @@
-Subproject commit d66107e9f008770b48f0df4fce041ee3e501e1e8
+Subproject commit fde74453a62a1ce4b5efaac0ec1835b9f5731e25
diff --git a/src/dawn/scene/components/ui/CMakeLists.txt b/src/dawn/scene/components/ui/CMakeLists.txt
index a8d0aea3..324f1446 100644
--- a/src/dawn/scene/components/ui/CMakeLists.txt
+++ b/src/dawn/scene/components/ui/CMakeLists.txt
@@ -9,6 +9,7 @@ target_sources(${DAWN_TARGET_NAME}
     UICanvas.cpp
     UIComponent.cpp
     UILabel.cpp
+    UIMenuController.cpp
 )
 
 tool_scenecomponent(UICanvas scene/components/ui/UICanvas.hpp)
\ No newline at end of file
diff --git a/src/dawn/scene/components/ui/UIMenu.hpp b/src/dawn/scene/components/ui/UIMenu.hpp
deleted file mode 100644
index a28302e8..00000000
--- a/src/dawn/scene/components/ui/UIMenu.hpp
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2023 Dominic Masters
-// 
-// This software is released under the MIT License.
-// https://opensource.org/licenses/MIT
-
-#pragma once
-#include "scene/SceneItemComponent.hpp"
-
-namespace Dawn {
-  class UIMenuController : public SceneItemComponent {
-    public:
-      
-  };
-}
\ No newline at end of file
diff --git a/src/dawn/scene/components/ui/UIMenuController.cpp b/src/dawn/scene/components/ui/UIMenuController.cpp
new file mode 100644
index 00000000..fd121a6c
--- /dev/null
+++ b/src/dawn/scene/components/ui/UIMenuController.cpp
@@ -0,0 +1,30 @@
+// Copyright (c) 2023 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#pragma once
+#include "UIMenuController.hpp"
+
+using namespace Dawn;
+
+UIMenuController::UIMenuController(SceneItem *item) :
+  SceneItemComponent(item),
+  active(false),
+  menuX(0),
+  menuY(0),
+  columns(4),
+  rows(4)
+{
+
+}
+
+void UIMenuController::onStart() {
+  useEffectWithTeardown([&]{
+    if(!active) return activeTeardown = [&]{ };
+
+    return activeTeardown = [&]{
+      
+    };
+  }, active)();
+}
\ No newline at end of file
diff --git a/src/dawn/scene/components/ui/UIMenuController.hpp b/src/dawn/scene/components/ui/UIMenuController.hpp
new file mode 100644
index 00000000..d5eefdc6
--- /dev/null
+++ b/src/dawn/scene/components/ui/UIMenuController.hpp
@@ -0,0 +1,28 @@
+// Copyright (c) 2023 Dominic Masters
+// 
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+#pragma once
+#include "scene/SceneItemComponent.hpp"
+
+namespace Dawn {
+  class UIMenuController : public SceneItemComponent {
+    private:
+      std::function<void()> activeTeardown;
+
+    public:
+      StateProperty<bool_t> active;
+      StateProperty<int32_t> menuX;
+      StateProperty<int32_t> menuY;
+      StateProperty<int32_t> columns;
+      StateProperty<int32_t> rows;
+
+      StateEvent<int32_t, int32_t> eventItemChange;
+      StateEvent<int32_t, int32_t> eventItemSelected;
+
+      UIMenuController(SceneItem *item);
+
+      void onStart();
+  };
+}
\ No newline at end of file