diff --git a/gipsl.all.build.eltbug/.classpath b/gipsl.all.build.eltbug/.classpath
new file mode 100644
index 00000000..0b423a2c
--- /dev/null
+++ b/gipsl.all.build.eltbug/.classpath
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/gipsl.all.build.eltbug/.project b/gipsl.all.build.eltbug/.project
new file mode 100644
index 00000000..522ee6c0
--- /dev/null
+++ b/gipsl.all.build.eltbug/.project
@@ -0,0 +1,25 @@
+
+
+ gipsl.all.build.eltbug
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextBuilder
+
+
+
+
+
+ org.emoflon.gips.gipsl.ui.gipsNature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.pde.PluginNature
+ org.eclipse.xtext.ui.shared.xtextNature
+
+
diff --git a/gipsl.all.build.eltbug/.settings/org.eclipse.jdt.core.prefs b/gipsl.all.build.eltbug/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000..cc4eaa53
--- /dev/null
+++ b/gipsl.all.build.eltbug/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
+org.eclipse.jdt.core.compiler.compliance=21
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=21
diff --git a/gipsl.all.build.eltbug/META-INF/MANIFEST.MF b/gipsl.all.build.eltbug/META-INF/MANIFEST.MF
new file mode 100644
index 00000000..2cef077e
--- /dev/null
+++ b/gipsl.all.build.eltbug/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Automatic-Module-Name: gipsl.all.build.eltbug
+Bundle-ManifestVersion: 2
+Bundle-Name: gipsl.all.build.eltbug
+Bundle-Vendor: My Company
+Bundle-Version: 1.0.0.qualifier
+Export-Package: gipsl.all.build.eltbug.connector
+Bundle-SymbolicName: gipsl.all.build.eltbug; singleton:=true
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-21
+Require-Bundle: org.emoflon.ibex.common,
+ org.emoflon.ibex.gt,
+ org.emoflon.gips.core,
+ org.emoflon.ibex.gt.democles,
+ org.emoflon.ibex.gt.hipe,
+ gipsl.all.build.model,
+ test.suite.utils
diff --git a/gipsl.all.build.eltbug/build.properties b/gipsl.all.build.eltbug/build.properties
new file mode 100644
index 00000000..14acfb7c
--- /dev/null
+++ b/gipsl.all.build.eltbug/build.properties
@@ -0,0 +1,5 @@
+source.. = src/,\
+ src-gen/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/Model.gipsl b/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/Model.gipsl
new file mode 100644
index 00000000..08903f28
--- /dev/null
+++ b/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/Model.gipsl
@@ -0,0 +1,58 @@
+package "gipsl.all.build.eltbug"
+import "platform:/resource/gipsl.all.build.model/model/Model.ecore"
+
+config {
+ solver := GUROBI;
+ timeLimit := true [value := 10.0];
+ randomSeed := true [value := 0];
+ presolve := true;
+ debugOutput := false;
+}
+
+rule mapVnode {
+ root: Root {
+ -containers -> substrateContainer
+ -containers -> virtualContainer
+ }
+
+ substrateContainer: SubstrateContainer {
+ -substrateNodes -> snode
+ }
+
+ virtualContainer: VirtualContainer {
+ -virtualNodes -> vnode
+ }
+
+ snode: SubstrateResourceNode
+
+ vnode: VirtualResourceNode {
+ ++ -host -> snode
+ }
+}
+
+pattern findRoot {
+ root : Root
+}
+
+//
+// GIPSL starts here!
+//
+
+mapping n2n to mapVnode;
+
+// Every node must be mapped exactly once
+constraint with VirtualNode {
+ mappings.n2n->filter(element.nodes.vnode == context)->sum(element.value) == 1
+}
+
+// This function triggers the bug within the code generation
+function dummy with Root {
+ mappings.n2n->sum(element.value)
+ *
+ patterns.findRoot->sum(1)
+ // ^this does also trigger the bug when access uses `rules.xy`
+}
+
+objective : min {
+ functions.dummy
+}
diff --git a/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/connector/EltBugConnector.java b/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/connector/EltBugConnector.java
new file mode 100644
index 00000000..6aa586c5
--- /dev/null
+++ b/gipsl.all.build.eltbug/src/gipsl/all/build/eltbug/connector/EltBugConnector.java
@@ -0,0 +1,25 @@
+package gipsl.all.build.eltbug.connector;
+
+import org.emoflon.gips.core.milp.SolverOutput;
+
+import gipsl.all.build.eltbug.api.gips.EltbugGipsAPI;
+import test.suite.gips.utils.AConnector;
+import test.suite.gips.utils.GipsTestUtils;
+import test.suite.gips.utils.GlobalTestConfig;
+
+public class EltBugConnector extends AConnector {
+
+ public EltBugConnector(final String modelPath) {
+ api = new EltbugGipsAPI();
+ api.init(GipsTestUtils.pathToAbsUri(modelPath));
+ GlobalTestConfig.overrideSolver(api);
+ }
+
+ @Override
+ public SolverOutput run(final String outputPath) {
+ final SolverOutput output = solve();
+ ((EltbugGipsAPI) api).getN2n().applyNonZeroMappings();
+ return output;
+ }
+
+}
diff --git a/test.suite.gips/META-INF/MANIFEST.MF b/test.suite.gips/META-INF/MANIFEST.MF
index febd47e2..76d9fe37 100644
--- a/test.suite.gips/META-INF/MANIFEST.MF
+++ b/test.suite.gips/META-INF/MANIFEST.MF
@@ -41,6 +41,7 @@ Import-Package: gips.enumequals.connector,
gipsl.all.build.and.connector,
gipsl.all.build.booleanbrackets.connector,
gipsl.all.build.count.connector,
+ gipsl.all.build.eltbug.connector,
gipsl.all.build.equals.fxeqctrafo.connector,
gipsl.all.build.filter.connector,
gipsl.all.build.implication.connector,
diff --git a/test.suite.gips/src/test/suite/gipsl/all/build/GipslAllBuildEltBugTest.java b/test.suite.gips/src/test/suite/gipsl/all/build/GipslAllBuildEltBugTest.java
new file mode 100644
index 00000000..f80c2846
--- /dev/null
+++ b/test.suite.gips/src/test/suite/gipsl/all/build/GipslAllBuildEltBugTest.java
@@ -0,0 +1,41 @@
+package test.suite.gipsl.all.build;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.emoflon.gips.core.milp.SolverOutput;
+import org.emoflon.gips.core.milp.SolverStatus;
+import org.junit.jupiter.api.Test;
+
+import gipsl.all.build.eltbug.connector.EltBugConnector;
+
+public class GipslAllBuildEltBugTest extends AGipslAllBuildTest {
+
+ // Setup method
+
+ public void callableSetUp() {
+ gen.persistModel(MODEL_PATH);
+ con = new EltBugConnector(MODEL_PATH);
+ }
+
+ // Actual tests
+ // Positive tests
+
+ @Test
+ public void testMap2to1() {
+ gen.genSubstrateNode("s1", 10);
+ gen.genVirtualNode("v1", 1);
+ gen.genVirtualNode("v2", 1);
+ callableSetUp();
+
+ final SolverOutput ret = con.run(OUTPUT_PATH);
+
+ assertEquals(SolverStatus.OPTIMAL, ret.status());
+ assertEquals(2, ret.objectiveValue());
+ }
+
+ @Override
+ public Class> getConnectorClass() {
+ return EltBugConnector.class;
+ }
+
+}