diff --git a/.gitignore b/.gitignore
index 9b6da0a..12529b9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 venv
 __pycache__
-cables
\ No newline at end of file
+cables
+.vscode
\ No newline at end of file
diff --git a/read_datasheet.py b/read_datasheet.py
index 46aa70c..37bcdc0 100755
--- a/read_datasheet.py
+++ b/read_datasheet.py
@@ -7,6 +7,7 @@ import camelot
 import numpy as np
 from PIL import Image
 import io
+import json
 
 def parse(filename, output_dir):
 
@@ -43,9 +44,10 @@ def parse(filename, output_dir):
 
             page.extract_text(visitor_text=visitor_body)
             text_body = "".join(parts).strip('\n')
+            if len(text_body) == 0:
+                text_body = str(n)
             #print(text_body)
-
-
+            
 
             table_list[text_body] = table.df
             #table.to_html("table" + str(n) + ".html")
@@ -55,7 +57,7 @@ def parse(filename, output_dir):
             n=n+1
     #camelot.plot(tables[0], kind='grid').savefig("test.png")
     
-    tables.export(output_dir + '/techdata.json', f='json')
+    #tables.export(output_dir + '/techdata.json', f='json')
 
     # print(table_list)
     # Extract Basic details - part name & description, image, etc
@@ -81,7 +83,95 @@ def parse(filename, output_dir):
                 with open(output_dir + "/brand.png", "wb") as fp:
                     fp.write(image_file_object.data)
                     count += 1
-    return table_list
+
+    # Table parsing and reordring
+    tables = dict()
+    previous_table = ""
+    for table_name in table_list.keys():
+        # determine shape: horizontal or vertical
+        table = table_list[table_name]
+        rows = table.shape[0]
+        cols = table.shape[1]
+        vertical = None
+        if rows > 2 and cols == 2:
+            vertical = True
+        elif cols == 1:
+            vertical = False
+        elif rows == 1:
+            vertical = True
+        elif cols == 2: # and rows <= 2
+            # inconsistent
+            if table.iloc[0, 0].find(":") == len(table.iloc[0, 0]) - 1: # check if last character is ":" indicating a vertical table
+                vertical = True
+            else:
+                vertical = False
+
+        elif cols > 2: # and rows <= 2
+            vertical = False
+        elif rows > 2 and cols > 2: # big table
+            vertical = False
+        else: # 1 column, <= 2 rows
+            vertical = False
+
+        # missing name check
+        for table_name_2 in table_list.keys(): 
+            if table_name_2.find(table.iloc[-1, 0]) >= 0:
+                # Name taken from table directly above - this table does not have a name
+                table_list["Specs " + str(len(tables))] = table_list.pop(table_name_2, None) # rename table to arbitrary altername name
+                break
+
+        if vertical:
+            out = dict()
+            for row in table.itertuples(index=False, name=None):
+                out[row[0].replace("\n", " ").replace(":", "")] = row[1]
+
+        else: # horizontal
+            out = dict()
+            for col in table.columns:
+                col_data = tuple(table[col])
+                out[col_data[0].replace("\n", " ")] = col_data[1:]
+        
+        tables[table_name] = out
+
+
+
+        # multi-page table check
+        if table_name.isdigit() and len(tables) > 1:
+            print(table_name)
+            print(previous_table)
+            
+            
+            
+            
+            main_key = previous_table
+            cont_key = table_name
+            print(tables)
+            if vertical == False:
+                main_keys = list(tables[main_key].keys())
+                for i, (cont_key, cont_values) in enumerate(tables[cont_key].items()):
+                    if i < len(main_keys):
+                        print(tables[main_key][main_keys[i]])
+                        tables[main_key][main_keys[i]] = (tables[main_key][main_keys[i]] + (cont_key,) + cont_values)
+
+                del tables[table_name]
+
+            else:
+                for key in tables[cont_key].keys():
+                    tables[main_key][key] = tables[cont_key][key]
+                del tables[table_name]
+
+        previous_table = table_name
+    
+
+    print(tables)
+    with open(output_dir + "/tables.json", 'w') as json_file:
+        json.dump(tables, json_file)
+
+
+
+
+
+    return tables
 
     
 
diff --git a/requirements.txt b/requirements.txt
index 10dce06..33099ce 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,7 +4,8 @@ opencv-python
 pypdf2==2.12.1
 alive-progress
 requests
+git+https://github.com/Byeongdulee/python-urx.git
 psycopg2
 
 # Development
-matplotlib
\ No newline at end of file
+matplotlib
diff --git a/ur5_control.py b/ur5_control.py
new file mode 100755
index 0000000..99e1267
--- /dev/null
+++ b/ur5_control.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python3
+
+import urx
+import math3d as m3d
+import math
+import time
+import logging
+from urx.robotiq_two_finger_gripper import Robotiq_Two_Finger_Gripper
+import sys
+
+rob = urx.Robot("192.168.1.145")
+robotiqgrip = Robotiq_Two_Finger_Gripper(rob)
+
+rob.set_tcp((0, 0, 0.15, 0, 0, 0))
+rob.set_payload(4, (0, 0, 0.1))
+#rob.set_payload(2, (0, 0, 0.1))
+time.sleep(0.2)
+
+
+def set_pos_abs(x, y, z, xb, yb, zb):
+
+    new_orientation = m3d.Transform()
+    new_orientation.orient.rotate_xb(xb)  # Replace rx with the desired rotation around X-axis
+    new_orientation.orient.rotate_yb(yb)  # Replace ry with the desired rotation around Y-axis
+    new_orientation.orient.rotate_zb(zb)  # Replace rz with the desired rotation around Z-axis
+
+    # Get the current pose
+    trans = rob.getl()
+    # Apply the new orientation while keeping the current position
+    new_trans = m3d.Transform(new_orientation.orient, m3d.Vector(trans[0:3]))
+    new_trans.pos.x = x
+    new_trans.pos.y = y
+    new_trans.pos.z = z
+    #rob.speedj(0.2, 0.5, 99999)
+    rob.set_pose(new_trans, acc=5.0, vel=5.0, command="movej")  # apply the new pose
+
+def set_pos_rel_rot_abs(x, y, z, xb, yb, zb):
+
+    new_orientation = m3d.Transform()
+    new_orientation.orient.rotate_xb(xb)  # Replace rx with the desired rotation around X-axis
+    new_orientation.orient.rotate_yb(yb)  # Replace ry with the desired rotation around Y-axis
+    new_orientation.orient.rotate_zb(zb)  # Replace rz with the desired rotation around Z-axis
+
+    # Get the current pose
+    trans = rob.getl()
+    
+    # Apply the new orientation while keeping the current position
+    new_trans = m3d.Transform(new_orientation.orient, m3d.Vector(trans[0:3]))
+    new_trans.pos.x += x
+    new_trans.pos.y += y
+    new_trans.pos.z += z
+    #rob.speedj(0.2, 0.5, 99999)
+    rob.set_pose(new_trans, acc=0.1, vel=0.4, command="movej")  # apply the new pose
+
+
+#rob.movej((0, 0, 0, 0, 0, 0), 0.1, 0.2)
+#rob.movel((x, y, z, rx, ry, rz), a, v)
+print("Current tool pose is: ",  rob.getl())
+#set_pos_rel_rot_abs(0, 0, -0.2, math.pi, 0, -math.pi)
+set_pos_abs(0.3, -0.2, 0.5, math.pi, 0, -math.pi)
+set_pos_abs(0, 0.2, 0.6, math.pi, 0, -math.pi)
+set_pos_abs(-0.5, -0.2, 0.4, math.pi, 0, -math.pi)
+#set_pos_rel_rot_abs(0, 0, 0, math.pi, 0, -math.pi)
+print("Current tool pose is: ",  rob.getl())
+sys.exit(0)
+rob.stop()
+