Index: trunk/src/gfx/debug_draw.cc
===================================================================
--- trunk/src/gfx/debug_draw.cc	(revision 299)
+++ trunk/src/gfx/debug_draw.cc	(revision 302)
@@ -29,5 +29,5 @@
 
 nv::debug_data::debug_data( device* a_device )
-	: m_device( a_device ), m_program( nullptr ), m_va( nullptr )
+	: m_device( a_device ), m_program( nullptr ), m_va()
 {
 	m_program = m_device->create_program( nv_debug_draw_vertex_shader, nv_debug_draw_fragment_shader );
@@ -36,5 +36,5 @@
 void nv::debug_data::update()
 {
-	delete m_va;
+	m_device->release( m_va );
 	m_va = m_device->create_vertex_array( m_data, nv::STATIC_DRAW );
 }
@@ -75,5 +75,5 @@
 nv::debug_data::~debug_data()
 {
-	delete m_va;
+	m_device->release( m_va );
 	delete m_program;
 }
Index: trunk/src/gfx/keyframed_mesh.cc
===================================================================
--- trunk/src/gfx/keyframed_mesh.cc	(revision 299)
+++ trunk/src/gfx/keyframed_mesh.cc	(revision 302)
@@ -15,6 +15,7 @@
 using namespace nv;
 
-nv::keyframed_mesh::keyframed_mesh( const mesh_data* a_data, const mesh_nodes_data* a_tag_map )
+nv::keyframed_mesh::keyframed_mesh( context* a_context, const mesh_data* a_data, const mesh_nodes_data* a_tag_map )
 	: animated_mesh()
+	, m_context( a_context )
 	, m_mesh_data( a_data )
 	, m_tag_map( a_tag_map )
@@ -36,4 +37,5 @@
 	}
 	m_frame_count  = m_vchannel->count / m_vertex_count;
+	m_pbuffer      = buffer();
 }
 
@@ -103,5 +105,5 @@
 nv::keyframed_mesh::~keyframed_mesh()
 {
-	delete m_va;
+	m_context->get_device()->release( m_va );
 }
 
@@ -122,5 +124,5 @@
 
 nv::keyframed_mesh_gpu::keyframed_mesh_gpu( context* a_context, const mesh_data* a_data, const mesh_nodes_data* a_tag_map )
-	: keyframed_mesh( a_data, a_tag_map )
+	: keyframed_mesh( a_context, a_data, a_tag_map )
 	, m_loc_next_position( -1 )
 	, m_loc_next_normal( -1 )
@@ -129,5 +131,6 @@
 	, m_gpu_next_frame( 0xFFFFFFFF )
 {
-	m_va = a_context->get_device()->create_vertex_array( a_data, STATIC_DRAW );
+	m_va      = a_context->get_device()->create_vertex_array( a_data, STATIC_DRAW );
+	m_pbuffer = a_context->get_device()->find_buffer( m_va, slot::POSITION );
 }
 
@@ -137,12 +140,13 @@
 	if ( m_loc_next_position == -1 ) return;
 	animated_mesh::update( ms );
-
+	device* dev = m_context->get_device();
 	if ( m_gpu_last_frame != m_last_frame )
 	{
-		m_va->update_vertex_buffer( slot::POSITION, m_last_frame * m_vertex_count * m_vsize );
-		m_va->update_vertex_buffer( slot::NORMAL,   m_last_frame * m_vertex_count * m_vsize + sizeof( vec3 ) );
+		uint32 base_offset = m_last_frame * m_vertex_count * m_vsize; 
+		dev->update_attribute_offset( m_va, slot::POSITION, base_offset );
+		dev->update_attribute_offset( m_va, slot::NORMAL,   base_offset + sizeof( vec3 ) );
 		if ( m_has_tangent && m_loc_next_tangent != -1 )
 		{
-			m_va->update_vertex_buffer( slot::TANGENT,   m_last_frame * m_vertex_count * m_vsize + 2*sizeof( vec3 ) );
+			dev->update_attribute_offset( m_va, slot::TANGENT, base_offset + 2*sizeof( vec3 ) );
 		}
 		m_gpu_last_frame = m_last_frame;
@@ -150,7 +154,11 @@
 	if ( m_loc_next_position != -1 && m_gpu_next_frame != m_next_frame )
 	{
-		m_va->update_vertex_buffer( m_loc_next_position, m_next_frame * m_vertex_count * m_vsize );
-		m_va->update_vertex_buffer( m_loc_next_normal,   m_next_frame * m_vertex_count * m_vsize + sizeof( vec3 ) );
-		m_va->update_vertex_buffer( m_loc_next_tangent,   m_next_frame * m_vertex_count * m_vsize + 2*sizeof( vec3 ) );
+		uint32 base_offset = m_next_frame * m_vertex_count * m_vsize; 
+		dev->update_attribute_offset( m_va, (slot)m_loc_next_position, base_offset );
+		dev->update_attribute_offset( m_va, (slot)m_loc_next_normal, base_offset + sizeof( vec3 ) );
+		if ( m_has_tangent && m_loc_next_tangent != -1 )
+		{
+			dev->update_attribute_offset( m_va, (slot)m_loc_next_tangent, base_offset + 2*sizeof( vec3 ) );
+		}
 		m_gpu_next_frame = m_next_frame;
 	}
@@ -166,9 +174,9 @@
 			m_loc_next_tangent  = a_program->get_attribute( "nv_next_tangent" )->get_location();
 
-		vertex_buffer* vb = m_va->find_buffer( slot::POSITION );
-		m_va->add_vertex_buffer( m_loc_next_position, vb, FLOAT, 3, 0, m_vsize, false );
-		m_va->add_vertex_buffer( m_loc_next_normal,   vb, FLOAT, 3, sizeof( vec3 ), m_vsize, false );
+		device* dev = m_context->get_device();
+		dev->add_vertex_buffer( m_va, (slot)m_loc_next_position, m_pbuffer, FLOAT, 3, 0, m_vsize, false );
+		dev->add_vertex_buffer( m_va, (slot)m_loc_next_normal,   m_pbuffer, FLOAT, 3, sizeof( vec3 ), m_vsize, false );
 		if ( m_has_tangent )
-			m_va->add_vertex_buffer( m_loc_next_tangent, vb, FLOAT, 4, 2*sizeof( vec3 ), m_vsize, false );
+			dev->add_vertex_buffer( m_va, (slot)m_loc_next_tangent, m_pbuffer, FLOAT, 4, 2*sizeof( vec3 ), m_vsize, false );
 	}
 	keyframed_mesh::update( a_program );
@@ -176,16 +184,16 @@
 
 nv::keyframed_mesh_cpu::keyframed_mesh_cpu( context* a_context, const mesh_data* a_data, const mesh_nodes_data* a_tag_map )
-	: keyframed_mesh( a_data, a_tag_map )
-	, m_context( a_context )
-{
-	m_va = m_context->get_device()->create_vertex_array();
-	m_vb = m_context->get_device()->create_vertex_buffer( nv::STATIC_DRAW, m_vertex_count * m_vsize, (void*)m_vchannel->data );
-	m_va->add_vertex_buffers( m_vb, m_vchannel );
-
-	nv::vertex_buffer* vb = m_context->get_device()->create_vertex_buffer( nv::STATIC_DRAW, m_vertex_count * sizeof( nv::vec2 ), (void*)m_mesh_data->get_channel<vertex_t>()->data );
-	m_va->add_vertex_buffers( vb, m_mesh_data->get_channel<vertex_t>() );
-
-	nv::index_buffer* ib = m_context->get_device()->create_index_buffer( nv::STATIC_DRAW, m_mesh_data->get_index_channel()->size(), (void*)m_mesh_data->get_index_channel()->data );
-	m_va->set_index_buffer( ib, m_mesh_data->get_index_channel()->desc.slots[0].etype, true );
+	: keyframed_mesh( a_context, a_data, a_tag_map )
+{
+	m_va      = m_context->get_device()->create_vertex_array();
+	m_pbuffer = m_context->get_device()->create_buffer( VERTEX_BUFFER, STATIC_DRAW, m_vertex_count * m_vsize, (void*)m_vchannel->data );
+	m_context->get_device()->add_vertex_buffers( m_va, m_pbuffer, m_vchannel );
+
+	buffer  vb = m_context->get_device()->create_buffer( VERTEX_BUFFER, STATIC_DRAW, m_vertex_count * sizeof( vec2 ), (void*)m_mesh_data->get_channel<vertex_t>()->data );
+	m_context->get_device()->add_vertex_buffers( m_va, vb, m_mesh_data->get_channel<vertex_t>() );
+
+	buffer  ib = m_context->get_device()->create_buffer( INDEX_BUFFER, STATIC_DRAW, m_mesh_data->get_index_channel()->size(), (void*)m_mesh_data->get_index_channel()->data );
+
+	m_context->get_device()->set_index_buffer( m_va, ib, m_mesh_data->get_index_channel()->desc.slots[0].etype, true );
 
 	m_data = new uint8[ m_vertex_count * m_vsize ];
@@ -224,5 +232,5 @@
 	}
 
-	m_context->update( m_vb, m_data, 0, m_vertex_count * m_vsize );
+	m_context->update( m_pbuffer, m_data, 0, m_vertex_count * m_vsize );
 }
 
Index: trunk/src/gfx/mesh_creator.cc
===================================================================
--- trunk/src/gfx/mesh_creator.cc	(revision 299)
+++ trunk/src/gfx/mesh_creator.cc	(revision 302)
@@ -430,8 +430,8 @@
 	{
 		mesh_raw_channel* old = m_data->m_channels[c];
-		size_t frame_count = ( old->is_index() ? 1 : old->count / size );
+		size_t frame_count = ( old->get_buffer_type() == INDEX_BUFFER ? 1 : old->count / size );
 		m_data->m_channels[c] = append_channels( old, other->m_channels[c], frame_count );
 		NV_ASSERT( m_data->m_channels[c], "Merge problem!" );
-		if ( old->is_index() )
+		if ( old->get_buffer_type() == INDEX_BUFFER )
 		{
 			switch ( old->desc.slots[0].etype )
Index: trunk/src/gfx/skeletal_mesh.cc
===================================================================
--- trunk/src/gfx/skeletal_mesh.cc	(revision 299)
+++ trunk/src/gfx/skeletal_mesh.cc	(revision 302)
@@ -12,6 +12,5 @@
 
 nv::skeletal_mesh_cpu::skeletal_mesh_cpu( context* a_context, const mesh_data* a_mesh_data, const mesh_nodes_data* bones )
-	: skeletal_mesh()
-	, m_context( a_context )
+	: skeletal_mesh( a_context )
 	, m_data( a_mesh_data )
 {
@@ -27,5 +26,7 @@
 	m_vtx_data  = a_mesh_data->get_channel_data<md5_vtx_pntiw>();
 	m_indices   = a_mesh_data->get_count();
-	m_va        = a_context->get_device()->create_vertex_array( a_mesh_data, nv::STREAM_DRAW );
+	m_va        = a_context->get_device()->create_vertex_array( a_mesh_data, 
+STREAM_DRAW );
+	m_pbuffer   = a_context->get_device()->find_buffer( m_va, slot::POSITION );
 }
 
@@ -63,6 +64,5 @@
 		}
 
-		vertex_buffer* vb = m_va->find_buffer( nv::slot::POSITION );
-		m_context->update( vb, m_pntdata.data(), 0, m_pntdata.raw_size() );
+		m_context->update( m_pbuffer, m_pntdata.data(), 0, m_pntdata.raw_size() );
 	}
 }
@@ -80,11 +80,4 @@
 		skeleton[i] = m_node_data->get_node(i)->data->get_transform( frame_num );
 	}
-}
-
-
-
-nv::skeletal_mesh_cpu::~skeletal_mesh_cpu()
-{
-	delete m_va;
 }
 
@@ -200,5 +193,5 @@
 
 nv::skeletal_mesh_gpu::skeletal_mesh_gpu( context* a_context, const mesh_data* a_mesh, const mesh_nodes_data* a_bone_data )
-	: skeletal_mesh(), m_bone_data( a_bone_data ), m_transform( nullptr )
+	: skeletal_mesh( a_context ), m_bone_data( a_bone_data ), m_transform( nullptr )
 {
 	m_va          = a_context->get_device()->create_vertex_array( a_mesh, nv::STATIC_DRAW );
