Index: trunk/src/gui/gui_element.cc
===================================================================
--- trunk/src/gui/gui_element.cc	(revision 66)
+++ trunk/src/gui/gui_element.cc	(revision 66)
@@ -0,0 +1,89 @@
+// Copyright (C) 2012-2013 ChaosForge / Kornel Kisielewicz
+// http://chaosforge.org/
+//
+// This file is part of NV Libraries.
+// For conditions of distribution and use, see copyright notice in nv.hh
+
+#include "nv/gui/gui_element.hh"
+
+using namespace nv;
+using namespace nv::gui;
+
+element::element( root* aroot, const rectangle r ) 
+	: object( aroot, "", 0 ), m_relative( r ), m_absolute( r ), m_enabled( true ), m_visible( true )
+{
+
+}
+
+void element::on_update( uint32 elapsed )
+{
+	if ( is_visible() )
+	{
+		for ( object* i : *this )
+		{
+			((element*)i)->on_update( elapsed );
+		}
+	}
+}
+
+void element::on_draw()
+{
+	if ( is_visible() )
+	{
+		for ( object* i : *this )
+		{
+			((element*)i)->on_draw();
+		}
+	}
+}
+
+element* element::get_element( const position& p )
+{
+	if ( !is_visible() ) return nullptr;
+
+	element* result = nullptr;
+	list::reverse_iterator it = m_children.rbegin();
+
+	while ( it != m_children.rend() )
+	{
+		result = ((element*)(*it))->get_element( p );
+		if ( result ) return result;
+		++it;
+	}
+
+	if ( contains( p ) ) return this;
+	return nullptr;
+}
+
+bool element::contains( const position& p ) const
+{
+	return m_absolute.contains( p );
+}
+
+void element::set_relative( const rectangle& r )
+{
+	m_relative = r;
+	recalculate_absolute();
+}
+
+void element::set_relative( const position& p )
+{
+	set_relative( rectangle( p, p + m_relative.get_size() ) );
+}
+
+void element::recalculate_absolute()
+{
+	rectangle pabsolute;
+
+	if ( m_parent )
+	{
+		pabsolute = ((element*)(m_parent))->m_absolute;
+	}
+
+	m_absolute = m_relative + pabsolute.upper_left;
+
+	for ( object* o : *this )
+	{
+		((element*)o)->recalculate_absolute();
+	}
+}
Index: trunk/src/object.cc
===================================================================
--- trunk/src/object.cc	(revision 64)
+++ trunk/src/object.cc	(revision 66)
@@ -138,4 +138,28 @@
 }
 
+bool object::move_to_top( object* child )
+{
+	list::iterator it = std::find( m_children.begin(), m_children.end(), child );
+	if ( it != m_children.end() )
+	{
+		m_children.erase( it );
+		m_children.push_back( child );
+		return true;
+	}	
+	return false;
+}
+
+bool object::move_to_bottom( object* child )
+{
+	list::iterator it = std::find( m_children.begin(), m_children.end(), child );
+	if ( it != m_children.end() )
+	{
+		m_children.erase( it );
+		m_children.push_front( child );
+		return true;
+	}	
+	return false;
+}
+
 void object::register_type( type_database* db )
 {
