diff --git a/Dockerfile b/Dockerfile
index 7d92c814732bf4352f0aeb5837fbe6f5f65ac1cc..955ab220512b05eabe6a24f46b11de87c9b76b65 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -10,6 +10,7 @@ RUN apt install -y python3  \
                 python3-pip \
                 python3-tk \
                 ipython3 \
+                git \
                 sudo \
                 vim \
                 vim-youcompleteme \
diff --git a/docs/bash_cli_basics.md b/docs/bash_cli_basics.md
index d45c95e841c79d5614784e56481f19b2d6c7cd70..5b4d330ef20f1c422ed6698088f4e2ab32e378ef 100644
--- a/docs/bash_cli_basics.md
+++ b/docs/bash_cli_basics.md
@@ -1,10 +1,18 @@
 ## most basic CLI commands
-1. sudo - run the actual command after it as administrator (need to ex. install stuff)
-2. apt - this is Ubuntu's package manager. It allows you to install nearly everything you'll ever need and manages (nearly) all installed programs in general. Note: on Linux you go to your package manager to install most things, you very rarely need to go to websites and download things (apt does all of it for you from Ubuntu's servers)
+1. sudo - run the actual command after it as administrator 
+   (need to ex. install stuff)
+2. apt - this is Ubuntu's package manager. 
+   It allows you to install nearly everything you'll ever need and manages (nearly) 
+   all installed programs in general. Note: on Linux you go to your package manager 
+   to install most things, you very rarely need to go to websites and download things 
+   (apt does all of it for you from Ubuntu's servers)
 3. apt update - update your machine to programs (also called packages) from Ubuntu's serves
 4. apt install [package_name] - installs [package_name]
 5. ls - list stuff in a folder (also known as directory)
-6. cd - change directory (i.e. change folder). Sometimes you need to run commands from specific folders (you need to pass a file as input for example). It's like clicking on folders' icons, but in the terminal
+6. cd - change directory (i.e. change folder). 
+   Sometimes you need to run commands from specific folders 
+   (you need to pass a file as input for example). 
+   It's like clicking on folders' icons, but in the terminal
 7. python [python_scripy.py] - run a python script
 8. man [command] - open manual for command [command]
 9. [command] --help - get the help text for command [command]
diff --git a/docs/installing_ubuntu.md b/docs/installing_ubuntu.md
index 50489a7ffb0f6f792ec0972f5ad4c9aa3c9b4f24..2a948847f88c75399fd06d2a2b8e433630556a64 100644
--- a/docs/installing_ubuntu.md
+++ b/docs/installing_ubuntu.md
@@ -97,7 +97,7 @@ which will help you avoid headaches in the future.
 #### option 2) Native installation
 1. Either create a disk partition for Ubuntu on your hard drive, or use an external hard drive. In the first case, you might need to shrink your existing partition. Searching for "how to create a disk partition [your_OS]" or "install ubuntu on [your_OS]" will get you all the information you need. Ideally, back up your data before any of this (you should be doing this in general as it's good practice).
 2. Download an Ubuntu 22 LTH iso (file which contains everything needed for installation), available at official Ubuntu websites
-3. Create a bootable USB. In short, you can't just copy an iso file to a USB and boot from it. Just google how to do it on your OS.
+3. Create a bootable USB. In short, you can't just copy an iso file to a USB and boot from it. Just google how to do it on your OS (use rufus if on windows).
 4. Enter BIOS to ensure you can boot from your USB. Ideally this step should just be to enable Boot menu, but this step is dependent to a specific computer. Any reasonable Ubuntu (or any Linux) installation guide should have detailed steps, but also consult your laptop manufacturer websites for BIOS steps if the steps won't be obvious/easy to follow.
 5. Boot from the Ubuntu USB and install it to the partition/external disk from step 1. MAKE SURE you are installing to the right partition. To select the partition, select the "Advanced installation" option (selecting the partition is the only advanced thing you need). Otherwise just follow the installation instructions you get once you boot into the USB, they are quite well done.
 
diff --git a/python/convenience_tool_box/frame_validation.py b/python/convenience_tool_box/frame_validation.py
index b7bb55df85ff55b5f68792f9e63639ee4fb06f4f..df3b1007bd6d075228d9dcdbc7182424e21b6e4c 100644
--- a/python/convenience_tool_box/frame_validation.py
+++ b/python/convenience_tool_box/frame_validation.py
@@ -26,7 +26,7 @@ for i in range(5000):
     current = robot.rtde_receive.getActualCurrent()
     q.append(0.0)
     q.append(0.0)
-    pinMtool = robot.getMtool()
+    pinMtool = robot.getT_w_e()
     
     if i % 25 == 0:
         print("ur5:", *np.array(robot.rtde_receive.getActualTCPPose()).round(4))
diff --git a/python/convenience_tool_box/measuring_stick.py b/python/convenience_tool_box/measuring_stick.py
index c410bf28e8058fd21c6fa0548f5c10ab97b73706..ede2b40b02bcd5467044dd1ab1db5eebca58b491 100644
--- a/python/convenience_tool_box/measuring_stick.py
+++ b/python/convenience_tool_box/measuring_stick.py
@@ -26,7 +26,7 @@ signal.signal(signal.SIGINT, handler)
 
 
 while True:
-    Mtool = robot.getMtool() 
+    Mtool = robot.getT_w_e() 
     print(Mtool)
     print("pin:", *Mtool.translation.round(4), *pin.rpy.matrixToRpy(Mtool.rotation).round(4))
     print("ur5:", *np.array(robot.rtde_receive.getActualTCPPose()).round(4))
diff --git a/python/examples/planar_dragging_via_top_contact_force.py b/python/examples/planar_dragging_via_top_contact_force.py
index 972448117be6d768168efe94ae486f4e69ce8fc4..8e7a82458a292c5549fea9dd9999b36376d9f688 100644
--- a/python/examples/planar_dragging_via_top_contact_force.py
+++ b/python/examples/planar_dragging_via_top_contact_force.py
@@ -179,7 +179,6 @@ def controlLoopPlanarDragging(dmp, tc, controller, robot, i, past_data):
     # rolling average
     if i % 100 == 0:
         print(wrench)
-    pin.forwardKinematics(robot.model, robot.data, q)
     J = pin.computeJointJacobian(robot.model, robot.data, q, robot.JOINT_ID)
     dq = robot.getQd()[:6].reshape((6,1))
     # get joitn 
diff --git a/python/examples/point_impedance_control.py b/python/examples/point_impedance_control.py
index 10d5de6f705de72ce14477d9e6e19bf159a6d519..58ac4d710d83d7e85e691c37973e8ce7ca263a0c 100644
--- a/python/examples/point_impedance_control.py
+++ b/python/examples/point_impedance_control.py
@@ -169,7 +169,7 @@ def controlLoopPointImpedance(q_init, controller, robot : RobotManager, i, past_
     save_past_dict = {}
     log_item = {}
     q = robot.getQ()
-    Mtool = robot.getMtool()
+    Mtool = robot.getT_w_e()
     wrench = robot.getWrench()
     log_item['wrench_raw'] = wrench.reshape((6,))
     # deepcopy for good coding practise (and correctness here)
@@ -229,7 +229,7 @@ def controlLoopCartesianPointImpedance(Mtool_init, clik_controller, robot, i, pa
     save_past_dict = {}
     log_item = {}
     q = robot.getQ()
-    Mtool = robot.getMtool()
+    Mtool = robot.getT_w_e()
     wrench = robot.getWrench()
     log_item['wrench_raw'] = wrench.reshape((6,))
     save_past_dict['wrench'] = copy.deepcopy(wrench)
@@ -307,7 +307,7 @@ if __name__ == "__main__":
             'wrench_used' : np.zeros(6),
         }
     q_init = robot.getQ()
-    Mtool_init = robot.getMtool()
+    Mtool_init = robot.getT_w_e()
 
     if not args.cartesian_space_impedance:
         controlLoop = partial(controlLoopPointImpedance, q_init, controller, robot)
diff --git a/python/ur_simple_control/__pycache__/managers.cpython-312.pyc b/python/ur_simple_control/__pycache__/managers.cpython-312.pyc
index bbcd15e78148acd5a796424e5d1111dd7a2a731e..b114db404caacd1a1e229e1b371bca3af042ebdc 100644
Binary files a/python/ur_simple_control/__pycache__/managers.cpython-312.pyc and b/python/ur_simple_control/__pycache__/managers.cpython-312.pyc differ
diff --git a/python/ur_simple_control/basics/__pycache__/basics.cpython-312.pyc b/python/ur_simple_control/basics/__pycache__/basics.cpython-312.pyc
index 5fa0086f49e4281f9eeaeae9db7e5d7d99c70bcf..03f3f9a372b4970f16339d4e5aedf8edfc824b6a 100644
Binary files a/python/ur_simple_control/basics/__pycache__/basics.cpython-312.pyc and b/python/ur_simple_control/basics/__pycache__/basics.cpython-312.pyc differ
diff --git a/python/ur_simple_control/clik/__pycache__/clik_point_to_point.cpython-312.pyc b/python/ur_simple_control/clik/__pycache__/clik_point_to_point.cpython-312.pyc
index 8ae2b48b1fa2da019eb463d43cf61b3ecfed7067..a300f6887915c8835819f530df29d28673262313 100644
Binary files a/python/ur_simple_control/clik/__pycache__/clik_point_to_point.cpython-312.pyc and b/python/ur_simple_control/clik/__pycache__/clik_point_to_point.cpython-312.pyc differ
diff --git a/python/ur_simple_control/clik/__pycache__/clik_trajectory_following.cpython-312.pyc b/python/ur_simple_control/clik/__pycache__/clik_trajectory_following.cpython-312.pyc
index 4239e1bd51ab18db826e0888d6072ac43e223e4d..d900eed3d1c0b5d9a5e328f65abf299bf57f1759 100644
Binary files a/python/ur_simple_control/clik/__pycache__/clik_trajectory_following.cpython-312.pyc and b/python/ur_simple_control/clik/__pycache__/clik_trajectory_following.cpython-312.pyc differ
diff --git a/python/ur_simple_control/clik/clik_point_to_point.py b/python/ur_simple_control/clik/clik_point_to_point.py
index 9f43931a068b1ba10607587b589469652eaa3864..838a917e91bf7ba5b1ed908118d7f573d7e4b839 100644
--- a/python/ur_simple_control/clik/clik_point_to_point.py
+++ b/python/ur_simple_control/clik/clik_point_to_point.py
@@ -288,8 +288,6 @@ def controlLoopCompliantClik(args, robot : RobotManager, i, past_data):
     save_past_dict = {}
     # know where you are, i.e. do forward kinematics
     q = robot.getQ()
-    pin.forwardKinematics(robot.model, robot.data, q)
-    # this has forward kinematics in it
     T_w_e = robot.getT_w_e()
     wrench = robot.getWrench()
     # we need to overcome noise if we want to converge
diff --git a/python/ur_simple_control/util/__pycache__/calib_board_hacks.cpython-312.pyc b/python/ur_simple_control/util/__pycache__/calib_board_hacks.cpython-312.pyc
index 7b4b291aa60caab7194c0c5f1e450a8f939c1e4f..f3cb936ccba20349b062a79f7f3ea0bac9108256 100644
Binary files a/python/ur_simple_control/util/__pycache__/calib_board_hacks.cpython-312.pyc and b/python/ur_simple_control/util/__pycache__/calib_board_hacks.cpython-312.pyc differ
diff --git a/python/ur_simple_control/util/__pycache__/draw_path.cpython-312.pyc b/python/ur_simple_control/util/__pycache__/draw_path.cpython-312.pyc
index 0dd487ca465ce8e1c0086017be6f1b5e777f2293..71e35875b7d8a6176729a24085e21d5e5618c2b2 100644
Binary files a/python/ur_simple_control/util/__pycache__/draw_path.cpython-312.pyc and b/python/ur_simple_control/util/__pycache__/draw_path.cpython-312.pyc differ
diff --git a/python/ur_simple_control/util/__pycache__/get_model.cpython-312.pyc b/python/ur_simple_control/util/__pycache__/get_model.cpython-312.pyc
index f71d31d1b099ad31d391d763413e725c2b8b077c..4f3cd82c660184ddd923df726a18a1539e1dba3b 100644
Binary files a/python/ur_simple_control/util/__pycache__/get_model.cpython-312.pyc and b/python/ur_simple_control/util/__pycache__/get_model.cpython-312.pyc differ
diff --git a/python/ur_simple_control/util/__pycache__/logging_utils.cpython-312.pyc b/python/ur_simple_control/util/__pycache__/logging_utils.cpython-312.pyc
index a5640ca76c535f04142b1d71d8fbba1556478f46..1557c6d021d3fe0b591b7bf92ae68a47a0777933 100644
Binary files a/python/ur_simple_control/util/__pycache__/logging_utils.cpython-312.pyc and b/python/ur_simple_control/util/__pycache__/logging_utils.cpython-312.pyc differ
diff --git a/python/ur_simple_control/util/calib_board_hacks.py b/python/ur_simple_control/util/calib_board_hacks.py
index f1f5e2abc87dc52ea685828ca6deeb4d4601870f..63bce31c624dd63094349a35bfc6b340e4995231 100644
--- a/python/ur_simple_control/util/calib_board_hacks.py
+++ b/python/ur_simple_control/util/calib_board_hacks.py
@@ -219,7 +219,7 @@ def calibratePlane(args, robot, plane_width, plane_height, n_tests):
     handleUserToHandleTCPPose(robot)
     q_init = copy.deepcopy(robot.getQ())
     # GET TCP
-    Mtool = robot.getMtool()
+    Mtool = robot.getT_w_e()
 
     init_pose = copy.deepcopy(Mtool)
     new_pose = copy.deepcopy(init_pose)
@@ -259,7 +259,7 @@ def calibratePlane(args, robot, plane_width, plane_height, n_tests):
 
         positions.append(copy.deepcopy(robot.data.oMi[robot.JOINT_ID].translation))
         if i < n_tests -1:
-            current_pose = robot.getMtool()
+            current_pose = robot.getT_w_e()
             new_pose = copy.deepcopy(current_pose)
             # go back up (assuming top-left is highest incline)
             # TODO: make this assumption an argument, or print it at least
@@ -296,7 +296,7 @@ def calibratePlane(args, robot, plane_width, plane_height, n_tests):
 
     print("finished estimating R")
 
-    current_pose = robot.getMtool()
+    current_pose = robot.getT_w_e()
     new_pose = copy.deepcopy(current_pose)
     # go back up
     # Z
@@ -332,7 +332,7 @@ def calibratePlane(args, robot, plane_width, plane_height, n_tests):
     # TODO: get rid of all movels, just your own stuff,
     # or at least shove them avait to the RobotManager
     # and now go back up
-    current_pose = robot.getMtool()
+    current_pose = robot.getT_w_e()
     new_pose = copy.deepcopy(current_pose)
     new_pose.translation[2] = init_pose.translation[2]
     moveL(args, robot, new_pose)
diff --git a/python/ur_simple_control/visualize/__pycache__/visualize.cpython-312.pyc b/python/ur_simple_control/visualize/__pycache__/visualize.cpython-312.pyc
index 82688cdec6204a4d6ea856a59f397797cb95e1e8..8a1adf2f8db4ef94087d08a06981bcfb331508e7 100644
Binary files a/python/ur_simple_control/visualize/__pycache__/visualize.cpython-312.pyc and b/python/ur_simple_control/visualize/__pycache__/visualize.cpython-312.pyc differ