Index: /trunk/nv/interface/data_channel.hh
===================================================================
--- /trunk/nv/interface/data_channel.hh	(revision 420)
+++ /trunk/nv/interface/data_channel.hh	(revision 421)
@@ -86,4 +86,24 @@
 		typedef const raw_data_channel* const_iterator;
 
+		data_channel_set( data_channel_set&& other )
+		{
+			for ( uint32 c = 0; c < other.m_size; ++c )
+				m_channels[c] = move( other.m_channels[c] );
+			m_size = other.m_size;
+			other.m_size = 0;
+		}
+
+		data_channel_set& operator=( data_channel_set&& other )
+		{
+			if ( this != &other )
+			{
+				for ( uint32 c = 0; c < other.m_size; ++c )
+					m_channels[c] = move( other.m_channels[c] );
+				m_size = other.m_size;
+				other.m_size = 0;
+			}
+			return *this;
+		}
+
 		size_t size() const { return m_size; }
 
Index: /trunk/nv/interface/mesh_data.hh
===================================================================
--- /trunk/nv/interface/mesh_data.hh	(revision 420)
+++ /trunk/nv/interface/mesh_data.hh	(revision 421)
@@ -74,10 +74,10 @@
 		}
 
-		data_channel_set* rlease_node_data( size_t i )
-		{
-			data_channel_set* result = m_nodes[i].data;
-			m_nodes[i].data = nullptr;
-			return result;
-		}
+// 		data_channel_set* rlease_node_data( size_t i )
+// 		{
+// 			data_channel_set* result = m_nodes[i].data;
+// 			m_nodes[i].data = nullptr;
+// 			return result;
+// 		}
 
 		bool is_flat() const { return m_flat; }
Index: /trunk/nv/io/string_table.hh
===================================================================
--- /trunk/nv/io/string_table.hh	(revision 420)
+++ /trunk/nv/io/string_table.hh	(revision 421)
@@ -79,13 +79,13 @@
 
 		string_table_creator();
-		index insert( const std::string& s );
+		index insert( const string_view& s );
 		string_table* create_table() const;
 		uint32 dump_size() const;
 		void dump( nv::stream* out ) const;
 		const char* get( index i ) const;
-		index get( const std::string& s ) const;
+		index get( const string_view& s ) const;
 		void clear();
 	private:
-		unordered_map< std::string, index > m_map;
+		unordered_map< uint64, index > m_map;
 		vector< offset > m_offsets;
 		vector< char >   m_data;
Index: /trunk/src/formats/md5_loader.cc
===================================================================
--- /trunk/src/formats/md5_loader.cc	(revision 420)
+++ /trunk/src/formats/md5_loader.cc	(revision 421)
@@ -520,5 +520,5 @@
 	for ( uint32 i = 0; i < size; ++i )
 	{
-		data_channel_set_creator( m_meshes[i] ).move_to( meshes[i] );
+		meshes[i] = move( *m_meshes[i] );
 		delete m_meshes[i];
 		m_meshes[i] = nullptr;
Index: /trunk/src/formats/nmd_loader.cc
===================================================================
--- /trunk/src/formats/nmd_loader.cc	(revision 420)
+++ /trunk/src/formats/nmd_loader.cc	(revision 421)
@@ -58,5 +58,5 @@
 	for ( uint32 i = 0; i < size; ++i )
 	{
-		data_channel_set_creator( m_meshes[i] ).move_to( meshes[i] );
+		meshes[i] = move( *m_meshes[i] );
 		delete m_meshes[i];
 	}
Index: /trunk/src/io/string_table.cc
===================================================================
--- /trunk/src/io/string_table.cc	(revision 420)
+++ /trunk/src/io/string_table.cc	(revision 421)
@@ -12,12 +12,13 @@
 }
 
-nv::string_table_creator::index nv::string_table_creator::insert( const std::string& s )
+nv::string_table_creator::index nv::string_table_creator::insert( const string_view& s )
 {
-	auto i = m_map.find( s );
+	uint64 hash_value = hash_string< uint64 >( s.data() );
+	auto i = m_map.find( hash_value );
 	if ( i != m_map.end() )
 	{
 		return i->second;
 	}
-	const char* cs = s.c_str();
+	const char* cs = s.data();
 	uint32 cs_size = s.size() + 1;
 	NV_ASSERT( m_offsets.size() < index(-1), "Too many strings!" );
@@ -27,5 +28,5 @@
 	m_data.resize( dsize + cs_size );
 	raw_copy( cs, cs + cs_size, m_data.data() + dsize );
-	m_map[ s ] = result;
+	m_map[ hash_value ] = result;
 	return result;
 }
@@ -55,7 +56,8 @@
 }
 
-nv::string_table_creator::index nv::string_table_creator::get( const std::string& s ) const
+nv::string_table_creator::index nv::string_table_creator::get( const string_view& s ) const
 {
-	auto i = m_map.find( s );
+	uint64 hash_value = hash_string< uint64 >( s.data() );
+	auto i = m_map.find( hash_value );
 	if ( i != m_map.end() )
 	{
