diff --git a/newmodeljsonparse.py b/newmodeljsonparse.py
index b67e4fc2aa17943f8d650851534a849459e1d5e4..001d112f8411e19dd42ab25b48f74daee031ac35 100644
--- a/newmodeljsonparse.py
+++ b/newmodeljsonparse.py
@@ -30,16 +30,7 @@ class Measurement:
             self.value = float(value)
         else:
             self.value = value
-        # calculate a start value
-        # if self.dimension != 0:
-        #     for i in range(self.dimension):
-        #         arrayval = self.datatype((self.range[0] + self.range[1]) / 2)
-        #         if self.datatype == "float" or self.datatype == "double":
-        #             arrayval = float(arrayval)
-        #         array.append(arrayval)
-        #     self.value = [0.0, 0.0, 0.0]
-        # else:
-        #     self.value = self.datatype(((self.range[0] + self.range[1]) / 2))
+
 
 class Parameter:
     def __init__(self, name, description, datatype, dimension, value, rangevar=None, unit=None, default=None, constant=False):
@@ -67,6 +58,7 @@ class Parameter:
         # else:
         #     self.value = self.datatype(default)
 
+
 class Function:
     def __init__(self, name, description, inargsdatatypes = None, outargsdatatypes = None):
         self.name = name
@@ -74,6 +66,7 @@ class Function:
         self.inargsdatatypes = inargsdatatypes
         self.outargsdatatypes = outargsdatatypes
 
+
 def dimensionchange(string):
     dimarr = string["dimension"]
     if type(dimarr) == list:
@@ -95,15 +88,11 @@ def getdatatypes(argarray):
         return None
 
 
-
 def changerange(string):
-    #print(type(string["range"][0]))
     if iskeythere(string, "range"):
         rangeval = string["range"]
         rangetuple = (rangeval[0], rangeval[1])
-    #print(rangetuple)
         string.update({"range": rangetuple})
-        #print(string["range"])
     else:
         string.update({"range": (None, None)})
    # print(string)
@@ -114,8 +103,6 @@ def getParameters(parametersDict):
     if len(parametersDict) > 0:
         for i in parametersDict:
             obj = i
-            # del obj["value"]
-            #del obj["uuid"]
             dimensionchange(obj)
             obj["value"]=getdefaultvalue(obj["dimension"], obj["datatype"])
             obj = json.dumps(i)
@@ -123,17 +110,14 @@ def getParameters(parametersDict):
             parameterobj.append(parameterobji)
     return parameterobj
 
+
 def getMeasurements(measurementsDict):
-    #extracts the measurements of a Json-Model
     measurementobj = []
     if len(measurementsDict) > 0:
         for i in measurementsDict:
             obj = i
-            #del obj["value"]
-            #del obj["uuid"]
             dimensionchange(obj)
             obj["value"] = getdefaultvalue(obj["dimension"], obj["datatype"])
-            #if i["range"]:
             changerange(obj)
             if not iskeythere(obj, "unit"):
                 obj["unit"] = "UNITLESS"
@@ -142,19 +126,43 @@ def getMeasurements(measurementsDict):
             measurementobj.append(measurementobji)
     return measurementobj
 
+
+def getFunctions(functionsDict, jsonmeasurements, jsonparameters):
+    functionobj = []
+    if len(functionsDict) > 0:
+        for i in functionsDict:
+            obj = i
+            # del obj["value"]
+            arguments = searchlists(obj["arguments"], jsonmeasurements)
+            arguments = arguments + searchlists(obj["arguments"], jsonparameters)
+            returns = []
+            if len(obj["returns"]) > 0:
+                returns = searchlists(obj["returns"], jsonmeasurements) + searchlists(obj["returns"], jsonparameters)
+            obj["inargsnames"] = getobjnames(arguments)
+            obj["outargsnames"] = getobjnames(returns)
+            obj["inargsdatatypes"] = getdatatypes(arguments)
+            obj["outargsdatatypes"] = getdatatypes(returns)
+            #del obj["uuid"]
+            #del obj["arguments"]
+            #del obj["returns"]
+            obj = json.dumps(obj)
+            functionobji = json.loads(obj, object_hook=functionJsonDecod)
+            functionobj.append(functionobji)
+    return functionobj
+
+
 def searchlists(list1, list2):
     print("I am searching")
     objmeasurementlist = []
-   # print(obj["measurements"])
     if len(list1) <= 0:
         return []
     for input in list1:
         for searchobj in list2:
-            # print(measentrance)
             if input["value"] == searchobj["uuid"]:
                 objmeasurementlist.append(searchobj)
     return objmeasurementlist
 
+
 def getdefaultvalue(dimension, datatype):
     if datatype == "float" or datatype == "double" or datatype == "int":
         if dimension > 1:
@@ -167,12 +175,14 @@ def getdefaultvalue(dimension, datatype):
     else:
         return True
 
+
 def iskeythere(list, key):
     for keysearch in list:
         if(keysearch == key):
             return True
     return False
 
+
 def iteratingInterface(obj, dict, componentslist):
     if iskeythere(list(obj.keys()), "baseComponent"):
         for searchobj in componentslist:
@@ -181,17 +191,9 @@ def iteratingInterface(obj, dict, componentslist):
 
 
 def getInterfaceparam(list1, interface, searched, jsoncomponents, searchinglist):
-    #list1.append(searchlists(interface[searched], searchinglist))
-    # if interface["name"] == "Gripper":
-        # print("I am searching Gripper in: ")
-        # print(searchinglist)
-        # print([interface[searched]])
     for inputsearch in interface[searched]:
         for searchobj in searchinglist:
-            # print(inputsearch["value"] + " " + searchobj["uuid"])
             if inputsearch["value"] == searchobj["uuid"]:
-                # print("found matching pair")
-                # print(inputsearch["value"] + " " + searchobj["uuid"])
                 list1.append(searchobj)
     if iskeythere(list(interface.keys()), "baseComponent"):
         for component in jsoncomponents:
@@ -200,7 +202,8 @@ def getInterfaceparam(list1, interface, searched, jsoncomponents, searchinglist)
     else:
         return list1
 
-def buildComponents(interfacesreturn, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, objcomponentsclone):
+
+def buildComponents(interfacesreturn, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone):
     for obj in jsoninterfaces:
         rootobj = {}
         if obj["elementType"] == "interface":
@@ -214,84 +217,37 @@ def buildComponents(interfacesreturn, jsoninterfaces, jsoncomponents, jsonmeasur
         objcomponentslist = getInterfaceparam([], rootobj, "components", jsoncomponents, jsoncomponents)
         if obj["name"] not in interfacesreturn.keys():
             interfacesreturn[str(obj["name"])] = wf.openobject(obj["name"], rootobj["description"])
-            #print(obj["name"])
-            #del obj["cardOpen"]
-            #del obj["uuid"]
-                #rootObjname = obj["rootComponent"]
-
-            # if iskeythere(list(obj.keys()), "baseComponent"):
-            #     basecomponent = obj["baseComponent"]
-            #     for search in jsoncomponents:
-            #         #print(search["uuid"])
-            #         if basecomponent == search["uuid"]:
-            #             wf.writebasecomponent(componenttypesdict[str(obj["name"])], componenttypesdict[str(search["name"])], search["name"])
-            #wf.writecomponents(interfacestypesdict[str(obj["name"])], objcomponentslist, interfacestypesdict)
             objmeasurementlist = getInterfaceparam([], rootobj, "measurements", jsoncomponents, jsonmeasurements)
             print(objmeasurementlist)
             measurementsobjs = getMeasurements(objmeasurementlist)
-            #print(objmeasurementlist)
-            # print(interfacesreturn)
             wf.writemeasurement(measurementsobjs, interfacesreturn[str(obj["name"])])
-            # print("I am searching Parameters")
             objparameterlist = getInterfaceparam([], rootobj, "parameters", jsoncomponents, jsonparameters)
             parameterobjs = getParameters(objparameterlist)
-            # print(objparameterlist)
             wf.writeparameter(parameterobjs, interfacesreturn[str(obj["name"])])
-            buildComponents(interfacesreturn, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, objcomponentsclone)
+            objfunctionlist = getInterfaceparam([], rootobj, "functions", jsoncomponents, jsonfunctions)
+            functionobj = getFunctions(objfunctionlist, jsonparameters, jsonmeasurements)
+            wf.writefunction(functionobj, interfacesreturn[str(obj["name"])])
+            buildComponents(interfacesreturn, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone)
     return interfacesreturn
-    #     if len(objcomponentslist) > 0:
-    #         print("I got called")
-    #         objcomponentsclone = objcomponentslist
-    #     if len(objcomponentslist) == 0:
-    #         if len(objcomponentsclone) > 0:
-    #             print(" I got called")
-    #             print(objcomponentslist)
-    #             return buildComponents(interfacesreturn, objcomponentsclone, jsoncomponents, jsonmeasurements, jsonparameters, objcomponentsclone)
-    #     else:
-    #             return buildComponents(interfacesreturn, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, objcomponentsclone)
-    #
-    # else:
-    #     if len(objcomponentslist) > 0:
-    #         return buildComponents(interfacesreturn, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, objcomponentsclone)
-    #     else:
-    #         return interfacesreturn
-
-
 
 
 def instantiateComponents(typesdict, interfaces, jsoncomponents, headnode, instantiatedict):
         count = 0
         countcomponent = 0
         for interface in interfaces:
-            # root = {}
-            # if interface["elementType"] == "interface":
-            #     for component in jsoncomponents:
-            #         if interface["rootComponent"] == component["uuid"]:
-            #             root = component
-            # else:
             root = interface
-
             components = getInterfaceparam([], root, "components", jsoncomponents, jsoncomponents)
             if interface["name"] in list(instantiatedict.keys()):
                 count += 1
-            # dictname = str(interface["name"]) + str(count)
-            # if interface["elementType"] == "interface":
-            #     instantiatedict[str(dictname)] = wf.writeinterface(typesdict[str(interface["name"])], interface["name"], count)
-            # else:
             instantiatedict[str(interface["name"])] = wf.writeobjects(typesdict[str(interface["name"])], interface["name"], instantiatedict[str(headnode["name"])], count)
-            # for component in components:
-            #     if component["name"] in list(instantiatedict.keys()):
-            #         countcomponent += 1
-                #dictnamecomponent = str(component["name"]) + str(count)
-                # instantiatedict[dictnamecomponent] = wf.writeobjects(typesdict[str(component["name"])], component["name"], instantiatedict[dictname], countcomponent)
             if len(components) > 0:
                 instantiateComponents(typesdict,components , jsoncomponents, interface, instantiatedict)
 
         return instantiatedict
 
+
 def instantiate(typesdict, interfaces, jsoncomponents):
     instantiatedict = {}
-    #print(interfaces)
     for interface in interfaces:
         root = {}
         count = 0
@@ -299,16 +255,14 @@ def instantiate(typesdict, interfaces, jsoncomponents):
             if interface["rootComponent"] == component["uuid"]:
                 root = component
         components = getInterfaceparam([], root, "components", jsoncomponents, jsoncomponents)
-        #dictname = str(interface["name"]) + str(count)
         instantiatedict[str(interface["name"])] = wf.writeinterface(typesdict[str(interface["name"])], interface["name"], count)
         instantiateComponents(typesdict, components, jsoncomponents, interface, instantiatedict)
 
 
-
 def main():
     try:
         JSON_MODEL = sys.argv[1][:-5]
-        if not os.path.exists(os.path.join('..', 'SOIL-OPC-UA', f'{JSON_MODEL}.json')):
+        if not os.path.exists(os.path.join('..', 'soil-opc-ua', f'{JSON_MODEL}.json')):
             raise Exception()
     except Exception as e:
         print('You must provide a file from the folder to be used as root file of the parsing, e.g., "python jsonparser.py model.json".')
@@ -338,59 +292,11 @@ def main():
                 jsoncomponents.append(obj)
             elif obj["elementType"] == "interface":
                 jsoninterfaces.append(obj)
-
-
-        # interfacestypesdict = {}
-        # for obj in jsoninterfaces:
-        #     #print(obj["name"])
-        #     #del obj["cardOpen"]
-        #     #del obj["uuid"]
-        #     rootobj = {}
-        #     for search in jsoncomponents:
-        #         if obj["rootComponent"] == search["uuid"]:
-        #             rootobj = search
-        #     objname = wf.openobject(obj["name"], rootobj["description"])
-        #     interfacestypesdict[str(obj["name"])] = objname
-        #     #rootObjname = obj["rootComponent"]
-        #
-        #     # if iskeythere(list(obj.keys()), "baseComponent"):
-        #     #     basecomponent = obj["baseComponent"]
-        #     #     for search in jsoncomponents:
-        #     #         #print(search["uuid"])
-        #     #         if basecomponent == search["uuid"]:
-        #     #             wf.writebasecomponent(componenttypesdict[str(obj["name"])], componenttypesdict[str(search["name"])], search["name"])
-        #     objcomponentslist = getInterfaceparam([], rootobj, "components", jsoncomponents, jsoncomponents)
-        #     wf.writecomponents(interfacestypesdict[str(obj["name"])], objcomponentslist, interfacestypesdict)
-        #     objmeasurementlist = getInterfaceparam([], rootobj, "measurements", jsoncomponents, jsonmeasurements)
-        #     measurementsobjs = getMeasurements(objmeasurementlist)
-        #     #print(objmeasurementlist)
-        #     wf.writemeasurement(measurementsobjs, interfacestypesdict[str(obj["name"])])
-        #     objparameterlist = getInterfaceparam([], rootobj, "parameters", jsoncomponents, jsonparameters)
-        #     parameterobjs = getParameters(objparameterlist)
-        #     wf.writemeasurement(parameterobjs, interfacestypesdict[str(obj["name"])])
-
-        typesdict = buildComponents({}, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, [])
-        print(typesdict)
+        typesdict = buildComponents({}, jsoninterfaces, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, [])
         intantiateddict = instantiate(typesdict, jsoninterfaces, jsoncomponents)
 
         wf.writend()
 
 
-
-        # print("Measurements: ")
-        # print(objmeasurementlist)
-        # print("\n")
-        # print("Components: ")
-        # print(objcomponentslist)
-        # print("\n")
-        # print("Parameters: ")
-        # print(objparameterlist)
-        # print("\n")
-        # print("Functions: ")
-        # print(jsonfunctions)
-
-
-
-
 if __name__ == '__main__':
     main()
diff --git a/writefile.py b/writefile.py
index 1f7a66d1e97f4dc057f7a14db01575b3d0fad285..471186402b0eb4ccaa4e9dd1bfd3a6f7609b4ddf 100644
--- a/writefile.py
+++ b/writefile.py
@@ -96,6 +96,8 @@ def writecomponents(headnode, componentslist, typesdict):
         objname = component["name"].lower() + "component"
         server.write(writeindent + objname + " = await " + headnode + ".add_object(idx, \"" + component["name"] + "\")\n")
         server.write(writeindent + "await " + objname + "." + "set_modelling_rule(True)\n")
+
+
 def writemeasurement(measurementobj, headnode):
     server = open("opcua-server.py", "a")
     writeindent = "    "
@@ -127,6 +129,7 @@ def writemeasurement(measurementobj, headnode):
     server.write("\n" + writeindent + "#creating all parameters with their properties\n")
     return measurementdict
 
+
 def writeparameter(parameterobj, headnode):
     writeindent = "    "
     server = open("opcua-server.py", "a")
@@ -171,7 +174,10 @@ def writefunction(functionobj, headnode):
         if i.outargsdatatypes != None:
             for j in i.outargsdataypes:
                 inargslist.append(getVariantType(j))
-        server.write(writeindent + "await mobilerobot.add_method(idx, \"" + i.name +"\", " + functionname + ", " + str(inargslist) + ", "+ str(outargslist) + ")\n\n")
+        methodvarname = functionname + "var"
+        server.write(writeindent + methodvarname + " = await " + headnode + ".add_method(idx, \"" + i.name +"\", " + functionname + ", " + str(inargslist) + ", "+ str(outargslist) + ")\n\n")
+        server.write(writeindent + "await " + methodvarname + ".set_modelling_rule(True)\n\n")
+
 
 def writeobjects(objtype, objname, headnode, count):
     server = open("opcua-server.py", "a")