Index: trunk/nv/gui/gui_common.hh
===================================================================
--- trunk/nv/gui/gui_common.hh	(revision 270)
+++ trunk/nv/gui/gui_common.hh	(revision 271)
@@ -42,5 +42,4 @@
 
 		typedef nv::handle<> handle;
-		typedef nv::index_store<handle> index_store;
 
 	} // namespace gui
Index: trunk/nv/gui/gui_element.hh
===================================================================
--- trunk/nv/gui/gui_element.hh	(revision 270)
+++ trunk/nv/gui/gui_element.hh	(revision 271)
@@ -41,5 +41,4 @@
 
 			string    m_id;              ///< id type of the object
-			handle    m_this;            ///< pointer to parent
 			handle    m_parent;          ///< pointer to parent
 			list      m_children;        ///< children objects
Index: trunk/nv/gui/gui_environment.hh
===================================================================
--- trunk/nv/gui/gui_environment.hh	(revision 270)
+++ trunk/nv/gui/gui_environment.hh	(revision 271)
@@ -43,6 +43,4 @@
 			virtual ~environment();
 		protected:
-			handle create_handle();
-			element* get_element( handle h );
 			handle get_element( const position& p );
 			void add_child( handle child );
@@ -60,11 +58,9 @@
 			void recalculate_absolute( handle e );
 			
-			std::vector< element > m_elements;
-
-			index_store      m_indexes;
-			renderer*    m_renderer;
-			window*      m_window;
-			handle       m_screen;
-			rectangle    m_area;
+			entity_store< element, handle > m_elements;
+			renderer*     m_renderer;
+			window*       m_window;
+			handle        m_screen;
+			rectangle     m_area;
 		};
 
Index: trunk/nv/handle.hh
===================================================================
--- trunk/nv/handle.hh	(revision 270)
+++ trunk/nv/handle.hh	(revision 271)
@@ -120,4 +120,46 @@
 	};
 
+	template < typename T, typename HANDLE = handle<>, typename TINDEX = sint32 >
+	class entity_store
+	{
+	public:
+		typedef HANDLE handle;
+		typedef TINDEX index_type;
+		typedef T      value_type;
+
+		entity_store() {}
+		handle create()
+		{
+			m_data.emplace_back();
+			m_handles.push_back( m_indexes.create_handle( sint32( m_data.size() - 1 ) ) );
+			return m_handles.back();
+		}
+		value_type* get( handle h )
+		{
+			if ( h.is_nil() ) return nullptr;
+			sint32 eindex = m_indexes.get_index( h );
+			return eindex >= 0 ? &(m_data[ eindex ]) : nullptr;
+		}
+		void destroy( handle e )
+		{
+			handle swap_handle    = m_handles.back();
+			sint32 dead_eindex    = m_indexes.get_index( e );
+			if ( dead_eindex != (sint32)m_data.size()-1 )
+			{
+				m_data[ dead_eindex ]    = m_data.back();
+				m_handles[ dead_eindex ] = m_handles.back();
+			}
+			m_data.pop_back();
+			m_handles.pop_back();
+			m_indexes.swap_indices( e, swap_handle );
+			m_indexes.free_handle( e );
+		}
+	private:
+		std::vector< handle >         m_handles;
+		std::vector< value_type >     m_data;
+		index_store< handle, TINDEX > m_indexes;
+	};
+
+
 
 }
Index: trunk/src/gui/gui_environment.cc
===================================================================
--- trunk/src/gui/gui_environment.cc	(revision 270)
+++ trunk/src/gui/gui_environment.cc	(revision 271)
@@ -30,6 +30,6 @@
 	m_area.dim( dimension( w->get_width(), w->get_height() ) );
 	
-	m_screen           = create_handle();
-	element* screen    = get_element( m_screen );
+	m_screen           = m_elements.create();
+	element* screen    = m_elements.get( m_screen );
 	screen->m_absolute = m_area;
 	screen->m_relative = m_area;
@@ -51,6 +51,6 @@
 {
 	if ( parent.is_nil() ) parent = m_screen;
-	handle result = create_handle();
-	element* e    = get_element( result );
+	handle result = m_elements.create();
+	element* e    = m_elements.get( result );
 	e->m_absolute = r;
 	e->m_relative = r;
@@ -59,14 +59,7 @@
 }
 
-nv::gui::handle nv::gui::environment::create_handle()
-{
-	m_elements.emplace_back();
-	m_elements.back().m_this = m_indexes.create_handle( sint32( m_elements.size() - 1 ) );
-	return m_elements.back().m_this;
-}
-
 void nv::gui::environment::destroy_element( handle e )
 {
-	element* dead_element = get_element( e );
+	element* dead_element = m_elements.get( e );
 	if ( dead_element == nullptr ) return;
 	destroy_children( e );
@@ -77,18 +70,10 @@
 	dead_element->m_parent = handle();
 
-	handle swap_handle    = m_elements.back().m_this;
-	sint32 dead_eindex    = m_indexes.get_index( e );
-	if ( dead_eindex != (sint32)m_elements.size()-1 )
-	{
-		m_elements[ dead_eindex ] = m_elements.back();
-	}
-	m_elements.pop_back();
-	m_indexes.swap_indices( e, swap_handle );
-	m_indexes.free_handle( e );
+	m_elements.destroy( e );
 }
 
 void nv::gui::environment::update( handle e, uint32 elapsed )
 {
-	element* el = get_element( e );
+	element* el = m_elements.get( e );
 	if ( !el ) return;
 	//	el->on_update( elapsed );
@@ -109,5 +94,5 @@
 void nv::gui::environment::draw( handle e )
 {
-	element* el = get_element( e );
+	element* el = m_elements.get( e );
 	if ( !el ) return;
 	if ( el->m_visible )
@@ -140,6 +125,6 @@
 void nv::gui::environment::add_child( handle parent, handle child )
 {
-	element* e = get_element( child );
-	element* p = get_element( parent );
+	element* e = m_elements.get( child );
+	element* p = m_elements.get( parent );
 	if ( e && p )
 	{
@@ -153,5 +138,5 @@
 void nv::gui::environment::destroy_children( handle e )
 {
-	element* parent = get_element(e);
+	element* parent = m_elements.get(e);
 	if ( parent )
 	{
@@ -177,5 +162,5 @@
 bool nv::gui::environment::process_io_event( handle e, const io_event& ev )
 {
-	element* el = get_element( e );
+	element* el = m_elements.get( e );
 	return el && el->m_parent.is_valid() ? process_io_event( el->m_parent, ev ) : false;
 }
@@ -186,14 +171,7 @@
 }
 
-nv::gui::element* nv::gui::environment::get_element( handle h )
-{
-	if ( h.is_nil() ) return nullptr;
-	sint32 eindex = m_indexes.get_index( h );
-	return eindex >= 0 ? &m_elements[ eindex ] : nullptr;
-}
-
 nv::gui::handle nv::gui::environment::get_deepest_child( handle e, const position& p )
 {
-	element* el = get_element(e);
+	element* el = m_elements.get(e);
 	if ( !el && !el->m_visible ) return handle();
 
@@ -214,6 +192,6 @@
 void nv::gui::environment::move_to_top( handle child )
 {
-	element* e      = get_element( child );
-	element* parent = get_element( e->m_parent );
+	element* e      = m_elements.get( child );
+	element* parent = m_elements.get( e->m_parent );
 	if ( e && parent )
 	{
@@ -230,6 +208,6 @@
 void nv::gui::environment::move_to_bottom( handle child )
 {
-	element* e      = get_element( child );
-	element* parent = get_element( e->m_parent );
+	element* e      = m_elements.get( child );
+	element* parent = m_elements.get( e->m_parent );
 	if ( e && parent )
 	{
@@ -246,5 +224,5 @@
 void nv::gui::environment::set_relative( handle e, const rectangle& r )
 {
-	element* el = get_element(e);
+	element* el = m_elements.get(e);
 	if ( el )
 	{
@@ -257,5 +235,5 @@
 void nv::gui::environment::set_relative( handle e, const position& p )
 {
-	element* el = get_element(e);
+	element* el = m_elements.get(e);
 	if ( el )
 	{
@@ -266,6 +244,6 @@
 void nv::gui::environment::recalculate_absolute( handle e )
 {
-	element* el = get_element(e);
-	rectangle pabsolute = get_element( el->m_parent )->m_absolute;
+	element* el = m_elements.get(e);
+	rectangle pabsolute = m_elements.get( el->m_parent )->m_absolute;
 	el->m_absolute = el->m_relative + pabsolute.ul;
 
@@ -278,5 +256,5 @@
 void nv::gui::environment::set_class( handle e, const string& text )
 {
-	element* ep = get_element(e);
+	element* ep = m_elements.get(e);
 	if ( ep != nullptr )
 	{
@@ -288,5 +266,5 @@
 void nv::gui::environment::set_text( handle e, const string& text )
 {
-	element* ep = get_element(e);
+	element* ep = m_elements.get(e);
 	if ( ep != nullptr )
 	{
@@ -298,5 +276,5 @@
 void nv::gui::environment::remove_child( handle parent, handle child )
 {
-	element* p = get_element( parent );
+	element* p = m_elements.get( parent );
 	if ( p )
 	{
@@ -304,5 +282,5 @@
 		if ( it != p->m_children.end() )
 		{
-			element* e = get_element( *it );
+			element* e = m_elements.get( *it );
 			e->m_parent = handle();
 			p->m_children.erase(it);
