Index: trunk/src/gui/gui_environment.cc
===================================================================
--- trunk/src/gui/gui_environment.cc	(revision 267)
+++ trunk/src/gui/gui_environment.cc	(revision 268)
@@ -42,5 +42,5 @@
 	element* result = new element( r );
 	if ( parent == nullptr ) parent = m_screen;
-	parent->add_child( result );
+	add_child( parent, result );
 	return result;
 }
@@ -49,5 +49,8 @@
 {
 	destroy_children( e );
-	e->detach();
+	if ( e->m_parent ) 
+	{
+		remove_child( e->m_parent, e );
+	}
 	delete e;
 }
@@ -56,15 +59,15 @@
 {
 //	e->on_update( elapsed );
-	if ( e->is_visible() )
-	{
-		for ( object* i : *e )
-		{
-			update( ((element*)i), elapsed );
-		}
-	}
-	if ( e->is_dirty() || e->m_render_data == nullptr )
+	if ( e->m_visible )
+	{
+		for ( element* i : e->m_children )
+		{
+			update( i, elapsed );
+		}
+	}
+	if ( e->m_dirty || e->m_render_data == nullptr )
 	{
 		m_renderer->redraw( e, elapsed );
-		e->set_dirty( false );
+		e->m_dirty = false;
 	}
 }
@@ -72,11 +75,11 @@
 void nv::gui::environment::draw( element* e )
 {
-	if ( e->is_visible() )
+	if ( e->m_visible )
 	{
 //		e->on_draw();
 		m_renderer->draw( e );
-		for ( object* i : *e )
-		{
-			draw((element*)i);
+		for ( element* i : e->m_children )
+		{
+			draw(i);
 		}
 	}
@@ -96,5 +99,19 @@
 void nv::gui::environment::add_child( element* child )
 {
-	m_screen->add_child( child );
+	add_child( m_screen, child );
+}
+
+void nv::gui::environment::add_child( element* parent, element* child )
+{
+	if ( child )
+	{
+		if ( child->m_parent )
+		{
+			remove_child( child->m_parent, child );
+		}
+		child->m_parent = parent;
+		parent->m_children.push_back( child );
+		parent->m_child_count++;
+	}
 }
 
@@ -103,5 +120,5 @@
 	while ( !e->m_children.empty() )
 	{
-		destroy_element( (element*)e->m_children.front() );
+		destroy_element( e->m_children.front() );
 	}
 }
@@ -121,5 +138,5 @@
 bool nv::gui::environment::process_io_event( element* e, const io_event& ev )
 {
-	return e->m_parent ? process_io_event( (element*)e->m_parent, ev ) : false;
+	return e->m_parent ? process_io_event( e->m_parent, ev ) : false;
 }
 
@@ -131,5 +148,5 @@
 nv::gui::element* nv::gui::environment::get_deepest_child( element* e, const position& p )
 {
-	if ( !e->is_visible() ) return nullptr;
+	if ( !e->m_visible ) return nullptr;
 
 	element* result = nullptr;
@@ -138,10 +155,10 @@
 	while ( it != e->m_children.rend() )
 	{
-		result = get_deepest_child( (element*)(*it), p );
+		result = get_deepest_child( *it, p );
 		if ( result ) return result;
 		++it;
 	}
 
-	if ( e->contains( p ) ) return e;
+	if ( e->m_absolute.contains(p) ) return e;
 	return nullptr;
 }
@@ -149,8 +166,8 @@
 void nv::gui::environment::move_to_top( element* child )
 {
-	element* parent = (element*)child->m_parent;
+	element* parent = child->m_parent;
 	if ( parent )
 	{
-		auto it = std::find( parent->m_children.begin(), parent->m_children.end(), (object*)child );
+		auto it = std::find( parent->m_children.begin(), parent->m_children.end(), child );
 		if ( it != parent->m_children.end() )
 		{
@@ -164,8 +181,8 @@
 void nv::gui::environment::move_to_bottom( element* child )
 {
-	element* parent = (element*)child->m_parent;
+	element* parent = child->m_parent;
 	if ( parent )
 	{
-		auto it = std::find( parent->m_children.begin(), parent->m_children.end(), (object*)child );
+		auto it = std::find( parent->m_children.begin(), parent->m_children.end(), child );
 		if ( it != parent->m_children.end() )
 		{
@@ -195,13 +212,40 @@
 	if ( e->m_parent )
 	{
-		pabsolute = ((element*)(e->m_parent))->m_absolute;
+		pabsolute = e->m_parent->m_absolute;
 	}
 
 	e->m_absolute = e->m_relative + pabsolute.ul;
 
-	for ( object* o : e->m_children )
-	{
-		recalculate_absolute( ((element*)o) );
-	}
-}
-
+	for ( element* o : e->m_children )
+	{
+		recalculate_absolute( o );
+	}
+}
+
+void nv::gui::environment::set_class( element* e, const string& text )
+{
+	e->m_class = text;
+	e->m_dirty = true;
+}
+
+void nv::gui::environment::set_text( element* e, const string& text )
+{
+	e->m_text = text;
+	e->m_dirty = true;
+}
+
+void nv::gui::environment::remove_child( element* parent, element* child )
+{
+	if ( child->m_parent != parent )
+	{
+		return; // signal error?
+	}
+	auto it = std::find( parent->m_children.begin(), parent->m_children.end(), child );
+	if ( it != parent->m_children.end() )
+	{
+		(*it)->m_parent = nullptr;
+		parent->m_children.erase(it);
+	}	
+
+}
+
Index: trunk/src/gui/gui_renderer.cc
===================================================================
--- trunk/src/gui/gui_renderer.cc	(revision 267)
+++ trunk/src/gui/gui_renderer.cc	(revision 268)
@@ -198,6 +198,6 @@
 
 	qvec.clear();
-	rectangle abs = e->get_absolute();
-	if ( e->get_absolute() != m_area )
+	rectangle abs = e->m_absolute;
+	if ( e->m_absolute != m_area )
 	{
 		int border;
@@ -220,5 +220,5 @@
 		}
 
-		text = e->get_text();
+		text = e->m_text;
 		if ( !text.empty() )
 		{
Index: trunk/src/gui/gui_style.cc
===================================================================
--- trunk/src/gui/gui_style.cc	(revision 267)
+++ trunk/src/gui/gui_style.cc	(revision 268)
@@ -67,6 +67,6 @@
 {
 	const char* centry = entry.c_str();
-	const char* cid    = e->get_id().c_str();
-	const char* cclass = e->get_class().c_str();
+	const char* cid    = e->m_id.c_str();
+	const char* cclass = e->m_class.c_str();
 	lua_getglobal( m_lua, "default" );
 	int global = lua_gettop( m_lua );
