diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java
index 52fc8cfee3974459903e91e9586537ba747facf8..5d954789ad3ef5c077be2753dd789d7dae2c53f9 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java
@@ -19,6 +19,8 @@ import edu.kit.ipd.descartes.adaptation.model.dmm.AdaptationProcessModelLoader;
 import edu.kit.ipd.descartes.adaptation.model.dmm.DmmModelActionHandler;
 import edu.kit.ipd.descartes.adaptation.model.dmm.util.ObjectivesHelper;
 import edu.kit.ipd.descartes.adaptation.model.perfdatarepo.IPerformanceDataRepositoryHandler;
+import edu.kit.ipd.descartes.adaptation.model.perfdatarepo.ObservationRepositoryHelper;
+import edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerfDataRepoConverter;
 import edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerformanceDataRepositoryHandlerFactory;
 import edu.kit.ipd.descartes.mm.adaptation.AdaptationProcess;
 import edu.kit.ipd.descartes.mm.adaptation.Event;
@@ -63,7 +65,7 @@ public class AdaptationControl {
     }
 
     public void init(String propertiesFile) {
-    
+
         if (propertiesFile == null || propertiesFile.equals("")) {
             logger.warn("No properties file given. Using default properties...");
             propertiesFile = DEFAULT_PROP_FILE_PATH;
@@ -71,12 +73,12 @@ public class AdaptationControl {
         try {
             // load properties file
             loadProperties(propertiesFile);
-    
+
             // load required models
             adaptationProcess = adaptationProcessModelLoader.load(URI.createFileURI(adaptationProcessXmiFilePath));
             perfdatarepo = PerformanceDataRepositoryHandlerFactory.createHandler(pdrMetamodelType);
             perfdatarepo.load(performanceDataRepoXmiFilePath);
-    
+
             // set handlers
             executor = new TacticExecutor(new DmmModelActionHandler());
             modelAnalyzer = new PcmModelAnalyzer();
@@ -120,7 +122,6 @@ public class AdaptationControl {
             analyzeModel();
             processResults(currentTactic);
             evaluate(currentTactic);
-           
 
             // save results
             try {
@@ -162,7 +163,7 @@ public class AdaptationControl {
         executor.applyTactic(weightedTactic);
     }
 
-    /** 
+    /**
      * Choose a suitable model analyzer and analyze the reconfigured model.
      */
     public void analyzeModel() {
@@ -170,32 +171,37 @@ public class AdaptationControl {
     }
 
     /**
-     * Process the results of the applied weighted tactic. For example,
-     * store the results in a performance data repository. 
+     * Process the results of the applied weighted tactic. For example, store the results in a
+     * performance data repository.
      * 
      * @param tactic
      */
     public void processResults(WeightedTactic tactic) {
-    
-        Impact latestImpact = perfdatarepo.getImpactAt(iteration);
+
+        // Impact latestImpact = perfdatarepo.getImpactAt(iteration);
+        String expName = ObservationRepositoryHelper.deriveExperimentName(tactic);
+        Impact latestImpact = PerfDataRepoConverter.convertObservableImpact(ObservationRepositoryHelper
+                .searchImpactOfTactic(expName, performanceDataRepoXmiFilePath));
         // Connect parsed results to the executed tactic
         if (latestImpact != null)
             tactic.setLastImpact(latestImpact);
     }
 
-    /** 
-     * Evaluates the impact of the tactic and assigns weights according to the specified weighting function.
+    /**
+     * Evaluates the impact of the tactic and assigns weights according to the specified weighting
+     * function.
      * 
      * @param tactic
      */
     public void evaluate(WeightedTactic tactic) {
-        // Check if tactic has made anything stupid, i.e., violates the objectives. If yes, undo and/or assign bad weight.
+        // Check if tactic has made anything stupid, i.e., violates the objectives. If yes, undo
+        // and/or assign bad weight.
         if (evaluator.degradationDetected(tactic)) {
             logger.warn("Degradation detected for tactic " + tactic.getName());
             // undo tactic
             // assign negative weight
         }
-        
+
         // If everything is fine, assign new weight.
         evaluator.evaluate(tactic);
     }
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java
index 03f67e36a2cdeab600876269540b41a4b3c5471f..ba2b589b03e122add726ad6a1e532fdf1a8ea51a 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java
@@ -274,12 +274,17 @@ public class DmmModelActionHandler implements IActionHandler {
      */
     // this is just a helper function
     private RuntimeEnvironment scaleOutContainerTemplate(ContainerTemplate template) {
-        Container referringContainer = template.getReferringContainers().get(0);
-
-        if (referringContainer != null && referringContainer instanceof RuntimeEnvironment) {
-            return DmmModelChanger.createNewRuntimeEnvironmentInstance((RuntimeEnvironment) referringContainer);
+        if (template.getReferringContainers().size() == 0) {
+            logger.debug("No referring containers found for template " + template.getName() + ", creating new instance from template.");
+            return DmmModelChanger.createNewRuntimeEnvironmentInstanceFromTemplate(template);
         } else {
-            logger.error("Cannot scale " + referringContainer);
+            Container referringContainer = template.getReferringContainers().get(0);
+
+            if (referringContainer != null && referringContainer instanceof RuntimeEnvironment) {
+                return DmmModelChanger.createNewRuntimeEnvironmentInstance((RuntimeEnvironment) referringContainer);
+            } else {
+                logger.error("Cannot scale " + referringContainer);
+            }
         }
         return null;
     }
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelChanger.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelChanger.java
index f3cde05b03eb483763a79607a8624befaecc11c0..fa1b1b479c08321d6cf101a3c284f900d4145eb0 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelChanger.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelChanger.java
@@ -22,10 +22,14 @@ import edu.kit.ipd.descartes.mm.resourceconfiguration.ConfigurationSpecification
 import edu.kit.ipd.descartes.mm.resourceconfiguration.NumberOfParallelProcessingUnits;
 import edu.kit.ipd.descartes.mm.resourceconfiguration.ResourceconfigurationPackage;
 import edu.kit.ipd.descartes.mm.resourcelandscape.Container;
+import edu.kit.ipd.descartes.mm.resourcelandscape.ResourcelandscapeFactory;
 import edu.kit.ipd.descartes.mm.resourcelandscape.RuntimeEnvironment;
+import edu.kit.ipd.descartes.mm.runtimeenvironmentclasses.RuntimeEnvironmentClasses;
 
 public class DmmModelChanger {
     
+    private static final int FIRST = 0;
+
     /**
      * Denotes a Container as a copy of another by
      * adding this mark to its name.
@@ -285,4 +289,16 @@ public class DmmModelChanger {
         int index = randomGenerator.nextInt(containers.size());
         return containers.get(index);
     }
+
+    public static RuntimeEnvironment createNewRuntimeEnvironmentInstanceFromTemplate(ContainerTemplate template) {
+        RuntimeEnvironment newRe = ResourcelandscapeFactory.eINSTANCE.createRuntimeEnvironment();
+        newRe.setId(EcoreUtil.generateUUID());
+        newRe.setName("RuntimeEnvironmentInstanceOfTemplate_" + template.getName());
+        newRe.setTemplate(template);
+        newRe.setOfClass(RuntimeEnvironmentClasses.MIDDLEWARE);
+        newRe.setContainedIn(template.getRunningOn().get(FIRST));
+        
+        template.getReferringContainers().add(newRe);        
+        return newRe;
+    }
 }
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java
index e68869378a260b9111bfe728a7b61eae6931c73d..7fcf38eb4a03cc4895f965c459af5486aa17f672 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java
@@ -3,15 +3,12 @@ package edu.kit.ipd.descartes.adaptation.model.perfdatarepo;
 import static edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerfDataRepoConverter.convertObservableImpact;
 import static edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerfDataRepoConverter.convertResult;
 
-import java.util.List;
-
 import org.apache.log4j.Logger;
 import org.eclipse.emf.common.util.URI;
 
 import edu.kit.ipd.descartes.adaptation.model.AbstractEcoreModelLoader;
 import edu.kit.ipd.descartes.perfdatarepo.Impact;
 import edu.kit.ipd.descartes.perfdatarepo.Result;
-import edu.kit.ipd.descartes.ql.models.repository.Observation;
 import edu.kit.ipd.descartes.ql.models.repository.ObservationRepository;
 
 public class ObservationRepositoryHandler implements IPerformanceDataRepositoryHandler {
@@ -48,21 +45,4 @@ public class ObservationRepositoryHandler implements IPerformanceDataRepositoryH
     public Result getCurrentSystemState() {
         return convertResult(repository.getObservations().get(iteration));
     }
-    
-    /** 
-     * Searches the observation repository for an observation that contains the given 
-     * name.
-     * 
-     * @param name
-     * @return first result that contains the given string, null otherwise.
-     */
-    public Result getResultOfName(String name) {
-        List<Observation> results = repository.getObservations();
-        for (Observation o : results) {
-            if(o.getIdentifier().contains(name))
-                return convertResult(o);
-        }
-        return null;
-    }
-
 }
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHelper.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..409d115687a0c4bf0680ce5c708551ce7c74bcd1
--- /dev/null
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHelper.java
@@ -0,0 +1,62 @@
+package edu.kit.ipd.descartes.adaptation.model.perfdatarepo;
+
+import java.util.List;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
+import edu.kit.ipd.descartes.ql.models.repository.ObservableImpact;
+import edu.kit.ipd.descartes.ql.models.repository.Observation;
+import edu.kit.ipd.descartes.ql.models.repository.ObservationRepository;
+
+
+public class ObservationRepositoryHelper {
+
+    public static ObservableImpact searchImpactOfTactic(String name, String modelUri) {
+        ObservationRepositoryModelLoader loader = ObservationRepositoryModelLoader.getInstance();
+        ObservationRepository repo = (ObservationRepository) loader.load(URI.createFileURI(modelUri));
+
+        // Get correct result
+        Observation o = getResultEndingWith(name, repo);
+        
+        // Derive impact from result
+        ObservableImpact i = deriveImpact(o, repo);
+        return i;
+    }
+
+
+    public static String deriveExperimentName(WeightedTactic tactic) {
+        return tactic.getName();
+    }
+
+
+    private static ObservableImpact deriveImpact(Observation o, ObservationRepository repo) {
+        List<ObservableImpact> impacts = repo.getImpacts();
+        for (ObservableImpact oi : impacts) {
+            if (EcoreUtil.equals(oi.getAfter(), o))
+                return oi;
+        }
+        
+        return null;
+    }
+
+
+    /** 
+     * Searches the observation repository for an observation that ends with the given 
+     * suffix.
+     * 
+     * @param suffix
+     * @return first result that ends the given suffix, null otherwise.
+     */
+    public static Observation getResultEndingWith(String suffix, ObservationRepository repo) {
+        List<Observation> results = repo.getObservations();
+        for (Observation o : results) {
+            if(o.getIdentifier().endsWith(suffix))
+                return o;
+        }
+        return null;
+    }
+
+
+}
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java
index 4905024b2a505c838c3065b25983423f4e26792e..a348d5d7306764ea3c0072bbc1ddd13f3c294ed7 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java
@@ -21,6 +21,8 @@ import edu.kit.ipd.descartes.ql.models.repository.Observation;
 public class PerfDataRepoConverter {
     
     public static Impact convertObservableImpact(ObservableImpact o) {
+        if (o == null)
+            return null;
         Impact impact = PerfdatarepoFactory.eINSTANCE.createImpact();
         impact.setId(o.getIdentifier());
         impact.setName("ObservableImpact (ID: " + o.getIdentifier() + ")");
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoHelper.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoHelper.java
deleted file mode 100644
index a4234e8e122b642ab3f33a2b965a935b8e804548..0000000000000000000000000000000000000000
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoHelper.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package edu.kit.ipd.descartes.adaptation.model.perfdatarepo;
-
-import org.eclipse.emf.common.util.EList;
-
-import edu.kit.ipd.descartes.perfdatarepo.Impact;
-import edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository;
-import edu.kit.ipd.descartes.perfdatarepo.Result;
-
-public class PerfDataRepoHelper {
-
-	/**
-	 * Queries for the latest impact. The latest impact is determined by the
-	 * {@link Result} with the most recent timestamp. Currently it is the last one in
-	 * the list.
-	 */
-	public static Impact getLatestImpact(PerformanceDataRepository perfDataRepo) {
-		
-		EList<Impact> impactHistory = perfDataRepo.getImpactHistory();
-		Impact mostRecentImpact =  impactHistory.get(impactHistory.size() - 1);
-				
-		for (Impact currentImpact : impactHistory) {
-			Result afterResult = currentImpact.getAfter();
-			if (afterResult.getTimestamp().compareTo(mostRecentImpact.getAfter().getTimestamp()) > 0 )
-				mostRecentImpact = currentImpact;
-		}
-		
-		return mostRecentImpact;
-	}
-	
-
-	/**
-	 * Returns the {@link Impact} at position {@code position} in the
-	 * impact list of the given {@link PerformanceDataRepository}
-	 * 
-	 * @param perfDataRepo {@link PerformanceDataRepository} containing all impacts
-	 * @param position The position of the impact to return
-	 * @return
-	 */
-	public static Impact getImpactAt(PerformanceDataRepository perfDataRepo, int position) {
-		EList<Impact> impactHistory = perfDataRepo.getImpactHistory();
-		if (position > impactHistory.size() - 1)
-		    return null;
-		return impactHistory.get(position);
-	}
-}
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java
index 5aea8ed93fc328748fcd71b5027d56291cdc4960..f8cc30578b5ea12ee1a210582fe736b8567c5e61 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java
@@ -1,6 +1,7 @@
 package edu.kit.ipd.descartes.adaptation.model.perfdatarepo;
 
 import org.apache.log4j.Logger;
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.URI;
 
 import edu.kit.ipd.descartes.perfdatarepo.Impact;
@@ -27,13 +28,25 @@ public class PerformanceDataRepositoryHandler implements IPerformanceDataReposit
 
     @Override
     public Impact getLatestImpact() {
-        return PerfDataRepoHelper.getLatestImpact(repository);
+        EList<Impact> impactHistory = repository.getImpactHistory();
+        Impact mostRecentImpact =  impactHistory.get(impactHistory.size() - 1);
+                
+        for (Impact currentImpact : impactHistory) {
+            Result afterResult = currentImpact.getAfter();
+            if (afterResult.getTimestamp().compareTo(mostRecentImpact.getAfter().getTimestamp()) > 0 )
+                mostRecentImpact = currentImpact;
+        }
+        
+        return mostRecentImpact;
     }
 
     @Override
     public Impact getImpactAt(int position) {
         iteration++; //TODO This is a hack, see getCurrentSystemState()
-        return PerfDataRepoHelper.getImpactAt(repository, position);
+        EList<Impact> impactHistory = repository.getImpactHistory();
+        if (position > impactHistory.size() - 1)
+            return null;
+        return impactHistory.get(position);
     }
 
     @Override