Index: trunk/nv/interface/device.hh
===================================================================
--- trunk/nv/interface/device.hh	(revision 115)
+++ trunk/nv/interface/device.hh	(revision 116)
@@ -51,5 +51,5 @@
 				const vertex_attribute_base* i = m->get_indices();
 				index_buffer* vb = create_index_buffer( hint, i->get_size(), i->get_data() );
-				result->set_index_buffer( vb, true );
+				result->set_index_buffer( vb, i->get_base_type(), true );
 			}
 			return result;
Index: trunk/nv/interface/vertex_buffer.hh
===================================================================
--- trunk/nv/interface/vertex_buffer.hh	(revision 115)
+++ trunk/nv/interface/vertex_buffer.hh	(revision 116)
@@ -93,5 +93,5 @@
 	{
 	public:
-		vertex_array() : m_map(), m_index( nullptr ) {}
+		vertex_array() : m_map(), m_index( nullptr ), m_index_owner( false ), m_index_type(INT) {}
 		void add_vertex_buffer( int location, vertex_buffer* buffer, datatype datatype, int components, int offset = 0, int stride = 0, bool owner = true ) 
 		{
@@ -107,9 +107,12 @@
 			}
 		};
-		void set_index_buffer( index_buffer* buffer, bool owner ) 
+		void set_index_buffer( index_buffer* buffer, datatype datatype, bool owner ) 
 		{ 
-			m_index = buffer; 
+			m_index       = buffer; 
 			m_index_owner = owner; 
+			m_index_type  = datatype;
 		}
+		bool has_index_buffer() const { return m_index != nullptr; }
+		datatype get_index_buffer_type() const { return m_index_type; }
 		virtual void bind() = 0;
 		virtual void unbind() = 0;
@@ -124,5 +127,6 @@
 		vertex_buffer_attribute_map m_map;
 		index_buffer* m_index;
-		bool m_index_owner;
+		bool          m_index_owner;
+		datatype      m_index_type;
 	};
 
Index: trunk/src/gl/gl_context.cc
===================================================================
--- trunk/src/gl/gl_context.cc	(revision 115)
+++ trunk/src/gl/gl_context.cc	(revision 116)
@@ -363,5 +363,12 @@
 		p->bind();
 		va->bind();
-		glDrawArrays( primitive_to_enum(prim), 0, count);
+		if ( va->has_index_buffer() )
+		{
+			glDrawElements( primitive_to_enum(prim), count, datatype_to_gl_enum( va->get_index_buffer_type() ), 0 );
+		}
+		else
+		{
+			glDrawArrays( primitive_to_enum(prim), 0, count);
+		}
 		va->unbind();
 		p->unbind();
Index: trunk/src/gl/gl_vertex_buffer.cc
===================================================================
--- trunk/src/gl/gl_vertex_buffer.cc	(revision 115)
+++ trunk/src/gl/gl_vertex_buffer.cc	(revision 116)
@@ -92,8 +92,17 @@
 	}
 
+	if ( m_index )
+	{
+		m_index->bind();
+	}
 }
 
 void gl_vertex_array::unbind()
 {
+	if ( m_index )
+	{
+		m_index->unbind();
+	}
+
 	for ( vertex_buffer_attribute_map::iterator i = m_map.begin(); 	i != m_map.end(); ++i ) 
 	{
