Index: trunk/nv/lua/lua_area.hh
===================================================================
--- trunk/nv/lua/lua_area.hh	(revision 206)
+++ trunk/nv/lua/lua_area.hh	(revision 207)
@@ -10,18 +10,6 @@
 #include <nv/position.hh>
 #include <nv/lua/lua_glm.hh>
-#include <nv/lib/lua.hh>
+#include <nv/lua/lua_state.hh>
 #include <nv/lua/lua_values.hh>
-
-void nlua_register_area( lua_State* L );
-
-bool nlua_is_area( lua_State* L, int index );
-nv::rectangle nlua_to_area( lua_State* L, int index );
-nv::rectangle* nlua_to_parea( lua_State* L, int index );
-void nlua_push_area( lua_State* L, const nv::rectangle& v );
-
-inline bool nlua_is_coord( lua_State* L, int index ) { return nlua_is_vec<nv::ivec2>( L, index ); }
-inline nv::ivec2 nlua_to_coord( lua_State* L, int index ) { return nlua_to_vec<nv::ivec2>( L, index ); }
-inline nv::ivec2* nlua_to_pcoord( lua_State* L, int index ) { return nlua_to_pvec<nv::ivec2>( L, index ); }
-inline void nlua_push_coord( lua_State* L, const nv::ivec2& v ) { return nlua_push_vec<nv::ivec2>( L, v ); }
 
 namespace nv
@@ -29,10 +17,26 @@
 	namespace lua
 	{
+		void register_area( lua_State* L );
+
+		namespace detail
+		{
+			extern const char* AREA_METATABLE;
+			inline bool is_area( lua_State* L, int index ) { return is_userdata( L, index, AREA_METATABLE ); }
+			inline rectangle to_area( lua_State* L, int index ) { return *(rectangle*)check_userdata( L, index, AREA_METATABLE ); }
+			inline rectangle* to_parea( lua_State* L, int index ) { return (rectangle*)check_userdata( L, index, AREA_METATABLE ); }
+			inline void push_area( lua_State* L, const rectangle& v ) { push_userdata( L, v, AREA_METATABLE ); }
+
+			inline bool is_coord( lua_State* L, int index ) { return is_vec<ivec2>( L, index ); }
+			inline ivec2 to_coord( lua_State* L, int index ) { return to_vec<ivec2>( L, index ); }
+			inline ivec2* to_pcoord( lua_State* L, int index ) { return to_pvec<ivec2>( L, index ); }
+			inline void push_coord( lua_State* L, const ivec2& v ) { push_vec<ivec2>( L, v ); }
+
+		}
 
 		template<>
-		struct pass_traits< nv::rectangle >
+		struct pass_traits< rectangle >
 		{
-			static void push( lua_State *L, const nv::rectangle& p ) { nlua_push_area( L, p ); }
-			static void pop( lua_State *L, nv::rectangle& p ) { p = nlua_to_area( L, -1 ); lua_pop( L, 1 ); }
+			static void push( lua_State *L, const rectangle& p ) { detail::push_area( L, p ); }
+			static void pop( lua_State *L, rectangle& p ) { p = detail::to_area( L, -1 ); detail::pop_and_discard( L, 1 ); }
 		};
 	}
Index: trunk/nv/lua/lua_aux.hh
===================================================================
--- trunk/nv/lua/lua_aux.hh	(revision 206)
+++ trunk/nv/lua/lua_aux.hh	(revision 207)
@@ -7,7 +7,13 @@
 #define NV_LUA_AUX_HH
 
-#include <nv/lua/lua_raw.hh>
+#include <nv/lua/lua_state.hh>
 
-void nlua_register_aux( lua_State* L );
+namespace nv
+{
+	namespace lua
+	{
+		void register_aux( lua_State* L );
+	}
+}
 
 #endif // NV_LUA_AUX_HH
Index: trunk/nv/lua/lua_glm.hh
===================================================================
--- trunk/nv/lua/lua_glm.hh	(revision 206)
+++ trunk/nv/lua/lua_glm.hh	(revision 207)
@@ -10,42 +10,5 @@
 #include <nv/common.hh>
 #include <nv/math.hh>
-#include <nv/lib/lua.hh>
 #include <nv/lua/lua_values.hh>
-
-void nlua_register_glm( lua_State* L );
-
-template< typename T > inline const char* nlua_metatable_name() { static_assert(sizeof(T) == 0, "Type not implemented!"); return NULL; }
-
-template< typename T >
-bool nlua_is_vec( lua_State* L, int index )
-{
-	return luaL_testudata( L, index, nlua_metatable_name<T>() ) != 0;
-}
-
-template< typename T >
-T nlua_to_vec( lua_State* L, int index )
-{
-	return *(T*)luaL_checkudata( L, index, nlua_metatable_name<T>() );
-}
-
-template< typename T >
-T* nlua_to_pvec( lua_State* L, int index )
-{
-	return (T*)luaL_checkudata( L, index, nlua_metatable_name<T>() );
-}
-
-template< typename T >
-void nlua_push_vec( lua_State* L, const T& v )
-{
-	new (lua_newuserdata(L, sizeof(T))) T(v);
-	luaL_setmetatable( L, nlua_metatable_name<T>() );
-}
-
-template<> inline const char* nlua_metatable_name< nv::ivec2 >() { return "ivec2"; }
-template<> inline const char* nlua_metatable_name< nv::ivec3 >() { return "ivec3"; }
-template<> inline const char* nlua_metatable_name< nv::ivec4 >() { return "ivec4"; }
-template<> inline const char* nlua_metatable_name< nv::vec2  >() { return "vec2"; }
-template<> inline const char* nlua_metatable_name< nv::vec3  >() { return "vec3"; }
-template<> inline const char* nlua_metatable_name< nv::vec4  >() { return "vec4"; }
 
 namespace nv
@@ -53,4 +16,40 @@
 	namespace lua
 	{
+		void register_glm( lua_State* L );
+
+		namespace detail
+		{
+			template< typename T > inline const char* glm_metatable_name() { static_assert(sizeof(T) == 0, "Type not implemented!"); return NULL; }
+			template<> inline const char* glm_metatable_name< nv::ivec2 >() { return "ivec2"; }
+			template<> inline const char* glm_metatable_name< nv::ivec3 >() { return "ivec3"; }
+			template<> inline const char* glm_metatable_name< nv::ivec4 >() { return "ivec4"; }
+			template<> inline const char* glm_metatable_name< nv::vec2  >() { return "vec2"; }
+			template<> inline const char* glm_metatable_name< nv::vec3  >() { return "vec3"; }
+			template<> inline const char* glm_metatable_name< nv::vec4  >() { return "vec4"; }
+
+			template< typename T >
+			bool is_vec( lua_State* L, int index )
+			{
+				return is_userdata( L, index, detail::glm_metatable_name<T>() );
+			}
+
+			template< typename T >
+			T to_vec( lua_State* L, int index )
+			{
+				return *(T*)check_userdata( L, index, detail::glm_metatable_name<T>() );
+			}
+
+			template< typename T >
+			T* to_pvec( lua_State* L, int index )
+			{
+				return (T*)check_userdata( L, index, detail::glm_metatable_name<T>() );
+			}
+
+			template< typename T >
+			void push_vec( lua_State* L, const T& v )
+			{
+				push_userdata( L, v, detail::glm_metatable_name<T>() );
+			}
+		}
 
 		template< typename T >
@@ -58,6 +57,6 @@
 		{
 			typedef glm::detail::tvec2<T> value_type;
-			static void push( lua_State *L, const value_type& p ) { nlua_push_vec< value_type >( L, p ); }
-			static void pop( lua_State *L, value_type& p ) { p = nlua_to_vec< value_type >( L, -1 ); lua_pop( L, 1 ); }
+			static void push( lua_State *L, const value_type& p ) { detail::push_vec< value_type >( L, p ); }
+			static void pop( lua_State *L, value_type& p ) { p = detail::to_vec< value_type >( L, -1 ); detail::pop_and_discard( L, 1 ); }
 		};
 
@@ -66,6 +65,6 @@
 		{
 			typedef glm::detail::tvec3<T> value_type;
-			static void push( lua_State *L, const value_type& p ) { nlua_push_vec< value_type >( L, p ); }
-			static void pop( lua_State *L, value_type& p ) { p = nlua_to_vec< value_type >( L, -1 ); lua_pop( L, 1 ); }
+			static void push( lua_State *L, const value_type& p ) { detail::push_vec< value_type >( L, p ); }
+			static void pop( lua_State *L, value_type& p ) { p = detail::to_vec< value_type >( L, -1 ); detail::pop_and_discard( L, 1 ); }
 		};
 
@@ -74,6 +73,6 @@
 		{
 			typedef glm::detail::tvec4<T> value_type;
-			static void push( lua_State *L, const value_type& p ) { nlua_push_vec< value_type >( L, p ); }
-			static void pop( lua_State *L, value_type& p ) { p = nlua_to_vec< value_type >( L, -1 ); lua_pop( L, 1 ); }
+			static void push( lua_State *L, const value_type& p ) { detail::push_vec< value_type >( L, p ); }
+			static void pop( lua_State *L, value_type& p ) { p = detail::to_vec< value_type >( L, -1 ); detail::pop_and_discard( L, 1 ); }
 		};
 	}
Index: trunk/nv/lua/lua_map_area.hh
===================================================================
--- trunk/nv/lua/lua_map_area.hh	(revision 206)
+++ trunk/nv/lua/lua_map_area.hh	(revision 207)
@@ -14,12 +14,21 @@
 
 #include <nv/interface/map_area.hh>
-#include <nv/lib/lua.hh>
+#include <nv/lua/lua_state.hh>
 
-void nlua_register_map_area( lua_State* L );
-void nlua_register_map_area_interface( lua_State* L, int index );
-bool nlua_is_map_area( lua_State* L, int index );
-nv::map_area* nlua_to_map_area( lua_State* L, int index );
-void nlua_push_map_area( lua_State* L, nv::map_area* c );
+namespace nv
+{
+	namespace lua
+	{
+		void register_map_area( lua_State* L );
+		void register_map_area_interface( lua_State* L, int index );
 
+		namespace detail
+		{
+			bool is_map_area( lua_State* L, int index );
+			map_area* to_map_area( lua_State* L, int index );
+			void push_map_area( lua_State* L, map_area* c );
+		}
+	}
+}
 
 #endif // NV_LUA_MAP_AREA_HH
Index: trunk/nv/lua/lua_state.hh
===================================================================
--- trunk/nv/lua/lua_state.hh	(revision 206)
+++ trunk/nv/lua/lua_state.hh	(revision 207)
@@ -4,6 +4,4 @@
 // This file is part of NV Libraries.
 // For conditions of distribution and use, see copyright notice in nv.hh
-//
-// TODO: the call() templates are copied over in table/state - can we get around that?
 
 #ifndef NV_LUA_HH
Index: trunk/nv/lua/lua_values.hh
===================================================================
--- trunk/nv/lua/lua_values.hh	(revision 206)
+++ trunk/nv/lua/lua_values.hh	(revision 207)
@@ -116,4 +116,15 @@
 				const static int value = 0;
 			};
+
+
+			void pop_and_discard( lua_State *L, int count );
+			bool is_userdata( lua_State *L, int index, const char* metatable );
+			void* check_userdata( lua_State *L, int index, const char* metatable );
+			void* allocate_userdata( lua_State *L, size_t size, const char* metatable );
+			template <typename T>
+			void push_userdata( lua_State *L, const T& v, const char* metatable )
+			{
+				new (allocate_userdata(L, sizeof(T), metatable)) T(v);
+			}
 		}
 
Index: trunk/src/lua/lua_area.cc
===================================================================
--- trunk/src/lua/lua_area.cc	(revision 206)
+++ trunk/src/lua/lua_area.cc	(revision 207)
@@ -11,35 +11,24 @@
 #include "nv/random.hh"
 
-static const char* NLUA_AREA_METATABLE = "area";
-
-bool nlua_is_area( lua_State* L, int index )
-{
-	return luaL_testudata( L, index, NLUA_AREA_METATABLE ) != 0;
-}
-
-nv::rectangle nlua_to_area( lua_State* L, int index )
-{
-	return *(nv::rectangle*)luaL_checkudata( L, index, NLUA_AREA_METATABLE );
-}
-
-nv::rectangle* nlua_to_parea( lua_State* L, int index )
-{
-	return (nv::rectangle*)luaL_checkudata( L, index, NLUA_AREA_METATABLE );
-}
-
-void nlua_push_area( lua_State* L, const nv::rectangle& v )
-{
-	new (lua_newuserdata(L, sizeof(nv::rectangle))) nv::rectangle(v);
-	luaL_setmetatable( L, NLUA_AREA_METATABLE );
-}
+const char* nv::lua::detail::AREA_METATABLE = "area";
+
+using nv::lua::detail::is_coord;
+using nv::lua::detail::to_coord;
+using nv::lua::detail::to_pcoord;
+using nv::lua::detail::push_coord;
+
+using nv::lua::detail::is_area;
+using nv::lua::detail::to_area;
+using nv::lua::detail::to_parea;
+using nv::lua::detail::push_area;
 
 static void nlua_area_construct( lua_State* L, int sidx )
 {
-	if ( nlua_is_coord( L, sidx ) )
-	{
-		if ( nlua_is_coord( L, sidx+1 ) )
+	if ( is_coord( L, sidx ) )
+	{
+		if ( is_coord( L, sidx+1 ) )
 		{
-			nv::rectangle a( nlua_to_coord( L, sidx ), nlua_to_coord( L, sidx+1 ) );
-			nlua_push_area( L, a );
+			nv::rectangle a( to_coord( L, sidx ), to_coord( L, sidx+1 ) );
+			push_area( L, a );
 			return;
 		}
@@ -51,5 +40,5 @@
 		nv::ivec2( lua_tointeger( L, sidx+2 ), lua_tointeger( L, sidx+3 ) )
 		);
-	nlua_push_area( L, a );
+	push_area( L, a );
 }
 
@@ -69,5 +58,5 @@
 static int nlua_area_eq( lua_State* L )
 {
-	lua_pushboolean( L, nlua_to_area( L, 1 ) == nlua_to_area( L, 2 ) );
+	lua_pushboolean( L, to_area( L, 1 ) == to_area( L, 2 ) );
 	return 1;
 }
@@ -75,7 +64,7 @@
 static int nlua_area_get( lua_State* L )
 {
-	nv::rectangle r( nlua_to_area( L, 1 ) );
-	nlua_push_coord( L, r.ul );
-	nlua_push_coord( L, r.lr );
+	nv::rectangle r( to_area( L, 1 ) );
+	push_coord( L, r.ul );
+	push_coord( L, r.lr );
 	return 2;
 }
@@ -83,5 +72,5 @@
 static int nlua_area_clone( lua_State* L )
 {
-	nlua_push_area( L, *nlua_to_parea( L, 1 ) );
+	push_area( L, *to_parea( L, 1 ) );
 	return 1;
 }
@@ -89,14 +78,14 @@
 static int nlua_area_index( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
+	nv::rectangle* a = to_parea( L, 1 );
 	std::size_t l;
 	const char* index = lua_tolstring( L, 2, &l );
 	if ( l == 1 && index[0] == 'a' )
 	{
-		nlua_push_coord( L, a->ul );
+		push_coord( L, a->ul );
 	}
 	else if ( l == 1 && index[0] == 'b' )
 	{
-		nlua_push_coord( L, a->lr );
+		push_coord( L, a->lr );
 	}
 	else
@@ -111,8 +100,8 @@
 static int nlua_area_newindex( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
+	nv::rectangle* a = to_parea( L, 1 );
 	std::size_t l;
 	const char* index = lua_tolstring( L, 2, &l );
-	nv::ivec2 value( nlua_to_coord( L, 3 ) );
+	nv::ivec2 value( to_coord( L, 3 ) );
 	if ( l == 1 && index[0] == 'a' )
 	{
@@ -128,6 +117,6 @@
 static int lua_area_coords_closure( lua_State* L )
 {
-	nv::rectangle* a( nlua_to_parea( L, lua_upvalueindex(1) ) );
-	nv::ivec2*     c( nlua_to_pcoord( L, lua_upvalueindex(2) ) );
+	nv::rectangle* a( to_parea( L, lua_upvalueindex(1) ) );
+	nv::ivec2*     c( to_pcoord( L, lua_upvalueindex(2) ) );
 
 	c->x++;
@@ -144,5 +133,5 @@
 	}
 
-	nlua_push_coord( L, *c );
+	push_coord( L, *c );
 	return 1;
 }
@@ -150,8 +139,8 @@
 static int nlua_area_coords( lua_State* L )
 {
-	nv::rectangle* a( nlua_to_parea( L, 1 ) );
+	nv::rectangle* a( to_parea( L, 1 ) );
 	nv::ivec2      c( a->ul );
 	c.x--;
-	nlua_push_coord( L, c );
+	push_coord( L, c );
 	lua_pushcclosure( L, lua_area_coords_closure, 2 );
 	return 1;
@@ -160,6 +149,6 @@
 static int nlua_area_edges_closure( lua_State* L )
 {
-	nv::rectangle* a( nlua_to_parea( L, lua_upvalueindex(1) ) );
-	nv::ivec2*     c( nlua_to_pcoord( L, lua_upvalueindex(2) ) );
+	nv::rectangle* a( to_parea( L, lua_upvalueindex(1) ) );
+	nv::ivec2*     c( to_pcoord( L, lua_upvalueindex(2) ) );
 
 	c->x++;
@@ -178,5 +167,5 @@
 
 
-	nlua_push_coord( L, *c );
+	push_coord( L, *c );
 	return 1;
 }
@@ -184,8 +173,8 @@
 static int nlua_area_edges( lua_State* L )
 {
-	nv::rectangle*   a( nlua_to_parea( L, 1 ) );
+	nv::rectangle*   a( to_parea( L, 1 ) );
 	nv::ivec2 c( a->ul );
 	c.x--;
-	nlua_push_coord( L, c );
+	push_coord( L, c );
 	lua_pushcclosure( L, nlua_area_edges_closure, 2 );
 	return 1;
@@ -203,14 +192,14 @@
 static int nlua_area_corners( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
+	nv::rectangle* a = to_parea( L, 1 );
 
 	lua_createtable(L, 4, 0);
-	nlua_push_coord( L, a->ul );
+	push_coord( L, a->ul );
 	lua_rawseti( L, -2, 1 );
-	nlua_push_coord( L, a->ur() );
+	push_coord( L, a->ur() );
 	lua_rawseti( L, -2, 2 );
-	nlua_push_coord( L, a->ll() );
+	push_coord( L, a->ll() );
 	lua_rawseti( L, -2, 3 );
-	nlua_push_coord( L, a->lr );
+	push_coord( L, a->lr );
 	lua_rawseti( L, -2, 4 );
 
@@ -222,5 +211,5 @@
 static int nlua_area_shrink( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
+	nv::rectangle* a = to_parea( L, 1 );
 	a->shrink( static_cast< int >( lua_tointeger( L, 2 ) ) );
 	return 0;
@@ -229,6 +218,6 @@
 static int nlua_area_shrinked( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
-	nlua_push_area( L, a->shrinked( static_cast< int >( lua_tointeger( L, 2 ) ) ) );
+	nv::rectangle* a = to_parea( L, 1 );
+	push_area( L, a->shrinked( static_cast< int >( lua_tointeger( L, 2 ) ) ) );
 	return 1;
 }
@@ -236,5 +225,5 @@
 static int nlua_area_expand( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
+	nv::rectangle* a = to_parea( L, 1 );
 	a->expand( static_cast< int >( lua_tointeger( L, 2 ) ) );
 	return 0;
@@ -243,6 +232,6 @@
 static int nlua_area_expanded( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
-	nlua_push_area( L, a->expanded( static_cast< int >( lua_tointeger( L, 2 ) ) ) );
+	nv::rectangle* a = to_parea( L, 1 );
+	push_area( L, a->expanded( static_cast< int >( lua_tointeger( L, 2 ) ) ) );
 	return 1;
 }
@@ -250,6 +239,6 @@
 static int nlua_area_clamp( lua_State* L )
 {
-	nv::rectangle* a1 = nlua_to_parea( L, 1 );
-	nv::rectangle* a2 = nlua_to_parea( L, 2 );
+	nv::rectangle* a1 = to_parea( L, 1 );
+	nv::rectangle* a2 = to_parea( L, 2 );
 	a1->clamp_to( *a2 );
 	return 0;
@@ -258,8 +247,8 @@
 static int nlua_area_clamped( lua_State* L )
 {
-	nv::rectangle  a1 = nlua_to_area( L, 1 );
-	nv::rectangle* a2 = nlua_to_parea( L, 2 );
+	nv::rectangle  a1 = to_area( L, 1 );
+	nv::rectangle* a2 = to_parea( L, 2 );
 	a1.clamp_to( *a2 );
-	nlua_push_area( L, a1 );
+	push_area( L, a1 );
 	return 1;
 }
@@ -267,6 +256,6 @@
 static int nlua_area_clamp_coord( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
-	nv::ivec2*     c = nlua_to_pcoord( L, 2 );
+	nv::rectangle* a = to_parea( L, 1 );
+	nv::ivec2*     c = to_pcoord( L, 2 );
 	*c = glm::clamp( *c, a->ul, a->lr );
 	return 0;
@@ -275,7 +264,7 @@
 static int nlua_area_clamped_coord( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
-	nv::ivec2*     c = nlua_to_pcoord( L, 2 );
-	nlua_push_coord( L, glm::clamp( *c, a->ul, a->lr ) );
+	nv::rectangle* a = to_parea( L, 1 );
+	nv::ivec2*     c = to_pcoord( L, 2 );
+	push_coord( L, glm::clamp( *c, a->ul, a->lr ) );
 	return 0;
 }
@@ -283,5 +272,5 @@
 static int nlua_area_fix( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
+	nv::rectangle* a = to_parea( L, 1 );
 	if ( a->ul.x > a->lr.x ) a->ul.x = a->lr.x;
 	if ( a->ul.y > a->lr.y ) a->ul.y = a->lr.y;
@@ -291,5 +280,5 @@
 static int nlua_area_proper( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
+	nv::rectangle* a = to_parea( L, 1 );
 	lua_pushboolean( L, a->ul.x <= a->lr.x && a->ul.y <= a->lr.y );
 	return 1;
@@ -298,6 +287,6 @@
 static int nlua_area_dim( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
-	nlua_push_coord( L, a->ul - a->lr + nv::ivec2(1,1) );
+	nv::rectangle* a = to_parea( L, 1 );
+	push_coord( L, a->ul - a->lr + nv::ivec2(1,1) );
 	return 1;
 }
@@ -305,5 +294,5 @@
 static int nlua_area_size( lua_State* L )
 {
-	nv::rectangle* a = nlua_to_parea( L, 1 );
+	nv::rectangle* a = to_parea( L, 1 );
 	lua_pushinteger( L, a->get_enclosed_area() );
 	return 1;
@@ -312,5 +301,5 @@
 static int nlua_area_contains( lua_State* L )
 {
-	lua_pushboolean( L, nlua_to_parea( L, 1 )->contains( nlua_to_coord( L, 2 ) ) );
+	lua_pushboolean( L, to_parea( L, 1 )->contains( to_coord( L, 2 ) ) );
 	return 1;
 }
@@ -318,6 +307,6 @@
 static int nlua_area_is_edge( lua_State* L )
 {
-	nv::rectangle a = nlua_to_area( L, 1 );
-	nv::ivec2     c = nlua_to_coord( L, 2 );
+	nv::rectangle a = to_area( L, 1 );
+	nv::ivec2     c = to_coord( L, 2 );
 	lua_pushboolean( L, a.contains( c ) && ( c.x == a.ul.x || c.x == a.lr.x || c.y == a.ul.y || c.y == a.lr.y ) );
 	return 1;
@@ -326,8 +315,8 @@
 static int nlua_area_around( lua_State* L )
 {
-	nv::ivec2 c = nlua_to_coord( L, 1 );
+	nv::ivec2 c = to_coord( L, 1 );
 	int amount = static_cast< int >( lua_tointeger( L, 1 ) );
 	nv::ivec2 shift( amount, amount );
-	nlua_push_area( L, nv::rectangle( c - shift, c + shift ) );
+	push_area( L, nv::rectangle( c - shift, c + shift ) );
 	return 1;
 }
@@ -335,5 +324,5 @@
 static int nlua_area_tostring( lua_State* L )
 {
-	nv::rectangle a = nlua_to_area( L, 1 );
+	nv::rectangle a = to_area( L, 1 );
 	std::string s = "(";
 	s += nv::to_string(a.ul.x);
@@ -351,5 +340,5 @@
 static int nlua_area_random_edge_coord( lua_State* L )
 {
-	nv::rectangle area = nlua_to_area( L, 1 );
+	nv::rectangle area = to_area( L, 1 );
 	nv::ivec2 a   = area.ul;
 	nv::ivec2 b   = area.lr;
@@ -368,5 +357,5 @@
 		result = ( roll < ys ) ? nv::ivec2( a.x, a.y + roll + 1 ) : nv::ivec2( b.x, a.y + roll - ys + 1);
 	}
-	nlua_push_coord( L, result );
+	push_coord( L, result );
 	return 1;
 }
@@ -374,5 +363,5 @@
 static int nlua_area_random_inner_edge_coord( lua_State* L )
 {
-	nv::rectangle area = nlua_to_area( L, 1 );
+	nv::rectangle area = to_area( L, 1 );
 	nv::ivec2 a   = area.ul;
 	nv::ivec2 b   = area.lr;
@@ -391,5 +380,5 @@
 		result = ( roll < ys ) ? nv::ivec2( a.x, a.y + roll + 1 ) : nv::ivec2( b.x, a.y + roll - ys + 1);
 	}
-	nlua_push_coord( L, result );
+	push_coord( L, result );
 	return 1;
 }
@@ -397,6 +386,6 @@
 static int nlua_area_random_coord( lua_State* L )
 {
-	nv::rectangle area = nlua_to_area( L, 1 );
-	nlua_push_coord( L, nv::random::get().range( area.ul, area.lr ) );
+	nv::rectangle area = to_area( L, 1 );
+	push_coord( L, nv::random::get().range( area.ul, area.lr ) );
 	return 1;
 }
@@ -404,8 +393,8 @@
 static int nlua_area_random_subarea( lua_State* L )
 {
-	nv::rectangle area  = nlua_to_area( L, 1 );
-	nv::ivec2     dim   = nlua_to_coord( L, 2 );
+	nv::rectangle area  = to_area( L, 1 );
+	nv::ivec2     dim   = to_coord( L, 2 );
 	nv::ivec2     start = nv::random::get().range( area.ul, area.lr - dim );
-	nlua_push_area( L, nv::rectangle( start, start + dim ) );
+	push_area( L, nv::rectangle( start, start + dim ) );
 	return 1;
 }
@@ -466,5 +455,5 @@
 	};
 
-	luaL_newmetatable( L, NLUA_AREA_METATABLE );
+	luaL_newmetatable( L, nv::lua::detail::AREA_METATABLE );
 	nlua_register( L, nlua_area_m, -1 );
 	lua_createtable( L, 0, 0 );
@@ -481,5 +470,5 @@
 }
 
-void nlua_register_area( lua_State* L )
+void nv::lua::register_area( lua_State* L )
 {
 	int stack = lua_gettop( L );
Index: trunk/src/lua/lua_aux.cc
===================================================================
--- trunk/src/lua/lua_aux.cc	(revision 206)
+++ trunk/src/lua/lua_aux.cc	(revision 207)
@@ -138,5 +138,5 @@
 };
 
-void nlua_register_aux( lua_State* L )
+void nv::lua::register_aux( lua_State* L )
 {
 	nlua_register( L, "table", nluaaux_table_aux_f );
Index: trunk/src/lua/lua_glm.cc
===================================================================
--- trunk/src/lua/lua_glm.cc	(revision 206)
+++ trunk/src/lua/lua_glm.cc	(revision 207)
@@ -13,4 +13,9 @@
 static size_t nlua_swizzel_lookup[256];
 
+using nv::lua::detail::is_vec;
+using nv::lua::detail::to_vec;
+using nv::lua::detail::to_pvec;
+using nv::lua::detail::push_vec;
+
 inline bool nlua_is_swizzel( const unsigned char* str, size_t max )
 {
@@ -42,5 +47,5 @@
 	static inline T construct( lua_State* L, int index ) {
 		if ( lua_type( L, index ) == LUA_TUSERDATA )
-			return nlua_to_vec<T>( L, index );
+			return to_vec<T>( L, index );
 		else
 			return T( lua_tonumber( L, index ), lua_tonumber( L, index + 1 ) );
@@ -54,13 +59,13 @@
 		if ( lua_type( L, index ) == LUA_TUSERDATA )
 		{
-			if ( nlua_is_vec<T>( L, index ) )
-				return nlua_to_vec<T>( L, index );
+			if ( is_vec<T>( L, index ) )
+				return to_vec<T>( L, index );
 			else
-				return T( nlua_to_vec<vec2>( L, index ), lua_tonumber( L, index + 1 ) );
+				return T( to_vec<vec2>( L, index ), lua_tonumber( L, index + 1 ) );
 		}
 		else
 		{
 			if ( lua_type( L, index+1 ) == LUA_TUSERDATA )
-				return T( lua_tonumber( L, index ), nlua_to_vec<vec2>( L, index+1 ) );
+				return T( lua_tonumber( L, index ), to_vec<vec2>( L, index+1 ) );
 			else
 				return T( lua_tonumber( L, index ), lua_tonumber( L, index + 1 ), lua_tonumber( L, index + 2 ) );
@@ -76,16 +81,16 @@
 		if ( lua_type( L, index ) == LUA_TUSERDATA )
 		{
-			if ( nlua_is_vec<T>( L, index ) )
-				return nlua_to_vec<T>( L, index );
+			if ( is_vec<T>( L, index ) )
+				return to_vec<T>( L, index );
 			else
 			{
-				if ( nlua_is_vec<vec3>( L, index ) )
-					return T( nlua_to_vec<vec3>( L, index ), lua_tonumber( L, index + 1 ) );
+				if ( is_vec<vec3>( L, index ) )
+					return T( to_vec<vec3>( L, index ), lua_tonumber( L, index + 1 ) );
 				else
 				{
 					if ( lua_type( L, index+1 ) == LUA_TUSERDATA )
-						return T( nlua_to_vec<vec2>( L, index ), nlua_to_vec<vec2>( L, index + 1 ) );
+						return T( to_vec<vec2>( L, index ), to_vec<vec2>( L, index + 1 ) );
 					else
-						return T( nlua_to_vec<vec2>( L, index ), lua_tonumber( L, index + 1 ), lua_tonumber( L, index + 2 ) );
+						return T( to_vec<vec2>( L, index ), lua_tonumber( L, index + 1 ), lua_tonumber( L, index + 2 ) );
 				}
 			}
@@ -95,13 +100,13 @@
 			if ( lua_type( L, index+1 ) == LUA_TUSERDATA )
 			{
-				if ( nlua_is_vec<vec3>( L, index+1 ) )
-					return T( lua_tonumber( L, index ), nlua_to_vec<vec3>( L, index+1 ) );
+				if ( is_vec<vec3>( L, index+1 ) )
+					return T( lua_tonumber( L, index ), to_vec<vec3>( L, index+1 ) );
 				else
-					return T( lua_tonumber( L, index ), nlua_to_vec<vec2>( L, index+1 ), lua_tonumber( L, index + 2 ) );
+					return T( lua_tonumber( L, index ), to_vec<vec2>( L, index+1 ), lua_tonumber( L, index + 2 ) );
 			}
 			else
 			{
 				if ( lua_type( L, index+2 ) == LUA_TUSERDATA )
-					return T( lua_tonumber( L, index ), lua_tonumber( L, index + 1 ), nlua_to_vec<vec2>( L, index+2 ) );
+					return T( lua_tonumber( L, index ), lua_tonumber( L, index + 1 ), to_vec<vec2>( L, index+2 ) );
 				else
 					return T( lua_tonumber( L, index ), lua_tonumber( L, index + 1 ), lua_tonumber( L, index + 2 ), lua_tonumber( L, index + 3 ) );
@@ -114,5 +119,5 @@
 int nlua_vec_new( lua_State* L )
 {
-	nlua_push_vec<T>( L, nlua_vec_constructor<T,sizeof( T ) / sizeof( typename T::value_type )>::construct( L, 1 ) );
+	push_vec<T>( L, nlua_vec_constructor<T,sizeof( T ) / sizeof( typename T::value_type )>::construct( L, 1 ) );
 	return 1;
 }
@@ -121,5 +126,5 @@
 int nlua_vec_random( lua_State* L )
 {
-	nlua_push_vec<T>( L, nv::random::get().range( nlua_to_vec<T>( L, 1 ), nlua_to_vec<T>( L, 2 ) ) );
+	push_vec<T>( L, nv::random::get().range( to_vec<T>( L, 1 ), to_vec<T>( L, 2 ) ) );
 	return 1;
 }
@@ -128,5 +133,5 @@
 int nlua_vec_clone( lua_State* L )
 {
-	nlua_push_vec<T>( L, nlua_to_vec<T>( L, 1 ) );
+	push_vec<T>( L, to_vec<T>( L, 1 ) );
 	return 1;
 }
@@ -135,5 +140,5 @@
 int nlua_vec_call( lua_State* L )
 {
-	nlua_push_vec<T>( L, nlua_vec_constructor<T,sizeof( T ) / sizeof( typename T::value_type )>::construct( L, 2 ) );
+	push_vec<T>( L, nlua_vec_constructor<T,sizeof( T ) / sizeof( typename T::value_type )>::construct( L, 2 ) );
 	return 1;
 }
@@ -142,5 +147,5 @@
 static int nlua_vec_unm( lua_State* L )
 {
-	nlua_push_vec<T>( L, -nlua_to_vec<T>( L, 1 ) );
+	push_vec<T>( L, -to_vec<T>( L, 1 ) );
 	return 1;
 }
@@ -150,10 +155,10 @@
 {
 	if ( lua_type( L, 1 ) == LUA_TNUMBER )
-		nlua_push_vec<T>( L, (typename T::value_type)(lua_tonumber( L, 1 )) + nlua_to_vec<T>( L, 2 ) );
+		push_vec<T>( L, (typename T::value_type)(lua_tonumber( L, 1 )) + to_vec<T>( L, 2 ) );
 	else
 		if ( lua_type( L, 2 ) == LUA_TNUMBER )
-			nlua_push_vec<T>( L, nlua_to_vec<T>( L, 1 ) + (typename T::value_type)(lua_tonumber( L, 2 )) );
-		else
-			nlua_push_vec<T>( L, nlua_to_vec<T>( L, 1 ) + nlua_to_vec<T>( L, 2 ) );
+			push_vec<T>( L, to_vec<T>( L, 1 ) + (typename T::value_type)(lua_tonumber( L, 2 )) );
+		else
+			push_vec<T>( L, to_vec<T>( L, 1 ) + to_vec<T>( L, 2 ) );
 	return 1;
 }
@@ -163,10 +168,10 @@
 {
 	if ( lua_type( L, 1 ) == LUA_TNUMBER )
-		nlua_push_vec<T>( L, (typename T::value_type)(lua_tonumber( L, 1 )) - nlua_to_vec<T>( L, 2 ) );
+		push_vec<T>( L, (typename T::value_type)(lua_tonumber( L, 1 )) - to_vec<T>( L, 2 ) );
 	else
 		if ( lua_type( L, 2 ) == LUA_TNUMBER )
-			nlua_push_vec<T>( L, nlua_to_vec<T>( L, 1 ) - (typename T::value_type)(lua_tonumber( L, 2 )) );
-		else
-			nlua_push_vec<T>( L, nlua_to_vec<T>( L, 1 ) - nlua_to_vec<T>( L, 2 ) );
+			push_vec<T>( L, to_vec<T>( L, 1 ) - (typename T::value_type)(lua_tonumber( L, 2 )) );
+		else
+			push_vec<T>( L, to_vec<T>( L, 1 ) - to_vec<T>( L, 2 ) );
 	return 1;
 }
@@ -176,10 +181,10 @@
 {
 	if ( lua_type( L, 1 ) == LUA_TNUMBER )
-		nlua_push_vec<T>( L, (typename T::value_type)(lua_tonumber( L, 1 )) * nlua_to_vec<T>( L, 2 ) );
+		push_vec<T>( L, (typename T::value_type)(lua_tonumber( L, 1 )) * to_vec<T>( L, 2 ) );
 	else
 		if ( lua_type( L, 2 ) == LUA_TNUMBER )
-			nlua_push_vec<T>( L, nlua_to_vec<T>( L, 1 ) * (typename T::value_type)(lua_tonumber( L, 2 )) );
-		else
-			nlua_push_vec<T>( L, nlua_to_vec<T>( L, 1 ) * nlua_to_vec<T>( L, 2 ) );
+			push_vec<T>( L, to_vec<T>( L, 1 ) * (typename T::value_type)(lua_tonumber( L, 2 )) );
+		else
+			push_vec<T>( L, to_vec<T>( L, 1 ) * to_vec<T>( L, 2 ) );
 	return 1;
 }
@@ -189,10 +194,10 @@
 {
 	if ( lua_type( L, 1 ) == LUA_TNUMBER )
-		nlua_push_vec<T>( L, (typename T::value_type)(lua_tonumber( L, 1 )) / nlua_to_vec<T>( L, 2 ) );
+		push_vec<T>( L, (typename T::value_type)(lua_tonumber( L, 1 )) / to_vec<T>( L, 2 ) );
 	else
 		if ( lua_type( L, 2 ) == LUA_TNUMBER )
-			nlua_push_vec<T>( L, nlua_to_vec<T>( L, 1 ) / (typename T::value_type)(lua_tonumber( L, 2 )) );
-		else
-			nlua_push_vec<T>( L, nlua_to_vec<T>( L, 1 ) / nlua_to_vec<T>( L, 2 ) );
+			push_vec<T>( L, to_vec<T>( L, 1 ) / (typename T::value_type)(lua_tonumber( L, 2 )) );
+		else
+			push_vec<T>( L, to_vec<T>( L, 1 ) / to_vec<T>( L, 2 ) );
 	return 1;
 }
@@ -201,5 +206,5 @@
 int nlua_vec_eq( lua_State* L )
 {
-	lua_pushboolean( L, nlua_to_vec<T>( L, 1 ) == nlua_to_vec<T>( L, 2 ) );
+	lua_pushboolean( L, to_vec<T>( L, 1 ) == to_vec<T>( L, 2 ) );
 	return 1;
 }
@@ -208,5 +213,5 @@
 int nlua_vec_get( lua_State* L )
 {
-	T v = nlua_to_vec<T>( L, 1 );
+	T v = to_vec<T>( L, 1 );
 	for ( size_t i = 0; i < v.length(); ++i )
 	{
@@ -219,5 +224,5 @@
 int nlua_vec_index( lua_State* L )
 {
-	T* v = nlua_to_pvec<T>( L, 1 );
+	T* v = to_pvec<T>( L, 1 );
 	size_t len  = 0;
 	size_t vlen = v->length();
@@ -237,7 +242,7 @@
 	{
 		switch (len) {
-		case 2 : nlua_push_vec( L, glm::detail::tvec2<typename T::value_type>( (*v)[nlua_swizzel_lookup[key[0]]], (*v)[nlua_swizzel_lookup[key[1]]] ) ); return 1;
-		case 3 : nlua_push_vec( L, glm::detail::tvec3<typename T::value_type>( (*v)[nlua_swizzel_lookup[key[0]]], (*v)[nlua_swizzel_lookup[key[1]]], (*v)[nlua_swizzel_lookup[key[2]]] ) ); return 1;
-		case 4 : nlua_push_vec( L, glm::detail::tvec4<typename T::value_type>( (*v)[nlua_swizzel_lookup[key[0]]], (*v)[nlua_swizzel_lookup[key[1]]], (*v)[nlua_swizzel_lookup[key[2]]], (*v)[nlua_swizzel_lookup[key[3]]] ) ); return 1;
+		case 2 : push_vec( L, glm::detail::tvec2<typename T::value_type>( (*v)[nlua_swizzel_lookup[key[0]]], (*v)[nlua_swizzel_lookup[key[1]]] ) ); return 1;
+		case 3 : push_vec( L, glm::detail::tvec3<typename T::value_type>( (*v)[nlua_swizzel_lookup[key[0]]], (*v)[nlua_swizzel_lookup[key[1]]], (*v)[nlua_swizzel_lookup[key[2]]] ) ); return 1;
+		case 4 : push_vec( L, glm::detail::tvec4<typename T::value_type>( (*v)[nlua_swizzel_lookup[key[0]]], (*v)[nlua_swizzel_lookup[key[1]]], (*v)[nlua_swizzel_lookup[key[2]]], (*v)[nlua_swizzel_lookup[key[3]]] ) ); return 1;
 		default: break;
 		}
@@ -257,5 +262,5 @@
 	typedef glm::detail::tvec4<typename T::value_type> vec4;
 
-	T* v = nlua_to_pvec<T>( L, 1 );
+	T* v = to_pvec<T>( L, 1 );
 	size_t len  = 0;
 	size_t vlen = v->length();
@@ -274,7 +279,7 @@
 	{
  		switch (len) {
-		case 2 : { vec2 v2 = nlua_to_vec<vec2>(L,3); for (size_t i = 0; i<len; ++i) (*v)[nlua_swizzel_lookup[key[i]]] = v2[i]; } return 0;
-		case 3 : { vec3 v3 = nlua_to_vec<vec3>(L,3); for (size_t i = 0; i<len; ++i) (*v)[nlua_swizzel_lookup[key[i]]] = v3[i]; } return 0;
-		case 4 : { vec4 v4 = nlua_to_vec<vec4>(L,3); for (size_t i = 0; i<len; ++i) (*v)[nlua_swizzel_lookup[key[i]]] = v4[i]; } return 0;
+		case 2 : { vec2 v2 = to_vec<vec2>(L,3); for (size_t i = 0; i<len; ++i) (*v)[nlua_swizzel_lookup[key[i]]] = v2[i]; } return 0;
+		case 3 : { vec3 v3 = to_vec<vec3>(L,3); for (size_t i = 0; i<len; ++i) (*v)[nlua_swizzel_lookup[key[i]]] = v3[i]; } return 0;
+		case 4 : { vec4 v4 = to_vec<vec4>(L,3); for (size_t i = 0; i<len; ++i) (*v)[nlua_swizzel_lookup[key[i]]] = v4[i]; } return 0;
  		default: break;
 		}
@@ -286,5 +291,5 @@
 static int nlua_vec_tostring( lua_State* L )
 {
-	T v = nlua_to_vec<T>( L, 1 );
+	T v = to_vec<T>( L, 1 );
 	std::string s = "(";
 	for ( size_t i = 0; i < v.length(); ++i )
@@ -332,5 +337,5 @@
 	};
 
-	luaL_newmetatable( L, nlua_metatable_name<T>() );
+	luaL_newmetatable( L, nv::lua::detail::glm_metatable_name<T>() );
 	nlua_register( L, nlua_vec_m, -1 );
 	lua_createtable( L, 0, 0 );
@@ -345,12 +350,12 @@
 	lua_setmetatable( L, -2 );
 
-	nlua_push_vec( L, T() );
+	nv::lua::detail::push_vec( L, T() );
 	lua_setfield( L, -2, "ZERO" );
-	nlua_push_vec( L, nlua_vec_constructor<T,sizeof( T ) / sizeof( typename T::value_type )>::unit() );
+	nv::lua::detail::push_vec( L, nlua_vec_constructor<T,sizeof( T ) / sizeof( typename T::value_type )>::unit() );
 	lua_setfield( L, -2, "UNIT" );
 	return 1;
 }
 
-void nlua_register_glm( lua_State* L )
+void nv::lua::register_glm( lua_State* L )
 { 
 	for (size_t i = 0; i < 256; ++i ) nlua_swizzel_lookup[i] = 255;
Index: trunk/src/lua/lua_map_area.cc
===================================================================
--- trunk/src/lua/lua_map_area.cc	(revision 206)
+++ trunk/src/lua/lua_map_area.cc	(revision 207)
@@ -47,10 +47,10 @@
 // }
 
-bool nlua_is_map_area( lua_State* L, int index )
+bool nv::lua::detail::is_map_area( lua_State* L, int index )
 {
 	return luaL_testudata( L, index, NLUA_MAP_AREA_METATABLE ) != 0;
 }
 
-nv::map_area* nlua_to_map_area( lua_State* L, int index )
+nv::map_area* nv::lua::detail::to_map_area( lua_State* L, int index )
 {
 	if ( lua_type( L, index ) == LUA_TTABLE )
@@ -75,5 +75,19 @@
 }
 
-void nlua_push_map_area( lua_State* L, nv::map_area* c )
+using nv::lua::detail::is_map_area;
+using nv::lua::detail::to_map_area;
+using nv::lua::detail::push_map_area;
+
+using nv::lua::detail::is_coord;
+using nv::lua::detail::to_coord;
+using nv::lua::detail::to_pcoord;
+using nv::lua::detail::push_coord;
+
+using nv::lua::detail::is_area;
+using nv::lua::detail::to_area;
+using nv::lua::detail::to_parea;
+using nv::lua::detail::push_area;
+
+void nv::lua::detail::push_map_area( lua_State* L, nv::map_area* c )
 {
 	nv::map_area** pm = (nv::map_area**) (lua_newuserdata(L, sizeof(nv::map_area*)));
@@ -91,5 +105,5 @@
 static int nlua_map_area_gc( lua_State* L )
 {
-	nv::map_area* ma = nlua_to_map_area( L, 1 );
+	nv::map_area* ma = to_map_area( L, 1 );
 	if ( ma != nullptr )
 	{
@@ -101,9 +115,9 @@
 static int nlua_map_area_get_area( lua_State* L )
 {
-	nv::map_area* ma = nlua_to_map_area( L, 1 );
+	nv::map_area* ma = to_map_area( L, 1 );
 	nv::rectangle r  = ma->get_rectangle();
 	r.lr.x -= 1;
 	r.lr.y -= 1;
-	nlua_push_area( L, r );
+	push_area( L, r );
 	return 1;
 }
@@ -111,6 +125,6 @@
 static int nlua_map_area_get_shift( lua_State* L )
 {
-	nv::map_area* ma = nlua_to_map_area( L, 1 );
-	nlua_push_coord( L, ma->get_shift() );
+	nv::map_area* ma = to_map_area( L, 1 );
+	push_coord( L, ma->get_shift() );
 	return 1;
 }
@@ -118,6 +132,6 @@
 static int nlua_map_area_get_size( lua_State* L )
 {
-	nv::map_area* ma = nlua_to_map_area( L, 1 );
-	nlua_push_coord( L, ma->get_size() );
+	nv::map_area* ma = to_map_area( L, 1 );
+	push_coord( L, ma->get_size() );
 	return 1;
 }
@@ -125,6 +139,6 @@
 static int nlua_map_area_get_cell( lua_State* L )
 {
-	nv::map_area* ma = nlua_to_map_area( L, 1 );
-	lua_pushstring( L, ma->id_to_string( ma->get_cell( nlua_to_coord( L, 2 ) ) ).c_str() );
+	nv::map_area* ma = to_map_area( L, 1 );
+	lua_pushstring( L, ma->id_to_string( ma->get_cell( to_coord( L, 2 ) ) ).c_str() );
 	return 1;
 }
@@ -132,6 +146,6 @@
 static int nlua_map_area_set_cell( lua_State* L )
 {
-	nv::map_area* ma = nlua_to_map_area( L, 1 );
-	ma->set_cell( nlua_to_coord( L, 2 ), nlua_to_cell_id( L, 3, ma ) );
+	nv::map_area* ma = to_map_area( L, 1 );
+	ma->set_cell( to_coord( L, 2 ), nlua_to_cell_id( L, 3, ma ) );
 	return 0;
 }
@@ -139,6 +153,6 @@
 static int nlua_map_area_raw_get_cell( lua_State* L )
 {
-	nv::map_area* ma = nlua_to_map_area( L, 1 );
-	lua_pushunsigned( L, ma->get_cell( nlua_to_coord( L, 2 ) ) );
+	nv::map_area* ma = to_map_area( L, 1 );
+	lua_pushunsigned( L, ma->get_cell( to_coord( L, 2 ) ) );
 	return 1;
 }
@@ -146,6 +160,6 @@
 static int nlua_map_area_raw_set_cell( lua_State* L )
 {
-	nv::map_area* ma = nlua_to_map_area( L, 1 );
-	ma->set_cell( nlua_to_coord( L, 2 ), lua_tounsigned( L, 3 ) );
+	nv::map_area* ma = to_map_area( L, 1 );
+	ma->set_cell( to_coord( L, 2 ), lua_tounsigned( L, 3 ) );
 	return 0;
 }
@@ -153,5 +167,5 @@
 static int nlua_map_area_index( lua_State* L )
 {
-	nv::map_area* ma = nlua_to_map_area( L, 1 );
+	nv::map_area* ma = to_map_area( L, 1 );
 	if ( lua_type( L, 1 ) == LUA_TSTRING )
 	{
@@ -162,5 +176,5 @@
 	else
 	{
-		lua_pushunsigned( L, ma->get_cell( nlua_to_coord( L, 2 ) ) );
+		lua_pushunsigned( L, ma->get_cell( to_coord( L, 2 ) ) );
 	}
 	return 1;
@@ -169,6 +183,6 @@
 static int nlua_map_area_newindex( lua_State* L )
 {
-	nv::map_area* ma = nlua_to_map_area( L, 1 );
-	ma->set_cell( nlua_to_coord( L, 2 ), lua_tounsigned( L, 3 ) );
+	nv::map_area* ma = to_map_area( L, 1 );
+	ma->set_cell( to_coord( L, 2 ), lua_tounsigned( L, 3 ) );
 	return 0;
 }
@@ -176,6 +190,6 @@
 static int nlua_map_area_new_sub_area( lua_State* L )
 {
-	nv::map_area* ma = nlua_to_map_area( L, 1 );
-	nlua_push_map_area( L, ma->create_sub_area( nlua_to_area( L, 2 ) ) );
+	nv::map_area* ma = to_map_area( L, 1 );
+	push_map_area( L, ma->create_sub_area( to_area( L, 2 ) ) );
 	return 1;
 }
@@ -212,10 +226,10 @@
 }
 
-void nlua_register_map_area_interface( lua_State* L, int index )
+void nv::lua::register_map_area_interface( lua_State* L, int index )
 {
 	nlua_register( L, nlua_map_area_f, index );
 }
 
-void nlua_register_map_area( lua_State* L )
+void nv::lua::register_map_area( lua_State* L )
 {
 	luaopen_map_area(L);
Index: trunk/src/lua/lua_state.cc
===================================================================
--- trunk/src/lua/lua_state.cc	(revision 206)
+++ trunk/src/lua/lua_state.cc	(revision 207)
@@ -142,60 +142,4 @@
 }
 
-bool lua::state::push( const std::string& path, bool global )
-{
-	size_t point = path.find('.');
-
-	if (point == std::string::npos)
-	{
-		if (global)
-		{
-			lua_getglobal( m_state, path.c_str() );
-		}
-		else
-		{
-			lua_getfield( m_state, -1, path.c_str() );
-		}
-		return !lua_isnil( m_state, -1 );
-	}
-
-	size_t idx = 0;
-	size_t start = 0;
-
-	while( point != std::string::npos )
-	{
-		if (idx == 0)
-		{
-			if (global)
-			{
-				lua_getglobal( m_state, path.substr(start,point-start).c_str() );
-			}
-			else
-			{
-				lua_getfield( m_state, -1, path.substr(start,point-start).c_str() );
-			}
-		}
-		else
-		{
-			if ( lua_istable( m_state, -1 ) )
-			{
-				lua_pushstring( m_state, path.substr(start,point-start).c_str() );
-				lua_gettable( m_state, -2 );
-				lua_insert( m_state, -2 );
-				lua_pop( m_state, 1 );
-			}
-			else
-			{
-				lua_pop(m_state, 1);
-				lua_pushnil(m_state);
-				return false;
-			}
-		}
-		start = point+1;
-		point = path.find( '.', start );
-	}
-	return true;
-}
-
-
 int lua::state::get_stack_size()
 {
Index: trunk/src/lua/lua_values.cc
===================================================================
--- trunk/src/lua/lua_values.cc	(revision 206)
+++ trunk/src/lua/lua_values.cc	(revision 207)
@@ -104,2 +104,24 @@
 }
 
+bool nv::lua::detail::is_userdata( lua_State *L, int index, const char* metatable )
+{
+	return luaL_testudata( L, index, metatable ) != 0;
+}
+
+void* nv::lua::detail::check_userdata( lua_State *L, int index, const char* metatable )
+{
+	return luaL_checkudata( L, index, metatable );
+}
+
+void* nv::lua::detail::allocate_userdata( lua_State *L, size_t size, const char* metatable )
+{
+	void* result = lua_newuserdata(L, size);
+	luaL_setmetatable( L, metatable );
+	return result;
+}
+
+void nv::lua::detail::pop_and_discard( lua_State *L, int count )
+{
+	lua_pop( L, count );
+}
+
