diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/DeclarationGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/DeclarationGenerator.java
index 606629834518eac75b5e597329eb2f80b1ff99d4..c12e28eaca4d3f9d05c3d19b409f9be12792b11a 100644
--- a/src/main/java/de/hhu/stups/codegenerator/generators/DeclarationGenerator.java
+++ b/src/main/java/de/hhu/stups/codegenerator/generators/DeclarationGenerator.java
@@ -92,7 +92,7 @@ public class DeclarationGenerator {
     /*
     * This function generates code for a parameter with the given node from the AST and the information whether it is an output parameter
     */
-    private String generateParameter(DeclarationNode node, boolean isReturn) {
+    public String generateParameter(DeclarationNode node, boolean isReturn) {
         ST declaration = currentGroup.getInstanceOf("parameter");
         TemplateHandler.add(declaration, "isReturn", isReturn);
         TemplateHandler.add(declaration, "type", typeGenerator.generate(node.getType()));
diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java
index 836aa2e9bffa10497a7a91c37c6a647dfd75da01..252a2bd59a38d670f6a811d70d5a6f9e8b169fc2 100755
--- a/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java
+++ b/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java
@@ -279,9 +279,10 @@ public class MachineGenerator implements AbstractVisitor<String, Void> {
 		TemplateHandler.add(machine, "externalFunctions", machineNode.getOperations()
 				.stream()
 				.filter(op -> op.getName().startsWith("EXTERNAL_"))
-				.map(op -> generateExternalFunction(op.getName(), op.getParams()
+				.map(op -> generateExternalFunction(operationGenerator.generateReturnType(op), op.getName(), op.getParams()
 						.stream()
-						.map(DeclarationNode::getName).collect(Collectors.toList())))
+						.map(parameter -> declarationGenerator.generateParameter(parameter, false))
+						.collect(Collectors.toList())))
 				.collect(Collectors.toList()));
 		generateBody(node, machine);
 		return machine.render();
@@ -372,8 +373,9 @@ public class MachineGenerator implements AbstractVisitor<String, Void> {
 		TemplateHandler.add(machine, "structs", recordStructGenerator.generateStructs());
 	}
 
-	private String generateExternalFunction(String name, List<String> parameters) {
+	private String generateExternalFunction(String type, String name, List<String> parameters) {
 		ST template = currentGroup.getInstanceOf("external_function");
+		TemplateHandler.add(template, "type", type);
 		TemplateHandler.add(template, "name", name);
 		TemplateHandler.add(template, "parameters", parameters);
 		return template.render();
diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java
index 54d851f2602b642b1c609fc58f244d1981529c64..8a61e33895cf7c266bf3705bd86db701d12029fd 100644
--- a/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java
+++ b/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java
@@ -125,6 +125,7 @@ public class OperationGenerator {
         TemplateHandler.add(operation, "parameters", declarationGenerator.generateDeclarations(node.getParams(), DeclarationType.PARAMETER, false));
         TemplateHandler.add(operation, "parameterNames", node.getParams().stream().map(DeclarationNode::getName).collect(Collectors.toList()));
         TemplateHandler.add(operation, "returnParameters", declarationGenerator.generateDeclarations(node.getOutputParams(), DeclarationType.PARAMETER, true));
+        TemplateHandler.add(operation, "hasReturnParameters", !node.getOutputParams().isEmpty());
         return operation;
     }
 
@@ -142,6 +143,17 @@ public class OperationGenerator {
         }
     }
 
+    public String generateReturnType(OperationNode node) {
+        List<DeclarationNode> outputs = node.getOutputParams();
+        if(outputs.size() > 1) {
+            return recordStructGenerator.getStruct(node);
+        } else if(outputs.size() == 1) {
+            return typeGenerator.generate(outputs.get(0).getType());
+        } else {
+            return typeGenerator.generateVoid();
+        }
+    }
+
     /*
     * This function generates code for empty output parameters
     */
diff --git a/src/main/resources/de/hhu/stups/codegenerator/JavaTemplate.stg b/src/main/resources/de/hhu/stups/codegenerator/JavaTemplate.stg
index fc4b0607e57be92efcc4ec3b26b657e879e74a8f..c140af61ea1ea8df78bb3d3a723afe243ebacb76 100644
--- a/src/main/resources/de/hhu/stups/codegenerator/JavaTemplate.stg
+++ b/src/main/resources/de/hhu/stups/codegenerator/JavaTemplate.stg
@@ -317,10 +317,14 @@ public <machine>(<if(hasExternalFunctions)>ExternalFunctionsInterface _externalF
 method() ::= <<
 >>
 
-operation(returnType, operationName, parameters, locals, body, return, isExternal, parameterNames) ::= <<
+operation(returnType, operationName, parameters, locals, body, return, isExternal, hasReturnParameters, parameterNames) ::= <<
 public <returnType> <operationName>(<parameters; separator=", ">) {
     <if(isExternal)>
+    <if(hasReturnParameters)>
+    return _externalFunctions.<operationName>(<parameterNames; separator=", ">);
+    <else>
     _externalFunctions.<operationName>(<parameterNames; separator=", ">);
+    <endif>
     <else>
     <locals; separator="\n">
     <body>
@@ -1867,6 +1871,6 @@ transition_cache_declaration(type, identifier, operationHasParams) ::= <<
 
 set_initialization(identifier, type, enums) ::= <<>>
 
-external_function(name, parameters) ::= <<
-void <name>(<parameters; separator=",">);
+external_function(type, name, parameters) ::= <<
+<type> <name>(<parameters; separator=",">);
 >>
\ No newline at end of file
diff --git a/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch b/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch
index 51e761ded8ab7e6ee415e58317a9e6a0b7f1271f..0ada38950496d633255f2ec7b5d885c14a6badd0 100644
--- a/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch
+++ b/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch
@@ -12,12 +12,12 @@ INITIALISATION
   cycle := 1
 
 OPERATIONS
-  EXTERN_Init =
+  EXTERNAL_Init =
   SELECT init = FALSE THEN
     init := TRUE
   END;
   
-  EXTERN_open_link =
+  EXTERNAL_open_link =
   SELECT init = TRUE THEN
     skip
   END;
@@ -28,7 +28,7 @@ OPERATIONS
   "high_level" - cflib.crazyflie.high_level_commander.HighLevelCommander
   "position_high_level" (the default) - cflib.positioning.position_hl_commander.PositionHlCommander
   */
-  EXTERN_open_link_with_commander_type(commander) =
+  EXTERNAL_open_link_with_commander_type(commander) =
   SELECT
     init = TRUE
     & commander : STRING
@@ -36,27 +36,27 @@ OPERATIONS
     skip
   END;
 
-  EXTERN_close_link =
+  EXTERNAL_close_link =
   SELECT init = TRUE THEN
     skip
   END;
 
-  EXTERN_register_sensors =
+  EXTERNAL_register_sensors =
   SELECT init = TRUE THEN
     skip
   END;
 
-  EXTERN_Drone_Takeoff =
+  EXTERNAL_Drone_Takeoff =
   SELECT init = TRUE THEN
     skip
   END;
 
-  EXTERN_Drone_Land =
+  EXTERNAL_Drone_Land =
   SELECT init = TRUE THEN
     skip
   END;
 
-  EXTERN_Drone_Left(dist) =
+  EXTERNAL_Drone_Left(dist) =
   SELECT
     init = TRUE &
     dist : 0..2000
@@ -64,7 +64,7 @@ OPERATIONS
     skip
   END;
 
-  EXTERN_Drone_Right(dist) =
+  EXTERNAL_Drone_Right(dist) =
   SELECT
     init = TRUE &
     dist : 0..2000
@@ -72,7 +72,7 @@ OPERATIONS
     skip
   END;
 
-  EXTERN_Drone_Up(dist) =
+  EXTERNAL_Drone_Up(dist) =
   SELECT
     init = TRUE &
     dist : 0..2000
@@ -80,7 +80,7 @@ OPERATIONS
     skip
   END;
 
-  EXTERN_Drone_Down(dist) =
+  EXTERNAL_Drone_Down(dist) =
   SELECT
     init = TRUE &
     dist : 0..2000
@@ -88,7 +88,7 @@ OPERATIONS
     skip
   END;
 
-  EXTERN_Drone_Forward(dist) =
+  EXTERNAL_Drone_Forward(dist) =
   SELECT
     init = TRUE &
     dist : 0..2000
@@ -96,7 +96,7 @@ OPERATIONS
     skip
   END;
 
-  EXTERN_Drone_Backward(dist) =
+  EXTERNAL_Drone_Backward(dist) =
   SELECT
     init = TRUE &
     dist : 0..2000
@@ -104,7 +104,7 @@ OPERATIONS
     skip
   END;
 
-  Drone_Turn_Left(degrees) =
+  EXTERNAL_Drone_Turn_Left(degrees) =
   SELECT
     init = TRUE &
     degrees : -360..360
@@ -112,7 +112,7 @@ OPERATIONS
     skip
   END;
 
-  Drone_Turn_Right(degrees) =
+  EXTERNAL_Drone_Turn_Right(degrees) =
   SELECT
     init = TRUE &
     degrees : -360..360
@@ -120,85 +120,85 @@ OPERATIONS
     skip
   END;
 
-  out <-- EXTERN_Drone_GetX =
+  out <-- EXTERNAL_Drone_GetX =
   SELECT init = TRUE THEN
     out := 2000;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetY =
+  out <-- EXTERNAL_Drone_GetY =
   SELECT init = TRUE THEN
     out := 2000;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetZ =
+  out <-- EXTERNAL_Drone_GetZ =
   SELECT init = TRUE THEN
     out := 2000;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetBattery =
+  out <-- EXTERNAL_Drone_GetBattery =
   SELECT init = TRUE THEN
     out := 100;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetFrontDistance =
+  out <-- EXTERNAL_Drone_GetFrontDistance =
   SELECT init = TRUE THEN
     out := 2000;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetBackDistance =
+  out <-- EXTERNAL_Drone_GetBackDistance =
   SELECT init = TRUE THEN
     out := 2000;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetUpDistance =
+  out <-- EXTERNAL_Drone_GetUpDistance =
   SELECT init = TRUE THEN
     out := 2000;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetDownDistance =
+  out <-- EXTERNAL_Drone_GetDownDistance =
   SELECT init = TRUE THEN
     out := 2000;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetLeftDistance =
+  out <-- EXTERNAL_Drone_GetLeftDistance =
   SELECT init = TRUE THEN
     out := 2000;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetRightDistance =
+  out <-- EXTERNAL_Drone_GetRightDistance =
   SELECT init = TRUE THEN
     out := 2000;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetRoll =
+  out <-- EXTERNAL_Drone_GetRoll =
   SELECT init = TRUE THEN
     out := 0;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetPitch =
+  out <-- EXTERNAL_Drone_GetPitch =
   SELECT init = TRUE THEN
     out := 0;
     cycle := cycle + 1
   END;
 
-  out <-- EXTERN_Drone_GetYaw =
+  out <-- EXTERNAL_Drone_GetYaw =
   SELECT init = TRUE THEN
     out := 0;
     cycle := cycle + 1
   END;
 
-  Destroy =
+  EXTERNAL_Destroy =
   SELECT init = TRUE THEN
     init := FALSE
   END