diff --git a/.gitmodules b/.gitmodules
index 61254c051d8768022c987c93ab363fd561b386b6..0f59df115d3205bafe74abe4b67a7fef1cb22ee3 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -7,3 +7,18 @@
 [submodule "extern/glm"]
 	path = extern/glm
 	url = https://github.com/g-truc/glm.git
+[submodule "extern/glfw"]
+	path = extern/glfw
+	url = https://github.com/glfw/glfw.git
+[submodule "extern/glow"]
+	path = extern/glow
+	url = https://www.graphics.rwth-aachen.de:9000/Glow/glow.git
+[submodule "extern/glow-extras"]
+	path = extern/glow-extras
+	url = https://www.graphics.rwth-aachen.de:9000/Glow/glow-extras.git
+[submodule "extern/imgui-lean"]
+	path = extern/imgui-lean
+	url = https://www.graphics.rwth-aachen.de:9000/ptrettner/imgui-lean.git
+[submodule "extern/ctracer"]
+	path = extern/ctracer
+	url = https://www.graphics.rwth-aachen.de:9000/ptrettner/ctracer.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fc6cabbbb9a0dd00119f909396f8e34c7e907113..b0f97b62601aa4646e3e7ec41f8ba5417ee57d09 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,11 +12,6 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON)
 
 option(PM_BUILD_TESTS "Build polymesh tests" OFF)
 
-option(PM_FORCE_CPP14 "Build samples and tests with C++14" OFF)
-
-if (PM_FORCE_CPP14)
-    set(CMAKE_CXX_STANDARD 14)
-endif()
 
 # ==============================================================================
 # Set bin dir
@@ -34,6 +29,9 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${BIN_DIR})
 # ===============================================
 # Dependencies
 
+# profiling library
+add_subdirectory(extern/ctracer)
+
 # glm
 add_library(glm INTERFACE)
 target_include_directories(glm INTERFACE extern/glm)
@@ -43,22 +41,38 @@ target_compile_definitions(glm INTERFACE
     GLM_FORCE_CTOR_INIT # 0.9.9 breaks a lot otherwise
 )
 
+# Add GLFW lib (with disabled spam)
+option(GLFW_BUILD_EXAMPLES "" OFF)
+option(GLFW_BUILD_TESTS "" OFF)
+option(GLFW_BUILD_DOCS "" OFF)
+option(GLFW_INSTALL "" OFF)
+add_subdirectory(extern/glfw)
+
 # math library
 add_subdirectory(extern/typed-geometry)
 
 # mesh library
 add_subdirectory(extern/polymesh)
 
+# opengl library
+add_subdirectory(extern/glow)
+
+# UI library
+add_subdirectory(extern/imgui-lean)
+
+# glow extras
+add_subdirectory(extern/glow-extras)
+
 
 # ===============================================
 # Compile flags
 
 if (MSVC)
-    set(SAMPLE_FLAGS 
+    set(SAMPLE_FLAGS
         /MP
     )
 else()
-    set(SAMPLE_FLAGS 
+    set(SAMPLE_FLAGS
         -Wall
         -Wno-unused-variable
     )
@@ -113,6 +127,11 @@ if (PM_BUILD_TESTS)
     target_link_libraries(pm-tests PUBLIC
         typed-geometry
         polymesh
+        ctracer
+        glfw
+        imgui
+        glow
+        glow-extras
     )
 
     target_include_directories(pm-tests PUBLIC "tests")
@@ -129,7 +148,7 @@ foreach(TARGET_NAME
     polymesh
     typed-geometry-src
 )
-    if (TARGET ${TARGET_NAME}) 
-        set_property(TARGET ${TARGET_NAME} PROPERTY FOLDER "Extern") 
+    if (TARGET ${TARGET_NAME})
+        set_property(TARGET ${TARGET_NAME} PROPERTY FOLDER "Extern")
     endif()
 endforeach()
diff --git a/extern/ctracer b/extern/ctracer
new file mode 160000
index 0000000000000000000000000000000000000000..56d33f9b69854c7339e8ddd71fe81095ddd5cc41
--- /dev/null
+++ b/extern/ctracer
@@ -0,0 +1 @@
+Subproject commit 56d33f9b69854c7339e8ddd71fe81095ddd5cc41
diff --git a/extern/glfw b/extern/glfw
new file mode 160000
index 0000000000000000000000000000000000000000..7f02898264d6077738f0e8032f027eb7e252c90e
--- /dev/null
+++ b/extern/glfw
@@ -0,0 +1 @@
+Subproject commit 7f02898264d6077738f0e8032f027eb7e252c90e
diff --git a/extern/glow b/extern/glow
new file mode 160000
index 0000000000000000000000000000000000000000..af31c1cccb3fcdac0ed05517654b122b138de73a
--- /dev/null
+++ b/extern/glow
@@ -0,0 +1 @@
+Subproject commit af31c1cccb3fcdac0ed05517654b122b138de73a
diff --git a/extern/glow-extras b/extern/glow-extras
new file mode 160000
index 0000000000000000000000000000000000000000..0b6506e3f67f3ea84ec8e54560ede9abc10051d2
--- /dev/null
+++ b/extern/glow-extras
@@ -0,0 +1 @@
+Subproject commit 0b6506e3f67f3ea84ec8e54560ede9abc10051d2
diff --git a/extern/imgui-lean b/extern/imgui-lean
new file mode 160000
index 0000000000000000000000000000000000000000..11db8750f990c6ae1a09fb21f7031d7d177fe4c1
--- /dev/null
+++ b/extern/imgui-lean
@@ -0,0 +1 @@
+Subproject commit 11db8750f990c6ae1a09fb21f7031d7d177fe4c1
diff --git a/extern/polymesh b/extern/polymesh
index 622e04156e2bd771d3131a35fb90008c83b807e3..f1ec496eb60b71f4bbc4f53ebb9b646b5c08a63f 160000
--- a/extern/polymesh
+++ b/extern/polymesh
@@ -1 +1 @@
-Subproject commit 622e04156e2bd771d3131a35fb90008c83b807e3
+Subproject commit f1ec496eb60b71f4bbc4f53ebb9b646b5c08a63f
diff --git a/extern/typed-geometry b/extern/typed-geometry
index 12b7f4ae7ccf066874388d7223d43868bce7c71c..650e30988351cf11f15141347c867a223d80f728 160000
--- a/extern/typed-geometry
+++ b/extern/typed-geometry
@@ -1 +1 @@
-Subproject commit 12b7f4ae7ccf066874388d7223d43868bce7c71c
+Subproject commit 650e30988351cf11f15141347c867a223d80f728