diff --git a/c++/CMakeLists.txt b/c++/CMakeLists.txt
index 2cfe3a63f828b10e83f7d86ecdcf341ab389a577..37cd050b08162f4bb4eb5495e7c62d60cdb7350e 100644
--- a/c++/CMakeLists.txt
+++ b/c++/CMakeLists.txt
@@ -14,7 +14,7 @@ find_package (broccoli 3.0.0 COMPONENTS eigen REQUIRED)
 find_package(RL COMPONENTS MDL REQUIRED)
 
 # dependencies for gpm function
-add_library(my_funcs SHARED src/gpm.cpp src/loadKinematicModel.cpp src/pointer_example.cpp)
+add_library(my_funcs SHARED src/yumi.cpp)
 target_link_libraries (
     my_funcs 
     ${RL_LIBRARIES}
@@ -32,7 +32,7 @@ target_link_libraries(
     eat::broccoli
 )
 
-add_executable(myMain src/main.cpp src/gpm.cpp src/loadKinematicModel.cpp src/pointer_example.cpp)
+add_executable(myMain src/main.cpp src/yumi.cpp)
 target_link_libraries(
     myMain
     eat::broccoli
diff --git a/c++/include/gpm.hpp b/c++/include/gpm.hpp
index ca063b958908ed495248287a64d2c18d8b39fd36..f147010370278ed5ba8bf48d9370084abfa44a1b 100644
--- a/c++/include/gpm.hpp
+++ b/c++/include/gpm.hpp
@@ -3,4 +3,4 @@
 
 
 std::pair<Eigen::Matrix<double, 7, 1>, Eigen::Matrix<double, 6, 1>> gpm(Eigen::Matrix<double, 6, 1> &desPose, Eigen::Matrix<double, 6, 1> &desVelocity, 
-Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelocity, void * kinematic_ptr);
+Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelocity, rl::mdl::Kinematic* kinematic);
diff --git a/c++/include/loadKinematicModel.hpp b/c++/include/loadKinematicModel.hpp
index ca6d3ad89a8065de7bca25333817ecceeea3fc3e..4e77030644afacabaaedfea47547db08ab364d17 100644
--- a/c++/include/loadKinematicModel.hpp
+++ b/c++/include/loadKinematicModel.hpp
@@ -4,10 +4,10 @@ class Arm {
     public:
     Arm(std::string path);
 
-    void* get_pointer2arm();
+    std::shared_ptr<void> get_pointer2arm();
 
     private:
     rl::mdl::Kinematic* kin_pointer;
     rl::mdl::Kinematic kin_model;
-    void* void_pointer;
+    std::shared_ptr<void> sharedvoid_pointer;
  };
diff --git a/c++/include/pointer_example.hpp b/c++/include/pointer_example.hpp
deleted file mode 100644
index 2f2ad00d9db55c8615b9f48a049dbf06324cc780..0000000000000000000000000000000000000000
--- a/c++/include/pointer_example.hpp
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-void * get_pointer();
-
-void set_pointer(void * pointer);
\ No newline at end of file
diff --git a/c++/include/yumi.hpp b/c++/include/yumi.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..89c4ae77a3087915de5261509436150bbf8b32d0
--- /dev/null
+++ b/c++/include/yumi.hpp
@@ -0,0 +1,39 @@
+#include <iostream>
+
+#include <Eigen/Eigen>
+
+#include <broccoli/control/kinematics/ComfortPoseGradient.hpp>
+#include <broccoli/core/math.hpp>
+
+#include <rl/math/Transform.h>
+#include <rl/mdl/Kinematic.h>
+#include <rl/mdl/Model.h>
+#include <rl/mdl/UrdfFactory.h>
+
+class Yumi {
+    public:
+
+    //functions
+    Yumi(std::string path);
+
+    void set_jointValues(Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelocity);
+
+    void print_pose();
+
+    private:
+    // vars for rl library
+    rl::mdl::Kinematic* m_kinematic;
+    rl::mdl::Kinematic m_kin_model;
+
+    // vars to store configuration
+    Eigen::Matrix<double, 6, 1> m_desPose = Eigen::Matrix<double, 6, 1>::Zero();
+    Eigen::Matrix<double, 6, 1> m_desVelocity = Eigen::Matrix<double, 6, 1>::Zero();
+
+    Eigen::Matrix<double, 7, 1> m_jointAngles = Eigen::Matrix<double, 7, 1>::Zero();
+    Eigen::Matrix<double, 7, 1> m_jointVelocity = Eigen::Matrix<double, 7, 1>::Zero();
+
+    rl::math::Vector3 m_position = rl::math::Vector3::Zero();
+	rl::math::Vector3 m_orientation = rl::math::Vector3::Zero();
+
+    void doForwardKinematics(rl::mdl::Kinematic* kinematic);
+ };
\ No newline at end of file
diff --git a/c++/src/gpm.cpp b/c++/src/gpm.cpp
index 69674105660c001cee58daeb513f9ff203c8ad84..d21b1dea0f7555004d9d350768be65cbe92da38a 100644
--- a/c++/src/gpm.cpp
+++ b/c++/src/gpm.cpp
@@ -1,5 +1,4 @@
 #include <iostream>
-#include <string>
 
 #include <broccoli/control/kinematics/ComfortPoseGradient.hpp>
 #include <broccoli/core/math.hpp>
@@ -11,17 +10,11 @@
 
 
 std::pair<Eigen::Matrix<double, 7, 1>, Eigen::Matrix<double, 6, 1>> gpm(Eigen::Matrix<double, 6, 1> &desPose, Eigen::Matrix<double, 6, 1> &desVelocity, 
-Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelocity, void * kinematic_ptr) {
+Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelocity, rl::mdl::Kinematic* kinematic) {
 
 
-	// FORWARD KINEMATICS
-	rl::mdl::Kinematic* kinematic = (rl::mdl::Kinematic*) kinematic_ptr;
-	std::cout << "adress of pointer gpm " << kinematic_ptr << std::endl;
-	
-
-	//std::cout << "pointer in gpm" << kinematic_ptr << std::endl;
-	//rl::mdl::Kinematic* kinematic = kinematicPtr;
 
+	// FORWARD KINEMATICS
 	kinematic->setPosition(jointAngles);
 	kinematic->forwardPosition();
 	kinematic->calculateJacobian();
@@ -33,20 +26,12 @@ Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelo
 			J(j, i) = kinematic->getJacobian()(j, i);
 		}
 	}
-
-
-	// check if matrices are the same
-	//std::cout << "RLJacobian \n" << kinematic->getJacobian() << std::endl;
-	//std::cout << "myJacobian \n" << J << std::endl;
-	//std::cout << "Manipulability meassure \n" << kinematic->calculateManipulabilityMeasure() << std::endl;
 	
 	// extract orientation and position for the right arm
 	rl::math::Transform t = kinematic->getOperationalPosition(0);
 	rl::math::Vector3 position = t.translation();
 	rl::math::Vector3 orientation = t.rotation().eulerAngles(2, 1, 0).reverse();
-	//std::cout << "Joint configuration in degrees: " << jointAngles.transpose() * rl::math::RAD2DEG << std::endl;
-	//std::cout << "FK end-effector position: [m] " << position.transpose() << " orientation [deg] " << orientation.transpose() * rl::math::RAD2DEG << std::endl;
-	
+
 	// INVERSE KINEMATICS
 	// compute translation and orientation error
 	Eigen::Matrix3d desOrientation;
@@ -55,17 +40,6 @@ Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelo
 					*Eigen::AngleAxisd(desPose(4), Eigen::Vector3d::UnitY())
 					*Eigen::AngleAxisd(desPose(3), Eigen::Vector3d::UnitX());
 					
-	//std::cout << "reverse euler angles" << desOrientation.eulerAngles(2, 1, 0).reverse();
-
-	//  check if these two rotation matrices match!
-	//std::cout << "desOrientation \n" << desOrientation << std::endl;
-	//std::cout << "RL Orientation \n" << t.rotation() << std::endl;
-
-	//Eigen::Vector3d einheitsvektor;
-	//einheitsvektor << 1.0, 0.0, 0.0;
-	//std::cout << "desOrientation x einheitsvektor \n" << desOrientation* einheitsvektor << std::endl;
-	//std::cout << "RL Orientation x einheitsvektor\n" << t.rotation()*einheitsvektor << std::endl;
-
 
 	// define Quaternion with coefficients in the order [x, y, z, w] 
 	Eigen::Vector3d desiredTranslation = desPose.head(3);
@@ -95,9 +69,6 @@ Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelo
 	effectiveTaskSpaceInput.tail(3) = gainDriftCompensation/dt * errorRotationInWorldFrame + desVelocity.tail(3);
 	//std::cout << "effectiveTaskSpaceInput: " << effectiveTaskSpaceInput << std::endl;
 
-
-
-
 	// COMPUTE CPG GRADIENT
 	// define min and max values for the joints of Yumi
 	Eigen::Matrix< double, 7, 1> q_min;
@@ -146,8 +117,6 @@ Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelo
 	Eigen::Matrix<double, 7, 1> nullSpaceGradient = Eigen::Matrix<double, 7, 1>::Zero();
 	nullSpaceGradient = 0*manipGradient + 0*cpgGradient;
 
-
-
 	// ASC desired effective velocity does not work -> implement myself
 	Eigen::Matrix<double, 7, 7>  m_inverseWeighing = Eigen::Matrix<double, 7, 7> ::Identity();
 	double m_activationFactorTaskSpace = 1.0;
@@ -160,11 +129,6 @@ Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelo
 	Eigen::Matrix<double, 7, 1> jointAnglesDelta;
 	jointAnglesDelta << jointVelocities * dt;
 
-
-	//std::cout << "current qs in DEG \n" << jointAngles* rl::math::RAD2DEG << std::endl;
-	//std::cout << "delta qs in DEG \n" << jointAnglesDelta * rl::math::RAD2DEG << std::endl;
-	//std::cout << "next qs in DEG \n" << (jointAngles+jointAnglesDelta)* rl::math::RAD2DEG << std::endl;
-
 	// forward kinematics with the new joints values from IK
 	kinematic->setPosition(jointAngles+jointAnglesDelta);
 	kinematic->forwardPosition();
@@ -172,9 +136,6 @@ Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelo
 	rl::math::Transform dest = kinematic->getOperationalPosition(0);
 	rl::math::Vector3 dposition = dest.translation();
 	rl::math::Vector3 dorientation = dest.rotation().eulerAngles(2, 1, 0).reverse();
-	//std::cout << "IK joint configuration in degrees: " << (jointAngles+jointAnglesDelta).transpose() * rl::math::RAD2DEG << std::endl;
-	//std::cout << "IK end-effector position: [m] " << dposition.transpose() << " orientation [deg] " << dorientation.transpose() * rl::math::RAD2DEG << std::endl;
-	
 	Eigen::Matrix<double, 6, 1> resPose;
 	resPose << dposition.transpose()(0), dposition.transpose()(1), dposition.transpose()(2), dorientation.transpose()(0), dorientation.transpose()(1), dorientation.transpose()(2);
 
diff --git a/c++/src/loadKinematicModel.cpp b/c++/src/loadKinematicModel.cpp
index 553ad68b91d19ff4fc49d0c527ebe6108fd84b78..8e6350fa1473e9db7937f424aa129d3967dba4b0 100644
--- a/c++/src/loadKinematicModel.cpp
+++ b/c++/src/loadKinematicModel.cpp
@@ -8,14 +8,17 @@
 Arm::Arm(std::string path){
     rl::mdl::UrdfFactory factory;
     std::shared_ptr<rl::mdl::Model> model(factory.create(path));
-    kin_pointer = dynamic_cast<rl::mdl::Kinematic*>(model.get());
-    kin_model = *(kin_pointer);
-    rl::mdl::Kinematic* tmp_pointer = &kin_model;
-    void_pointer = (void*) tmp_pointer;
-    std::cout << "adress of pointer load " << void_pointer << std::endl;
+
+
+    //kin_pointer = dynamic_cast<rl::mdl::Kinematic*>(model.get());
+    sharedvoid_pointer = (std::shared_ptr<void>) model;
+    //kin_model = *(kin_pointer);
+    //rl::mdl::Kinematic* tmp_pointer = &kin_model;
+    //oid_pointer = (void*) tmp_pointer;
+    //std::cout << "adress of pointer load " << void_pointer << std::endl;
     }
 
-void* Arm::get_pointer2arm() {return void_pointer;}
+std::shared_ptr<void> Arm::get_pointer2arm() {return sharedvoid_pointer;}
 
 /* class Arm {
     public:
diff --git a/c++/src/main.cpp b/c++/src/main.cpp
index b6a42286f31da16631b44a98b78aa1e23cb02bb2..c46dbf2e22569bb2ea2819c7f9c9f4b366e9fea5 100644
--- a/c++/src/main.cpp
+++ b/c++/src/main.cpp
@@ -1,7 +1,7 @@
 #include <iostream>
 #include "gpm.hpp"
 #include "loadKinematicModel.hpp"
-#include "pointer_example.hpp"
+#include "yumi.hpp"
 
 #include <Eigen/Eigen>
 #include <rl/math/Unit.h>
@@ -12,20 +12,28 @@
 
 int main(int, char**) {
 
-	enum yumi_arm{YUMI_RIGHT, YUMI_LEFT};
+	std::string path2yumi_l = "/home/joschua/Coding/forceControl/master-project/c++/models/urdf/yumi_left.urdf";
+	Yumi yumi_l(path2yumi_l);
 
-	//rl::mdl::Kinematic *kinematic_ptr = loadKinematicModel("/home/joschua/Coding/forceControl/master-project/c++/models/urdf/yumi_left.urdf");
+	Eigen::Matrix<double, 7, 1> jointAngles;
+	jointAngles << 90.48, 17.87, -25.0, 48.0, -137.0, 122.0, -74.21;
+	jointAngles *= rl::math::DEG2RAD;
+
+	Eigen::Matrix<double, 7, 1> jointVelocities;
+	jointVelocities << 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0;
+
+	yumi_l.set_jointValues(jointAngles, jointVelocities);
+	yumi_l.print_pose();
+
+
+
+	//enum yumi_arm{YUMI_RIGHT, YUMI_LEFT};
 
-	
-	//std::cout << *((int*)p) << std::endl;
 
-	rl::mdl::UrdfFactory factory;
+/* 	rl::mdl::UrdfFactory factory;
 	std::shared_ptr<rl::mdl::Model> model(factory.create("/home/joschua/Coding/forceControl/master-project/c++/models/urdf/yumi_left.urdf"));
 	rl::mdl::Kinematic* kinematic = dynamic_cast<rl::mdl::Kinematic*>(model.get());
 
-	Arm right_arm("/home/joschua/Coding/forceControl/master-project/c++/models/urdf/yumi_right.urdf");
-	void* test_pointer = right_arm.get_pointer2arm();
-
 	// Is Values
 	Eigen::Matrix<double, 6, 1> actualPosition;
 	Eigen::Matrix<double, 7, 1> jointAngles;
@@ -44,21 +52,10 @@ int main(int, char**) {
 	desVelocity << 0.0, 0.0, 0.0, 0.0, 0.0, 0.0;
 
 	std::pair<Eigen::Matrix<double, 7, 1>, Eigen::Matrix<double, 6, 1>> result;
-	result = gpm(desPose, desVelocity, jointAngles, jointVelocity, test_pointer);
+	result = gpm(desPose, desVelocity, jointAngles, jointVelocity, kinematic);
 	
 	std::cout << "desired joint values: \n" << result.first << std::endl;
-	std::cout << "current pose: \n" << result.second << std::endl;
-
-
-
-	int number = 7;
-    int *mypointer = &number;
-	set_pointer(mypointer);
-
-	void * p = get_pointer();
-	set_pointer(p);
-	
-
+	std::cout << "current pose: \n" << result.second << std::endl; */
 	
 	return 0;
 }
\ No newline at end of file
diff --git a/c++/src/pointer_example.cpp b/c++/src/pointer_example.cpp
deleted file mode 100644
index c140dbdbcdc78339ae4c30720ae037c509c6121a..0000000000000000000000000000000000000000
--- a/c++/src/pointer_example.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <iostream>
-
-void * get_pointer(){
-    static int number = 7;
-    int *p2number = &number;
-    std::cout << "pointer_ref" << (void*) p2number << std::endl;
-    return ((void *) p2number);
-}
-
-void set_pointer(void * pointer){
-    std::cout << "int value from pointer " << *((int*) pointer) << std::endl;
-    std::cout << "void pointer " << pointer << std::endl;
-} 
\ No newline at end of file
diff --git a/c++/src/py2gpmbind.cpp b/c++/src/py2gpmbind.cpp
index d9c9addeb5f3614af4bc5a82efc79670f53768ff..f84831a5dde8e8806e751e8aac0ebfdd7a80e45c 100644
--- a/c++/src/py2gpmbind.cpp
+++ b/c++/src/py2gpmbind.cpp
@@ -2,7 +2,7 @@
 #include <pybind11/eigen.h>
 #include "gpm.hpp"
 #include "loadKinematicModel.hpp"
-#include "pointer_example.hpp"
+#include "yumi.hpp"
 #include <rl/mdl/UrdfFactory.h>
 
 namespace py = pybind11;
@@ -11,17 +11,18 @@ namespace py = pybind11;
 
 PYBIND11_MODULE(invKin, m) {
     m.doc() = "pybind11 binding to C++ function that computes IK based on GPM"; // optional module docstring
-    m.def("gpm", &gpm, "A function to compute the invserse kinematics for a 7 DOF serial manipulator on vecocity level with comfort pose and manipulabilty gradient",
-    py::arg("desired pose"),py::arg("desired Velocities"), py::arg("joint angles"), py::arg("joint velocities"), py::arg("left arm -> 1, right arm -> 0"), py::return_value_policy::copy);
+
+    //m.def("gpm", &gpm, "A function to compute the invserse kinematics for a 7 DOF serial manipulator on vecocity level with comfort pose and manipulabilty gradient",
+    //py::arg("desired pose"),py::arg("desired Velocities"), py::arg("joint angles"), py::arg("joint velocities"), py::arg("left arm -> 1, right arm -> 0"), py::return_value_policy::copy);
 	
+    py::class_<Yumi>(m, "Yumi")
+       .def(py::init<std::string>())
+       .def("set_jointValues", &Yumi::set_jointValues, py::arg("joint angles"), py::arg("joint velocities"))
+       .def("printPose", &Yumi::print_pose); 
     // load model and return ptr for future function calls
     // https://pybind11.readthedocs.io/en/stable/advanced/functions.html#return-value-policies
 
-
-    m.def("set_pointer", &set_pointer, "set pointer", py::arg("pointer"), py::return_value_policy::move);
-    m.def("get_pointer", &get_pointer, py::return_value_policy::move);
-
-    py::class_<Arm>(m, "Arm")
+    /* py::class_<Arm>(m, "Arm")
        .def(py::init<std::string>())
-       .def("get_pointer2arm", &Arm::get_pointer2arm);
+       .def("get_pointer2arm", &Arm::get_pointer2arm); */
 	}
\ No newline at end of file
diff --git a/c++/src/yumi.cpp b/c++/src/yumi.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..019601077d791884744ee99e709b0d61bcc5065e
--- /dev/null
+++ b/c++/src/yumi.cpp
@@ -0,0 +1,38 @@
+#include <iostream>
+
+#include <broccoli/control/kinematics/ComfortPoseGradient.hpp>
+#include <broccoli/core/math.hpp>
+
+#include <rl/math/Transform.h>
+#include <rl/mdl/Kinematic.h>
+#include <rl/mdl/Model.h>
+#include <rl/mdl/UrdfFactory.h>
+
+#include <yumi.hpp>
+
+// constructor
+Yumi::Yumi(std::string path){
+    rl::mdl::UrdfFactory factory;
+    std::shared_ptr<rl::mdl::Model> model(factory.create(path));
+    rl::mdl::Kinematic* kinematic = dynamic_cast<rl::mdl::Kinematic*>(model.get());
+    m_kin_model = *(kinematic);
+    m_kinematic = &m_kin_model;
+}
+
+void Yumi::set_jointValues(Eigen::Matrix<double, 7, 1> &jointAngles, Eigen::Matrix<double, 7, 1> &jointVelocity){
+    m_jointAngles = jointAngles;
+    m_jointVelocity = jointVelocity;
+}
+
+void Yumi::doForwardKinematics(rl::mdl::Kinematic* kinematic){
+    kinematic->setPosition(m_jointAngles);
+    kinematic->forwardPosition();
+    rl::math::Transform t = kinematic->getOperationalPosition(0);
+	m_position = t.translation();
+	m_orientation = t.rotation().eulerAngles(2, 1, 0).reverse();
+}
+
+void Yumi::print_pose(){
+    Yumi::doForwardKinematics(&m_kin_model);
+    std::cout << "pose " << m_position << "\t" << m_orientation << std::endl;
+}
\ No newline at end of file