diff --git a/Machines/Electron/Electron.cpp b/Machines/Electron/Electron.cpp
index 81c466d41..cd8bf65c3 100644
--- a/Machines/Electron/Electron.cpp
+++ b/Machines/Electron/Electron.cpp
@@ -65,7 +65,7 @@ void Machine::setup_output(float aspect_ratio)
 			"texValue >>= 4 - (int(icoordinate.x * 8) & 4);"
 			"return vec3( uvec3(texValue) & uvec3(4u, 2u, 1u));"
 		"}");
-	_crt->set_output_device(Outputs::CRT::Monitor);
+	_crt->set_output_device(Outputs::CRT::Television);
 	_crt->set_visible_area(_crt->get_rect_for_area(first_graphics_line - 3, 256, first_graphics_cycle * crt_cycles_multiplier, 80 * crt_cycles_multiplier, 4.0f / 3.0f));
 
 	// The maximum output frequency is 62500Hz and all other permitted output frequencies are integral divisions of that;
diff --git a/Outputs/CRT/Internals/CRTOpenGL.cpp b/Outputs/CRT/Internals/CRTOpenGL.cpp
index 5ab01bb02..2987c7547 100644
--- a/Outputs/CRT/Internals/CRTOpenGL.cpp
+++ b/Outputs/CRT/Internals/CRTOpenGL.cpp
@@ -248,9 +248,13 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out
 	// drawing commands having been issued, reclaim the array buffer pointer
 	glBindBuffer(GL_ARRAY_BUFFER, output_array_buffer);
 	_output_buffer_data = (uint8_t *)glMapBufferRange(GL_ARRAY_BUFFER, 0, OutputVertexBufferDataSize, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
+
 	glBindBuffer(GL_ARRAY_BUFFER, source_array_buffer);
 	_source_buffer_data = (uint8_t *)glMapBufferRange(GL_ARRAY_BUFFER, 0, SourceVertexBufferDataSize, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
+	_source_buffer_data_pointer = 0;
+
 	_input_texture_data = (uint8_t *)glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, _input_texture_array_size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
+
 	_output_mutex->unlock();
 }
 
diff --git a/Outputs/CRT/Internals/CRTOpenGL.hpp b/Outputs/CRT/Internals/CRTOpenGL.hpp
index a6c8837b1..4407b3e00 100644
--- a/Outputs/CRT/Internals/CRTOpenGL.hpp
+++ b/Outputs/CRT/Internals/CRTOpenGL.hpp
@@ -106,18 +106,20 @@ class OpenGLOutputBuilder {
 
 		inline uint8_t *get_next_source_run()
 		{
-			return nullptr;
+			_output_mutex->lock();
+			return &_source_buffer_data[_source_buffer_data_pointer];
 		}
 
 		inline void complete_source_run()
 		{
+			_source_buffer_data_pointer += 2 * SourceVertexSize;
+			_output_mutex->unlock();
 		}
 
 		inline uint8_t *get_next_output_run()
 		{
 			_output_mutex->lock();
-			uint8_t *pointer = &_output_buffer_data[_output_buffer_data_pointer];
-			return pointer;
+			return &_output_buffer_data[_output_buffer_data_pointer];
 		}
 
 		inline void complete_output_run(size_t vertices_written)