Index: trunk/src/gl/gl_context.cc
===================================================================
--- trunk/src/gl/gl_context.cc	(revision 43)
+++ trunk/src/gl/gl_context.cc	(revision 44)
@@ -13,4 +13,5 @@
 {
 	// apply_framebuffer
+	
 	apply_scissor_test( cs.scissor_test );
 	apply_color_mask( cs.color_mask );
@@ -35,6 +36,6 @@
 		m_clear_stencil = cs.stencil;
 	}
-
-	glClear( cs.buffers );
+	
+	glClear( clear_state_buffers_to_mask( cs.buffers ) );
 }
 
@@ -347,2 +348,7 @@
 }
 
+
+gl_context::gl_context()
+{
+	force_apply_render_state( m_render_state );
+}
Index: trunk/src/gl/gl_device.cc
===================================================================
--- trunk/src/gl/gl_device.cc	(revision 43)
+++ trunk/src/gl/gl_device.cc	(revision 44)
@@ -56,4 +56,14 @@
 }
 
+index_buffer* gl_device::create_index_buffer( buffer_hint hint, int size, void* source /*= nullptr */ )
+{
+	return new gl_index_buffer( hint, size, source );
+}
+
+vertex_array* gl_device::create_vertex_array()
+{
+	return new gl_vertex_array();
+}
+
 gl_device::~gl_device()
 {
Index: trunk/src/gl/gl_enum.cc
===================================================================
--- trunk/src/gl/gl_enum.cc	(revision 43)
+++ trunk/src/gl/gl_enum.cc	(revision 44)
@@ -186,4 +186,10 @@
 	switch( type )
 	{
+	case BYTE           : return GL_BYTE;
+	case UBYTE          : return GL_UNSIGNED_BYTE;
+	case SHORT          : return GL_SHORT;
+	case USHORT         : return GL_UNSIGNED_SHORT;
+	case INT            : return GL_INT;
+	case UINT	        : return GL_UNSIGNED_INT;
 	case FLOAT          : return GL_FLOAT;
 	case FLOAT_VECTOR_2 : return GL_FLOAT_VEC2;
@@ -193,5 +199,4 @@
 	case FLOAT_MATRIX_3 : return GL_FLOAT_MAT3;
 	case FLOAT_MATRIX_4 : return GL_FLOAT_MAT4;
-	case INT            : return GL_INT;
 	case INT_VECTOR_2   : return GL_INT_VEC2;
 	case INT_VECTOR_3   : return GL_INT_VEC3;
@@ -205,15 +210,20 @@
 	switch( gl_enum )
 	{
-	case GL_FLOAT      : return FLOAT;
-	case GL_FLOAT_VEC2 : return FLOAT_VECTOR_2;
-	case GL_FLOAT_VEC3 : return FLOAT_VECTOR_3;
-	case GL_FLOAT_VEC4 : return FLOAT_VECTOR_4;
-	case GL_FLOAT_MAT2 : return FLOAT_MATRIX_2;
-	case GL_FLOAT_MAT3 : return FLOAT_MATRIX_3;
-	case GL_FLOAT_MAT4 : return FLOAT_MATRIX_4;
-	case GL_INT        : return INT;
-	case GL_INT_VEC2   : return INT_VECTOR_2;
-	case GL_INT_VEC3   : return INT_VECTOR_3;
-	case GL_INT_VEC4   : return INT_VECTOR_4;
+	case GL_BYTE           : return BYTE;
+	case GL_UNSIGNED_BYTE  : return UBYTE;
+	case GL_SHORT          : return SHORT;
+	case GL_UNSIGNED_SHORT : return USHORT;
+	case GL_INT            : return INT;
+	case GL_UNSIGNED_INT   : return UINT;
+	case GL_FLOAT          : return FLOAT;
+	case GL_FLOAT_VEC2     : return FLOAT_VECTOR_2;
+	case GL_FLOAT_VEC3     : return FLOAT_VECTOR_3;
+	case GL_FLOAT_VEC4     : return FLOAT_VECTOR_4;
+	case GL_FLOAT_MAT2     : return FLOAT_MATRIX_2;
+	case GL_FLOAT_MAT3     : return FLOAT_MATRIX_3;
+	case GL_FLOAT_MAT4     : return FLOAT_MATRIX_4;
+	case GL_INT_VEC2       : return INT_VECTOR_2;
+	case GL_INT_VEC3       : return INT_VECTOR_3;
+	case GL_INT_VEC4       : return INT_VECTOR_4;
 	default : return type(0); // TODO: throw!
 	}
Index: trunk/src/gl/gl_vertex_buffer.cc
===================================================================
--- trunk/src/gl/gl_vertex_buffer.cc	(revision 43)
+++ trunk/src/gl/gl_vertex_buffer.cc	(revision 44)
@@ -40,2 +40,68 @@
 	return m_name.is_valid();
 }
+
+gl_index_buffer::gl_index_buffer( buffer_hint hint, int size, void* data ) 
+	: index_buffer( hint, size ), m_name()
+{
+	if (data)
+	{
+		assign( data );
+	}
+}
+
+void gl_index_buffer::assign( void* data )
+{
+	glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, m_name.get_value() );
+	glBufferData( GL_ELEMENT_ARRAY_BUFFER, m_size, data, buffer_hint_to_enum( m_hint ) );
+	glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0);
+}
+
+void gl_index_buffer::bind()
+{
+	glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, m_name.get_value() );
+}
+
+void gl_index_buffer::unbind()
+{
+	glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
+}
+
+bool gl_index_buffer::is_valid() const
+{
+	return m_name.is_valid();
+}
+
+gl_vertex_array::gl_vertex_array()
+{
+
+}
+
+void gl_vertex_array::bind()
+{
+	for ( vertex_buffer_attribute_map::iterator i = m_map.begin(); 	i != m_map.end(); ++i ) 
+	{
+		int location                = i->first;
+		vertex_buffer_attribute* va = i->second;
+		vertex_buffer*           vb = va->get_buffer();
+		glEnableVertexAttribArray( location );
+		vb->bind();
+		glVertexAttribPointer( 
+			location, 
+			va->get_components(), 
+			nv::type_to_gl_enum( va->get_datatype() ),
+			GL_FALSE,
+			va->get_stride(),
+			(void*)va->get_offset()
+			);
+		vb->unbind();
+	}
+
+}
+
+void gl_vertex_array::unbind()
+{
+	for ( vertex_buffer_attribute_map::iterator i = m_map.begin(); 	i != m_map.end(); ++i ) 
+	{
+		glDisableVertexAttribArray( i->first );
+	}
+}
Index: trunk/src/gl/gl_window.cc
===================================================================
--- trunk/src/gl/gl_window.cc	(revision 43)
+++ trunk/src/gl/gl_window.cc	(revision 44)
@@ -29,4 +29,7 @@
 	NV_LOG( LOG_INFO, "OpenGL Version      : " << glGetString(GL_VERSION) );
 	NV_LOG( LOG_INFO, "OpenGL GLSL Version : " << glGetString(GL_SHADING_LANGUAGE_VERSION) );
+
+	m_context = new gl_context();
+	m_context->set_viewport( nv::ivec4( 0, 0, m_width, m_height ) );
 }
 
@@ -51,2 +54,7 @@
 	m_title = title;
 }
+
+gl_window::~gl_window()
+{
+	delete m_context;
+}
