Index: trunk/nv/gfx/cached_buffer.hh
===================================================================
--- trunk/nv/gfx/cached_buffer.hh	(revision 100)
+++ trunk/nv/gfx/cached_buffer.hh	(revision 101)
@@ -84,13 +84,13 @@
 			{
 				const vector& bv = bslice->data();
-				bslice.m_offset = m_data.size();
+				bslice->m_offset = m_data.size();
 				m_data.insert( m_data.end(), bv.cbegin(), bv.cend() );
 			}
-			else if ( bslice.m_locked )
+			else if ( bslice->m_locked )
 			{
 				const vector& bv = bslice->data();
 				std::copy( bv.cbegin(), bv.cend(), m_data.begin() + bslice->m_offset );
-				m_min = glm::min( m_min, bslice->m_offset );
-				m_max = glm::max( m_max, bslice->m_offset + bv.size() );
+				m_min = glm::min<int>( m_min, bslice->m_offset );
+				m_max = glm::max<int>( m_max, bslice->m_offset + bv.size() );
 			}
 		}
@@ -106,5 +106,5 @@
 		void commit()
 		{
-			int bsize = get_max_size();
+			size_t bsize = (size_t)get_max_size();
 			if ( m_data.size() > bsize )
 			{
Index: trunk/nv/interface/device.hh
===================================================================
--- trunk/nv/interface/device.hh	(revision 100)
+++ trunk/nv/interface/device.hh	(revision 101)
@@ -41,5 +41,5 @@
 		{
 			vertex_array* result = create_vertex_array();
-			for ( auto attr : m->get_attributes() )
+			for ( auto& attr : m->get_attributes() )
 			{
 				// TODO : error checking
@@ -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 );
+				result->set_index_buffer( vb, true );
 			}
 			return result;
Index: trunk/nv/interface/mesh.hh
===================================================================
--- trunk/nv/interface/mesh.hh	(revision 100)
+++ trunk/nv/interface/mesh.hh	(revision 101)
@@ -80,5 +80,5 @@
 		{ 
 			if ( m_indices ) delete m_indices; // error?
-			m_indices = new vertex_attribute<T>( attr ); 
+			m_indices = new vertex_attribute<T>(""); 
 			return m_indices;
 		}
@@ -117,5 +117,5 @@
 		{
 			delete m_indices;
-			for ( auto v : m_map )
+			for ( auto& v : m_map )
 			{
 				delete v.second;
Index: trunk/nv/interface/vertex_buffer.hh
===================================================================
--- trunk/nv/interface/vertex_buffer.hh	(revision 100)
+++ trunk/nv/interface/vertex_buffer.hh	(revision 101)
@@ -20,4 +20,5 @@
 namespace nv
 {
+	class vertex_array;
 
 	enum buffer_hint
@@ -62,4 +63,5 @@
 
 		vertex_buffer* get_buffer() const { return m_buffer; }
+		void set_buffer( vertex_buffer* b, bool owner ) { if (m_owner) delete m_buffer; m_buffer = b; m_owner = owner; }
 		datatype get_datatype() const { return m_datatype; }
 		int get_components() const { return m_components; }
@@ -75,4 +77,6 @@
 		}
 	protected:
+		friend class vertex_array;
+
 		vertex_buffer* m_buffer;
 		datatype       m_datatype;
@@ -91,7 +95,20 @@
 		void add_vertex_buffer( int location, vertex_buffer* buffer, datatype datatype, int components, int offset = 0, int stride = 0, bool owner = true ) 
 		{
-			m_map[ location ] = new vertex_buffer_attribute( buffer, datatype, components, offset, stride, owner );
+			auto p = new vertex_buffer_attribute( buffer, datatype, components, offset, stride, owner );
+			m_map[ location ] = p;
 		};
-		void set_index_buffer( index_buffer* buffer ) { m_index = buffer; }
+		void update_vertex_buffer( int location, vertex_buffer* b, bool owner ) 
+		{
+			auto i = m_map.find( location );
+			if ( i != m_map.end() )
+			{
+				i->second->set_buffer( b, owner );
+			}
+		};
+		void set_index_buffer( index_buffer* buffer, bool owner ) 
+		{ 
+			m_index = buffer; 
+			m_index_owner = owner; 
+		}
 		virtual void bind() = 0;
 		virtual void unbind() = 0;
@@ -101,9 +118,10 @@
 				delete i->second;
 			}
-			if (m_index) delete m_index; 
+			if (m_index && m_index_owner) delete m_index; 
 		}
 	protected:
 		vertex_buffer_attribute_map m_map;
 		index_buffer* m_index;
+		bool m_index_owner;
 	};
 
