diff --git a/src/main/java/de/hhu/stups/codegenerator/MachineConstantsOptimizer.java b/src/main/java/de/hhu/stups/codegenerator/MachineConstantsOptimizer.java
index 50dcbb02327fbfc038b61dca417521d8d5b2489a..63ad6b25dae0e6e5d37139fccef463f314d996e5 100644
--- a/src/main/java/de/hhu/stups/codegenerator/MachineConstantsOptimizer.java
+++ b/src/main/java/de/hhu/stups/codegenerator/MachineConstantsOptimizer.java
@@ -313,17 +313,17 @@ public class MachineConstantsOptimizer implements AbstractVisitor<Node, Void> {
 
     @Override
     public Node visitRecordNode(RecordNode node, Void expected) {
-        return node;
+        return new RecordNode(node.getSourceCodePosition(), node.getDeclarations(), node.getExpressions().stream().map(expr -> (ExprNode) visitExprNode(expr, expected)).collect(Collectors.toList()));
     }
 
     @Override
     public Node visitStructNode(StructNode node, Void expected) {
-        return node;
+        return new StructNode(node.getSourceCodePosition(), node.getDeclarations(), node.getExpressions().stream().map(expr -> (ExprNode) visitExprNode(expr, expected)).collect(Collectors.toList()));
     }
 
     @Override
     public Node visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
-        return node;
+        return new RecordFieldAccessNode(node.getSourceCodePosition(), (ExprNode) visitExprNode(node.getRecord(), expected), node.getIdentifier());
     }
 
     @Override
diff --git a/src/main/java/de/hhu/stups/codegenerator/MachineConstantsPreprocessor.java b/src/main/java/de/hhu/stups/codegenerator/MachineConstantsPreprocessor.java
index 68d6799fc33aea26423415bffd8c8dfab447fb44..692bfbf12495e2a1aabc6b7a731e98513fbf9efa 100644
--- a/src/main/java/de/hhu/stups/codegenerator/MachineConstantsPreprocessor.java
+++ b/src/main/java/de/hhu/stups/codegenerator/MachineConstantsPreprocessor.java
@@ -271,16 +271,19 @@ public class MachineConstantsPreprocessor implements AbstractVisitor<Node, Void>
 
     @Override
     public Node visitRecordNode(RecordNode node, Void expected) {
+        node.getExpressions().forEach(e -> visitExprNode(e, expected));
         return null;
     }
 
     @Override
     public Node visitStructNode(StructNode node, Void expected) {
+        node.getExpressions().forEach(e -> visitExprNode(e, expected));
         return null;
     }
 
     @Override
     public Node visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
+        visitExprNode(node.getRecord(), expected);
         return null;
     }
 
diff --git a/src/main/java/de/hhu/stups/codegenerator/analyzers/IdentifierAnalyzer.java b/src/main/java/de/hhu/stups/codegenerator/analyzers/IdentifierAnalyzer.java
index 4497f95a7f67f60d4009dfebf72053a7b464b902..9443a5d03317d185f9edeeb5cbedacc4cdf26ff2 100644
--- a/src/main/java/de/hhu/stups/codegenerator/analyzers/IdentifierAnalyzer.java
+++ b/src/main/java/de/hhu/stups/codegenerator/analyzers/IdentifierAnalyzer.java
@@ -348,16 +348,19 @@ public class IdentifierAnalyzer implements AbstractVisitor<Void, Void> {
 
     @Override
     public Void visitRecordNode(RecordNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitStructNode(StructNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
+        visitExprNode(node.getRecord(), expected);
         return null;
     }
 
diff --git a/src/main/java/de/hhu/stups/codegenerator/analyzers/ParallelConstructAnalyzer.java b/src/main/java/de/hhu/stups/codegenerator/analyzers/ParallelConstructAnalyzer.java
index f69dd9b749bbd0ad57b30b3cdf4e404690afad07..cc743f914afea8b7fe53c37c8ffc3e5f1f253c41 100644
--- a/src/main/java/de/hhu/stups/codegenerator/analyzers/ParallelConstructAnalyzer.java
+++ b/src/main/java/de/hhu/stups/codegenerator/analyzers/ParallelConstructAnalyzer.java
@@ -433,8 +433,15 @@ public class ParallelConstructAnalyzer implements AbstractVisitor<Void, Void> {
         return null;
     }
 
+    /*
+     * When visiting a record node, local variables are added to ignored variables as they are not relevant for variables in a parallel substitution.
+     */
     @Override
     public Void visitStructNode(StructNode node, Void expected) {
+        List<String> locals = node.getDeclarations().stream().map(DeclarationNode::getName).collect(Collectors.toList());
+        ignoredVariables.addAll(locals);
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
+        ignoredVariables.removeAll(locals);
         return null;
     }
 
diff --git a/src/main/java/de/hhu/stups/codegenerator/analyzers/PrimedIdentifierAnalyzer.java b/src/main/java/de/hhu/stups/codegenerator/analyzers/PrimedIdentifierAnalyzer.java
index b6e27d7a29df1f662e01fa06099d2a0385016f6b..1f60345cc067f9b401e30240878825291e55e755 100644
--- a/src/main/java/de/hhu/stups/codegenerator/analyzers/PrimedIdentifierAnalyzer.java
+++ b/src/main/java/de/hhu/stups/codegenerator/analyzers/PrimedIdentifierAnalyzer.java
@@ -272,16 +272,19 @@ public class PrimedIdentifierAnalyzer implements AbstractVisitor<Void, Void> {
 
     @Override
     public Void visitRecordNode(RecordNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitStructNode(StructNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
+        visitExprNode(node.getRecord(), expected);
         return null;
     }
 
diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/LambdaFunctionGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/LambdaFunctionGenerator.java
index 7ef64bfbbb9a8fed04585a10df28faba6278a824..2b3a05849579be3e8c7d8cef6c0bbd4d9a6d6fac 100644
--- a/src/main/java/de/hhu/stups/codegenerator/generators/LambdaFunctionGenerator.java
+++ b/src/main/java/de/hhu/stups/codegenerator/generators/LambdaFunctionGenerator.java
@@ -416,16 +416,19 @@ public class LambdaFunctionGenerator implements AbstractVisitor<Void, Void> {
 
     @Override
     public Void visitRecordNode(RecordNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitStructNode(StructNode node, Void expected) {
+        node.getExpressions().forEach(expr -> visitExprNode(expr, expected));
         return null;
     }
 
     @Override
     public Void visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
+        visitExprNode(node.getRecord(), expected);
         return null;
     }
 
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 84cb6906c01027322cb58b1ce8c9ce58359e61d7..e1ead492bb3847f9ae1ac15276d76c5b7721b790 100755
--- a/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java
+++ b/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java
@@ -739,7 +739,7 @@ public class MachineGenerator implements AbstractVisitor<String, Void> {
 
 	@Override
 	public String visitStructNode(StructNode node, Void expected) {
-		return "";
+		return expressionGenerator.visitExprNode(node);
 	}
 
 	@Override
diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/MachinePreprocessor.java b/src/main/java/de/hhu/stups/codegenerator/generators/MachinePreprocessor.java
index 75107c0937e065591d13b4a73f9e7edc13c01d7c..4af3f1a470fcf1bb4fb8f8a00db78c6ec73202dc 100644
--- a/src/main/java/de/hhu/stups/codegenerator/generators/MachinePreprocessor.java
+++ b/src/main/java/de/hhu/stups/codegenerator/generators/MachinePreprocessor.java
@@ -577,17 +577,23 @@ public class MachinePreprocessor implements AbstractVisitor<Node, Void> {
 
     @Override
     public Node visitRecordNode(RecordNode node, Void expected) {
-        return node;
+        RecordNode result = new RecordNode(node.getSourceCodePosition(), node.getDeclarations(), node.getExpressions().stream().map(expr -> (ExprNode) visitExprNode(node, expected)).collect(Collectors.toList()));
+        result.setType(node.getType());
+        return result;
     }
 
     @Override
     public Node visitStructNode(StructNode node, Void expected) {
-        return node;
+        StructNode result = new StructNode(node.getSourceCodePosition(), node.getDeclarations(), node.getExpressions().stream().map(expr -> (ExprNode) visitExprNode(node, expected)).collect(Collectors.toList()));
+        result.setType(node.getType());
+        return result;
     }
 
     @Override
     public Node visitRecordFieldAccessNode(RecordFieldAccessNode node, Void expected) {
-        return node;
+        RecordFieldAccessNode result = new RecordFieldAccessNode(node.getSourceCodePosition(), (ExprNode) visitExprNode(node.getRecord(), expected), node.getIdentifier());
+        result.setType(node.getType());
+        return result;
     }
 
     @Override