Index: trunk/src/gfx/keyframed_mesh.cc
===================================================================
--- trunk/src/gfx/keyframed_mesh.cc	(revision 424)
+++ trunk/src/gfx/keyframed_mesh.cc	(revision 427)
@@ -42,5 +42,5 @@
 	if ( m_tag_map && m_tag_map->get_count() > 0 )
 	{
-		m_interpolation_key = m_tag_map->get_node( 0 )->data->get_interpolation_key();
+		m_interpolation_key = (*m_tag_map)[ 0 ]->get_interpolation_key();
 	}
 }
@@ -55,7 +55,6 @@
 	if ( !m_tag_map ) return transform();
 	NV_ASSERT( node_id < m_tag_map->get_count(), "TAGMAP FAIL" );
-	const data_channel_set* data = m_tag_map->get_node( node_id )->data;
-	NV_ASSERT( data && data->size() > 0, "TAG FAIL" );
-	raw_channel_interpolator interpolator( data, m_interpolation_key );
+	NV_ASSERT( (*m_tag_map)[node_id]->size() > 0, "TAG FAIL" );
+	raw_channel_interpolator interpolator( ( *m_tag_map )[node_id], m_interpolation_key );
 	return interpolator.get< transform >( m_last_frame, m_next_frame, m_interpolation );
 }
Index: trunk/src/gfx/mesh_creator.cc
===================================================================
--- trunk/src/gfx/mesh_creator.cc	(revision 424)
+++ trunk/src/gfx/mesh_creator.cc	(revision 427)
@@ -18,7 +18,7 @@
 	for ( size_t i = 0; i < m_data->get_count(); ++i )
 	{
-		sint16 parent_id = m_data->m_nodes[i].data->get_parent_id();
-		data_channel_set* keys   = m_data->m_nodes[i].data;
-		data_channel_set* pkeys  = ( parent_id != -1 ? m_data->m_nodes[parent_id].data : nullptr );
+		data_channel_set* keys = m_data->m_data[i];
+		sint16 parent_id = keys->get_parent_id();
+		data_channel_set* pkeys  = ( parent_id != -1 ? m_data->m_data[parent_id] : nullptr );
 		size_t count     = ( keys ? keys->get_channel_size(0) : 0 );
 		size_t pcount    = ( pkeys ? pkeys->get_channel_size(0) : 0 );
@@ -51,5 +51,5 @@
 	for ( size_t i = 0; i < m_data->get_count(); ++i )
 	{
-		data_channel_set* old_keys = m_data->m_nodes[i].data;
+		data_channel_set* old_keys = m_data->m_data[i];
 		if ( old_keys && old_keys->size() > 0 )
 		{
@@ -89,5 +89,5 @@
 
 			delete old_keys;
-			m_data->m_nodes[i].data = new_keys;
+			m_data->m_data[i] = new_keys;
 		}
 	}
@@ -102,17 +102,14 @@
 	for ( size_t i = 0; i < m_data->get_count(); ++i )
 	{
-		mesh_node_data& node = m_data->m_nodes[i];
-		node.data->m_transform = pre_transform * node.data->m_transform * post_transform;
-		if ( node.data )
-		{
-			data_channel_set* kdata  = node.data;
-			for ( size_t c = 0; c < kdata->size(); ++c )
-			{
-				raw_data_channel_access channel( kdata, c );
-				size_t key_size = channel.element_size();
-				for ( size_t n = 0; n < channel.size(); ++n )
-				{
-					transform_key_raw( kdata->get_channel( c )->descriptor(), channel.raw_data() + n * key_size, scale, r33, ri33 );
-				}
+		data_channel_set* node = m_data->m_data[i];
+		node->m_transform = pre_transform * node->m_transform * post_transform;
+
+		for ( size_t c = 0; c < node->size(); ++c )
+		{
+			raw_data_channel_access channel( node, c );
+			size_t key_size = channel.element_size();
+			for ( size_t n = 0; n < channel.size(); ++n )
+			{
+				transform_key_raw( node->get_channel( c )->descriptor(), channel.raw_data() + n * key_size, scale, r33, ri33 );
 			}
 		}
@@ -458,5 +455,6 @@
 	if ( index < m_pack->get_count() )
 	{
-		data_channel_set_creator( &m_pack->m_meshes[m_pack->m_count - 1] ).move_to( m_pack->m_meshes[index] );
+
+		m_pack->m_meshes[index] = move( m_pack->m_meshes[m_pack->m_count - 1] );
 		m_pack->m_count--;
 	}
Index: trunk/src/gfx/skeletal_mesh.cc
===================================================================
--- trunk/src/gfx/skeletal_mesh.cc	(revision 424)
+++ trunk/src/gfx/skeletal_mesh.cc	(revision 427)
@@ -23,5 +23,5 @@
 	for ( uint32 i = 0; i < bones->get_count(); ++i )
 	{
-		m_bone_offset[i] = transform( bones->get_node(i)->data->get_transform() );
+		m_bone_offset[i] = transform( (*bones)[i]->get_transform() );
 	}
 
@@ -93,9 +93,9 @@
 void nv::skeletal_animation_entry_cpu::initialize()
 {
-	for ( size_t i = 0; i < m_node_data->get_count(); ++i )
-	{
-		if ( m_node_data->is_animated( i ) )
-		{
-			m_interpolation_key = m_node_data->get_node( i )->data->get_interpolation_key();
+	for ( auto bone : *m_node_data )
+	{
+		if ( bone->size() > 0 )
+		{
+			m_interpolation_key = bone->get_interpolation_key();
 			break;
 		}
@@ -112,5 +112,5 @@
 	for ( size_t i = 0; i < m_node_data->get_count(); ++i )
 	{
-		raw_channel_interpolator interpolator( m_node_data->get_node( i )->data, m_interpolation_key );
+		raw_channel_interpolator interpolator( (*m_node_data)[i], m_interpolation_key );
 		skeleton[i] = interpolator.get< transform >( frame_num );
 	}
@@ -132,8 +132,8 @@
 		for ( uint32 n = 0; n < node_count; ++n )
 		{
-			const mesh_node_data* node = m_node_data->get_node(n);
-			if ( node->data->get_parent_id() != -1 )
-			{
-				m_children[ node->data->get_parent_id()].push_back( n );
+			const data_channel_set* node = (*m_node_data)[n];
+			if ( node->get_parent_id() != -1 )
+			{
+				m_children[ node->get_parent_id()].push_back( n );
 			}
 		}
@@ -156,10 +156,10 @@
 		if ( m_bone_ids[n] >= 0 )
 		{
-			const mesh_node_data* node = m_node_data->get_node(n);
-			nv::mat4 node_mat( node->data->get_transform() );
-
-			if ( node->data && node->data->size() > 0 )
-			{
-				raw_channel_interpolator interpolator( node->data, m_interpolation_key );
+			const data_channel_set* node = m_node_data->get_node(n);
+			nv::mat4 node_mat( node->get_transform() );
+
+			if ( node->size() > 0 )
+			{
+				raw_channel_interpolator interpolator( node, m_interpolation_key );
 				node_mat = interpolator.get< mat4 >( anim_time );
 			}
@@ -177,15 +177,15 @@
 	for ( nv::uint16 bi = 0; bi < bones->get_count(); ++bi )
 	{
-		const mesh_node_data* bone = bones->get_node(bi);
-		bone_names[ bone->data->get_name() ] = bi;
-		m_offsets[bi] = bone->data->get_transform();
+		const data_channel_set* bone = bones->get_node( bi );
+		bone_names[ bone->get_name() ] = bi;
+		m_offsets[bi] = bone->get_transform();
 	}
 
 	for ( uint32 n = 0; n < m_node_data->get_count(); ++n )
 	{
-		const mesh_node_data* node = m_node_data->get_node(n);
+		const data_channel_set* node = m_node_data->get_node( n );
 		sint16 bone_id = -1;
 
-		auto bi = bone_names.find( node->data->get_name() );
+		auto bi = bone_names.find( node->get_name() );
 		if ( bi != bone_names.end() )
 		{
@@ -194,6 +194,6 @@
 		m_bone_ids[n] = bone_id;
 
-		if ( m_interpolation_key.size() == 0 && node->data->size() > 0 )
-			m_interpolation_key = node->data->get_interpolation_key();
+		if ( m_interpolation_key.size() == 0 && node->size() > 0 )
+			m_interpolation_key = node->get_interpolation_key();
 
 	}
@@ -205,10 +205,10 @@
 	// TODO: fix transforms, which are now embedded,
 	//       see note in assimp_loader.cc:load_node
-	const mesh_node_data* node = m_node_data->get_node( node_id );
-	mat4 node_mat( node->data->get_transform() );
-
-	if ( node->data && node->data->size() > 0 )
-	{
-		raw_channel_interpolator interpolator( node->data, m_interpolation_key );
+	const data_channel_set* node = m_node_data->get_node( node_id );
+	mat4 node_mat( node->get_transform() );
+
+	if ( node->size() > 0 )
+	{
+		raw_channel_interpolator interpolator( node, m_interpolation_key );
 		node_mat = interpolator.get< mat4 >( time );
 	}
