diff --git a/README.md b/README.md
index beb0ae6724e202f1c5755ea06fec1240632f64d9..7a62c7b904617294c45d2a32877266d5e7936fae 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 # Python Unified Device Interface
-Current stable version: 5.2.5
+Current stable version: 6.0.2
 
 ## Installation
 1. Install the *WZL-Utilities* dependency via pip
@@ -34,14 +34,6 @@ Setup your server as follows:
     sensors = [Sensor(macs[i]) for i in range(3)]
     implementation = Environment(sensors)
     
-    # configure MQTT publisher
-    mqtt = MQTTPublisher(MQTT_USER)
-    mqtt.connect(MQTT_BROKER, MQTT_PORT, MQTT_USER, MQTT_PASSWORD)
-    
-    # configure message publishing 
-    message_schedule = docstring_parser.parse_docstrings_for_mqtt(implementation)
-    message_scheduler = MessageScheduluer(loop, message_schedule, [mqtt])
-
     # configure HTTP server
     mapping = src.test.devices.mapping.mapping(implementation)
     model = Component.load('./src/test/devices/environmental_sensor/Environment.json', mapping)
@@ -61,10 +53,19 @@ Setup your server as follows:
 2. If you are not using MQTT or HTTP leave out the respective lines. 
 
 ## Recent changes
-5.2.5
+6.0.2 | 5.2.5
 - bug fix
-  - fixed parsing of parameters and measurements of type "time" for higher dimensions
+  - fixed parsing of parameters and variables/ measurements of type "time" for higher dimensions 
+
+6.0.1
+- bug fix
+  - fixed parsing of parameters and measurements of type "time" for higher dimensions 
   
+6.0.0
+- renamed Object to Component and Variable to Measurement. UUID now starts with COM MEA respectively
+- marked Object and Variable as deprecated
+- marked docstring parsing as deprecated due to its error-prone behaviour
+
 5.2.4
 - bug fix
     - variables and parameters of type 'enum' and 'time' are now returned correctly
diff --git a/setup.py b/setup.py
index fbefba3b2ec66aadaa2ff720a747637a6297c70a..25fa7e0c1e51fc4a49df2a8fe52d96e5b373b617 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
 from setuptools import setup, find_packages
 
 setup(name='wzl-udi',
-      version='5.2.5',
+      version='6.0.2',
       url='',
       author='Matthias Bodenbenner',
       author_email='m.bodenbenner@wzl.rwth-aachen.de',
diff --git a/src/soil/figure.py b/src/soil/figure.py
index bfeef2e094ddf76b533f574d32938e9d0455061a..b885cf0b0ae1c4cab1346403fe3ad941d9f89d47 100644
--- a/src/soil/figure.py
+++ b/src/soil/figure.py
@@ -7,7 +7,7 @@ import datetime
 import nest_asyncio
 import strict_rfc3339 as rfc3339
 import time
-from typing import Any, List, Callable
+from typing import Any, List, Callable, Union
 from wzl.utilities import root_logger
 
 nest_asyncio.apply()
@@ -46,13 +46,14 @@ class Figure(Element, ABC):
         if getter is not None and not callable(getter):
             raise TypeError("{}: The getter of the Figure must be callable!".format(uuid))
         self._datatype = datatype
-        if datatype == 'time' and value is not None and value != "":
+        self._dimension = dimension
+        self._range = range
+        if datatype == 'time':
             self._value = parse_time(value)
         else:
             self._value = value
-        self._dimension = dimension
         self._getter = getter
-        self._range = range
+
 
     @property
     def datatype(self):
diff --git a/test/devices/lasertracker/Lasertracker.json b/test/devices/lasertracker/Lasertracker.json
new file mode 100644
index 0000000000000000000000000000000000000000..c32e28f2b938baddc24f6eb359210e650523ba43
--- /dev/null
+++ b/test/devices/lasertracker/Lasertracker.json
@@ -0,0 +1,355 @@
+{
+  "components": [
+    {
+      "components": [
+        {
+          "components": [],
+          "functions": [
+            {
+              "arguments": [
+                {
+                  "range": [
+                    null,
+                    null
+                  ],
+                  "datatype": "double",
+                  "dimension": [],
+                  "value": 0,
+                  "unit": "C81",
+                  "uuid": "ARG-Azimuth",
+                  "name": "Azimuth",
+                  "description": "Azimuth angle the laser tracker head is jogged."
+                },
+                {
+                  "range": [
+                    null,
+                    null
+                  ],
+                  "datatype": "double",
+                  "dimension": [],
+                  "value": 0,
+                  "unit": "C81",
+                  "uuid": "ARG-Elevation",
+                  "name": "Elevation",
+                  "description": "Elevation angle the laser tracker head is jogged."
+                }
+              ],
+              "returns": [],
+              "uuid": "FUN-Jog",
+              "name": "Jog",
+              "description": "Jogs the tracker head by the given angles for the azimuth and elevation."
+            },
+            {
+              "arguments": [
+                {
+                  "range": [
+                    null,
+                    null
+                  ],
+                  "datatype": "double",
+                  "dimension": [
+                    3
+                  ],
+                  "value": [
+                    0,
+                    0,
+                    0
+                  ],
+                  "unit": "MTR",
+                  "uuid": "ARG-Position",
+                  "name": "Position",
+                  "description": "Position to which the laser tracker should point."
+                }
+              ],
+              "returns": [],
+              "uuid": "FUN-PointTo",
+              "name": "PointTo",
+              "description": "Moves the tracker head so that the laser points to the specified position."
+            }
+          ],
+          "measurements": [
+            {
+              "range": [
+                null,
+                null
+              ],
+              "datatype": "double",
+              "dimension": [
+                3
+              ],
+              "value": [
+                0,
+                0,
+                0
+              ],
+              "unit": "MTR",
+              "uuid": "MEA-Position",
+              "name": "Position",
+              "description": "Most recently dispatched measured position."
+            },
+            {
+              "range": [
+                null,
+                null
+              ],
+              "datatype": "double",
+              "dimension": [
+                4
+              ],
+              "value": [
+                0,
+                0,
+                0,
+                0
+              ],
+              "unit": "NONE",
+              "uuid": "MEA-Quaternion",
+              "name": "Quaternion",
+              "description": "Most recently dispatched measured orientation as quaternion, if available."
+            },
+            {
+              "range": [
+                null,
+                null
+              ],
+              "datatype": "double",
+              "dimension": [],
+              "value": 0,
+              "unit": "C81",
+              "uuid": "MEA-Azimuth",
+              "name": "Azimuth",
+              "description": "Current position of azimuth rotation encoder in Radian."
+            },
+            {
+              "range": [
+                null,
+                null
+              ],
+              "datatype": "double",
+              "dimension": [],
+              "value": 0,
+              "unit": "C81",
+              "uuid": "MEA-Elevation",
+              "name": "Elevation",
+              "description": "Current position of elevation rotation encoder."
+            },
+            {
+              "range": [
+                null,
+                null
+              ],
+              "datatype": "double",
+              "dimension": [],
+              "value": 0,
+              "unit": "MTR",
+              "uuid": "MEA-Distance",
+              "name": "Distance",
+              "description": "Measured distance to the currently activate target."
+            },
+            {
+              "range": [
+                "False",
+                "True"
+              ],
+              "datatype": "bool",
+              "dimension": [
+                2,
+                3
+              ],
+              "value": [
+                [
+                  true,
+                  true,
+                  true
+                ],
+                [
+                  true,
+                  true,
+                  true
+                ]
+              ],
+              "unit": "NONE",
+              "uuid": "MEA-Online",
+              "name": "Online",
+              "description": "Some description..."
+            }
+          ],
+          "parameters": [
+            {
+              "constant": true,
+              "range": [
+                "OK",
+                "WARNING",
+                "ERROR",
+                "MAINTENANCE"
+              ],
+              "datatype": "enum",
+              "dimension": [],
+              "value": "ERROR",
+              "unit": "NONE",
+              "uuid": "PAR-State",
+              "name": "State",
+              "description": "Reflects the current state of the target. If logged in: OK. If not stable: WARNING. If lost: ERROR."
+            },
+            {
+              "constant": true,
+              "range": [
+                0,
+                null
+              ],
+              "datatype": "string",
+              "dimension": [],
+              "value": "",
+              "unit": "NONE",
+              "uuid": "PAR-Calibration",
+              "name": "Calibration",
+              "description": "Unique identifier that can be used to retrieve a corresponding calibration certificate."
+            },
+            {
+              "constant": false,
+              "range": [
+                null,
+                null
+              ],
+              "datatype": "int",
+              "dimension": [],
+              "value": 0,
+              "unit": "NONE",
+              "uuid": "PAR-Interval",
+              "name": "Interval",
+              "description": "Some description..."
+            }
+          ],
+          "uuid": "COM-Base",
+          "name": "Base",
+          "description": "Represents a base station in a distributed system. "
+        }
+      ],
+      "functions": [],
+      "measurements": [],
+      "parameters": [],
+      "uuid": "COM-BaseStations",
+      "name": "Base Stations",
+      "description": "Object acting as a list of base stations of the metrology system. "
+    },
+    {
+      "components": [
+        {
+          "uuid": "COM-Home-Target",
+          "name": "Home Target",
+          "description": "Represents an individual mobile entity ",
+          "parameters": [
+            {
+              "uuid": "PAR-State",
+              "value": "ERROR"
+            },
+            {
+              "uuid": "PAR-Mode",
+              "value": "Continuous"
+            },
+            {
+              "uuid": "PAR-Type",
+              "value": "SMR"
+            },
+            {
+              "uuid": "PAR-Calibration",
+              "value": ""
+            }
+          ],
+          "file": "./MobileEntities/Target.json"
+        }
+      ],
+      "functions": [],
+      "measurements": [],
+      "parameters": [],
+      "uuid": "COM-MobileEntities",
+      "name": "Mobile Entities",
+      "description": "Object acting as a list of mobile entities in the metrology system."
+    }
+  ],
+  "functions": [
+    {
+      "arguments": [],
+      "returns": [],
+      "uuid": "FUN-Reset",
+      "name": "Reset",
+      "description": "Resets the device into the state like directly after start-up."
+    },
+    {
+      "arguments": [],
+      "returns": [],
+      "uuid": "FUN-Shutdown",
+      "name": "Shutdown",
+      "description": "Gracefully shutdown the device."
+    }
+  ],
+  "measurements": [],
+  "parameters": [
+    {
+      "constant": false,
+      "range": [
+        "OK",
+        "WARNING",
+        "ERROR",
+        "MAINTENANCE"
+      ],
+      "datatype": "enum",
+      "dimension": [],
+      "value": "OK",
+      "unit": "NONE",
+      "uuid": "PAR-State",
+      "name": "State",
+      "description": "The current state of the device."
+    },
+    {
+      "constant": true,
+      "range": [
+        null,
+        null
+      ],
+      "datatype": "string",
+      "dimension": [],
+      "value": "Laboratory for Machine Tools and Production Engineering WZL of RWTH Aachen",
+      "unit": "NONE",
+      "uuid": "PAR-Manufacturer",
+      "name": "Manufacturer",
+      "description": "Name of manufacturing company."
+    },
+    {
+      "constant": true,
+      "range": [
+        0,
+        null
+      ],
+      "datatype": "int",
+      "dimension": [],
+      "value": 1,
+      "unit": "NONE",
+      "uuid": "PAR-Version",
+      "name": "Version",
+      "description": "Incremental API-Version."
+    },
+    {
+      "constant": true,
+      "range": [
+        null,
+        null
+      ],
+      "datatype": "time",
+      "dimension": [
+        2
+      ],
+      "value": [
+        "2021-05-03T15:30:00.0000Z",
+        "2021-05-03T15:30:00.0000Z"
+      ],
+      "unit": "NONE",
+      "uuid": "PAR-Time",
+      "name": "Time",
+      "description": "Current system time."
+    }
+  ],
+  "uuid": "COM-Lasertracker",
+  "name": "Lasertracker",
+  "description": "Active coordinate measurement device based on laser interferometry for Large-Scale metrology applications."
+}
\ No newline at end of file
diff --git a/test/devices/lasertracker/MobileEntities/Target.json b/test/devices/lasertracker/MobileEntities/Target.json
new file mode 100644
index 0000000000000000000000000000000000000000..105272190780e915b002b9c21c938fa89f3cebec
--- /dev/null
+++ b/test/devices/lasertracker/MobileEntities/Target.json
@@ -0,0 +1 @@
+{"components": [], "functions": [{"arguments": [], "returns": [], "uuid": "FUN-Reset", "name": "Reset", "description": "Starts the search routine around the current direction."}, {"arguments": [], "returns": [], "uuid": "FUN-Trigger", "name": "Trigger", "description": "Trigger count measurements and set the resulting label to nonce. This function is only allowed in triggered acquisition mode."}], "measurements": [{"range": [null, null], "datatype": "double", "dimension": [3], "value": [0, 0, 0], "unit": "MTR", "uuid": "MEA-Position", "name": "Position", "description": "Most recently dispatched measured position."}, {"range": [null, null], "datatype": "double", "dimension": [4], "value": [0, 0, 0, 0], "unit": "NONE", "uuid": "MEA-Quaternion", "name": "Quaternion", "description": "Most recently dispatched measured orientation as quaternion, if available."}], "parameters": [{"constant": true, "range": ["OK", "WARNING", "ERROR", "MAINTENANCE"], "datatype": "enum", "dimension": [], "value": "ERROR", "unit": "NONE", "uuid": "PAR-State", "name": "State", "description": "Reflects the current state of the target. If logged in: OK. If not stable: WARNING. If lost: ERROR."}, {"constant": true, "range": ["Continuous", "Triggered", "External", "Idle"], "datatype": "enum", "dimension": [], "value": "Continuous", "unit": "NONE", "uuid": "PAR-Mode", "name": "Mode", "description": "Current state of the entity. In CONTINUOUS mode, values are dispatched as fast as possible. In TRIGGERED mode, values are only dispatches after a software trigger. In EXTERNAL mode, values are dispatched in accordance to an external trigger, e.g. probe or TTL. IDLE means the entity is currently not used."}, {"constant": true, "range": [null, null], "datatype": "string", "dimension": [], "value": "SMR", "unit": "NONE", "uuid": "PAR-Type", "name": "Type", "description": "System specific identifier of the target Type, e.g. SMR or Active SMR."}, {"constant": true, "range": [0, null], "datatype": "string", "dimension": [], "value": "", "unit": "NONE", "uuid": "PAR-Calibration", "name": "Calibration", "description": "Unique identifier that can be used to retrieve a corresponding calibration certificate."}, {"constant": false, "range": ["False", "True"], "datatype": "bool", "dimension": [], "value": false, "unit": "NONE", "uuid": "PAR-Locked", "name": "Locked", "description": "Some description..."}], "uuid": "COM-Target", "name": "Target", "description": "Represents an individual mobile entity "}
\ No newline at end of file
diff --git a/test/devices/lasertracker/__init__.py b/test/devices/lasertracker/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/test/devices/lasertracker/const.py b/test/devices/lasertracker/const.py
new file mode 100644
index 0000000000000000000000000000000000000000..d1cd96ac3c340e9a462d96d05892966c632a3e9f
--- /dev/null
+++ b/test/devices/lasertracker/const.py
@@ -0,0 +1,10 @@
+MQTT_USERNAME = ''
+MQTT_PASSWORD = ''
+
+# MQTT_BROKER = 'wzl-mbroker01.wzl.rwth-aachen.de'
+# MQTT_PORT = 1883
+# MQTT_VHOST = "metrology"
+
+MQTT_BROKER = 'localhost'
+MQTT_PORT = 1883
+MQTT_VHOST = ""
diff --git a/test/devices/lasertracker/device/__init__.py b/test/devices/lasertracker/device/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/test/devices/lasertracker/device/com_base.py b/test/devices/lasertracker/device/com_base.py
new file mode 100644
index 0000000000000000000000000000000000000000..c29c83484ce7c9be3aa0a197928d0d9b2a21eea0
--- /dev/null
+++ b/test/devices/lasertracker/device/com_base.py
@@ -0,0 +1,71 @@
+from typing import Dict
+
+from typing import List
+from device.enums import StateEnum
+
+class COMBase(object):
+
+    def __init__(self, device):
+        self._device = device
+        self._mea_position = [0, 0, 0]
+        self._mea_quaternion = [0, 0, 0, 0]
+        self._mea_azimuth = 0
+        self._mea_elevation = 0
+        self._mea_distance = 0
+        self._mea_online = [[True, True, True], [True, True, True]]
+        self._par_state = StateEnum.ERROR
+        self._par_calibration = ""
+        self._par_interval = 0
+        # TODO implement
+
+    def get_mea_position(self) -> List[float]:
+        # TODO implement
+        return self._mea_position
+    
+    def get_mea_quaternion(self) -> List[float]:
+        # TODO implement
+        return self._mea_quaternion
+    
+    def get_mea_azimuth(self) -> float:
+        # TODO implement
+        return self._mea_azimuth
+    
+    def get_mea_elevation(self) -> float:
+        # TODO implement
+        return self._mea_elevation
+    
+    def get_mea_distance(self) -> float:
+        # TODO implement
+        return self._mea_distance
+    
+    def get_mea_online(self) -> List[List[bool]]:
+        # TODO implement
+        return self._mea_online
+    
+    def get_par_state(self) -> StateEnum:
+        # TODO implement
+        return self._par_state
+    
+    def get_par_calibration(self) -> str:
+        # TODO implement
+        return self._par_calibration
+    
+    def get_par_interval(self) -> int:
+        # TODO implement
+        return self._par_interval
+    
+    def set_par_interval(self, par_interval: int):
+        # TODO implement
+        self._par_interval = par_interval
+    
+    
+    def fun_jog(self, arg_azimuth: float = 0, arg_elevation: float = 0):
+        # TODO implement
+        pass
+    
+    
+    def fun_pointto(self, arg_position: List[float] = [0, 0, 0]):
+        arg_position = [0, 0, 0] if arg_position is None else arg_position
+        # TODO implement
+        pass
+    
\ No newline at end of file
diff --git a/test/devices/lasertracker/device/com_basestations.py b/test/devices/lasertracker/device/com_basestations.py
new file mode 100644
index 0000000000000000000000000000000000000000..817753141a252eb1623c65385040d0284583c138
--- /dev/null
+++ b/test/devices/lasertracker/device/com_basestations.py
@@ -0,0 +1,10 @@
+from typing import Dict
+
+from device.com_base import COMBase
+
+class COMBaseStations(object):
+
+    def __init__(self, device):
+        self._device = device
+        self._com_base = COMBase(device)
+        # TODO implement
diff --git a/test/devices/lasertracker/device/com_lasertracker.py b/test/devices/lasertracker/device/com_lasertracker.py
new file mode 100644
index 0000000000000000000000000000000000000000..202cf3d0f5e896234a79b53838cb290033aa3fb5
--- /dev/null
+++ b/test/devices/lasertracker/device/com_lasertracker.py
@@ -0,0 +1,50 @@
+from typing import Dict
+
+from device.com_basestations import COMBaseStations
+from device.com_mobileentities import COMMobileEntities
+import datetime
+from typing import List
+from device.enums import StateEnum
+
+class COMLasertracker(object):
+
+    def __init__(self, device):
+        self._device = device
+        self._par_state = StateEnum.OK
+        self._par_manufacturer = "Laboratory for Machine Tools and Production Engineering WZL of RWTH Aachen"
+        self._par_version = 1
+        self._par_time = [datetime.datetime.fromtimestamp(1620048600.0), datetime.datetime.fromtimestamp(1620048600.0)]
+        self._com_basestations = COMBaseStations(device)
+        self._com_mobileentities = COMMobileEntities(device)
+        # TODO implement
+
+    def get_par_state(self) -> StateEnum:
+        # TODO implement
+        return self._par_state
+    
+    def set_par_state(self, par_state: StateEnum):
+        # TODO implement
+        self._par_state = par_state
+    
+    def get_par_manufacturer(self) -> str:
+        # TODO implement
+        return self._par_manufacturer
+    
+    def get_par_version(self) -> int:
+        # TODO implement
+        return self._par_version
+    
+    def get_par_time(self) -> List['datetime']:
+        # TODO implement
+        return self._par_time
+    
+    
+    def fun_reset(self):
+        # TODO implement
+        pass
+    
+    
+    def fun_shutdown(self):
+        # TODO implement
+        pass
+    
\ No newline at end of file
diff --git a/test/devices/lasertracker/device/com_mobileentities.py b/test/devices/lasertracker/device/com_mobileentities.py
new file mode 100644
index 0000000000000000000000000000000000000000..e67d0cca7a32e0d9fdb907564ddc86c7655f9607
--- /dev/null
+++ b/test/devices/lasertracker/device/com_mobileentities.py
@@ -0,0 +1,18 @@
+from typing import Dict
+
+from device.com_target import COMTarget
+from device.enums import StateEnum, ModeEnum
+
+class COMMobileEntities(object):
+
+    def __init__(self, device):
+        self._device = device
+        self._com_target = {}
+        self._com_target["COM-Home-Target"] = COMTarget(device, StateEnum.ERROR, ModeEnum.Continuous, "SMR", "")
+        # TODO implement
+
+    def add(self, uuid: str, child: COMTarget):
+        self._com_target[uuid] = child
+
+    def remove(self, uuid: str):
+        del self._com_target[uuid]
diff --git a/test/devices/lasertracker/device/com_target.py b/test/devices/lasertracker/device/com_target.py
new file mode 100644
index 0000000000000000000000000000000000000000..b867c696a59dbd820ae733e7f87583c1bc81a168
--- /dev/null
+++ b/test/devices/lasertracker/device/com_target.py
@@ -0,0 +1,60 @@
+from typing import Dict
+
+from typing import List
+from device.enums import StateEnum, ModeEnum
+
+class COMTarget(object):
+
+    def __init__(self, device, par_state: StateEnum = StateEnum.ERROR, par_mode: ModeEnum = ModeEnum.Continuous, par_type: str = "SMR", par_calibration: str = "", par_locked: bool = False):
+        self._device = device
+        self._mea_position = [0, 0, 0]
+        self._mea_quaternion = [0, 0, 0, 0]
+        self._par_state = par_state
+        self._par_mode = par_mode
+        self._par_type = par_type
+        self._par_calibration = par_calibration
+        self._par_locked = par_locked
+        # TODO implement
+
+    def get_mea_position(self) -> List[float]:
+        # TODO implement
+        return self._mea_position
+    
+    def get_mea_quaternion(self) -> List[float]:
+        # TODO implement
+        return self._mea_quaternion
+    
+    def get_par_state(self) -> StateEnum:
+        # TODO implement
+        return self._par_state
+    
+    def get_par_mode(self) -> ModeEnum:
+        # TODO implement
+        return self._par_mode
+    
+    def get_par_type(self) -> str:
+        # TODO implement
+        return self._par_type
+    
+    def get_par_calibration(self) -> str:
+        # TODO implement
+        return self._par_calibration
+    
+    def get_par_locked(self) -> bool:
+        # TODO implement
+        return self._par_locked
+    
+    def set_par_locked(self, par_locked: bool):
+        # TODO implement
+        self._par_locked = par_locked
+    
+    
+    def fun_reset(self):
+        # TODO implement
+        pass
+    
+    
+    def fun_trigger(self):
+        # TODO implement
+        pass
+    
\ No newline at end of file
diff --git a/test/devices/lasertracker/device/device.py b/test/devices/lasertracker/device/device.py
new file mode 100644
index 0000000000000000000000000000000000000000..f47c3bd7052c2f922e6efb565bf012d5cf20d27c
--- /dev/null
+++ b/test/devices/lasertracker/device/device.py
@@ -0,0 +1,9 @@
+class Device(object):
+
+    def __init__(self):
+        # TODO implement
+        pass
+
+    def __del__(self):
+        # TODO implement
+        pass
\ No newline at end of file
diff --git a/test/devices/lasertracker/device/enums.py b/test/devices/lasertracker/device/enums.py
new file mode 100644
index 0000000000000000000000000000000000000000..acb3c7dda819c00d16332c91e26bbf3c4d5e0385
--- /dev/null
+++ b/test/devices/lasertracker/device/enums.py
@@ -0,0 +1,32 @@
+from enum import Enum
+
+class StateEnum(Enum):
+    OK = 0
+    WARNING = 1
+    ERROR = 2
+    MAINTENANCE = 3
+
+    def __str__(self):
+        return ["OK", "WARNING", "ERROR", "MAINTENANCE"][self.value]
+
+    @classmethod
+    def from_string(cls, name):
+        return {"OK": StateEnum.OK, "WARNING": StateEnum.WARNING, "ERROR": StateEnum.ERROR, "MAINTENANCE": StateEnum.MAINTENANCE}[name]
+
+
+
+class ModeEnum(Enum):
+    Continuous = 0
+    Triggered = 1
+    External = 2
+    Idle = 3
+
+    def __str__(self):
+        return ["Continuous", "Triggered", "External", "Idle"][self.value]
+
+    @classmethod
+    def from_string(cls, name):
+        return {"Continuous": ModeEnum.Continuous, "Triggered": ModeEnum.Triggered, "External": ModeEnum.External, "Idle": ModeEnum.Idle}[name]
+
+
+
diff --git a/test/devices/lasertracker/device/start.py b/test/devices/lasertracker/device/start.py
new file mode 100644
index 0000000000000000000000000000000000000000..f1d7630bf746d3709d7208470228fd7de4bd475c
--- /dev/null
+++ b/test/devices/lasertracker/device/start.py
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+import asyncio
+import datetime
+import sys
+from concurrent.futures import ThreadPoolExecutor
+
+from devices.lasertracker.const import MQTT_USERNAME, MQTT_PASSWORD, MQTT_BROKER, MQTT_VHOST, MQTT_PORT
+from wzl.utilities import root_logger
+from wzl.mqtt import MQTTPublisher
+from src.soil.component import Component
+from src.http.server import HTTPServer
+from src.soil.event import Event, EventSeverity, EventTrigger
+from src.soil.stream import FixedJob, ConfigurableJob, EventJob, UpdateJob, MessageScheduler, EventScheduler, UpdateScheduler
+
+from devices.lasertracker.device.enums import StateEnum, ModeEnum
+from devices.lasertracker.device.com_lasertracker import COMLasertracker
+
+sys.setswitchinterval(0.0005)
+
+
+def start(com_lasertracker: COMLasertracker):
+    # server settings
+    address = '127.0.0.1'
+    port = '8000'
+
+    main_logger = root_logger.get(__name__)
+
+    # set up servers
+    executor = ThreadPoolExecutor(max_workers=100)
+    loop = asyncio.get_event_loop()
+    loop.set_default_executor(executor)
+
+    # configure mqtt
+    mqtt = MQTTPublisher(MQTT_USERNAME)
+    mqtt.connect(MQTT_BROKER, MQTT_PORT, MQTT_VHOST + ":" + MQTT_USERNAME, MQTT_PASSWORD)
+
+    # configure messages
+    message_schedule = []
+    update_schedule = []
+    message_schedule += [
+        FixedJob("COM-Lasertracker/COM-BaseStations/COM-Base/MEA-Position", 1, com_lasertracker._com_basestations._com_base.get_mea_position)]
+    for child0_uuid in com_lasertracker._com_mobileentities._com_target:
+        message_schedule += [FixedJob("COM-Lasertracker/COM-MobileEntities/{}/MEA-Position".format(child0_uuid), 1,
+                                      com_lasertracker._com_mobileentities._com_target[child0_uuid].get_mea_position)]
+    message_scheduler = MessageScheduler(loop, message_schedule, [mqtt])
+
+    for child0_uuid in com_lasertracker._com_mobileentities._com_target:
+        update_schedule += [UpdateJob("COM-Lasertracker/COM-MobileEntities/{}/MEA-Quaternion".format(child0_uuid),
+                                      com_lasertracker._com_mobileentities._com_target[child0_uuid].get_mea_quaternion)]
+    update_scheduler = UpdateScheduler(loop, update_schedule, [mqtt])
+
+    # configure events
+    event_schedule = []
+    event_schedule += [
+        EventJob("COM-Lasertracker/COM-BaseStations/COM-Base/MEA-Distance", 10, com_lasertracker._com_basestations._com_base.get_mea_distance,
+                 Event(EventSeverity.WARNING, EventTrigger.LARGER, "double", 50, "The target is distance is large. Uncertainty might be high."))]
+    event_schedule += [
+        EventJob("COM-Lasertracker/COM-BaseStations/COM-Base/PAR-State", 10, com_lasertracker._com_basestations._com_base.get_par_state,
+                 Event(EventSeverity.ERROR, EventTrigger.EQUALS, "enum", StateEnum.ERROR, "An error occured!"))]
+    for child0_uuid in com_lasertracker._com_mobileentities._com_target:
+        event_schedule += [EventJob("COM-Lasertracker/COM-MobileEntities/{}/PAR-Locked".format(child0_uuid), 10,
+                                    com_lasertracker._com_mobileentities._com_target[child0_uuid].get_par_locked,
+                                    Event(EventSeverity.WARNING, EventTrigger.EQUALS, "bool", False, "Target is not locked!"))]
+    event_scheduler = EventScheduler(loop, event_schedule, [mqtt])
+
+    # configure model
+    mapping = {}
+    mapping['COM-Lasertracker'] = {'add': None, 'remove': None}
+    submapping = mapping['COM-Lasertracker']
+    submapping['PAR-State'] = {'getter': com_lasertracker.get_par_state, 'setter': com_lasertracker.set_par_state}
+    submapping['PAR-Manufacturer'] = {'getter': com_lasertracker.get_par_manufacturer, 'setter': None}
+    submapping['PAR-Version'] = {'getter': com_lasertracker.get_par_version, 'setter': None}
+    submapping['PAR-Time'] = {'getter': com_lasertracker.get_par_time, 'setter': None}
+    submapping['FUN-Reset'] = {'method': com_lasertracker.fun_reset, 'signature': {'arguments': {}, 'returns': []}}
+    submapping['FUN-Shutdown'] = {'method': com_lasertracker.fun_shutdown, 'signature': {'arguments': {}, 'returns': []}}
+    mapping['COM-Lasertracker']['COM-BaseStations'] = {'add': None, 'remove': None}
+    submapping = mapping['COM-Lasertracker']['COM-BaseStations']
+    mapping['COM-Lasertracker']['COM-BaseStations']['COM-Base'] = {'add': None, 'remove': None}
+    submapping = mapping['COM-Lasertracker']['COM-BaseStations']['COM-Base']
+    submapping['MEA-Position'] = com_lasertracker._com_basestations._com_base.get_mea_position
+    submapping['MEA-Quaternion'] = com_lasertracker._com_basestations._com_base.get_mea_quaternion
+    submapping['MEA-Azimuth'] = com_lasertracker._com_basestations._com_base.get_mea_azimuth
+    submapping['MEA-Elevation'] = com_lasertracker._com_basestations._com_base.get_mea_elevation
+    submapping['MEA-Distance'] = com_lasertracker._com_basestations._com_base.get_mea_distance
+    submapping['MEA-Online'] = com_lasertracker._com_basestations._com_base.get_mea_online
+    submapping['PAR-State'] = {'getter': com_lasertracker._com_basestations._com_base.get_par_state, 'setter': None}
+    submapping['PAR-Calibration'] = {'getter': com_lasertracker._com_basestations._com_base.get_par_calibration, 'setter': None}
+    submapping['PAR-Interval'] = {'getter': com_lasertracker._com_basestations._com_base.get_par_interval,
+                                  'setter': com_lasertracker._com_basestations._com_base.set_par_interval}
+    submapping['FUN-Jog'] = {'method': com_lasertracker._com_basestations._com_base.fun_jog,
+                             'signature': {'arguments': {'ARG-Azimuth': 'arg_azimuth', 'ARG-Elevation': 'arg_elevation'}, 'returns': []}}
+    submapping['FUN-PointTo'] = {'method': com_lasertracker._com_basestations._com_base.fun_pointto,
+                                 'signature': {'arguments': {'ARG-Position': 'arg_position'}, 'returns': []}}
+    mapping['COM-Lasertracker']['COM-MobileEntities'] = {'add': com_lasertracker._com_mobileentities.add,
+                                                         'remove': com_lasertracker._com_mobileentities.remove}
+    submapping = mapping['COM-Lasertracker']['COM-MobileEntities']
+    for child0_uuid in com_lasertracker._com_mobileentities._com_target:
+        mapping['COM-Lasertracker']['COM-MobileEntities'][child0_uuid] = {'add': None, 'remove': None}
+        submapping = mapping['COM-Lasertracker']['COM-MobileEntities'][child0_uuid]
+        submapping['MEA-Position'] = com_lasertracker._com_mobileentities._com_target[child0_uuid].get_mea_position
+        submapping['MEA-Quaternion'] = com_lasertracker._com_mobileentities._com_target[child0_uuid].get_mea_quaternion
+        submapping['PAR-State'] = {'getter': com_lasertracker._com_mobileentities._com_target[child0_uuid].get_par_state, 'setter': None}
+        submapping['PAR-Mode'] = {'getter': com_lasertracker._com_mobileentities._com_target[child0_uuid].get_par_mode, 'setter': None}
+        submapping['PAR-Type'] = {'getter': com_lasertracker._com_mobileentities._com_target[child0_uuid].get_par_type, 'setter': None}
+        submapping['PAR-Calibration'] = {'getter': com_lasertracker._com_mobileentities._com_target[child0_uuid].get_par_calibration, 'setter': None}
+        submapping['PAR-Locked'] = {'getter': com_lasertracker._com_mobileentities._com_target[child0_uuid].get_par_locked,
+                                    'setter': com_lasertracker._com_mobileentities._com_target[child0_uuid].set_par_locked}
+        submapping['FUN-Reset'] = {'method': com_lasertracker._com_mobileentities._com_target[child0_uuid].fun_reset,
+                                   'signature': {'arguments': {}, 'returns': []}}
+        submapping['FUN-Trigger'] = {'method': com_lasertracker._com_mobileentities._com_target[child0_uuid].fun_trigger,
+                                     'signature': {'arguments': {}, 'returns': []}}
+    model = Component.load('./Lasertracker.json', mapping['COM-Lasertracker'])
+
+    http = HTTPServer(loop, address, port, model)
+
+    # start servers
+    main_logger.info("Starting main asynchronous loop")
+    try:
+        loop.run_forever()
+    except:
+        pass
+    finally:
+        loop.close()
diff --git a/test/devices/lasertracker/lasertracker.py b/test/devices/lasertracker/lasertracker.py
new file mode 100644
index 0000000000000000000000000000000000000000..b6bd99caafac17159422f6d96fb42d17ba191e7c
--- /dev/null
+++ b/test/devices/lasertracker/lasertracker.py
@@ -0,0 +1,30 @@
+import datetime
+import random
+
+from device.enums import StateEnum
+from device.com_lasertracker import COMLasertracker
+
+
+class Lasertracker(COMLasertracker):
+
+    def __init__(self, device):
+        COMLasertracker.__init__(self, device)
+
+    def get_par_state(self):
+        if random.random() < 0.5:
+            self._par_state = StateEnum.OK
+        else:
+            self._par_state = StateEnum.WARNING
+        return self._par_state
+
+    def get_par_time(self):
+        # self._par_time = datetime.datetime.now()
+        return self._par_time
+
+    def fun_reset(self):
+        # TODO implement
+        pass
+
+    def fun_shutdown(self):
+        # TODO implement
+        pass
diff --git a/test/devices/lasertracker/main.py b/test/devices/lasertracker/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..979f9bb5eba06f546431c18c149de3eddfa3586b
--- /dev/null
+++ b/test/devices/lasertracker/main.py
@@ -0,0 +1,12 @@
+# -*- coding: utf-8 -*-
+
+from device.device import Device
+from device.start import start
+from lasertracker import Lasertracker
+
+if __name__ == "__main__":
+
+    device = Device()
+    lasertracker = Lasertracker(device)
+
+    start(lasertracker)
\ No newline at end of file