diff --git a/newmodeljsonparse.py b/newmodeljsonparse.py
index 2c85af9f900c76dddaf3ffb4b28cab82aee5a5c0..533f08093231bdc654e0191c38d54c62bf739aa0 100644
--- a/newmodeljsonparse.py
+++ b/newmodeljsonparse.py
@@ -68,9 +68,10 @@ class Parameter:
 
 #Function class that can be instantiated using JsonDecod functions
 class Function:
-    def __init__(self, name, description, inargsdatatypes = None, outargsdatatypes = None):
+    def __init__(self, name, description, uuid, inargsdatatypes = None, outargsdatatypes = None):
         self.name = name
         self.description = description
+        self.uuid = uuid
         self.inargsdatatypes = inargsdatatypes
         self.outargsdatatypes = outargsdatatypes
 
@@ -255,6 +256,17 @@ def getVariables(list1, interface, jsoncomponents):
         return list1
 
 
+def getFunctionVariables(list1, interface, jsoncomponents):
+    variablelist = interface["functions"]
+    list1 = list1 + variablelist
+    if iskeythere(list(interface.keys()), "baseComponent"):
+        for component in jsoncomponents:
+            if component["uuid"] == interface["baseComponent"]:
+                return getFunctionVariables(list1, component, jsoncomponents)
+    else:
+        return list1
+
+
 def getEvents(list1, component, jsoncomponents):
     for event in component["events"]:
         list1.append(event)
@@ -302,7 +314,8 @@ def buildComponents(interfacesreturn, variabledict, jsoninterfaces, jsoncomponen
             wf.writeparameter(parameterobjs, interfacesreturn[str(obj["name"])], enumnodedict, enumvalues, enumnames)
             objfunctionlist = getInterfaceparam([], rootobj, "functions", jsoncomponents, jsonfunctions)
             functionobj = getFunctions(objfunctionlist, jsonparameters, jsonmeasurements)
-            wf.writefunction(functionobj, interfacesreturn[str(obj["name"])])
+            functionvars = getFunctionVariables([], rootobj, jsoncomponents)
+            wf.writefunction(functionobj, interfacesreturn[str(obj["name"])], functionvars)
             buildComponents(interfacesreturn, variabledict, objcomponentslist, jsoncomponents, jsonmeasurements, jsonparameters, jsonfunctions, objcomponentsclone, enumnodedict, enumvalues, enumnames)
     return interfacesreturn, variabledict
 
@@ -339,7 +352,7 @@ def instantiate(typesdict, interfaces, jsoncomponents):
         events = getEvents([], root, jsoncomponents)
         streams = getStreams([], root, jsoncomponents)
         components = getInterfaceparam([], root, "components", jsoncomponents, jsoncomponents)
-        instantiatedict[str(interface["uuid"])] = wf.writeinterface(typesdict[str(interface["name"])], interface["name"], count)
+        instantiatedict[str(interface["uuid"])] = wf.writeinterface(typesdict[str(interface["name"])], interface["name"])
         eventsdict[str(interface["uuid"])] = events
         streamsdict[str(interface["uuid"])] = streams
         return instantiateComponents(typesdict, components, jsoncomponents, interface, instantiatedict, eventsdict, streamsdict)
diff --git a/writefile.py b/writefile.py
index a39c2efaa231941b2d477cc89583716616eab934..f38cdff50caaf9498c6caf519a064271a2dd450b 100644
--- a/writefile.py
+++ b/writefile.py
@@ -3,7 +3,7 @@ import tomli
 
 """
 This File takes the prepared Data structures and writes the OPC-UA Server based on them.
-    Methods: defFunction, getVariantType, writebeginning, writeenums, openobject, writeenumobj, writemeasurement, writeparameter,
+    Methods: defFunction, getVariantType, writebeginning, writeenums, openobject, writemeasurement, writeparameter,
              writefunction, writeobjects, writeinterface, writeevents, writestreams, writendpt1, triggerevents, triggerstreams,
              writendpt2
 """
@@ -158,36 +158,10 @@ def openobject(objname, description):
     writeindent = "    "
     server.write(writeindent + "#creating the objecttype\n")
     objtypename = (objname.lower()).replace(" ", "") + "type"
-    server.write(writeindent + objtypename + "= await server.nodes.base_object_type.add_object_type(idx, \"" + objname +"\" )\n")
+    server.write(writeindent + objtypename + "= await server.nodes.base_object_type.add_object_type(idx, \"" + objname + "\" )\n\n")
     return objtypename
 
 
-def writeenumobj(variable, headnode, enumnodedict, enumvaldict, enumvariantdict):
-    """
-    Creates the variables with the type enum.
-    :param variable: the variableobject that is created
-    :param headnode: the component to which the variable belongs
-    :param enumnodedict: Dict of the format {enum uuid: enum opc ua nodename}
-    :param enumvaldict: Dict of the format {enum uuid: changed values for the propertie names}
-                            (same as returnvalues from writeenums)
-    :param enumvariantdict: Dict of the format {enum uuid: enum name}
-    :return: name of the created variablenode
-    """
-    server = open("opcua-server.py", "a")
-    writeindent = "    "
-    uuid = variable.uuid
-    varname = (variable.name.lower()).replace(" ","") + "var"
-    server.write(writeindent + varname + " = await " + headnode + ".add_variable(idx,  \"" + variable.name + "\", " + variable.value + ", datatype=" + enumnodedict[variable.uuid] + ".nodeid)\n")
-    server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n")
-    i = 0
-    for value in enumvaldict[variable.uuid]:
-        valname = "value" + str(i)
-        server.write(writeindent + valname + " = await " + varname + ".add_property(idx, \"" + str(value) + "\", \"" + str(value) + "\")\n")
-        server.write(writeindent + "await " + valname + "." + "set_modelling_rule(True)\n")
-        i += 1
-    return varname
-
-
 def writemeasurement(measurementobj, headnode, enumnodedict, enumvaldict, enumvariantdict):
     #ToDo: Schauen ob man returns rausnehmen kann
     """
@@ -197,20 +171,28 @@ def writemeasurement(measurementobj, headnode, enumnodedict, enumvaldict, enumva
     :param enumnodedict: Dict for the names of the enum nodes from writeenums (used for writeenumobj)
     :param enumvaldict: Dict for the enumvalues from writenums (used for writeenumobj)
     :param enumvariantdict: Dict for the name of the enums (used for writeenumobj)
-    :return: a dict for the measurement node names
+    :return: None
     """
     server = open("opcua-server.py", "a")
     writeindent = "    "
     measurementdict = {}
+    if len(measurementobj) > 0:
+        server.write(writeindent + "# measurements for " + headnode + "\n")
     for i in measurementobj:
+        varname = ((i.name).lower()).replace(" ", "") + "var"
         if i.datatype == "enum":
-            varname = writeenumobj(i, headnode, enumnodedict, enumvaldict, enumvariantdict)
             measurementdict[i.name] = varname
+            server.write(writeindent + varname + " = await " + headnode + ".add_variable(idx,  \"" + i.name + "\", " + i.value + ", datatype=" + enumnodedict[i.uuid] + ".nodeid)\n")
+            server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n")
+            count = 0
+            for value in enumvaldict[i.uuid]:
+                valname = "value" + str(count)
+                server.write(writeindent + valname + " = await " + varname + ".add_property(idx, \"" + str(value) + "\", \"" + str(value) + "\")\n")
+                server.write(writeindent + "await " + valname + "." + "set_modelling_rule(True)\n")
+                i += 1
         else:
             varianttype = getVariantType(i.datatype)
             datatype = "measurementtype.nodeid"
-            varname = ((i.name).lower()).replace(" ", "") + "var"
-            measurementdict[i.name] = varname
             server.write(writeindent + varname + " = " + "await " + headnode + ".add_variable(idx, \"" + str(
                 i.name) + "\", " + str(i.value) + ", " + varianttype + ", " + datatype + ")\n")
             server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n")
@@ -223,14 +205,10 @@ def writemeasurement(measurementobj, headnode, enumnodedict, enumvaldict, enumva
                 server.write(
                     writeindent + unitname + " = await " + varname + ".add_property(idx, \"unit\"," + "\"" + i.unit + "\")\n")
                 server.write(writeindent + "await " + unitname + ".set_modelling_rule(True)\n")
-
         server.write(
             writeindent + varname + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n")
         server.write(writeindent + "await "+ varname + "description.set_modelling_rule(True)\n\n")
 
-    server.write("\n" + writeindent + "#creating all parameters with their properties\n")
-    return measurementdict
-
 
 def writeparameter(parameterobj, headnode, enumnodedict, enumvaldict, enumvariantdict):
     """
@@ -240,15 +218,24 @@ def writeparameter(parameterobj, headnode, enumnodedict, enumvaldict, enumvarian
     :param enumnodedict: Dict for the names of the enum nodes from writeenums (used for writeenumobj)
     :param enumvaldict: Dict for the enumvalues from writenums (used for writeenumobj)
     :param enumvariantdict: Dict for the name of the enums (used for writeenumobj)
-    :return: A dict with the node names of the parameters
+    :return: None
     """
     writeindent = "    "
     server = open("opcua-server.py", "a")
     parameterdict = {}
+    if len(parameterobj) > 0:
+        server.write(writeindent + "# parameters for " + headnode + "\n")
     for i in parameterobj:
         if i.datatype == "enum":
-            varname = writeenumobj(i, headnode, enumnodedict, enumvaldict, enumvariantdict)
-            parameterdict[i.name] = varname
+            varname = (i.name.lower()).replace(" ", "") + "var"
+            server.write(writeindent + varname + " = await " + headnode + ".add_variable(idx,  \"" + i.name + "\", " + i.value + ", datatype=" + enumnodedict[i.uuid] + ".nodeid)\n")
+            server.write(writeindent + "await " + varname + "." + "set_modelling_rule(True)\n")
+            count = 0
+            for value in enumvaldict[i.uuid]:
+                valname = "value" + str(count)
+                server.write(writeindent + valname + " = await " + varname + ".add_property(idx, \"" + str(value) + "\", \"" + str(value) + "\")\n")
+                server.write(writeindent + "await " + valname + "." + "set_modelling_rule(True)\n")
+                count += 1
         else:
             varianttype = getVariantType(i.datatype)
             datatype = "parametertype.nodeid"
@@ -271,20 +258,27 @@ def writeparameter(parameterobj, headnode, enumnodedict, enumvaldict, enumvarian
         server.write(
             writeindent + varname + "description = await " + varname + ".add_property(idx, \"Description\", " + "\"" + i.description + "\")" + "\n")
         server.write(writeindent + "await " + varname + "description.set_modelling_rule(True)\n\n")
-    return parameterdict
 
 
-def writefunction(functionobj, headnode):
+def writefunction(functionobj, headnode, functionlist):
     """
     Takes the function objects writes the function body by calling deffunction and adds it to the objecttypes
     :param functionobj: List of functionobjects
     :param headnode: component the functions belong to
+    :param functionlist: List of all functions from the component with the Format {name: value}
     :return: None
     """
     server = open("opcua-server.py", "a")
     writeindent = "    "
+    functionname = ""
     for i in functionobj:
-        functionname = (i.name.lower()).replace(" ", "")
+        print(i)
+        for fobj in functionlist:
+            if fobj["value"] == i.uuid:
+                print(fobj["name"])
+                functionname = (fobj["name"].lower()).replace(" ", "")
+                functionlist.remove(fobj)
+                break
         defFunction(functionname, server, 1, i.inargsnames, i)
         server.write("\n")
         inargslist = []
@@ -313,25 +307,25 @@ def writeobjects(objtype, objname, headnode, count):
     """
     server = open("opcua-server.py", "a")
     writeindent = "    "
+    server.write(writeindent + "# creating object \n")
     objtypename = (objname.lower()).replace(" ", "") + "var" + str(count)
     server.write(
-        writeindent + objtypename + "= await " + headnode + ".add_object(idx, \"" + objname + "\", " + objtype + ".nodeid)\n")
+        writeindent + objtypename + "= await " + headnode + ".add_object(idx, \"" + objname + "\", " + objtype + ".nodeid)\n\n")
     return objtypename
 
 
-def writeinterface(objtype, objname, count):
+def writeinterface(objtype, objname):
     """
     Generates the interface, meaning the highest object layer. (Works similar to writeobjects)
     :param objtype: The name of the node with the objecttype
     :param objname: The name of the object
-    :param count: (Currently not really implemented) but for counting the names up
-                    if an object with the same name is instantiated twice.
     :return: The name of the newly created objectnode
     """
     server = open("opcua-server.py", "a")
     writeindent = "    "
-    objtypename = (objname.lower()).replace(" ","") + "var" + str(count)
-    server.write(writeindent + objtypename + "= await server.nodes.objects.add_object(idx, \"" + objname + "\", " + objtype + ".nodeid)\n")
+    server.write(writeindent + "# creating Interface\n")
+    objtypename = (objname.lower()).replace(" ","") + "var"
+    server.write(writeindent + objtypename + "= await server.nodes.objects.add_object(idx, \"" + objname + "\", " + objtype + ".nodeid)\n\n")
     return objtypename
 
 
@@ -345,6 +339,8 @@ def writeevents(events, component, eventlist):
     """
     server = open("opcua-server.py", "a")
     writeindent = "    "
+    if len(events) > 0:
+        server.write(writeindent + "# creating event and eventgenerators for " + component + "\n")
     for event in events:
         eventname = (event["element"].lower()).replace(" ", "") + component + str(event["severity"])
         eventgenname = eventname + "generator"
@@ -362,7 +358,7 @@ def writeevents(events, component, eventlist):
             severity = 1000
         server.write(writeindent + eventname + " = await server.create_custom_event_type(idx, \"" + str(event["element"]) + " " + str(event["severity"]) + "\", ua.ObjectIds.SystemEventType)\n")
         server.write(writeindent + str(eventlist[eventname]) + " = await server.get_event_generator(" + eventname + ", " + component + ")\n")
-        server.write(writeindent + str(eventlist[eventname]) + ".event.Severity = " + str(severity) + "\n")
+        server.write(writeindent + str(eventlist[eventname]) + ".event.Severity = " + str(severity) + "\n\n")
     return eventlist
 
 
@@ -383,6 +379,8 @@ def writestreams(streams, component, streamslist, variablelist, jsonmeasurements
     server = open("opcua-server.py", "a")
     writeindent = "    "
     updatestreamdict = {}
+    if len(streamslist) > 0:
+        server.write(writeindent + "# creating events and event generators for" + component + "\n")
     for stream in streams:
         streamname = (stream["measurement"].lower()).replace(" ", "") + component
         streamgenname = streamname + "generator"
@@ -407,7 +405,7 @@ def writestreams(streams, component, streamslist, variablelist, jsonmeasurements
                 writevalue = "\"" + value + "\""
             else:
                 writevalue = str(value)
-            server.write(writeindent + savevaluename + " = " + writevalue + "\n")
+            server.write(writeindent + savevaluename + " = " + writevalue + "\n\n")
             updatestreamdict[streamname] = savevaluename
 
     return streamslist, updatestreamdict
@@ -443,6 +441,8 @@ def triggerevents(generatordict, eventslist, component, variablelist, jsonmeasur
     indent = 3
     writeindent = ""
     variablenamelist = {}
+    if len(eventslist) > 0:
+        server.write("          # triggering events from " + component + "\n")
     for event in eventslist:
         writeindent = ""
         for i in range(indent):
@@ -471,7 +471,7 @@ def triggerevents(generatordict, eventslist, component, variablelist, jsonmeasur
             trigger = "\"" + str(event["target"] + "\"")
         server.write(writeindent + "if (await " + valuename + ".get_value()) " + event["trigger"] + " " + trigger + ":\n")
         writeindent += "    "
-        server.write(writeindent + "await " + generatorname + ".trigger(message=\"" + event["message"] + "\")\n")
+        server.write(writeindent + "await " + generatorname + ".trigger(message=\"" + event["message"] + "\")\n\n")
         writeindent = ""
         for i in range(indent):
             writeindent += "    "
@@ -493,6 +493,8 @@ def triggerstreams(generatordict, streamslist, component, variablelist, jsonmeas
     """
     server = open("opcua-server.py", "a")
     indent = 3
+    if len(streamslist) > 0:
+        server.write("          # triggering streams from " + component + "\n")
     for stream in streamslist:
         writeindent = ""
         streamname = ""
@@ -514,7 +516,7 @@ def triggerstreams(generatordict, streamslist, component, variablelist, jsonmeas
             writeindent += "    "
             server.write(writeindent + "puffer = await " + valuename + ".get_value()\n")
             server.write(writeindent + "await " + generatorname + ".trigger(message= \"value\" + str(puffer))\n")
-            server.write(writeindent + savevaldict[(stream["measurement"].lower()).replace(" ", "") + component] + " = puffer \n")
+            server.write(writeindent + savevaldict[(stream["measurement"].lower()).replace(" ", "") + component] + " = puffer \n\n")
             writeindent = ""
             for i in range(indent):
                 writeindent += "    "
@@ -524,7 +526,7 @@ def triggerstreams(generatordict, streamslist, component, variablelist, jsonmeas
             server.write(writeindent + "if "+ stream["measurement"] + "time == 0:\n")
             writeindent += "    "
             server.write(writeindent + "puffer = await " + valuename + ".get_value()\n")
-            server.write(writeindent + "await " + generatorname + ".trigger(message=\"" + stream["measurement"] + " value: \" + str(puffer))\n")
+            server.write(writeindent + "await " + generatorname + ".trigger(message=\"" + stream["measurement"] + " value: \" + str(puffer))\n\n")
             writeindent = ""
             for i in range(indent):
                 writeindent += "    "