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 c124945e63a829dcd5f2fbd3e008cc299c6f290d..3c9db445f5065bf2886d2c7bdf4d50baf945fc96 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
@@ -36,6 +36,7 @@ public class AdaptationControl {
     private static final String PROP_ADAPTATION_PROCESS_NAME = "process.name";
     private static final String PROP_MAX_ITERATIONS = "process.maxiterations";
     private static final String PROP_TRIGGERING_EVENT_TYPE = "event.type";
+    private static final String PROP_QOS_DEGRADATION = "qosdegradation.accept";
 
     private static Logger logger = Logger.getLogger(AdaptationControl.class);
 
@@ -54,6 +55,7 @@ public class AdaptationControl {
 
     private int iteration = 0;
     private int maxIterations = 0;
+    private boolean qosDegradationAcceptable = false;
     private Event cause;
 
     /**
@@ -148,7 +150,7 @@ public class AdaptationControl {
      * @return
      */
     public boolean isObjectiveFulfilled() {
-        logger.debug("Checking if objective is fulfilled...");
+        logger.debug("Checking if objective <<" + cause.getTriggers().getObjective().getName() + ">> is fulfilled...");
         boolean flag = ObjectivesHelper.isObjectiveFulfilled(cause, perfDataRepoHandler.getCurrentSystemState());
         if (flag)
             logger.info("Problem that caused event " + cause.getName() + " has been solved, Objective is fulfilled.");
@@ -201,8 +203,13 @@ public class AdaptationControl {
             // and/or assign bad weight.
             if (evaluator.slaViolated(tactic)) {
                 logger.warn("QoS degradation detected after applying tactic " + tactic.getName());
-                executor.undoPreviousTactic();
-                evaluator.punishTactic(tactic);
+                if (qosDegradationAcceptable) {
+                    logger.debug("QoS degradation is acceptable!");
+                } else {
+                    logger.debug("Undoing previous tactic because of QoS degradation");
+                    executor.undoPreviousTactic();
+                    evaluator.punishTactic(tactic);
+                }
             } else {
                 evaluator.evaluate(tactic);
             }
@@ -234,6 +241,7 @@ public class AdaptationControl {
         adaptationProcessXmiFilePath = properties.getProperty(PROP_ADAPTATION_PROCESS_XMI_FILE_PATH_NAME);
         performanceDataRepoXmiFilePath = properties.getProperty(PROP_PERF_DATA_REPO_XMI_FILE_PATH_NAME);
         maxIterations = Integer.parseInt(properties.getProperty(PROP_MAX_ITERATIONS));
+        qosDegradationAcceptable = Boolean.parseBoolean(properties.getProperty(PROP_QOS_DEGRADATION));
         eventType = properties.getProperty(PROP_TRIGGERING_EVENT_TYPE).trim();
         logger.debug("Maximum iterations till abort: " + maxIterations);
     }
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 9d9375880e3b371036805b8c9ced778b6ec6cf77..82cacc29763f61f36e9fbb3373d3b67607e153ce 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
@@ -258,8 +258,7 @@ public class DmmModelActionHandler implements IActionHandler {
     }
 
     private Entity scaleInContainerTemplate(ContainerTemplate template) {
-        Container referringContainer = template.getReferringContainers().get(
-                template.getReferringContainers().size() - 1);
+        Container referringContainer = template.getReferringContainers().get(0);
         RuntimeEnvironment removedRe = null;
         if (referringContainer != null && referringContainer instanceof RuntimeEnvironment) {
             removedRe = DmmModelChanger.scaleInRuntimeEnvironmentInstance((RuntimeEnvironment) referringContainer);
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelActionHelper.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelActionHelper.java
index 203cd216b199d83a892c25443e86c106be2c8b48..78b415ba2d7161193571d4a7746cfcac081e7ecb 100644
--- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelActionHelper.java
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelActionHelper.java
@@ -91,6 +91,29 @@ public class DmmModelActionHelper {
         return null;
     }
 
+    public static RuntimeEnvironment filterRuntimeEnvironment(List<RuntimeEnvironment> candidates,
+            RuntimeEnvironment comparatorRE) {
+
+        // Filter RE with copy mark first
+        RuntimeEnvironment reWithCopyMark = filterCopiedRuntimeEnvironment(candidates, comparatorRE);
+        if (reWithCopyMark != null) {
+            return reWithCopyMark;
+        } else {
+            // If there is no copy mark, filter an RE with different ID
+            for (RuntimeEnvironment re : candidates) {
+
+                if (re.getId() != comparatorRE.getId()
+                // && EcoreUtil.equals(comparatorRE.getConfigSpec(), re.getConfigSpec())
+                // && EcoreUtil.equals(comparatorRE.getContainedIn(), re.getContainedIn())
+                        && EcoreUtil.equals(comparatorRE.getTemplate(), re.getTemplate())) {
+                    return re;
+                }
+            }
+        }
+        // If no matches have been found, return the comparator element
+        return comparatorRE;
+    }
+
     public static NamedElement findEntityWithName(NamedElement element, String name) {
 
         if (element.getName().equals(name))
@@ -161,7 +184,8 @@ public class DmmModelActionHelper {
      * @return All Container Instances referring to the same ContainerTemplate
      */
     public static List<Container> queryContainersWithSimilarTemplate(Container container) {
-        String queryExpression = "RuntimeEnvironment.allInstances()->select( re | re.template = self.template and re.id <> self.id)";
+//        String queryExpression = "RuntimeEnvironment.allInstances()->select( re | re.template = self.template and re.id <> self.id)";
+        String queryExpression = "RuntimeEnvironment.allInstances()->select( re | re.template = self.template)";
         List<EObject> tempList = new ArrayList<EObject>(OclEvaluationHelper.query(container, queryExpression,
                 container.eClass()));
         List<Container> resultList = new ArrayList<Container>(tempList.size());
@@ -196,25 +220,27 @@ public class DmmModelActionHelper {
      * 
      * @param containerTemplate
      * @param adaptationScope
-     * @param targets 
+     * @param targets
      * @return
      */
-    public static Container findSuitableContainer(ContainerTemplate containerTemplate, AdaptationScope adaptationScope, VariationType targets) {
+    public static Container findSuitableContainer(ContainerTemplate containerTemplate, AdaptationScope adaptationScope,
+            VariationType targets) {
         // Get all containers referring to the template
         List<Container> containers = containerTemplate.getReferringContainers();
         List<Entity> variants = ((SetOfConfigurations) targets).getVariants();
-        
+
         // Prepare the list of migration targets
         List<Container> migrationTargets = new ArrayList<Container>();
         for (Entity entity : variants) {
             migrationTargets.add((Container) entity);
         }
-        
+
         for (Container container : containers) {
-            
+
             // Remove container from migration targets
-            List<Container> migrationTargetCandidates = excludeSelfContainmentFromTargetList(container, migrationTargets);
-            
+            List<Container> migrationTargetCandidates = excludeSelfContainmentFromTargetList(container,
+                    migrationTargets);
+
             // If there are migration targets left
             if (migrationTargetCandidates.size() > 0) {
                 switch (adaptationScope) {
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 ec6a13e03976f9337d447507bdea061d96ef33d1..899d06f659d43a44a12ec16139e3d0f154657b9f 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
@@ -101,7 +101,7 @@ public class DmmModelChanger {
     public static RuntimeEnvironment scaleInRuntimeEnvironmentInstance(RuntimeEnvironment runtimeEnvironment) {
         List<Container> similarContainers = DmmModelActionHelper.queryContainersWithSimilarTemplate(runtimeEnvironment);
         List<RuntimeEnvironment> containedEntities = DmmModelActionHelper.filterAndConvertRuntimeEnvironment(similarContainers);
-        RuntimeEnvironment similarEntity = DmmModelActionHelper.filterCopiedRuntimeEnvironment(containedEntities, runtimeEnvironment);
+        RuntimeEnvironment similarEntity = DmmModelActionHelper.filterRuntimeEnvironment(containedEntities, runtimeEnvironment);
         if (similarEntity != null) {
             runtimeEnvironment.getTemplate().getReferringContainers().remove(similarEntity);
             similarEntity.getContainedIn().getContains().remove(similarEntity);