diff --git a/jastadd-mquat-solver-emfer/libs/libEMFER.jar b/jastadd-mquat-solver-emfer/libs/libEMFER.jar
index ad56ac74b12afb1e057eb1e61566945e513bb11a..b4797b38d2a2fe903daeac6180408e3ab95512b1 100644
Binary files a/jastadd-mquat-solver-emfer/libs/libEMFER.jar and b/jastadd-mquat-solver-emfer/libs/libEMFER.jar differ
diff --git a/jastadd-mquat-solver-emfer/src/main/java/uniks/EMFeRSolver.java b/jastadd-mquat-solver-emfer/src/main/java/uniks/EMFeRSolver.java
index d58e06d912c6593b3b8094e83b5d8c054084cf6a..a638bae0fa95e280d4d217046ce9be9a919a5abf 100644
--- a/jastadd-mquat-solver-emfer/src/main/java/uniks/EMFeRSolver.java
+++ b/jastadd-mquat-solver-emfer/src/main/java/uniks/EMFeRSolver.java
@@ -8,7 +8,7 @@ import de.tudresden.inf.st.mquat.solving.SolvingException;
 import de.tudresden.inf.st.mquat.utils.StopWatch;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import uniks.ttc18.ECompMapping;
+import uniks.ttc18.EAssignment;
 import uniks.ttc18.ESolution;
 import uniks.ttc18.Ttc18Factory;
 
@@ -90,11 +90,11 @@ public class EMFeRSolver implements BenchmarkableSolver {
 
     EMFeRTrafos emFeRTrafos = new EMFeRTrafos(model);
 
-    emFeRTrafos.createTopLevelMappings(eSolution);
+    emFeRTrafos.createTopLevelAssignments(eSolution);
 
-    for (ECompMapping compMapping : eSolution.getCompMappings())
+    for (EAssignment topAssignment : eSolution.getAssignments())
     {
-      emFeRTrafos.createAssignments(eSolution, compMapping);
+      emFeRTrafos.createSubAssignments(eSolution, topAssignment);
     }
 
     int numAssignments = 0;
@@ -113,8 +113,12 @@ public class EMFeRSolver implements BenchmarkableSolver {
 
     Solution emferSolution = emFeRTrafos.transform(eSolution);
 
+    boolean valid = emferSolution.isValid();
+    // currentSolution = emferSolution;
     //    currentSolution.trace().process(new LoggerProcessor());
 
+    logger.info("emfer found a solution with an objective of {}.", emferSolution.computeObjective());
+
     de.tudresden.inf.st.mquat.jastadd.model.List<Resource> resources = model.getHardwareModel().getResources();
 
     boolean hasNextSoftwareAssignment;
@@ -134,7 +138,7 @@ public class EMFeRSolver implements BenchmarkableSolver {
         for (Assignment assignment : assignments) {
           Set<Resource> resourceList = new HashSet<>();
           for (Resource resource : resources) {
-            assignResource(assignment, resource);
+            // assignResource(assignment, resource);
             if (assignment.isValid()) {
               resourceList.add(resource);
             }
diff --git a/jastadd-mquat-solver-emfer/src/main/java/uniks/EMFeRTrafos.java b/jastadd-mquat-solver-emfer/src/main/java/uniks/EMFeRTrafos.java
index d0c104f1eda572afde181004898e3433ce3e20c4..228b6ffa8fd9eebdcd2a0e4a0a84166e005e8117 100644
--- a/jastadd-mquat-solver-emfer/src/main/java/uniks/EMFeRTrafos.java
+++ b/jastadd-mquat-solver-emfer/src/main/java/uniks/EMFeRTrafos.java
@@ -1,13 +1,12 @@
 package uniks;
 
 import de.tudresden.inf.st.mquat.jastadd.model.*;
+import de.tudresden.inf.st.mquat.solving.SolverUtils;
 import uniks.ttc18.EAssignment;
-import uniks.ttc18.ECompMapping;
 import uniks.ttc18.ESolution;
 import uniks.ttc18.Ttc18Factory;
 
-import java.io.IOException;
-import java.nio.file.*;
+import java.util.ArrayList;
 
 public class EMFeRTrafos
 {
@@ -18,11 +17,13 @@ public class EMFeRTrafos
       this.model = model;
    }
 
-   public void createTopLevelMappings(ESolution eSolution)
+   public int resourceNum = 0;
+
+   public void createTopLevelAssignments(ESolution eSolution)
    {
-      org.eclipse.emf.common.util.EList<ECompMapping> compMappings = eSolution.getCompMappings();
+      org.eclipse.emf.common.util.EList<EAssignment> assignments = eSolution.getAssignments();
 
-      if ( ! compMappings.isEmpty())
+      if ( ! assignments.isEmpty())
       {
          return;
       }
@@ -33,38 +34,141 @@ public class EMFeRTrafos
          ComponentRef target = request.getTarget();
          Name targetName = target.getName();
 
-         ECompMapping eCompMapping = Ttc18Factory.eINSTANCE.createECompMapping();
-         eCompMapping.setRequName(requName);
-         eCompMapping.setCompName(targetName.toString());
-         compMappings.add(eCompMapping);
+         EAssignment topAssignment = Ttc18Factory.eINSTANCE.createEAssignment();
+         topAssignment.setRequestName(requName);
+         topAssignment.setCompName(targetName.toString());
+         String nodeName = model.getHardwareModel().getResource(resourceNum).getName().toString();
+         resourceNum++;
+         topAssignment.setNodeName(nodeName);
+         assignments.add(topAssignment);
       }
    }
 
-   public void createAssignments(ESolution eSolution, ECompMapping compMapping)
+   public void createSubAssignments(ESolution eSolution, EAssignment newAssignment)
    {
-      String compName = compMapping.getCompName();
+      String compName = newAssignment.getCompName();
       Component comp = findComp(model, compName);
       Implementation implementation = comp.getImplementation(0);
-      EAssignment eAssignment = Ttc18Factory.eINSTANCE.createEAssignment();
       String implName = implementation.getName().toString();
-      eAssignment.setImplName(implName);
-      compMapping.setAssignment(eAssignment);
+      newAssignment.setImplName(implName);
 
 
       for (ComponentRequirement componentRequirement : implementation.getComponentRequirements())
       {
          String requCompName = componentRequirement.getComponentRef().getRef().getName().toString();
 
-         ECompMapping subMapping = Ttc18Factory.eINSTANCE.createECompMapping();
-         subMapping.setRequName(implName);
-         subMapping.setCompName(requCompName);
-         eAssignment.getCompMappings().add(subMapping);
+         EAssignment kidAssignment = Ttc18Factory.eINSTANCE.createEAssignment();
+         kidAssignment.setRequestName(implName);
+         kidAssignment.setCompName(requCompName);
+         String nodeName = model.getHardwareModel().getResource(resourceNum).getName().toString();
+         resourceNum++;
+         kidAssignment.setNodeName(nodeName);
+
+         newAssignment.getAssignments().add(kidAssignment);
+
+         createSubAssignments(eSolution, kidAssignment);
+      }
+
+   }
+
+   ArrayList<Resource> availableResources = null;
+
+   public Solution transform(ESolution eSolution)
+   {
+      Solution result = new Solution();
+      result.setModel(model);
+
+      availableResources = new ArrayList();
+      List<Resource> resourceList = model.getHardwareModel().getResources();
+      for (Resource r : resourceList)
+      {
+         availableResources.add(r);
+      }
+
+
+
+      // top level
+      for (EAssignment eAssignment : eSolution.getAssignments())
+      {
+         Assignment dAssignment = new Assignment();
+         Request request = findRequest(eAssignment.getRequestName());
+         dAssignment.setRequest(request);
+         dAssignment.setTopLevel(true);
+
+         Component comp = findComp(model, eAssignment.getCompName());
+         Implementation implementation = findImplementation(comp, eAssignment.getImplName());
+         dAssignment.setImplementation(implementation);
+
+         transformSubAssignments(dAssignment, eAssignment, implementation);
+
+         for (Instance instance : implementation.getResourceRequirement().getInstances())
+         {
+            for (Resource resource : availableResources)
+            {
+               ResourceMapping resourceMapping = new ResourceMapping(instance, resource, new List<>());
+
+               SolverUtils.populateResourceMapping(resourceMapping, implementation.getResourceRequirement(), resource);
+
+               dAssignment.setResourceMapping(resourceMapping);
+
+               if (dAssignment.isValid())
+               {
+                  availableResources.remove(resource);
+                  break;
+               }
+            }
+         }
 
-         createAssignments(eSolution, subMapping);
+         result.addAssignment(dAssignment);
       }
 
+      return result;
+   }
+
+
+   private void transformSubAssignments(Assignment dAssignment, EAssignment eAssignment, Implementation implementation)
+   {
+      for (EAssignment eSubAssignment : eAssignment.getAssignments())
+      {
+         ComponentMapping componentMapping = new ComponentMapping();
+
+         Assignment dSubAssignment = new Assignment();
+         Request request = dAssignment.getRequest();
+         dSubAssignment.setRequest(request);
+         dSubAssignment.setTopLevel(false);
+
+         Component subComp = findComp(model, eSubAssignment.getCompName());
+         Implementation subImpl = findImplementation(subComp, eSubAssignment.getImplName());
+
+         dSubAssignment.setImplementation(subImpl);
+
+         for (Instance instance : subImpl.getResourceRequirement().getInstances())
+         {
+            for (Resource resource : availableResources)
+            {
+               ResourceMapping resourceMapping = new ResourceMapping(instance, resource, new List<>());
+               SolverUtils.populateResourceMapping(resourceMapping, subImpl.getResourceRequirement(), resource);
+               dSubAssignment.setResourceMapping(resourceMapping);
+
+               if (dSubAssignment.isValid())
+               {
+                  availableResources.remove(resource);
+                  break;
+               }
+            }
+         }
+
+         Instance instance = findInstance(implementation, "the_" + eSubAssignment.getCompName());
+
+         componentMapping.setInstance(instance);
+         componentMapping.setAssignment(dSubAssignment);
+         dAssignment.getComponentMappings().add(componentMapping);
+
+         transformSubAssignments(dSubAssignment, eSubAssignment, subImpl);
+      }
    }
 
+
    private Component findComp(Root model, String compName)
    {
       for (Component comp : model.getSoftwareModel().getComponents())
@@ -77,23 +181,46 @@ public class EMFeRTrafos
       return null;
    }
 
-   public Solution transform(ESolution eSolution)
-   {
-      Solution result = new Solution();
-      result.setModel(model);
 
+   private Instance findInstance(Implementation implementation, String compName)
+   {
+      for (ComponentRequirement componentRequirement : implementation.getComponentRequirements())
+      {
+         for (Instance instance : componentRequirement.getInstances())
+         {
+            if (instance.getName().toString().equals(compName))
+            {
+               return instance;
+            }
+         }
+      }
+      return null;
+   }
 
 
-      // top level
-      for (ECompMapping eCompMap : eSolution.getCompMappings())
+   private Resource findResource(String nodeName)
+   {
+      for (Resource r : model.getHardwareModel().getResources())
       {
-         Assignment assignment = new Assignment();
-         assignment.setRequest(findRequest(eCompMap.getRequName()));
-         assignment.setTopLevel(true);
-         result.addAssignment(assignment);
+         if (r.getName().toString().equals(nodeName))
+         {
+            return r;
+         }
       }
+      return null;
+   }
 
-      return result;
+
+   private Implementation findImplementation(Component comp, String implName)
+   {
+      for (Implementation impl : comp.getImplementations())
+      {
+         if (impl.getName().toString().equals(implName))
+         {
+            return impl;
+         }
+      }
+      return null;
    }
 
    private Request findRequest(String requName)
diff --git a/jastadd-mquat-solver-emfer/src/test/java/de/tudresden/inf/st/mquat/solving/EMFeRSolverTest.java b/jastadd-mquat-solver-emfer/src/test/java/de/tudresden/inf/st/mquat/solving/EMFeRSolverTest.java
index ab6ae20d1ea5b0aa4be9468633d7b42df97fa060..d953849a6efcfc90366a63bb4835925fdc6780a3 100644
--- a/jastadd-mquat-solver-emfer/src/test/java/de/tudresden/inf/st/mquat/solving/EMFeRSolverTest.java
+++ b/jastadd-mquat-solver-emfer/src/test/java/de/tudresden/inf/st/mquat/solving/EMFeRSolverTest.java
@@ -27,7 +27,7 @@ public class EMFeRSolverTest {
    * tests the simple solver with one very simple use case
    */
   @Test
-  public void testSimpleSolver() throws SolvingException {
+  public void testEmferSolver() throws SolvingException {
     int tlc = 1;
     int iac = 2;
     int isd = 0;
@@ -38,7 +38,7 @@ public class EMFeRSolverTest {
     int mod = 3;
     double res = 1.5d;
     int nfp = 0;
-    int req = 1;
+    int req = 3;
     int cpu = 1;
     int seed = 0;