Index: trunk/src/formats/md3_loader.cc
===================================================================
--- trunk/src/formats/md3_loader.cc	(revision 152)
+++ trunk/src/formats/md3_loader.cc	(revision 153)
@@ -351,7 +351,18 @@
 }
 
-sint32 nv::md3_loader::get_max_frames() const
+sint32 md3_loader::get_max_frames() const
 {
 	return ((md3_t*)m_md3)->header.num_frames;
+}
+
+void md3_loader::load_tag_names( std::vector< std::string >& tags )
+{
+	tags.clear();
+	md3_t* md3 = (md3_t*)m_md3;
+	for ( sint32 i = 0; i < md3->header.num_tags; ++i )
+	{
+		const md3_tag_t& rtag = md3->tags[i + md3->header.num_tags];
+		tags.push_back( (char*)(rtag.name) );
+	}
 }
 
@@ -480,2 +491,20 @@
 
 }
+
+keyframed_mesh::keyframed_mesh( md3_loader* loader )
+{
+	loader->load_positions( m_positions );
+	loader->load_normals( m_normals );
+	loader->load_texcoords( m_texcoords );
+	loader->load_indicies( m_indices );
+
+	std::vector< std::string > names;
+	loader->load_tag_names( names );
+	for ( auto& name : names )
+	{
+		loader->load_tags( m_tags[ name ], name );
+	}
+
+	m_frames = loader->get_max_frames();
+}
+
Index: trunk/src/gl/gl_device.cc
===================================================================
--- trunk/src/gl/gl_device.cc	(revision 152)
+++ trunk/src/gl/gl_device.cc	(revision 153)
@@ -53,10 +53,10 @@
 }
 
-vertex_buffer* gl_device::create_vertex_buffer( buffer_hint hint, size_t size, void* source /*= nullptr */ )
+vertex_buffer* gl_device::create_vertex_buffer( buffer_hint hint, size_t size, const void* source /*= nullptr */ )
 {
 	return new gl_vertex_buffer( hint, size, source );
 }
 
-index_buffer* gl_device::create_index_buffer( buffer_hint hint, size_t size, void* source /*= nullptr */ )
+index_buffer* gl_device::create_index_buffer( buffer_hint hint, size_t size, const void* source /*= nullptr */ )
 {
 	return new gl_index_buffer( hint, size, source );
Index: trunk/src/gl/gl_vertex_buffer.cc
===================================================================
--- trunk/src/gl/gl_vertex_buffer.cc	(revision 152)
+++ trunk/src/gl/gl_vertex_buffer.cc	(revision 153)
@@ -10,5 +10,5 @@
 using namespace nv;
 
-gl_vertex_buffer::gl_vertex_buffer( buffer_hint hint, size_t size, void* data ) 
+gl_vertex_buffer::gl_vertex_buffer( buffer_hint hint, size_t size, const void* data ) 
 	: vertex_buffer( hint, size ), m_name()
 {
@@ -18,5 +18,5 @@
 }
 
-void gl_vertex_buffer::update( void* data, size_t offset, size_t size )
+void gl_vertex_buffer::update( const void* data, size_t offset, size_t size )
 {
 	glBufferSubData( GL_ARRAY_BUFFER, (GLintptr)offset, (GLsizeiptr)size, data );
@@ -39,5 +39,5 @@
 }
 
-gl_index_buffer::gl_index_buffer( buffer_hint hint, size_t size, void* data ) 
+gl_index_buffer::gl_index_buffer( buffer_hint hint, size_t size, const void* data ) 
 	: index_buffer( hint, size ), m_name()
 {
@@ -47,5 +47,5 @@
 }
 
-void gl_index_buffer::update( void* data, size_t offset, size_t size )
+void gl_index_buffer::update( const void* data, size_t offset, size_t size )
 {
 	glBufferSubData( GL_ELEMENT_ARRAY_BUFFER, (GLintptr)offset, (GLsizeiptr)size, data );
