diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/IEvaluator.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/IEvaluator.java
new file mode 100644
index 0000000000000000000000000000000000000000..c789ef4dec5176b990120a6bc219a16a34b0e2f0
--- /dev/null
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/IEvaluator.java
@@ -0,0 +1,20 @@
+package edu.kit.ipd.descartes.adaptation.evaluation;
+
+import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
+
+/**
+ * Evaluates a tactic.
+ * 
+ * @author nhuber
+ *
+ */
+public interface IEvaluator {
+    
+    /**
+     * Evaluates the impact of a {@link WeightedTactic}.
+     * 
+     * @param wt The weighted tactic to evaluate
+     */
+    public void evaluate(WeightedTactic wt);
+
+}
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/WeightingFunctionEvaluator.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/WeightingFunctionEvaluator.java
new file mode 100644
index 0000000000000000000000000000000000000000..1aa5c0dba566f883c991cb6ddada59cece315c2d
--- /dev/null
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/WeightingFunctionEvaluator.java
@@ -0,0 +1,32 @@
+package edu.kit.ipd.descartes.adaptation.evaluation;
+
+import edu.kit.ipd.descartes.adaptation.evaluation.weightingfunction.WeightedSumCalculator;
+import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
+import edu.kit.ipd.descartes.mm.adaptation.WeightingFunction;
+
+/**
+ * Evaluates a given {@link WeightedTactic} using the weighted tactic's {@link WeightingFunction}.
+ * 
+ * @author nhuber
+ * 
+ */
+public class WeightingFunctionEvaluator implements IEvaluator {
+
+    private WeightedSumCalculator calculator = null;
+
+    public WeightingFunctionEvaluator() {
+        calculator = new WeightedSumCalculator();
+    }
+    
+    /*
+     * (non-Javadoc)
+     * 
+     * @see edu.kit.ipd.descartes.adaptation.evaluation.IEvaluator#evaluate()
+     */
+    @Override
+    public void evaluate(WeightedTactic tactic) {
+        WeightingFunction f = tactic.getParentStrategy().getWeightingFunction();
+        calculator.setWeightingFunction(f);
+        calculator.updateWeight(tactic);
+    }
+}
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/IWeightingFunctionCalculator.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/IWeightingFunctionCalculator.java
new file mode 100644
index 0000000000000000000000000000000000000000..72068f516abb3a19e789517b55b7328f73537995
--- /dev/null
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/IWeightingFunctionCalculator.java
@@ -0,0 +1,24 @@
+package edu.kit.ipd.descartes.adaptation.weightingfunction;
+
+import edu.kit.ipd.descartes.mm.adaptation.Tactic;
+import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
+
+public interface IWeightingFunctionCalculator {
+	
+	/**
+	 * Calculates the new weight of the given {@link Tactic}.
+	 * 
+	 * @param impact
+	 * @return
+	 */
+	double calculateWeight(WeightedTactic weightedTactic);
+	
+	/**
+	 * Calculates and sets the new weight of the given {@link WeightedTactic}.
+	 * 
+	 * @param impact
+	 * @return
+	 */
+	void updateWeight(WeightedTactic weightedTactic);
+
+}
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/RandomWeightCalculator.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/RandomWeightCalculator.java
new file mode 100644
index 0000000000000000000000000000000000000000..244fae639d4345fb210ad248387fda40355bd430
--- /dev/null
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/RandomWeightCalculator.java
@@ -0,0 +1,19 @@
+package edu.kit.ipd.descartes.adaptation.weightingfunction;
+
+import java.util.Random;
+
+import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
+
+public class RandomWeightCalculator implements IWeightingFunctionCalculator {
+
+	@Override
+	public double calculateWeight(WeightedTactic weightedTactic) {
+		Random r = new Random(System.currentTimeMillis());
+		return r.nextDouble();
+	}
+
+	@Override
+	public void updateWeight(WeightedTactic weightedTactic) {
+		weightedTactic.setCurrentWeight(calculateWeight(weightedTactic));
+	}
+}
diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/WeightedSumCalculator.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/WeightedSumCalculator.java
new file mode 100644
index 0000000000000000000000000000000000000000..67c304e35187c43fa71a630159354eac5689f6dd
--- /dev/null
+++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/evaluation/weightingfunction/WeightedSumCalculator.java
@@ -0,0 +1,62 @@
+package edu.kit.ipd.descartes.adaptation.weightingfunction;
+
+import org.apache.log4j.Logger;
+import org.eclipse.emf.common.util.EList;
+
+import edu.kit.ipd.descartes.adaptation.model.dmm.util.WeightingFunctionHelper;
+import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
+import edu.kit.ipd.descartes.mm.adaptation.WeightingFunction;
+import edu.kit.ipd.descartes.perfdatarepo.Impact;
+import edu.kit.ipd.descartes.perfdatarepo.MetricValue;
+import edu.kit.ipd.descartes.perfdatarepo.Result;
+
+public class WeightedSumCalculator implements IWeightingFunctionCalculator {
+
+	private Logger logger = Logger.getLogger(WeightedSumCalculator.class);
+	private WeightingFunction weightingFunction = null;
+
+	public WeightedSumCalculator(WeightingFunction weightingFunction) {
+		this.weightingFunction = weightingFunction;
+	}
+
+	@Override
+	public double calculateWeight(WeightedTactic weightedtactic) {
+
+		double newWeight = 0.0;
+		Impact impact = weightedtactic.getLastImpact();
+		Result before = impact.getBefore();
+		Result after = impact.getAfter();
+		EList<MetricValue> afterMetricValues = after.getMetricValues();
+
+		for (MetricValue afterMetricValue : afterMetricValues) {
+			// calculated delta=(after-before)
+			double afterValue = afterMetricValue.getValue();
+			double beforeValue = WeightingFunctionHelper
+					.getValueForMetricType(afterMetricValue.getMetricType(), before);
+			double delta = afterValue - beforeValue;
+
+			// get the corresponding weight
+			double weightOfMetric = WeightingFunctionHelper.getWeightForMetricType(weightingFunction,
+					afterMetricValue.getMetricType());
+
+            if (Double.isNaN(weightOfMetric))
+                logger.error("No weight found for metric type: " + afterMetricValue.getMetricType().getName());
+            else {
+                // add it
+                newWeight += weightOfMetric * delta;
+                logger.debug("Delta for metric type " + afterMetricValue.getMetricType().getName() + " was: " + delta
+                        + " and weight is " + weightOfMetric);
+            }
+		}
+
+		return newWeight;
+	}
+
+	@Override
+	public void updateWeight(WeightedTactic weightedTactic) {
+		double newWeight = calculateWeight(weightedTactic);
+		logger.debug("Setting new weight of " + weightedTactic.getName() + " to " + newWeight);
+		weightedTactic.setCurrentWeight(newWeight);
+	}
+
+}