diff --git a/Ccs/ccs_function_lib.py b/Ccs/ccs_function_lib.py
index 7f1dfa957ed551d6ef5f24f06823c826d9e19c39..e4fe4e276ab682f655af996306a6b15c7ec67a9a 100644
--- a/Ccs/ccs_function_lib.py
+++ b/Ccs/ccs_function_lib.py
@@ -2546,7 +2546,7 @@ def Tcsend_DB(cmd, *args, ack=None, pool_name=None, sleep=0., no_check=False, pk
 
 ##
 #  Generate TC
-def Tcbuild(cmd, *args, sdid=0, ack=None, no_check=False, hack_value=None, source_data_only=False, **kwargs):
+def Tcbuild(cmd, *args, sdid=0, ack=None, no_check=False, hack_value=None, source_data_only=False, fmt='raw', **kwargs):
     """
     Create TC bytestring for CMD with corresponding parameters
 
@@ -2604,6 +2604,9 @@ def Tcbuild(cmd, *args, sdid=0, ack=None, no_check=False, hack_value=None, sourc
         else:
             values = hack_value
 
+        if fmt == 'tcl':
+            return cmd, params, values
+
         pdata = encode_pus(params, *values)
 
         if source_data_only:
diff --git a/Ccs/tools/convert_to_tcl.py b/Ccs/tools/convert_to_tcl.py
new file mode 100644
index 0000000000000000000000000000000000000000..576763dc9ea2583bebfa747706eec941902c7d63
--- /dev/null
+++ b/Ccs/tools/convert_to_tcl.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python3
+
+import sys
+sys.path.insert(0, '..')
+
+import ccs_function_lib as cfl
+
+TCL_CMD_STR = "tcsend {} {} checks ALL ackFlags 15"
+
+TCL_PKT_VER_STR = 'subscribepacket {} referby {}\nwaitfor {} -timeout {}\nsyslog "{} received"\nunsubscribepacket {}'
+
+def get_cname(cdescr):
+    try:
+        descr, = cfl.scoped_session_idb.execute('select ccf_cname from ccf where ccf_descr="{}"'.format(cdescr)).fetchall()[0]
+    except IndexError:
+        descr = cdescr
+    finally:
+        cfl.scoped_session_idb.close()
+    return descr
+
+def get_tm_info(st, sst, pi1):
+    return cfl.scoped_session_idb.execute('select pid_spid from pid where pid_type="{}" and pid_stype="{}" and pid_pi1_val="{}"'.format(st, sst, pi1)).fetchall()[0]
+
+def build_tcl_cmd(cmd, *args, **kwargs):
+
+    cdescr, params, values = cfl.Tcbuild(cmd, *args, fmt='tcl', **kwargs)
+    cname = get_cname(cdescr)
+
+    ed_pars = [param for param in params if param[5] not in ['A', 'F']]
+    if len(ed_pars) != len(values):
+        raise ValueError('Wrong number of parameters: Expected {}, but got {}.\n{}'.format(len(ed_pars), len(values), ', '.join(x[10] for x in ed_pars)))
+
+
+    pconfig = [(p[12], v) for p, v in zip(ed_pars, values)]
+    pstr = ["{{{} {}}}".format(*pv) for pv in pconfig]
+
+    return TCL_CMD_STR.format(cname, " ".join(pstr))
+
+def build_tcl_pkt_ver(st, sst, pi1, wait=5.):
+
+    spid, descr = get_tm_info(st, sst, pi1)
+
+    return TCL_PKT_VER_STR.format(spid, descr, descr, wait, descr, spid)
+
+
+
+# MemoryID16 = "MRAM"  # JA0H0124
+# # N_16 = 1  # JA0H0042 [NOT EDITABLE]
+# StartAddress = 0x80000  # JA0H0125
+# Length = 8  # JA0H0123
+# Data = b'DEADBEEF'  # JA0H0122
+# tc=build_tcl_cmd('BSW_SetParamValue', 2818572294, 42, pool_name='LIVE')
+# pass
\ No newline at end of file