diff --git a/FocusTerra/.vs/FocusTerra/v16/.suo b/FocusTerra/.vs/FocusTerra/v16/.suo
index 160d73178deeeb55bb53f8d60b6f3423c11ad63f..3071d821f737f1314afea7da0fe47f1dccf121e7 100644
Binary files a/FocusTerra/.vs/FocusTerra/v16/.suo and b/FocusTerra/.vs/FocusTerra/v16/.suo differ
diff --git a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/13073c15335d2976/DRAWING_HANDLER.ipch b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/13073c15335d2976/DRAWING_HANDLER.ipch
index 84f70c2405f19d3874bc7e01b7cf83a3dd891fe8..239643c4e2519bdff74ff2a922d18180137e4959 100644
Binary files a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/13073c15335d2976/DRAWING_HANDLER.ipch and b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/13073c15335d2976/DRAWING_HANDLER.ipch differ
diff --git a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/2497ca4debdda90c/SLIM_BLOCKCHAIN_HANDLER.ipch b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/2497ca4debdda90c/SLIM_BLOCKCHAIN_HANDLER.ipch
index dcfa507f66db01ed338689168d7803fba025919b..365263a7c92d61f6b8523123d9820f76c1597f0f 100644
Binary files a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/2497ca4debdda90c/SLIM_BLOCKCHAIN_HANDLER.ipch and b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/2497ca4debdda90c/SLIM_BLOCKCHAIN_HANDLER.ipch differ
diff --git a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/2c9c502d131f3083/MAIN_TESTING.ipch b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/2c9c502d131f3083/MAIN_TESTING.ipch
new file mode 100644
index 0000000000000000000000000000000000000000..5276a65cb7165aadb0c3407befbc9b6f5c3c5630
Binary files /dev/null and b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/2c9c502d131f3083/MAIN_TESTING.ipch differ
diff --git a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/3ff180ae330f6cc6/DRAWER.ipch b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/3ff180ae330f6cc6/DRAWER.ipch
index ef107c52279c62e2faa4b96004e8266605435952..90e3bafc1fb50b4c3c99d513a125871d4ad92f39 100644
Binary files a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/3ff180ae330f6cc6/DRAWER.ipch and b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/3ff180ae330f6cc6/DRAWER.ipch differ
diff --git a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/814970c2f16523d/WAVE_HANDLER.ipch b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/814970c2f16523d/WAVE_HANDLER.ipch
index f15d120fc5ea292f07d2e8a133e950db020affad..08a9a66aba44c509c35fa50a6ebbc7b6b6c2aac9 100644
Binary files a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/814970c2f16523d/WAVE_HANDLER.ipch and b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/814970c2f16523d/WAVE_HANDLER.ipch differ
diff --git a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/86d3aa3212a74e48/INFRASTRUCTURE.ipch b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/86d3aa3212a74e48/INFRASTRUCTURE.ipch
index fa51d59f881710aaf9233fea744d8c8e9b6935b1..a21d643fe919fcc05327764d6784086fe6142ca6 100644
Binary files a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/86d3aa3212a74e48/INFRASTRUCTURE.ipch and b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/86d3aa3212a74e48/INFRASTRUCTURE.ipch differ
diff --git a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/cb00a5d01c33728d/MAIN_TESTING.ipch b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/cb00a5d01c33728d/MAIN_TESTING.ipch
index 10ff385078eda405b315961b0619593f33b56407..903edd66c758e1cdd8718fdaa73d28d7a2a2d79f 100644
Binary files a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/cb00a5d01c33728d/MAIN_TESTING.ipch and b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/cb00a5d01c33728d/MAIN_TESTING.ipch differ
diff --git a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/e7b221f31939c09e/EFFICIENT_BLOCK.ipch b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/e7b221f31939c09e/EFFICIENT_BLOCK.ipch
index 47580869773352ac5cb3f3d137732c6369dc7682..dc3ffdb4dfa81525063ec600afb0e92096f7841e 100644
Binary files a/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/e7b221f31939c09e/EFFICIENT_BLOCK.ipch and b/FocusTerra/.vs/FocusTerra/v16/ipch/AutoPCH/e7b221f31939c09e/EFFICIENT_BLOCK.ipch differ
diff --git a/FocusTerra/FocusTerra/FocusTerra.vcxproj b/FocusTerra/FocusTerra/FocusTerra.vcxproj
index 52e84f698b26e441ef9767552bae7d4edb9fe2c7..fbc91051866bb831b0e2491bc8fa11018d419915 100644
--- a/FocusTerra/FocusTerra/FocusTerra.vcxproj
+++ b/FocusTerra/FocusTerra/FocusTerra.vcxproj
@@ -237,6 +237,8 @@
     <None Include="..\..\shaders\copy_red.vert" />
     <None Include="..\..\shaders\draw.frag" />
     <None Include="..\..\shaders\draw.vert" />
+    <None Include="..\..\shaders\draw_blocks.frag" />
+    <None Include="..\..\shaders\draw_blocks.vert" />
     <None Include="..\..\shaders\render2d.frag" />
     <None Include="..\..\shaders\render2d.vert" />
     <None Include="..\..\shaders\render3d.frag" />
diff --git a/FocusTerra/FocusTerra/FocusTerra.vcxproj.filters b/FocusTerra/FocusTerra/FocusTerra.vcxproj.filters
index 03dbb48d63d4bf631c509ca39864977ff0ace3d0..e1c14ecc8819c3e56c464214051ccd14b0a5aa11 100644
--- a/FocusTerra/FocusTerra/FocusTerra.vcxproj.filters
+++ b/FocusTerra/FocusTerra/FocusTerra.vcxproj.filters
@@ -238,6 +238,12 @@
     <None Include="..\..\resource\damp_test.conf">
       <Filter>Resource Files</Filter>
     </None>
+    <None Include="..\..\shaders\draw_blocks.vert">
+      <Filter>Resource Files</Filter>
+    </None>
+    <None Include="..\..\shaders\draw_blocks.frag">
+      <Filter>Resource Files</Filter>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <Text Include="..\..\resource\classDesign.txt">
diff --git a/FocusTerra/FocusTerra/x64/Release/FocusTerra.Build.CppClean.log b/FocusTerra/FocusTerra/x64/Release/FocusTerra.Build.CppClean.log
new file mode 100644
index 0000000000000000000000000000000000000000..a7a36fe4bad7fc33a49e81318804157dfd20e222
--- /dev/null
+++ b/FocusTerra/FocusTerra/x64/Release/FocusTerra.Build.CppClean.log
@@ -0,0 +1,38 @@
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\vc142.pdb
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\glad.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\shader.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\main.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\init.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\imgui_widgets.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\imgui_impl_sdl.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\imgui_impl_opengl3.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\imgui_draw.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\imgui_demo.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\imgui.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\main_3d.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\wave_handler.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\main_refactored.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\main_testing.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\input_handler.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\infrastructure.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\gui_handler.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\blockchain_handler.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\pevent.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\block.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\toolbox.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\drawing_handler.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\drawer.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\event_logger.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\imgui_example_sdl_opengl3.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\slim_blockchain_handler.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\efficient_block.obj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\x64\release\focusterra.exe
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\focusterra.ipdb
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\focusterra.iobj
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\x64\release\focusterra.pdb
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\focusterra.tlog\cl.command.1.tlog
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\focusterra.tlog\cl.read.1.tlog
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\focusterra.tlog\cl.write.1.tlog
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\focusterra.tlog\link.command.1.tlog
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\focusterra.tlog\link.read.1.tlog
+c:\users\engel\vs_projects\focusterra\framebuffer-testing\focusterra\focusterra\x64\release\focusterra.tlog\link.write.1.tlog
diff --git a/FocusTerra/FocusTerra/x64/Release/FocusTerra.iobj b/FocusTerra/FocusTerra/x64/Release/FocusTerra.iobj
index 49a4ca1caf201823d9cb32cfc753b28738a2e754..b6eb842ea492238961052f03be77ac5188ba66c8 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/FocusTerra.iobj and b/FocusTerra/FocusTerra/x64/Release/FocusTerra.iobj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/FocusTerra.ipdb b/FocusTerra/FocusTerra/x64/Release/FocusTerra.ipdb
index 16a3c271aa4d25ea5a203a4825cd94ec54f54789..5f4c1aa50444e7fab5cc44d7d27bdd07283759c2 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/FocusTerra.ipdb and b/FocusTerra/FocusTerra/x64/Release/FocusTerra.ipdb differ
diff --git a/FocusTerra/FocusTerra/x64/Release/FocusTerra.log b/FocusTerra/FocusTerra/x64/Release/FocusTerra.log
index 0f3b073d50ab240e5614072f1c476ac2adb1cb69..01bea05a82735b5b9ae096d9df7553a754dc6d91 100644
--- a/FocusTerra/FocusTerra/x64/Release/FocusTerra.log
+++ b/FocusTerra/FocusTerra/x64/Release/FocusTerra.log
@@ -1,8 +1,96 @@
-  block.cpp
+  slim_blockchain_handler.cpp
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(146,40): warning C4267: 'argument': conversion from 'size_t' to 'GLint', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(161,40): warning C4267: 'argument': conversion from 'size_t' to 'GLint', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(167,40): warning C4267: 'argument': conversion from 'size_t' to 'GLint', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(182,40): warning C4267: 'argument': conversion from 'size_t' to 'GLint', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(188,40): warning C4267: 'argument': conversion from 'size_t' to 'GLint', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(246,16): warning C4244: 'initializing': conversion from 'int' to 'float', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(247,59): warning C4244: 'argument': conversion from 'float' to 'int', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(247,56): warning C4244: 'argument': conversion from 'float' to 'int', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(267,16): warning C4244: 'initializing': conversion from 'int' to 'float', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(268,59): warning C4244: 'argument': conversion from 'float' to 'int', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(268,56): warning C4244: 'argument': conversion from 'float' to 'int', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(275,17): warning C4244: 'initializing': conversion from 'const int' to 'float', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(276,18): warning C4244: 'initializing': conversion from 'const int' to 'float', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(284,11): warning C4244: 'initializing': conversion from 'int' to 'float', possible loss of data
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(285,11): warning C4244: 'initializing': conversion from 'const T' to 'float', possible loss of data
+          with
+          [
+              T=glm::i32
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(286,11): warning C4244: 'initializing': conversion from 'T' to 'float', possible loss of data
+          with
+          [
+              T=glm::i32
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(287,11): warning C4244: 'initializing': conversion from 'const T' to 'float', possible loss of data
+          with
+          [
+              T=glm::i32
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(289,42): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(290,43): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(294,46): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(295,47): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(299,46): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(300,43): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(304,42): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(305,43): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(309,46): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(310,47): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(314,42): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
+C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\slim_blockchain_handler.cpp(315,47): warning C4244: 'argument': conversion from 'double' to '_Ty', possible loss of data
+          with
+          [
+              _Ty=float
+          ]
   Generating code
-C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\src\main_testing.cpp(104): warning C4715: 'SDL_main': not all control paths return a value
-  9 of 2120 functions ( 0.4%) were compiled, the rest were copied from previous compilation.
+  2 of 2212 functions (<0.1%) were compiled, the rest were copied from previous compilation.
     0 functions were new in current compilation
-    22 functions had inline decision re-evaluated but remain unchanged
+    23 functions had inline decision re-evaluated but remain unchanged
   Finished generating code
   FocusTerra.vcxproj -> C:\Users\engel\VS_Projects\FocusTerra\framebuffer-testing\FocusTerra\x64\Release\FocusTerra.exe
diff --git a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.command.1.tlog b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.command.1.tlog
index db04f725f81a6ea3c060c158b838a3e5faa60200..02fbb17783a6fff9c9fd36cd0d145dc2a4f44a37 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.command.1.tlog and b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.command.1.tlog differ
diff --git a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.read.1.tlog b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.read.1.tlog
index 217750b72a3067993aa771a8e1cd35d63d4741bc..17b47dbbeb5026e8016ebea879e358c7d6d8882f 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.read.1.tlog and b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.read.1.tlog differ
diff --git a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.write.1.tlog b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.write.1.tlog
index 14585667aa7dc606783ec8de16d50c123e308c61..1c5e5c11ee5e3738c740f990220f3e6c41c602f3 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.write.1.tlog and b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/CL.write.1.tlog differ
diff --git a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.command.1.tlog b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.command.1.tlog
index 06f33998edf5afd5928fb69f3eb27e5aec5dc434..1a2742ba34faf8bf40bcd668bb1ba03225d980b2 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.command.1.tlog and b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.command.1.tlog differ
diff --git a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.read.1.tlog b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.read.1.tlog
index 157ec7f83d88ad3b3f9eaf04c488926c500208a3..2cd31494dadf74d19db32eb70f85c6443501b23f 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.read.1.tlog and b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.read.1.tlog differ
diff --git a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.write.1.tlog b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.write.1.tlog
index 23313101401cc1ee226fc009ac014ac91c7229b3..161ca65f0408be56139d39cad22ef1d94a307b50 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.write.1.tlog and b/FocusTerra/FocusTerra/x64/Release/FocusTerra.tlog/link.write.1.tlog differ
diff --git a/FocusTerra/FocusTerra/x64/Release/FocusTerra.vcxproj.FileListAbsolute.txt b/FocusTerra/FocusTerra/x64/Release/FocusTerra.vcxproj.FileListAbsolute.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/FocusTerra/FocusTerra/x64/Release/block.obj b/FocusTerra/FocusTerra/x64/Release/block.obj
deleted file mode 100644
index 79d3aab8fe8996119f00cdf9d3d1a112bb58d51d..0000000000000000000000000000000000000000
Binary files a/FocusTerra/FocusTerra/x64/Release/block.obj and /dev/null differ
diff --git a/FocusTerra/FocusTerra/x64/Release/blockchain_handler.obj b/FocusTerra/FocusTerra/x64/Release/blockchain_handler.obj
deleted file mode 100644
index 611c99f874aae3874b81ef0be0b8f073885b661c..0000000000000000000000000000000000000000
Binary files a/FocusTerra/FocusTerra/x64/Release/blockchain_handler.obj and /dev/null differ
diff --git a/FocusTerra/FocusTerra/x64/Release/drawer.obj b/FocusTerra/FocusTerra/x64/Release/drawer.obj
index be390687af97af06cf9601305d1a31e70c85fac7..ed7e9bdec214765b3fa6e30835631ace8395b39d 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/drawer.obj and b/FocusTerra/FocusTerra/x64/Release/drawer.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/drawing_handler.obj b/FocusTerra/FocusTerra/x64/Release/drawing_handler.obj
index aeacb8e69b66c2b8caec4cd3d410092f2ddf1a46..43b1942bdf9c1c5dea438176f03da3d127e39683 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/drawing_handler.obj and b/FocusTerra/FocusTerra/x64/Release/drawing_handler.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/efficient_block.obj b/FocusTerra/FocusTerra/x64/Release/efficient_block.obj
new file mode 100644
index 0000000000000000000000000000000000000000..ab2e02ff86e403b5e969647887bf37d2ddcdaa4f
Binary files /dev/null and b/FocusTerra/FocusTerra/x64/Release/efficient_block.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/event_logger.obj b/FocusTerra/FocusTerra/x64/Release/event_logger.obj
index bc5bc8f320d40dd5f87a580972072a9bb6e45c89..777d2fd426e8bed7610e7a5646cf773c11a923c0 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/event_logger.obj and b/FocusTerra/FocusTerra/x64/Release/event_logger.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/glad.obj b/FocusTerra/FocusTerra/x64/Release/glad.obj
index de6111f6987a5ca7d37d4a0d4810642927386043..98a4a0ddf1c923638cd97b340047e0e327b9c891 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/glad.obj and b/FocusTerra/FocusTerra/x64/Release/glad.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/gui_handler.obj b/FocusTerra/FocusTerra/x64/Release/gui_handler.obj
index cdaa55227fad4d928bbfe106c52ffb93316c5993..bc2056481f0e4978f91f523790101764a97ba692 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/gui_handler.obj and b/FocusTerra/FocusTerra/x64/Release/gui_handler.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/imgui.obj b/FocusTerra/FocusTerra/x64/Release/imgui.obj
index 025a4cf0c97dac56625446f8ed93fb1767cbdfed..a592d41a4460e3c1d9ecf4fc48065c2c96522c71 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/imgui.obj and b/FocusTerra/FocusTerra/x64/Release/imgui.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/imgui_demo.obj b/FocusTerra/FocusTerra/x64/Release/imgui_demo.obj
index da919fbd69559647b8ce30fcb015d56f85f24ec8..ddaf7ca4958713b293d61db3550f53ae1e2f12cb 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/imgui_demo.obj and b/FocusTerra/FocusTerra/x64/Release/imgui_demo.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/imgui_draw.obj b/FocusTerra/FocusTerra/x64/Release/imgui_draw.obj
index a9d89a6d9bcf993ed070cf1c8d5c188d4ddaf11f..442a03895e626ca7c171f75a4033ab9508754aab 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/imgui_draw.obj and b/FocusTerra/FocusTerra/x64/Release/imgui_draw.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/imgui_example_sdl_opengl3.obj b/FocusTerra/FocusTerra/x64/Release/imgui_example_sdl_opengl3.obj
deleted file mode 100644
index 2a5d3403dfa1fdbd753974fa310284ceb9c7f954..0000000000000000000000000000000000000000
Binary files a/FocusTerra/FocusTerra/x64/Release/imgui_example_sdl_opengl3.obj and /dev/null differ
diff --git a/FocusTerra/FocusTerra/x64/Release/imgui_impl_opengl3.obj b/FocusTerra/FocusTerra/x64/Release/imgui_impl_opengl3.obj
index cf3907bc161c5c8a0d6f012486c7548dcedf9fb0..8c980d5fbcbfee3ce717bad746ee9f1624c6b44e 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/imgui_impl_opengl3.obj and b/FocusTerra/FocusTerra/x64/Release/imgui_impl_opengl3.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/imgui_impl_sdl.obj b/FocusTerra/FocusTerra/x64/Release/imgui_impl_sdl.obj
index ce5081a73613fe4e657ba33c71ac4b0909a1c629..0cd3b518ece0e6ed49e13be8d6d3c30d40532539 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/imgui_impl_sdl.obj and b/FocusTerra/FocusTerra/x64/Release/imgui_impl_sdl.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/imgui_widgets.obj b/FocusTerra/FocusTerra/x64/Release/imgui_widgets.obj
index 15b2c0d42b16f91a79de6be2505a74973c6fd1c2..090a08fde90c1cf8f382322bdf5bf24457695442 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/imgui_widgets.obj and b/FocusTerra/FocusTerra/x64/Release/imgui_widgets.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/infrastructure.obj b/FocusTerra/FocusTerra/x64/Release/infrastructure.obj
index c0961dbf81cac9c7095b7cfcbc395bbfbff0e43c..9caf3ba1f99eb88966ec40e0abcb5de95181937e 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/infrastructure.obj and b/FocusTerra/FocusTerra/x64/Release/infrastructure.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/init.obj b/FocusTerra/FocusTerra/x64/Release/init.obj
index 27027313b8caba3ecc994dd0f78fa0f7e294dc00..cc56d833e29b23273c5305ef04b95fe3a4400b62 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/init.obj and b/FocusTerra/FocusTerra/x64/Release/init.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/input_handler.obj b/FocusTerra/FocusTerra/x64/Release/input_handler.obj
index 95b11625b0cf94a3d5771b0eb7aaa0a946e57e2c..1ddbf2da81292d29395ccb468901caf2db586ad9 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/input_handler.obj and b/FocusTerra/FocusTerra/x64/Release/input_handler.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/main.obj b/FocusTerra/FocusTerra/x64/Release/main.obj
deleted file mode 100644
index 8d13c9c7d890f78a4915ee47acc95d12e165b631..0000000000000000000000000000000000000000
Binary files a/FocusTerra/FocusTerra/x64/Release/main.obj and /dev/null differ
diff --git a/FocusTerra/FocusTerra/x64/Release/main_3d.obj b/FocusTerra/FocusTerra/x64/Release/main_3d.obj
deleted file mode 100644
index 304f9d5bed6c5a677d539138cf76ffdfa130ddfe..0000000000000000000000000000000000000000
Binary files a/FocusTerra/FocusTerra/x64/Release/main_3d.obj and /dev/null differ
diff --git a/FocusTerra/FocusTerra/x64/Release/main_refactored.obj b/FocusTerra/FocusTerra/x64/Release/main_refactored.obj
deleted file mode 100644
index d20a3dc1cca32d03d554ef0ee6f7c144a0f1619a..0000000000000000000000000000000000000000
Binary files a/FocusTerra/FocusTerra/x64/Release/main_refactored.obj and /dev/null differ
diff --git a/FocusTerra/FocusTerra/x64/Release/main_testing.obj b/FocusTerra/FocusTerra/x64/Release/main_testing.obj
index 9175e7b1e6330119d6d89e29af3093806a082b43..2b71187a70b4b9a4c2ccbec648275071a1bd3d01 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/main_testing.obj and b/FocusTerra/FocusTerra/x64/Release/main_testing.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/pevent.obj b/FocusTerra/FocusTerra/x64/Release/pevent.obj
index 216c2aebd50115ea4244a527cfb481005c9634ab..257580f048528e4a779aa70a3dcaa4090d40e4fa 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/pevent.obj and b/FocusTerra/FocusTerra/x64/Release/pevent.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/shader.obj b/FocusTerra/FocusTerra/x64/Release/shader.obj
index 5b2c2bc2244958df3c5b3dd27822f1cf3634bf0c..48873ae056f99b23f966a2ba4391f32c7b14af4c 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/shader.obj and b/FocusTerra/FocusTerra/x64/Release/shader.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/slim_blockchain_handler.obj b/FocusTerra/FocusTerra/x64/Release/slim_blockchain_handler.obj
index 6fb5f1e38cf605e44bfdc038797260bdf8a5851b..977de2618614cb28f74ff358d61cf040e77a8bbe 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/slim_blockchain_handler.obj and b/FocusTerra/FocusTerra/x64/Release/slim_blockchain_handler.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/toolbox.obj b/FocusTerra/FocusTerra/x64/Release/toolbox.obj
index 35331eaa53991d542273eb7d65860589e1cdd3da..48f03404287bdd7ebc895b6e67bdf2f91ed80ab6 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/toolbox.obj and b/FocusTerra/FocusTerra/x64/Release/toolbox.obj differ
diff --git a/FocusTerra/FocusTerra/x64/Release/vc142.pdb b/FocusTerra/FocusTerra/x64/Release/vc142.pdb
index 2bb360ed9adb21ad80b8065953996ef562480f99..ed4ea1d82c83de7c93d2bceee60946a610428e21 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/vc142.pdb and b/FocusTerra/FocusTerra/x64/Release/vc142.pdb differ
diff --git a/FocusTerra/FocusTerra/x64/Release/wave_handler.obj b/FocusTerra/FocusTerra/x64/Release/wave_handler.obj
index 94c45805472653d18989c0f956a3a189ecbcaf6a..2b080db7088c89d65b8c3e535db8f8be82df0e2f 100644
Binary files a/FocusTerra/FocusTerra/x64/Release/wave_handler.obj and b/FocusTerra/FocusTerra/x64/Release/wave_handler.obj differ
diff --git a/FocusTerra/x64/Release/FocusTerra.exe b/FocusTerra/x64/Release/FocusTerra.exe
index d0c848c5b84bf46eaf034fef0f95b6f949408917..159bde3a141874f04c6f0bbf1b930d6e858bb022 100644
Binary files a/FocusTerra/x64/Release/FocusTerra.exe and b/FocusTerra/x64/Release/FocusTerra.exe differ
diff --git a/FocusTerra/x64/Release/FocusTerra.pdb b/FocusTerra/x64/Release/FocusTerra.pdb
index c88e757bf116348c23046a4d3c290d226279d257..2e96651623a2c237f64094581ea613a7a21e1877 100644
Binary files a/FocusTerra/x64/Release/FocusTerra.pdb and b/FocusTerra/x64/Release/FocusTerra.pdb differ
diff --git a/include/efficient_block.hpp b/include/efficient_block.hpp
index d968aa9950b305be1ba2b5c3ca64a44ec252887b..bf685ffaaa8f20a8ee001cec7a52c48225508c43 100644
--- a/include/efficient_block.hpp
+++ b/include/efficient_block.hpp
@@ -15,6 +15,8 @@ public:
 	bool needs_removal() const;
 	glm::ivec4 xywh() const;
 	bool is_inside(int x, int y) const;
+	int width() const;
+	int height() const;
 
 private:
 	glm::ivec4 xywh_;
diff --git a/include/slim_blockchain_handler.hpp b/include/slim_blockchain_handler.hpp
index d27682efdb988c9d0291c68d77fa0f3033035507..faf8cbbd71d12a96e910c02751c6e4cd988008be 100644
--- a/include/slim_blockchain_handler.hpp
+++ b/include/slim_blockchain_handler.hpp
@@ -1,26 +1,54 @@
 #pragma once
 #include <list>
-#include <block.hpp>
+#include <efficient_block.hpp>
 #include <toolbox.hpp>
 #include <enums.hpp>
 #include <iostream>
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
+#include <glm/gtc/type_ptr.hpp>
+#include <shader.hpp>
 class SlimBlockchainHandler {
 public:
 	/*Assumes all toolbox textures are initialized*/
 	SlimBlockchainHandler(Toolbox& tb, MSTATE initial_mstate)
 		: previous_mstate_(static_cast<int>(initial_mstate)),
 		blockchain_(0),
-		dragpairs_(0)
+		dragpairs_(0),
+		shader_drawblocks_((tb.shader_path + "draw_blocks.vert").c_str(), (tb.shader_path + "draw_blocks.frag").c_str())
 	{
-		glGenFramebuffers(1, &fbo_);
-		glBindFramebuffer(GL_FRAMEBUFFER, fbo_);
-		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tb.tex_const_zero, 0);
-		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, tb.tex_damp_clean, 0);
-		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, tb.tex_wave_clean, 0);
+		/*Set up Framebuffers*/
+		glGenFramebuffers(1, &fbo_wave_);
+		glBindFramebuffer(GL_FRAMEBUFFER, fbo_wave_);
+		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tb.tex_wave_1, 0);
+		if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
+			std::cout << "ERROR::FRAMEBUFFER: Blockchain Framebuffer not complete!" << std::endl;
+		}
+		glGenFramebuffers(1, &fbo_dynamic_);
+		glBindFramebuffer(GL_FRAMEBUFFER, fbo_dynamic_);
+		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tb.tex_damp_dynamic, 0);
+		if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
+			std::cout << "ERROR::FRAMEBUFFER: Blockchain Framebuffer not complete!" << std::endl;
+		}
+		glGenFramebuffers(1, &fbo_static_);
+		glBindFramebuffer(GL_FRAMEBUFFER, fbo_static_);
+		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tb.tex_damp_static, 0);
 		if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
 			std::cout << "ERROR::FRAMEBUFFER: Blockchain Framebuffer not complete!" << std::endl;
 		}
 		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
+		/*Set up rendering infrastructure*/
+		glGenVertexArrays(1, &vao_);
+		glGenBuffers(1, &vbo_);
+		glBindVertexArray(vao_);
+		glBindBuffer(GL_ARRAY_BUFFER, vbo_);
+		glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
+		glEnableVertexAttribArray(0);
+		glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
+		glEnableVertexAttribArray(1);
+		glBindVertexArray(0);
+		glBindBuffer(GL_ARRAY_BUFFER, 0);
 	}
 
 	void update(Toolbox& tb);
@@ -29,19 +57,33 @@ public:
 private:
 	void clear_blocks_();
 	void update_blocks_(const Toolbox& tb, bool reload_all);
-
 	bool in_wave_window_(const Toolbox&, const Pevent&) const;
-
 	//Patterns
-	void upload_singleslit_(Toolbox&);
-	void upload_doubleslit_(Toolbox&);
-	void upload_lattice_(Toolbox&);
-	void upload_waveguide_(Toolbox&);
+	void queue_singleslit_(Toolbox&);
+	void queue_doubleslit_(Toolbox&);
+	void queue_lattice_(Toolbox&);
+	void queue_waveguide_(Toolbox&);
+	//Vertex Calculation
+	void xywhs_to_vertices_(const Toolbox& tb, const std::vector<bool>& duplicates, const std::vector<glm::ivec4>& xywhs, std::vector<float>& vertices) const;
+	//Duplicate identification
+	void find_dynamic_duplicates_();
 
+	//Data
 	int previous_mstate_ = static_cast<int>(MSTATE::PLACE); /*Keep track when mstate changes*/
-	std::list<Block> blockchain_; /*Blocks present in system*/
-	std::list<std::pair<Block*, SDL_FingerID> > dragpairs_; /*Dragged Blocks and their dragging finger*/
-
-	/*Framebuffer*/
-	GLuint fbo_ = 0;
+	std::list<EfficientBlock> blockchain_; /*Blocks present in system*/
+	std::list<std::pair<EfficientBlock*, SDL_FingerID> > dragpairs_; /*Dragged Blocks and their dragging finger*/
+	/*Rendering infrastructure*/
+	Shader shader_drawblocks_;
+	GLuint vao_;
+	GLuint vbo_;
+	/*Framebuffers*/
+	GLuint fbo_wave_ = 0;
+	GLuint fbo_dynamic_ = 0;
+	GLuint fbo_static_ = 0;
+	/*Drawlists*/
+	std::vector<glm::ivec4> drawlist_static_;
+	std::vector<glm::ivec4> drawlist_dynamic_;
+	std::vector<glm::ivec4> eraselist_dynamic_;
+	std::vector<bool> drawlist_dynamic_duplicates_;
+	std::vector<bool> eraselist_dynamic_duplicates_;
 };
\ No newline at end of file
diff --git a/shaders/draw_blocks.frag b/shaders/draw_blocks.frag
new file mode 100644
index 0000000000000000000000000000000000000000..d8fb2a41a8da7240b71ff044933438abaeb79052
--- /dev/null
+++ b/shaders/draw_blocks.frag
@@ -0,0 +1,17 @@
+#version 410 core
+
+precision highp float;
+
+out vec4 FragColor;
+
+in vec2 textureCoordinates;
+
+uniform float color_multiplier;
+uniform sampler2D source_texture;
+
+void main()
+{
+	vec4 tex_color = texture(source_texture, textureCoordinates);
+
+	FragColor = tex_color * color_multiplier;
+}
\ No newline at end of file
diff --git a/shaders/draw_blocks.vert b/shaders/draw_blocks.vert
new file mode 100644
index 0000000000000000000000000000000000000000..9c55aff11bff55eaa64cf965633de88e3693a618
--- /dev/null
+++ b/shaders/draw_blocks.vert
@@ -0,0 +1,16 @@
+#version 410 core
+layout (location = 0) in vec2 verCoords;
+layout (location = 1) in vec2 texCoords;
+
+precision highp float;
+
+uniform float color_multiplier;
+uniform sampler2D source_texture;
+
+out vec2 textureCoordinates;
+
+void main()
+{
+	gl_Position = vec4(verCoords.x, verCoords.y, 0.0, 1.0);
+	textureCoordinates = texCoords;
+}
\ No newline at end of file
diff --git a/src/drawing_handler.cpp b/src/drawing_handler.cpp
index e6253556f1b470444598733973f1aa1f91d718e1..e4a73bb9a1387ead74bd9e788290b208457fae25 100644
--- a/src/drawing_handler.cpp
+++ b/src/drawing_handler.cpp
@@ -72,6 +72,7 @@ void DrawingHandler::update(Toolbox& tb) {
 	shader_draw_.use();
 	glBindFramebuffer(GL_FRAMEBUFFER, fbo_);
 	glBindVertexArray(vao_);
+	glBindBuffer(GL_ARRAY_BUFFER, vbo_);
 	glViewport(0, 0, tb.texture_w, tb.texture_h);
 	for (Pevent& pev : tb.events) {
 		/*Event is in wave window*/
@@ -169,6 +170,7 @@ void DrawingHandler::update(Toolbox& tb) {
 	/*Unbind*/
 	glBindFramebuffer(GL_FRAMEBUFFER, 0);
 	glBindVertexArray(0);
+	glBindBuffer(GL_ARRAY_BUFFER, 0);
 
 	/*Push info to toolbox developer region*/
 	tb.num_drawers = num_drawers();
diff --git a/src/efficient_block.cpp b/src/efficient_block.cpp
index 3a7ec64c4ceb868f9c30f4de49218f2f8c50723c..438dcc6e44c1eece94b6a35db0155e1b9e2e3de3 100644
--- a/src/efficient_block.cpp
+++ b/src/efficient_block.cpp
@@ -27,4 +27,12 @@ glm::ivec4 EfficientBlock::xywh() const {
 
 bool EfficientBlock::is_inside(int x, int y) const {
 	return ((x >= xywh_.r) && (x <= xywh_.r + xywh_.b) && (y >= xywh_.g) && (y < xywh_.g + xywh_.a));
+}
+
+int EfficientBlock::width() const {
+	return xywh_.b;
+}
+
+int EfficientBlock::height() const {
+	return xywh_.a;
 }
\ No newline at end of file
diff --git a/src/infrastructure.cpp b/src/infrastructure.cpp
index 741df3d049e10261b5300df3ee4e0f61dd254c2d..6a15fdfa3318ce970402a1fb222a8d2b4b5da25f 100644
--- a/src/infrastructure.cpp
+++ b/src/infrastructure.cpp
@@ -58,7 +58,7 @@ bool Infrastructure::init(const std::string name, const int width, const int hei
     glViewport(0, 0, width, height);
     glClearColor(0.0f, 0.0f, 0.0f, 1.0);
     glClear(GL_COLOR_BUFFER_BIT);
-    SDL_GL_SetSwapInterval(0); //1 to turn on VSync, 0 to turn off VSync
+    SDL_GL_SetSwapInterval(1); //1 to turn on VSync, 0 to turn off VSync
 
     return true;
 }
diff --git a/src/main_testing.cpp b/src/main_testing.cpp
index 1f175472d9dbf42a48653914447c80c11d5162cf..1d8299d44894bd57ecbf0b307a6a28469b6fcd99 100644
--- a/src/main_testing.cpp
+++ b/src/main_testing.cpp
@@ -12,6 +12,8 @@
 /*Screen resolution*/
 #define WIDTH 2560
 #define HEIGHT 1440
+//#define WIDTH 3840
+//#define HEIGHT 2160
 
 int main(int argc, char** argv) {
 	int tex_offscreen_left = 0;
@@ -82,10 +84,12 @@ int main(int argc, char** argv) {
 		//SDL_GetWindowSize(tb.infra.window(), &w_width, &w_height);
 		size_t num_ev = tb.events.size();
 		size_t num_mess = tb.mailbox.size();
+		/*
 		if (num_ev != 0)
 			std::cout << "Events: " << num_ev << std::endl;
 		if (num_mess != 0)
 			std::cout << "Messages: " << num_mess << std::endl;
+		*/
 		//std::cout << "Window Dimensions: " << w_width << " x " << w_height << std::endl;
 		GLint err = glGetError();
 		if (err != GL_NO_ERROR) {
diff --git a/src/slim_blockchain_handler.cpp b/src/slim_blockchain_handler.cpp
index 9e52b9556dc52fecd4b97421c09cdd00467c0e5b..01d993a5c7ad8af02e4142be3f5ca893a493794e 100644
--- a/src/slim_blockchain_handler.cpp
+++ b/src/slim_blockchain_handler.cpp
@@ -8,7 +8,7 @@
 void SlimBlockchainHandler::update(Toolbox& tb) {
 	//can't be dragging if mstate changes
 	if (previous_mstate_ != tb.m_state) {
-		dragpairs_.clear();
+		clear_blocks_();
 	}
 	//update tracked mstate
 	previous_mstate_ = tb.m_state;
@@ -24,79 +24,81 @@ void SlimBlockchainHandler::update(Toolbox& tb) {
 				break;
 			case BLOCKCHAINMESSAGE::PATTERN_SINGLESLIT:
 				clear_blocks_();
-				upload_singleslit_(tb);
+				queue_singleslit_(tb);
 				m.handled = true;
 				break;
 			case BLOCKCHAINMESSAGE::PATTERN_DOUBLESLIT:
 				clear_blocks_();
-				upload_doubleslit_(tb);
+				queue_doubleslit_(tb);
 				m.handled = true;
 				break;
 			case BLOCKCHAINMESSAGE::PATTERN_LATTICE:
 				clear_blocks_();
-				upload_lattice_(tb);
+				queue_lattice_(tb);
 				m.handled = true;
 				break;
 			case BLOCKCHAINMESSAGE::PATTERN_WAVEGUIDE:
 				clear_blocks_();
-				upload_waveguide_(tb);
+				queue_waveguide_(tb);
 				m.handled = true;
 				break;
 			}
 		}
 	}
 
-	if (tb.m_state != static_cast<int>(MSTATE::IMMEDIATE)) {
-		return;
-	}
-
-	/*Handle Events*/
-	glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_);
-	for (Pevent& pev : tb.events) {
-		/*Handle event differently depending on where it is*/
-		/*Event within wave window*/
-		if (in_wave_window_(tb, pev)) {
-			switch (pev.type) {
-			/*Finger down, place Block, add to dragpairs*/
-			case PEVENTTYPE::DOWN:
-				blockchain_.push_back(Block(tb.block_width, tb.block_height, pev.itcoord_x - tb.block_width / 2, tb.texture_h - (pev.itcoord_y + tb.block_height / 2), tb.tex_damp_dynamic, tb.tex_wave_1));
-				dragpairs_.push_back({ &blockchain_.back(), pev.finger_id });
-				break;
-			/*Finger up, find and remove the associated Block and dragpair*/
-			case PEVENTTYPE::UP: {
-				auto released = std::find_if(dragpairs_.begin(), dragpairs_.end(), [=](auto dragpair) { return dragpair.second == pev.finger_id; });
-				if (released != dragpairs_.end()) {
-					released->first->request_removal();
+	if (tb.m_state == static_cast<int>(MSTATE::IMMEDIATE)) {
+		/*Handle Events*/
+		for (Pevent& pev : tb.events) {
+			/*Handle event differently depending on where it is*/
+			/*Event within wave window*/
+			if (in_wave_window_(tb, pev)) {
+				switch (pev.type) {
+					/*Finger down, place Block, add to dragpairs*/
+				case PEVENTTYPE::DOWN:
+					blockchain_.push_back(EfficientBlock(tb.block_width, tb.block_height, pev.itcoord_x - tb.block_width / 2, tb.texture_h - (pev.itcoord_y + tb.block_height / 2)));
+					dragpairs_.push_back({ &blockchain_.back(), pev.finger_id });
+					drawlist_dynamic_.push_back(blockchain_.back().xywh());
+					break;
+					/*Finger up, find and remove the associated Block and dragpair*/
+				case PEVENTTYPE::UP: {
+					auto released = std::find_if(dragpairs_.begin(), dragpairs_.end(), [=](auto dragpair) { return dragpair.second == pev.finger_id; });
+					if (released != dragpairs_.end()) {
+						released->first->request_removal();
+						eraselist_dynamic_.push_back(released->first->xywh());
+					}
+					dragpairs_.remove_if([=](auto dragpair) { return dragpair.second == pev.finger_id; });
+					break;
 				}
-				dragpairs_.remove_if([=](auto dragpair) { return dragpair.second == pev.finger_id; });
-				break;
-			}
-				/*Finger moved, find and translate associated Block*/
-			case PEVENTTYPE::MOVE: {
-				auto moved = std::find_if(dragpairs_.begin(), dragpairs_.end(), [=](auto dragpair) { return dragpair.second == pev.finger_id; });
-				if (moved != dragpairs_.end()) {
-					moved->first->translate(pev.itcoord_x - moved->first->width() / 2, tb.texture_h - (pev.itcoord_y + moved->first->height() / 2));
+													 /*Finger moved, find and translate associated Block*/
+				case PEVENTTYPE::MOVE: {
+					auto moved = std::find_if(dragpairs_.begin(), dragpairs_.end(), [=](auto dragpair) { return dragpair.second == pev.finger_id; });
+					if (moved != dragpairs_.end()) {
+						eraselist_dynamic_.push_back(moved->first->xywh());
+						moved->first->translate(pev.itcoord_x - moved->first->width() / 2, tb.texture_h - (pev.itcoord_y + moved->first->height() / 2));
+						drawlist_dynamic_.push_back(moved->first->xywh());
+					}
+					break;
 				}
-				break;
-			}
-			}
-		}
-		/*Event outside wave window*/
-		else {
-			switch (pev.type) {
-			/*Finger down outside wave area, don't care*/
-			case PEVENTTYPE::DOWN:
-				break;
-			/*Finger up or moved outside wave area, if associated Block exists, clear it*/
-			case PEVENTTYPE::UP:
-			case PEVENTTYPE::MOVE: {
-				auto released = std::find_if(dragpairs_.begin(), dragpairs_.end(), [=](auto dragpair) { return dragpair.second == pev.finger_id; });
-				if (released != dragpairs_.end()) {
-					released->first->request_removal();
 				}
-				dragpairs_.remove_if([=](auto dragpair) { return dragpair.second == pev.finger_id; });
-				break;
 			}
+			/*Event outside wave window*/
+			else {
+				switch (pev.type) {
+					/*Finger down outside wave area, don't care*/
+				case PEVENTTYPE::DOWN:
+					break;
+					/*Finger up or moved outside wave area, if associated Block exists, clear it*/
+				case PEVENTTYPE::UP:
+				case PEVENTTYPE::MOVE: {
+					auto released = std::find_if(dragpairs_.begin(), dragpairs_.end(), [=](auto dragpair) { return dragpair.second == pev.finger_id; });
+					if (released != dragpairs_.end()) {
+						released->first->request_removal();
+						eraselist_dynamic_.push_back(released->first->xywh());
+					}
+					dragpairs_.remove_if([=](auto dragpair) { return dragpair.second == pev.finger_id; });
+					break;
+				}
+				}
 			}
 		}
 	}
@@ -106,8 +108,6 @@ void SlimBlockchainHandler::update(Toolbox& tb) {
 
 	/*Toolbox developer region*/
 	tb.num_blocks = num_blocks();
-
-	glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
 }
 
 size_t SlimBlockchainHandler::num_blocks() {
@@ -115,33 +115,94 @@ size_t SlimBlockchainHandler::num_blocks() {
 }
 
 void SlimBlockchainHandler::clear_blocks_() {
-	for (Block& b : blockchain_) {
+	for (EfficientBlock& b : blockchain_) {
+		eraselist_dynamic_.push_back(b.xywh());
 		b.request_removal();
 	}
 	dragpairs_.clear();
+	blockchain_.clear();
 }
 
 void SlimBlockchainHandler::update_blocks_(const Toolbox& tb, bool reload_all) {
-	/*Remove and upload as needed*/
-	for (auto bit = blockchain_.begin(); bit != blockchain_.end(); ++bit) {
-		if (bit->needs_removal()) {
-			bit->remove();
+	find_dynamic_duplicates_();
+	if (drawlist_dynamic_.size() != 0 || drawlist_static_.size() != 0 || eraselist_dynamic_.size() != 0) {
+		glBindVertexArray(vao_);
+		glBindBuffer(GL_ARRAY_BUFFER, vbo_);
+		glViewport(0, 0, tb.texture_w, tb.texture_h);
+		glActiveTexture(GL_TEXTURE0);
+		shader_drawblocks_.use();
+	}
+	std::vector<float> vertices;
+	/*Erase dynamic blocks*/
+	if (eraselist_dynamic_.size() != 0) {
+		glBindFramebuffer(GL_FRAMEBUFFER, fbo_dynamic_);
+		glBindTexture(GL_TEXTURE_2D, tb.tex_damp_clean);
+		xywhs_to_vertices_(tb, eraselist_dynamic_duplicates_, eraselist_dynamic_, vertices);
+		if (vertices.size() != 0) {
+			glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
+			/*Draw on damping*/
+			shader_drawblocks_.setFloat("color_multiplier", 1.f);
+			for (size_t i = 0; i < eraselist_dynamic_.size(); ++i) {
+				glDrawArrays(GL_TRIANGLES, 6 * i, 6);
+			}
 		}
-		if (bit->needs_upload()) {
-			bit->upload();
+		eraselist_dynamic_.clear();
+	}
+	/*Draw static blocks*/
+	if (drawlist_static_.size() != 0) {
+		glBindFramebuffer(GL_FRAMEBUFFER, fbo_static_);
+		glBindTexture(GL_TEXTURE_2D, tb.tex_wave_clean);
+		xywhs_to_vertices_(tb, std::vector<bool>(drawlist_static_.size(), false), drawlist_static_, vertices);
+		if (vertices.size() != 0) {
+			glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
+			/*Draw on damping*/
+			shader_drawblocks_.setFloat("color_multiplier", 0.f);
+			for (size_t i = 0; i < drawlist_static_.size(); ++i) {
+				glDrawArrays(GL_TRIANGLES, 6 * i, 6);
+			}
+			/*Draw on wave*/
+			shader_drawblocks_.setFloat("color_multiplier", 1.f);
+			glBindFramebuffer(GL_FRAMEBUFFER, fbo_wave_);
+			for (size_t i = 0; i < drawlist_static_.size(); ++i) {
+				glDrawArrays(GL_TRIANGLES, 6 * i, 6);
+			}
 		}
+		drawlist_static_.clear();
 	}
+	/*Draw dynamic blocks*/
+	if (drawlist_dynamic_.size() != 0) {
+		glBindFramebuffer(GL_FRAMEBUFFER, fbo_dynamic_);
+		glBindTexture(GL_TEXTURE_2D, tb.tex_wave_clean);
+		xywhs_to_vertices_(tb, drawlist_dynamic_duplicates_, drawlist_dynamic_, vertices);
+		if (vertices.size() != 0) {
+			glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_DYNAMIC_DRAW);
+			/*Draw on damping*/
+			shader_drawblocks_.setFloat("color_multiplier", 0.f);
+			for (size_t i = 0; i < drawlist_dynamic_.size(); ++i) {
+				glDrawArrays(GL_TRIANGLES, 6 * i, 6);
+			}
+			/*Draw on wave*/
+			shader_drawblocks_.setFloat("color_multiplier", 1.f);
+			glBindFramebuffer(GL_FRAMEBUFFER, fbo_wave_);
+			for (size_t i = 0; i < drawlist_dynamic_.size(); ++i) {
+				glDrawArrays(GL_TRIANGLES, 6 * i, 6);
+			}
+		}
+		drawlist_dynamic_.clear();
+	}
+	/*Drawing finished, reset OpenGL state*/
+	glBindVertexArray(0);
+	glBindBuffer(GL_ARRAY_BUFFER, 0);
+	glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
+
 	/*Clean up the blockchain*/
 	/* This doesn't work, because it invalidates all iterators/pointers, even in a list. See https://godbolt.org/z/GzxTExc44
 	blockchain_.erase(std::remove_if(blockchain_.begin(), blockchain_.end(), [](const Block& b) {return b.needs_removal(); }), blockchain_.end());
 	The following preserves iterator/pointer validity, which is what we need
 	*/
-	blockchain_.remove_if([=](const Block& b) { return b.needs_removal(); });
-	if (reload_all) {
-		for (auto b : blockchain_) {
-			b.upload();
-		}
-	}
+	dragpairs_.remove_if([=](const std::pair<EfficientBlock*, SDL_FingerID>& dp) { return dp.first->needs_removal(); });
+	blockchain_.remove_if([=](const EfficientBlock& b) { return b.needs_removal(); });
 }
 
 bool SlimBlockchainHandler::in_wave_window_(const Toolbox& tb, const Pevent& pev) const {
@@ -151,58 +212,51 @@ bool SlimBlockchainHandler::in_wave_window_(const Toolbox& tb, const Pevent& pev
 /*Structures*/
 /*Note that they don't go into the blockchain, they only exist in the static damping texture*/
 /*The correct wave texture for Blocks is tb.tex_wave_1*/
-void SlimBlockchainHandler::upload_singleslit_(Toolbox& tb) {
+void SlimBlockchainHandler::queue_singleslit_(Toolbox& tb) {
 	int block_width = 30;
 	int slit_height = 40;
 	int block_height = tb.texture_h / 2 - slit_height/2 - 1;
-	Block b_top(block_width, block_height, tb.texture_w / 3, tb.texture_h / 2 + slit_height / 2, tb.tex_damp_static, tb.tex_wave_1);
-	Block b_bottom(block_width, block_height, tb.texture_w / 3, 0, tb.tex_damp_static, tb.tex_wave_1);
-	glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_);
-	b_top.upload();
-	b_bottom.upload();
-	glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
+	EfficientBlock b_top(block_width, block_height, tb.texture_w / 3, tb.texture_h / 2 + slit_height / 2);
+	EfficientBlock b_bottom(block_width, block_height, tb.texture_w / 3, 0);
+	drawlist_static_.push_back(b_top.xywh());
+	drawlist_static_.push_back(b_bottom.xywh());
 }
 
-void SlimBlockchainHandler::upload_doubleslit_(Toolbox& tb) {
+void SlimBlockchainHandler::queue_doubleslit_(Toolbox& tb) {
 	int block_width = 30;
 	int slit_height = 40;
 	int mid_block_height = 30;
 	int block_height = tb.texture_h / 2 - slit_height - mid_block_height / 2 - 1;
-	Block b_top(block_width, block_height, tb.texture_w / 3, tb.texture_h / 2 + mid_block_height / 2 + slit_height, tb.tex_damp_static, tb.tex_wave_1);
-	Block b_bottom(block_width, block_height, tb.texture_w / 3, 0, tb.tex_damp_static, tb.tex_wave_1);
-	Block b_middle(block_width, mid_block_height, tb.texture_w / 3, tb.texture_h / 2 - mid_block_height / 2, tb.tex_damp_static, tb.tex_wave_1);
-	glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_);
-	b_top.upload();
-	b_bottom.upload();
-	b_middle.upload();
-	glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
+	EfficientBlock b_top(block_width, block_height, tb.texture_w / 3, tb.texture_h / 2 + mid_block_height / 2 + slit_height);
+	EfficientBlock b_bottom(block_width, block_height, tb.texture_w / 3, 0);
+	EfficientBlock b_middle(block_width, mid_block_height, tb.texture_w / 3, tb.texture_h / 2 - mid_block_height / 2);
+	drawlist_static_.push_back(b_top.xywh());
+	drawlist_static_.push_back(b_bottom.xywh());
+	drawlist_static_.push_back(b_middle.xywh());
 }
 
 /*Lattice targets frequency of 5Hz*/
-void SlimBlockchainHandler::upload_lattice_(Toolbox& tb) {
+void SlimBlockchainHandler::queue_lattice_(Toolbox& tb) {
 	int block_width = 10;
 	int block_height = 10;
 	int block_spacing = 30;
 	int lattice_width = tb.texture_w / 3;
 	int lattice_minx = tb.texture_w / 3 - lattice_width / 2;
-	glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_);
 	for (float y = 0.f; y + block_height + block_spacing < tb.texture_h; y += block_spacing + block_height) {
 		for (float x = lattice_minx; x < lattice_minx + lattice_width; x += block_spacing + block_height) {
-			Block new_block(block_width, block_height, x, y, tb.tex_damp_static, tb.tex_wave_1);
-			new_block.upload();
+			EfficientBlock new_block(block_width, block_height, x, y);
+			drawlist_static_.push_back(new_block.xywh());
 		}
 	}
-	glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
 }
 
 /*Lattice targets frequency of 5Hz*/
-void SlimBlockchainHandler::upload_waveguide_(Toolbox& tb) {
+void SlimBlockchainHandler::queue_waveguide_(Toolbox& tb) {
 	int block_width = 10;
 	int block_height = 10;
 	int block_spacing = 30;
 	int lattice_width = tb.texture_w / 3;
 	int lattice_minx = tb.texture_w / 3 - lattice_width / 2;
-	glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_);
 	for (float y = 0.f; y + block_height + block_spacing < tb.texture_h; y += block_spacing + block_height) {
 		if (y < tb.texture_h / 2 && y + block_spacing + block_height > tb.texture_h / 2) {
 			continue;
@@ -211,9 +265,73 @@ void SlimBlockchainHandler::upload_waveguide_(Toolbox& tb) {
 			continue;
 		}
 		for (float x = lattice_minx; x < lattice_minx + lattice_width; x += block_spacing + block_height) {
-			Block new_block(block_width, block_height, x, y, tb.tex_damp_static, tb.tex_wave_1);
-			new_block.upload();
+			EfficientBlock new_block(block_width, block_height, x, y);
+			drawlist_static_.push_back(new_block.xywh());
 		}
 	}
-	glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
 }
+
+void SlimBlockchainHandler::xywhs_to_vertices_(const Toolbox& tb, const std::vector<bool>& duplicates,  const std::vector<glm::ivec4>& xywhs, std::vector<float>& vertices) const {
+	float texwidth = tb.texture_w;
+	float texheight = tb.texture_h;
+	vertices.clear();
+	vertices.reserve(24 * xywhs.size());
+	for (size_t i = 0; i < xywhs.size(); ++i) {
+		const glm::ivec4& xywh = xywhs[i];
+		if (duplicates[i]) {
+			continue;
+		}
+		float x = xywh.r >= 0 ? xywh.r : 0;
+		float y = xywh.g;
+		float w = xywh.r >= 0 ? xywh.b : xywh.b + xywh.r;
+		float h = xywh.a;
+		/*Lower Left Corner*/
+		vertices.push_back(2. * (x) / texwidth - 1.f); //x
+		vertices.push_back(2. * (y) / texheight - 1.f); //y
+		vertices.push_back((x) / texwidth); //u
+		vertices.push_back((y) / texheight); //v
+		/*Top Right Corner*/
+		vertices.push_back(2. * (x + w) / texwidth - 1.f); //x
+		vertices.push_back(2. * (y + h) / texheight - 1.f); //y
+		vertices.push_back((x + w) / texwidth); //u
+		vertices.push_back((y + h) / texheight); //v
+		/*Bottom Right Corner*/
+		vertices.push_back(2. * (x + w) / texwidth - 1.f); //x
+		vertices.push_back(2. * (y) / texheight - 1.f); //y
+		vertices.push_back((x + w) / texwidth); //u
+		vertices.push_back((y) / texheight); //v
+		/*Lower Left Corner*/
+		vertices.push_back(2. * (x) / texwidth - 1.f); //x
+		vertices.push_back(2. * (y) / texheight - 1.f); //y
+		vertices.push_back((x) / texwidth); //u
+		vertices.push_back((y) / texheight); //v
+		/*Top Right Corner*/
+		vertices.push_back(2. * (x + w) / texwidth - 1.f); //x
+		vertices.push_back(2. * (y + h) / texheight - 1.f); //y
+		vertices.push_back((x + w) / texwidth); //u
+		vertices.push_back((y + h) / texheight); //v
+		/*Top Left Corner*/
+		vertices.push_back(2. * (x) / texwidth - 1.f); //x
+		vertices.push_back(2. * (y + h) / texheight - 1.f); //y
+		vertices.push_back((x) / texwidth); //u
+		vertices.push_back((y + h) / texheight); //v
+	}
+}
+
+void SlimBlockchainHandler::find_dynamic_duplicates_() {
+	drawlist_dynamic_duplicates_ = std::vector<bool>(drawlist_dynamic_.size(), false);
+	eraselist_dynamic_duplicates_ = std::vector<bool>(eraselist_dynamic_.size(), false);
+	if (drawlist_dynamic_.size() == 0 || eraselist_dynamic_.size() == 0) {
+		return;
+	}
+	for (size_t i_draw = 0; i_draw < drawlist_dynamic_.size(); ++i_draw) {
+		const glm::ivec4 dr = drawlist_dynamic_[i_draw];
+		for (size_t i_erase = 0; i_erase < eraselist_dynamic_.size(); ++i_erase) {
+			const glm::ivec4 er = eraselist_dynamic_[i_erase];
+			if (dr.r == er.r && dr.g == er.g && dr.b == er.b && er.a == dr.a) {
+				drawlist_dynamic_duplicates_[i_draw] = true;
+				eraselist_dynamic_duplicates_[i_erase] = true;
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/wave_handler.cpp b/src/wave_handler.cpp
index a327687a06bc94def653ff73b6bf695c72895a41..4cdf85c3d8487181a77ffe0540c6a4aa8a9f941d 100644
--- a/src/wave_handler.cpp
+++ b/src/wave_handler.cpp
@@ -234,6 +234,8 @@ bool WaveHandler::initialize_2D_data_()
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
   glEnableVertexAttribArray(1);
   glBindVertexArray(0);
+  
+  return true;
 }
 
 bool WaveHandler::initialize_3D_data_()
@@ -482,6 +484,7 @@ bool WaveHandler::initialize_comp_data_(const std::string damping_file)
     return false;
   }
   glBindFramebuffer(GL_FRAMEBUFFER, 0);
+  return true;
 }
 
 bool WaveHandler::initialize_render_data_(const std::string palette_file) {
@@ -603,6 +606,8 @@ bool WaveHandler::initialize_shaders_()
   shdr_damp_.use();
   shdr_damp_.setInt("tex_damping_static", 0);
   shdr_damp_.setInt("tex_damping_dynamic", 1);
+
+  return true;
 }
 
 void WaveHandler::generate_and_transfer_textures(Toolbox& tb) const {