diff --git a/lrs_util/apiutil.py b/lrs_util/apiutil.py
new file mode 100644
index 0000000000000000000000000000000000000000..f3ff98bd698a91698e7e5ec837079a61ca25b97d
--- /dev/null
+++ b/lrs_util/apiutil.py
@@ -0,0 +1,169 @@
+import uuid
+import json
+
+from dataclasses import dataclass, field
+from typing import Any, Dict, List
+
+@dataclass
+class Signal:
+    task_uuid: str
+    ns: str
+
+    def get_signal(self, signal):
+        mobj = {}
+        mobj["com-uuid"] = str(uuid.uuid4())
+        mobj["command"] = "signal-task"
+        mobj["sender"] = "commander"
+        mobj["signal"] = signal
+        mobj["task-uuid"] = self.task_uuid
+        mstr = json.dumps(mobj, sort_keys=True, indent=4, separators=(',', ': '))
+        topic = "exec/command"
+        return self.ns.lstrip("/"), topic, mstr
+    #        try:
+    #            client = rospy.ServiceProxy('send_topic_msg_to_unit', SendTopicMsgToUnit)
+    #            resp = client(self.ns.lstrip("/"), topic, mstr)
+    #            print("RESP:", resp)            
+    #        except rospy.ServiceException as e:
+    #            print("Service call failed: %s"%e)
+
+
+    def get_signal_unit(self, unit, signal):
+        mobj = {}
+        mobj["com-uuid"] = str(uuid.uuid4())
+        mobj["command"] = "signal-unit"
+        mobj["sender"] = "commander"
+        mobj["signal"] = signal
+        mobj["unit"] = unit
+        mstr = json.dumps(mobj, sort_keys=True, indent=4, separators=(',', ': '))
+        topic = "tst/command"
+        return self.ns.lstrip("/"), topic, mstr
+    
+@dataclass
+class SignalNode:
+    node_uuid: str
+    ns: str
+    tree_uuid: str
+    
+    def get_signal(self, signal):
+        mobj = {}
+        mobj["com-uuid"] = str(uuid.uuid4())
+        mobj["command"] = "signal-tst-node"
+        mobj["sender"] = "commander"
+        mobj["signal"] = signal
+        mobj["node-uuid"] = self.node_uuid
+        mstr = json.dumps(mobj, sort_keys=True, indent=4, separators=(',', ': '))
+        topic = "tst/command"
+        ns = "/op0"
+        print(ns, topic, mstr)
+        return ns.lstrip("/"), topic, mstr
+
+    def get_signal_tree(self, signal):
+        print("signal_tree:", signal)
+        mobj = {}
+        mobj["com-uuid"] = str(uuid.uuid4())
+        mobj["command"] = "signal-tst-tree"
+        mobj["sender"] = "commander"
+        mobj["signal"] = signal
+        mobj["node-uuid"] = self.tree_uuid
+        mstr = json.dumps(mobj, sort_keys=True, indent=4, separators=(',', ': '))
+        topic = "tst/command"
+        ns = "/op0"
+        print("signal_tree:", ns, topic, mstr)
+        return ns.lstrip("/"), topic, mstr
+ 
+    def get_signal_unit(self, unit, signal):
+        mobj = {}
+        mobj["com-uuid"] = str(uuid.uuid4())
+        mobj["command"] = "signal-unit"
+        mobj["sender"] = "commander"
+        mobj["signal"] = signal
+        mobj["unit"] = unit
+        mstr = json.dumps(mobj, sort_keys=True, indent=4, separators=(',', ': '))
+        topic = "tst/command"
+        ns = "/op0"
+        print(ns, topic, mstr)
+        return ns.lstrip("/"), topic, mstr        
+
+def cleanup_task(task):
+    task.pop("children", None)
+    common_params = task.pop("common_params", None)
+    cleanup_params(task["params"])
+    return common_params["execunit"]
+
+def cleanup_common_params(jobj):
+    jobj.pop("use_lock")
+
+def cleanup_params(jobj):
+    jobj.pop("use_lock", None)
+
+def cleanup_tst(task):
+    cleanup_common_params(task["common_params"])
+    cleanup_params(task["params"])
+    for child in task["children"]:
+        cleanup_tst(child)
+            
+def get_task_command(jobj, task_uuid=str(uuid.uuid4())):
+    if len(jobj["children"]) != 1:
+        print("ERROR: Not a task")
+    taskobj = jobj["children"][0]
+    execunit = cleanup_task(taskobj)
+    mobj = {}
+    mobj["com-uuid"] = str(uuid.uuid4())
+    mobj["command"] = "start-task"
+    mobj["sender"] = "commander"
+    mobj["execution-unit"] = execunit.lstrip("/")
+    mobj["task-uuid"] = task_uuid
+    mobj["task"] = taskobj
+    mstr = json.dumps(mobj, sort_keys=True, indent=4, separators=(',', ': ')) 
+    ns = jobj["common_params"]["execunit"]
+    signalobj = Signal(mobj["task-uuid"], ns)
+    topic = "exec/command"
+    print(mstr)
+    print("TOPIC:", topic)
+    print("EXECUNIT:", execunit)
+    #    try:
+    #        client = rospy.ServiceProxy('send_topic_msg_to_unit', SendTopicMsgToUnit)
+    #        resp = client(execunit.lstrip("/"), topic, mstr)
+    #        print("RESP:", resp)            
+    #    except rospy.ServiceException as e:
+    #        print("Service call failed: %s"%e)
+    return execunit.lstrip("/"), topic, mstr, signalobj
+            
+def get_tst_command(jobj, root_uuid=str(uuid.uuid4())):
+    print(jobj)
+    if len(jobj["children"]) != 1:
+        print("ERROR: Not a simple TST")
+    tstobj = jobj
+    tstobj["common_params"]["execunit"] = "/op0"
+    tstobj["common_params"]["node-uuid"] = root_uuid
+    cleanup_tst(tstobj)
+    termobj = tstobj["children"][0]
+    termobj["common_params"]["node-uuid"] = str(uuid.uuid4())    
+    signalobj = None
+    print(termobj)
+    ns = "/op0"
+    if "node-uuid" in termobj["common_params"]:
+        signalobj = SignalNode(termobj["common_params"]["node-uuid"], "op0", tstobj["common_params"]["node-uuid"])
+    mobj = {}
+    mobj["com-uuid"] = str(uuid.uuid4())
+    mobj["command"] = "start-tst"
+    mobj["sender"] = "commander"
+    mobj["receiver"] = "op0"
+    # mobj["execution-unit"] = execunit.lstrip("/")
+    # mobj["task-uuid"] = str(uuid.uuid4())
+    mobj["tst"] = tstobj
+    mstr = json.dumps(mobj, sort_keys=True, indent=4, separators=(',', ': ')) 
+    #ns = jobj["common_params"]["execunit"]
+    ns = "/op0"
+    topic = "tst/command"
+    print(mstr)
+    print("TOPIC:", topic)
+    return topic, mstr, signalobj    
+#    try:
+#        client = rospy.ServiceProxy(f'{ns}/send_topic_msg_to_unit', SendTopicMsgToUnit)
+#        resp = client(ns.lstrip("/"), topic, mstr)
+#        print("RESP:", resp)            
+#    except rospy.ServiceException as e:
+#        print("Service call failed: %s"%e)
+#    return signalobj
+        
diff --git a/lrs_util/jsonutil.py b/lrs_util/jsonutil.py
index 5696df3bde27e6bc9ecdf0d870605cc94a335ad0..395f849ae39a736f4dc7ec499ddd2ace46aeceea 100644
--- a/lrs_util/jsonutil.py
+++ b/lrs_util/jsonutil.py
@@ -380,7 +380,7 @@ def json_tree_from_task(ns, name, params, seq_node_uuid="", node_uuid="", use_al
     cobj =  {
         "children": [],
         "common_params": get_common_params (ns, use_alias, node_uuid, use_lock=use_lock),                
-        "name": "look-at-bearing",
+        "name": name,
         "params": params
     }
     jobj["children"].append(cobj)