diff --git a/net_api_generator/generator.py b/net_api_generator/generator.py
index b6b9028f4561564c8ef5350978ab98d03e24120a..26616a3b4527678bdc8e9aa67f426a8968f8269e 100644
--- a/net_api_generator/generator.py
+++ b/net_api_generator/generator.py
@@ -286,58 +286,8 @@ def typescript(output_dir):
         return "export interface ParamList {\n\t old: string[],\n\t new: string[]\n}"
 
     def generate_api_function(api_function: ApiFunction) -> str:
-        def generate_api_call(api_function: ApiFunction) -> str:
-            api_code =  "\t" + api_function.name + "(config: any, {$param}){\n$code\n\t}"
-            # generate parameters of api_function for signature
-            for parameter in api_function.parameters.values():
-                replace_string = ""
-                if parameter.new is not None and parameter.old is not None:
-                    # issue: param is old and new at the same time. Need to figure out how to
-                    replace_string = parameter.name + "_new"
-                    api_code = api_code.replace("$param", replace_string + ", $param")
-                    replace_string = parameter.name + "_old"
-                    api_code = api_code.replace("$param", replace_string + ", $param")
-                else:
-                    if parameter.new is not None:
-                        replace_string += parameter.name + "_new"
-                    if parameter.old is not None:
-                        replace_string += parameter.name + "_old"
-                    api_code = api_code.replace("$param", replace_string+ ", $param")
-            api_code = api_code.replace('$param', '')
-            # generate param declaration string
-            param_declaration = ("\t\tconst params = {\n\t\t\t'new': {$new},\n\t\t\t'old': {$old}\n\t\t}")
-            param_old_string = ""
-            param_new_string = ""
-            for param_key, parameter in api_function.parameters.items():
-                if parameter.new is not None:
-                    param_new_string  += parameter.name + ": " + parameter.name + "_new, "
-                if parameter.old is not None:
-                    param_old_string += parameter.name + ": " + parameter.name + "_old, "
-            param_new_string = param_new_string[:-2]
-            param_old_string = param_old_string[:-2]
-            if '_old' not in param_old_string:
-                param_declaration = param_declaration.replace("$old", " ")
-            else:
-                param_declaration = param_declaration.replace("$old", "\n\t\t\t\t" + param_old_string + "\n\t\t\t")
-            if'_new' not in param_new_string:
-                param_declaration = param_declaration.replace("$new", " ")
-            else:
-                param_declaration = param_declaration.replace("$new", "\n\t\t\t\t" + param_new_string + "\n\t\t\t")
-
-            # create axios request (at least when only post request is used
-            path = api_function.fq_name.replace('.','/')
-            axios_statement = ""
-            if api_function.is_data_manipulating:
-                axios_statement = "return Axios.$METHOD(`${NETVSConfig.NETDB_API_BASE_URL}/${NETVSConfig.NETDB_API_VERSION}/"+path+"`, params, (config || {}).netdb_axios_config)"
-                axios_statement = axios_statement.replace("$METHOD", 'post')
-            else:
-                pass
-                # axios_statement.replace("$METHOD", 'get')
-            api_code = api_code.replace("$code", param_declaration + "\n\t\t" + axios_statement)
-            return api_code
-
         def generate_param_list(api_function: ApiFunction) -> str:
-            code_template = ("\t$METHOD_NAMEParamList(): ParamList {\n"
+            code_template = ("\t$METHOD_NAMEParamList (): ParamList {\n"
                              "\t\treturn {\n"
                              "\t\t\t'old': [$OLD],\n"
                              "\t\t\t'new': [$NEW],\n"
@@ -362,6 +312,65 @@ def typescript(output_dir):
             return code_template
 
         param_list_function = generate_param_list(api_function)
+
+        def generate_api_call(api_function: ApiFunction) -> str:
+            code_template = ("\t$METHOD_NAME (config: any, $FUNCTION_ATTRIBUTE) {\n"
+                             "\t\tconst params = {\n"
+                             "\t\t\t'new': {\n"
+                             "\t\t\t\t$NEW\n"
+                             "\t\t\t},\n"
+                             "\t\t\t'old':{\n"
+                             "\t\t\t\t$OLD\n"
+                             "\t\t\t}\n"
+                             "\t\t}\n"
+                             "\t\tAxios.$HTTP_METHOD(`${NETVSConfig.NETDB_API_BASE_URL}/${NETVSConfig.NETDB_API_VERSION}/$PATH`, params, (config || {}).netdb_axios_config)\n"
+                             "\t}")
+
+            code_template = code_template.replace('$METHOD_NAME', api_function.name)
+
+            for index, parameter in enumerate(api_function.parameters.values()):
+                # function attributes
+                function_attribute_replace_string = "$PARAMETER_OLD_NAME: $PARAMETER_TYPE, $PARAMETER_NEW_NAME: $PARAMETER_TYPE"
+                if parameter.old is not None:
+                    function_attribute_replace_string = function_attribute_replace_string.replace("$PARAMETER_OLD_NAME", parameter.name + "_old")
+                else:
+                    function_attribute_replace_string = function_attribute_replace_string.replace("$PARAMETER_OLD_NAME: $PARAMETER_TYPE, ", "")
+                if parameter.new is not None:
+                    function_attribute_replace_string = function_attribute_replace_string.replace("$PARAMETER_NEW_NAME", parameter.name + "_new")
+                else:
+                    function_attribute_replace_string = function_attribute_replace_string.replace(", $PARAMETER_NEW_NAME: $PARAMETER_TYPE", "")
+                function_attribute_replace_string = function_attribute_replace_string.replace("$PARAMETER_TYPE", map_netdb_type_to_typescript_type(parameter.data_type))
+
+                if index < len(api_function.parameters) - 1:
+                    code_template = code_template.replace("$FUNCTION_ATTRIBUTE", function_attribute_replace_string + ", $FUNCTION_ATTRIBUTE")
+                else:
+                    code_template = code_template.replace("$FUNCTION_ATTRIBUTE", function_attribute_replace_string)
+
+                # params definition
+                if parameter.old is not None:
+                    parameter_old_replacement_str = parameter.name + ": " + parameter.name + "_old"
+                    if index < len(api_function.parameters) - 1:
+                       parameter_old_replacement_str += ", $OLD"
+                    code_template = code_template.replace("$OLD", parameter_old_replacement_str)
+                if parameter.new is not None:
+                    parameter_new_replacement_str = parameter.name + ": " + parameter.name + "_new"
+                    if index < len(api_function.parameters) - 1:
+                        parameter_new_replacement_str += ", $NEW"
+                    code_template = code_template.replace("$NEW", parameter_new_replacement_str)
+            # cleanup: replace remaining $NEW and $OLD with empty strings
+            code_template = re.sub(r'\n\t\t\t\t\$OLD\n\t\t\t|\$OLD', "", code_template)
+            # code_template = code_template(r'\n\t\t\t\t$OLD\n\t\t\t|$OLD', "")
+            code_template =  re.sub(r'\n\t\t\t\t\$NEW\n\t\t\t|\$NEW', "", code_template)
+
+            if api_function.is_data_manipulating:
+                code_template = code_template.replace('$HTTP_METHOD', "post")
+            else:
+                code_template = code_template.replace('$HTTP_METHOD', "get")
+
+            path_replacement_str = api_function.fq_name.replace(".", "/")
+            code_template = code_template.replace("$PATH", path_replacement_str)
+            print(code_template)
+            return code_template
         api_function_code = generate_api_call(api_function)
 
         return param_list_function + ",\n" + api_function_code