diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 560b4c5..1b9f4d7 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,7 +1,4 @@
-include_directories(
-	${CMAKE_CURRENT_SOURCE_DIR}/deps/lua-5.3.4/src
-	${CMAKE_CURRENT_SOURCE_DIR}/deps/sol
-	)
+
 
 add_subdirectory(deps)
 add_subdirectory(core)
diff --git a/src/core/include/pw/core/axisangle.hpp b/src/core/include/pw/core/axisangle.hpp
index 0330ec7..9fbf8c3 100644
--- a/src/core/include/pw/core/axisangle.hpp
+++ b/src/core/include/pw/core/axisangle.hpp
@@ -28,6 +28,8 @@ public:
 
 };
 
+typedef axisangle<double> axisangled;
+
 }
 
 
diff --git a/src/core/include/pw/core/globals.hpp b/src/core/include/pw/core/globals.hpp
index d603c79..15d8e1c 100644
--- a/src/core/include/pw/core/globals.hpp
+++ b/src/core/include/pw/core/globals.hpp
@@ -2,4 +2,9 @@
 #define PW_CORE_GLOBALS_HPP
 
 
+#include <cstddef>
+
+#include <memory>
+
+
 #endif
diff --git a/src/core/include/pw/core/image.hpp b/src/core/include/pw/core/image.hpp
index f71c3ee..0dba463 100644
--- a/src/core/include/pw/core/image.hpp
+++ b/src/core/include/pw/core/image.hpp
@@ -2,9 +2,13 @@
 #define PW_CORE_IMAGE_HPP
 
 #include <pw/core/globals.hpp>
+#include <pw/core/referenced.hpp>
 
 namespace pw {
 
+class image : public referenced<image> {
+
+};
 
 }
 
diff --git a/src/core/include/pw/core/quaternion.hpp b/src/core/include/pw/core/quaternion.hpp
index 0763ea6..15f9c2b 100644
--- a/src/core/include/pw/core/quaternion.hpp
+++ b/src/core/include/pw/core/quaternion.hpp
@@ -58,6 +58,13 @@ public:
         _q.set(x,y,z,w);
     }
 
+    inline void set_x(const T& v) { x() = v; }
+    inline void set_y(const T& v) { y() = v; }
+    inline void set_z(const T& v) { z() = v; }
+    inline void set_w(const T& v) { w() = v; }
+
+
+
     inline const vector4<T> as_vector() const { return _q; }
 
     inline T& x() { return _q.x(); }
diff --git a/src/core/include/pw/core/vector.hpp b/src/core/include/pw/core/vector.hpp
index 8b6e932..5b43346 100644
--- a/src/core/include/pw/core/vector.hpp
+++ b/src/core/include/pw/core/vector.hpp
@@ -65,8 +65,7 @@ public:
 // Vec3 -----------------------------------------------------------------------
 
 template <class T>
-class vector3 : public vector<3,T>
-{
+class vector3 : public vector<3,T> {
 public:
 
     using vector<3,T>::operator=;
@@ -79,6 +78,8 @@ public:
 
     void set(T c1, T c2, T c3) { (*this)(0) = c1; (*this)(1) = c2; (*this)(2) = c3; }
 
+    vector3 clone() const { return vector3(*this); }
+
     inline void set_x(const T& v) { x() = v; }
     inline void set_y(const T& v) { y() = v; }
     inline void set_z(const T& v) { z() = v; }
diff --git a/src/core/src/core.cpp b/src/core/src/core.cpp
index 2057d18..1632142 100644
--- a/src/core/src/core.cpp
+++ b/src/core/src/core.cpp
@@ -1,8 +1,8 @@
 
 //#include <GLFW/glfw3.h>
 
-#include <lua.hpp>
-#include <lualib.h>
+//#include <lua.hpp>
+//#include <lualib.h>
 
 
 #include "pw/core/matrixbase.hpp"
diff --git a/src/engine/pixwerx.cpp b/src/engine/pixwerx.cpp
index fda3a26..c59766a 100644
--- a/src/engine/pixwerx.cpp
+++ b/src/engine/pixwerx.cpp
@@ -53,14 +53,5 @@ int main(int argc,const char** argv) {
 
     pw::script s;
 
-#if 1
     return s.run(sout.str().c_str());
-#else
-
-    s.load(sout.str());
-
-//    s.main_loop();
-
-
-#endif
 }
diff --git a/src/scripting/include/pw/scripting/script.hpp b/src/scripting/include/pw/scripting/script.hpp
index ab15597..b1e9f94 100644
--- a/src/scripting/include/pw/scripting/script.hpp
+++ b/src/scripting/include/pw/scripting/script.hpp
@@ -1,28 +1,29 @@
 #ifndef PW_SCRIPTING_SCRIPT_HPP
 #define PW_SCRIPTING_SCRIPT_HPP
 
-#include <pw/scripting/scripting.hpp>
+
+#include <pw/core/globals.hpp>
+
+#include <string>
 
 namespace pw {
 
 class script {
-protected:
-
-    scripting::state _state;
-    scripting::table _namespace;
-
 public:
 
     script();
     ~script();
 
-    bool load(const std::string &s);
-
     int run(const std::string& s);
 
+    struct state {
+        virtual int run(const std::string& script) = 0;
+    };
+
 protected:
 
-    void load_modules();
+    std::unique_ptr<state> _state;
+
 };
 
 }
diff --git a/src/scripting/src/CMakeLists.txt b/src/scripting/src/CMakeLists.txt
index 8d7e934..24478ff 100644
--- a/src/scripting/src/CMakeLists.txt
+++ b/src/scripting/src/CMakeLists.txt
@@ -20,4 +20,11 @@ target_include_directories(
 	../include
 	)
 
+target_include_directories(
+	pwscripting
+	PUBLIC
+	${CMAKE_SOURCE_DIR}/src/deps/lua-5.3.4/src
+	${CMAKE_SOURCE_DIR}/src/deps/sol
+	)
+
 target_link_libraries(pwscripting lua pwcore)
diff --git a/src/scripting/src/script.cpp b/src/scripting/src/script.cpp
index 2eeadea..f340e86 100644
--- a/src/scripting/src/script.cpp
+++ b/src/scripting/src/script.cpp
@@ -1,56 +1,101 @@
 #include "pw/scripting/script.hpp"
+
+#include "pw/scripting/scripting.hpp"
+
 #include "pw/core/vector.hpp"
+#include "pw/core/quaternion.hpp"
+#include "pw/core/axisangle.hpp"
 
 
-pw::script::script() {
+struct lua_state : public pw::script::state {
 
-    // create global pw namespace
-    _namespace = _state.create_named_table("pw");
+    pw::scripting::state _state;
+    pw::scripting::table _namespace;
 
-    // add the script as a user type
-    _namespace.new_usertype<script>("script",
-                                    "initialize",&script::load_modules,
-                                    "run",&script::run
-                                    );
 
-    // add this instance as "script"
-    _namespace.set("script",this);
-}
+    void load_modules();
 
-pw::script::~script()
-{
-    _state.collect_garbage();
-}
+    lua_state() {
+        // create global pw namespace
+        _namespace = _state.create_named_table("pw");
 
-bool pw::script::load(const std::string &s)
-{
-    return _state.load(s.c_str());
-}
+        // add the script as a user type
+        _namespace.new_usertype<lua_state>("script",
+                                           "initialize",&lua_state::load_modules
+                                           );
 
-int pw::script::run(const std::string &s)
+        // add this instance as "script"
+        _namespace.set("script",this);
+    }
+
+    virtual int run(const std::string &s);
+
+};
+
+int lua_state::run(const std::string &s)
 {
     return _state.script(s.c_str()).get<int>();
 }
 
-void pw::script::load_modules() {
+void lua_state::load_modules() {
 
     // open all libraries
     _state.open_libraries();
 
     typedef double Scalar;
 
-    _namespace.set("pi",Pi<Scalar>());
+    _namespace.set("pi",pw::Pi<Scalar>());
 
+#if 0
     _namespace.new_usertype<vector3d>("vector3",
                                       "set",&vector3d::set,
                                       "x", scripting::property(scripting::resolve<const Scalar&() const>(&vector3d::x), &vector3d::set_x),
                                       "y", scripting::property(scripting::resolve<const Scalar&() const>(&vector3d::y), &vector3d::set_y),
                                       "z", scripting::property(scripting::resolve<const Scalar&() const>(&vector3d::z), &vector3d::set_z),
-                                      "v",&vector3d::values
+                                      "v",&vector3d::values,
+                                      "clone",&vector3d::clone
                                       );
 
+    _namespace.new_usertype<quaterniond>("quaternion",
+                                         "set",&quaterniond::set,
+                                         "x", scripting::property(scripting::resolve<const Scalar&() const>(&quaterniond::x), &quaterniond::set_x),
+                                         "y", scripting::property(scripting::resolve<const Scalar&() const>(&quaterniond::y), &quaterniond::set_y),
+                                         "z", scripting::property(scripting::resolve<const Scalar&() const>(&quaterniond::z), &quaterniond::set_z),
+                                         "w", scripting::property(scripting::resolve<const Scalar&() const>(&quaterniond::w), &quaterniond::set_w)
+                                         //                                      "v",&vector3d::values,
+                                         //                                      "clone",&vector3d::clone
+                                         );
+
+    _namespace.new_usertype<axisangled>("axisangle",
+                                        "axis",scripting::property(&axisangled::axis,&axisangled::set_axis),
+                                        "angle",scripting::property(&axisangled::angle,&axisangled::set_angle)
+                                        );
+
+#endif
 
 }
 
 
 
+pw::script::script() {
+}
+
+pw::script::~script()
+{
+    //    _state.collect_garbage();
+}
+
+//bool pw::script::load(const std::string &s)
+//{
+//    return _state.load(s.c_str());
+//}
+
+int pw::script::run(const std::string &s)
+{
+    return _state->run(s);
+
+}
+
+
+
+
diff --git a/src/scripts/demos/simple_000.lua b/src/scripts/demos/simple_000.lua
index 162a608..19f9852 100644
--- a/src/scripts/demos/simple_000.lua
+++ b/src/scripts/demos/simple_000.lua
@@ -6,9 +6,27 @@ print("hellow pixwerx")
 local v = pw.vector3.new()
 v:set(0,1,2)
 
+-- objects need to be cloned
+local v2 = v:clone()
+
+-- manipulate stuff
 v.x = 0.2
 v.y = pw.pi
 
-print(v.x)
 
-print(v:v())
+print("v : ", v:v())
+print("v2: ", v2:v())
+
+local q = pw.quaternion.new()
+
+print("q",q.x,q.y,q.z,q.w)
+
+local aa = pw.axisangle.new()
+
+-- assign vector to axis
+aa.axis = v
+
+print("aa",aa.axis.x)
+
+--local scene = pw:scene.new()
+
diff --git a/src/ui/include/pw/ui/window.hpp b/src/ui/include/pw/ui/window.hpp
index 3b7f037..c48db83 100644
--- a/src/ui/include/pw/ui/window.hpp
+++ b/src/ui/include/pw/ui/window.hpp
@@ -4,7 +4,7 @@
 //#include "glad/glad.h"
 #include "GLFW/glfw3.h"
 
-#include "sol.hpp"
+//#include "sol.hpp"
 
 namespace pw {
 
@@ -34,7 +34,7 @@ public:
 
     context* get_context();
 
-    static void load(sol::table &ns);
+//    static void load(sol::table &ns);
 
 };
 
diff --git a/src/ui/src/window.cpp b/src/ui/src/window.cpp
index 5aea0ec..9f483a9 100644
--- a/src/ui/src/window.cpp
+++ b/src/ui/src/window.cpp
@@ -48,14 +48,14 @@ void pw::window::set_size(int w,int h) {
     glfwSetWindowSize(_window,w,h);
 }
 
-void pw::window::load(sol::table &ns)
-{
-    glfwInit();
+//void pw::window::load(sol::table &ns)
+//{
+//    glfwInit();
 
-    ns.new_usertype<window>("window",
-                            "update",&window::update,
-                            "set_title",&window::set_title,
-                            "set_size",&window::set_size
-                            );
-}
+//    ns.new_usertype<window>("window",
+//                            "update",&window::update,
+//                            "set_title",&window::set_title,
+//                            "set_size",&window::set_size
+//                            );
+//}