From 729f08f792e6cab6cc614ed2b1b34819bc448435 Mon Sep 17 00:00:00 2001
From: Alexander Diewald <diewald@fortiss.org>
Date: Wed, 24 Jan 2018 16:44:52 +0000
Subject: [PATCH] Exploration.alg: First running version of the Partition
 Exploration.

* Introduce the following Decoders:
  * PartitionMappingDecoderGraph: Updates a PlatformCommunicationGraph to align to an updated PartitionMapping.
  * PartitionMappingIdentityDecoder: Forwards a PartitionMappingEncoding to the Genotype
  * TaskInstanceResourceAlignmentDecoder: Adjusts the sets of valid target resources for allocations & reallocates invalid entries.
* Add the following Exploration Sub Problems:
  * PartitionMappingProblem: Mapping of Partitions to cores. TaskMappings are now defined as Task --> Partition.
  * PlatformCommGraphProblem: Recalculation of communication paths existing in the platform. Required for Message Routing.
  * Add corresponding operators: vary the number of Partitions and their allocation to cores. Also add NOP Operators where needed (Esp. Crossover).
  * Add Copy operations.
* Restructure the MessageRouter(s) to consider changes of the PlatfromCommunicationGraphs.
* Various Adpations to existing task mappings due to the changed target resources.
* Update the DependencyGraph:
  * Simplify the calculation of dependencies.
  * Correctly consider "Pure" identity decoders, i.e., Decoders that only take one input genotype into account and output the same: They would be neglected otherwise.
* Restructure the Mapping class.
*
---
 .../af3/exploration/alg/dse/DSEFactory.java   |  66 ++++++++-
 .../af3/exploration/alg/dse/Explorer.java     |   2 +
 .../alg/dse/TaskMappingFactory.java           |   2 +-
 .../backend/opt4j/Opt4JExplorerBackend.java   |  25 ++--
 .../PartitionMappingCreator.java              |   2 +-
 .../PlatformCommunicationGraphCreator.java    |  58 ++++++++
 .../opt4j/encoding/MappingEncoding.java       |  28 +++-
 .../opt4j/encoding/MappingEntryBase.java      |   5 +
 .../PartitionMappingEncoding.java             |  48 +++----
 .../PartitionMappingEntry.java                |  14 +-
 .../PlatformCommunicationGraphEncoding.java   | 103 ++++++++++++++
 .../taskmapping/TaskMappingEncoding.java      |  23 +--
 .../taskmapping/TaskMappingEntry.java         |   3 +-
 .../AbstractTaskMappingEncoding.java          |  55 ++------
 .../FailSilentTaskMappingEncoding.java        |  61 ++------
 ...ultDetectionVotingTaskMappingEncoding.java |  45 ------
 .../InstantiatedTaskMappingEncoding.java      |   8 ++
 .../create/ComposableCreatorBase.java         |  12 +-
 .../decode/ComposableDecoder.java             |   2 +
 .../decode/CompositeDecoderBase.java          |  20 ++-
 .../evaluate/CompositeEvaluatorBase.java      |   3 +-
 .../CopyPartitionMapping.java                 |   2 +-
 .../CopyPlatformCommunicationGraph.java       |  33 +++++
 .../CopyPlatformCommunicationGraphModule.java |  32 +++++
 .../taskmapping/CopyAbstractTaskMapping.java  |   2 +-
 .../NopCrossoverPartitionMappingModule.java   |  31 ++++
 ...soverPlatformCommunicationGraphModule.java |  31 ++++
 .../operator/mutate/NopMutateOperator.java    |  32 +++++
 .../partitionmapping/MutatePartitionBase.java |   3 +-
 .../NopPlatformCommGraphMutateModule.java     |  31 ++++
 .../opt4j/problem/StrictTTDecoder.java        |  13 +-
 .../opt4j/problem/comm/MessageDecoder.java    |  25 +++-
 .../InstantiatedTaskMappingDecoder.java       |   6 +
 ...InstantiatedTaskMappingDecoderAcyclic.java |   6 +
 .../PartitionMappingDecoderGraph.java         | 133 ++++++++++++++++++
 .../PartitionMappingIdentityDecoder.java      |  75 ++++++++++
 .../safetyfunction/SFEncodingDecoder.java     |  17 ++-
 .../safetyfunction/SFGraphDecoder.java        |  16 ++-
 .../SFMappingConstraintDecoder.java           |   6 +
 .../safetyfunction/SFMappingDecoder.java      |   6 +
 .../AbstractTaskMappingIdentityDecoder.java   |  24 +++-
 .../taskmapping/TaskMappingDecoderBase.java   |  77 ++++++++++
 .../AbstractTaskMappingDecoder.java           |   2 +-
 .../FailSilentAbstractTaskMappingDecoder.java |   8 +-
 ...ctionVotingAbstractTaskMappingDecoder.java |   8 +-
 .../TaskInstanceResourceAlignmentDecoder.java |  88 ++++++++++++
 .../opt4j/solution/StrictTTSchedule.java      |   4 +-
 ...aluator.java => TaskMappingEvaluator.java} |  25 +++-
 .../MappingEvaluatorConstraint.java           |  15 +-
 .../objective/MappingEvaluatorObjective.java  |  13 +-
 .../sysmodel/FailSilentExecModelFactory.java  |   4 +-
 .../FaultDetectionVotingExecModelFactory.java |   4 +-
 .../arch/PlatformCommunicationGraph.java      | 128 -----------------
 .../dse/sysmodel/arch/SystemModelAdapter.java |  87 +++++++++++-
 .../af3/AF3DeployableComponentAdapter.java    |   5 +-
 .../arch/af3/AF3SystemModelAdapter.java       |   5 +-
 .../sysmodel/mapping/IMappingEncoding.java    |   2 +
 .../sysmodel/mapping/comm/IMessageRouter.java |  12 +-
 ...sageRouterBase.java => MessageRouter.java} |  43 ++++--
 .../mapping/comm/ShortestPathRouter.java      |  33 +++--
 .../sysmodel/sched/comm/TDMABusScheduler.java |  12 +-
 .../alg/graph/DependencyGraph.java            | 124 ++++++++--------
 .../alg/graph/display/NamedVertex.java        |   3 +
 63 files changed, 1319 insertions(+), 492 deletions(-)
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.java
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraph.java
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPartitionMappingModule.java
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPlatformCommunicationGraphModule.java
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/NopMutateOperator.java
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/platform/NopPlatformCommGraphMutateModule.java
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingIdentityDecoder.java
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/TaskMappingDecoderBase.java
 rename org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/{instantiatemapping => taskmapping/instantiate}/AbstractTaskMappingDecoder.java (99%)
 rename org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/{instantiatemapping => taskmapping/instantiate}/FailSilentAbstractTaskMappingDecoder.java (97%)
 rename org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/{instantiatemapping => taskmapping/instantiate}/FaultDetectionVotingAbstractTaskMappingDecoder.java (97%)
 create mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/TaskInstanceResourceAlignmentDecoder.java
 rename org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/{MappingEvaluator.java => TaskMappingEvaluator.java} (80%)
 delete mode 100644 org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/PlatformCommunicationGraph.java
 rename org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/{MessageRouterBase.java => MessageRouter.java} (67%)

diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java
index fae01031..59585161 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java
@@ -23,10 +23,14 @@ import java.util.List;
 import javax.activation.UnsupportedDataTypeException;
 
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.ArchitectureExplorationCreator;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.partitionmapping.PartitionMappingCreator;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.platform.PlatformCommunicationGraphCreator;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.safetyfunctionarch.SafetyFunctionArchCreator;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.taskmapping.AbstractTaskMappingCreator;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.taskmapping.TaskMappingCreator;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.safetyfunctionarch.SafetyFunctionArchEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry;
@@ -40,14 +44,17 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchitectureDec
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchitectureExplorationProblemModule;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.StrictTTDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.comm.MessageDecoder;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatemapping.AbstractTaskMappingDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoderAcyclic;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.partitionmapping.PartitionMappingDecoderGraph;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.partitionmapping.PartitionMappingIdentityDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.safetyfunction.SFEncodingDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.safetyfunction.SFGraphDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.safetyfunction.SFMappingConstraintDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.safetyfunction.SFMappingDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.AbstractTaskMappingIdentityDecoder;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.AbstractTaskMappingDecoder;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.TaskInstanceResourceAlignmentDecoder;
 import org.fortiss.af3.exploration.alg.dse.evaluator.ArchitectureEvaluator;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.FailSilentExecModelFactory;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.FaultDetectionVotingExecModelFactory;
@@ -56,6 +63,7 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
 import org.fortiss.af3.exploration.moea.model.DseSpecification;
 import org.fortiss.af3.exploration.moea.model.feature.SafetyExploration;
 import org.fortiss.af3.exploration.moea.model.parameters.ExecutionModel;
+import org.jgrapht.experimental.dag.DirectedAcyclicGraph.CycleFoundException;
 
 /**
  * Factory to create exploration problems solved by the DSE. It is used to create the single parts
@@ -113,6 +121,9 @@ public class DSEFactory {
 			systemModelAdapter.addSafetyFunctionAdapters(sfExplorationModule.getAdapters());
 			createSafetyFunctionArchProblem(archExpProblemModule, systemModelAdapter, execDepGraph);
 		}
+		createPartitionMappingProblem(archExpProblemModule, dse, systemModelAdapter, execDepGraph);
+		createPlatformCommunicationGraphProblem(archExpProblemModule, dse, systemModelAdapter,
+				execDepGraph);
 		createAbstractTaskMappingProblem(tmFactory, archExpProblemModule, dse, systemModelAdapter,
 				execDepGraph);
 		createTaskMappingInstantiationProblem(tmFactory, archExpProblemModule, dse,
@@ -121,8 +132,7 @@ public class DSEFactory {
 
 	/**
 	 * Creates the safety function architecture exploration sub-problem, or, more specifically,
-	 * the
-	 * creators of this sub-problem.
+	 * the creators of this sub-problem.
 	 *
 	 * @param archExpProblemModule
 	 *            The {@link CompositeProblemModuleBase} declaring the architectural exploration
@@ -167,6 +177,56 @@ public class DSEFactory {
 				sfDecoders);
 	}
 
+	/**
+	 * Creates a Partition Mapping sub-problem: Partition --> ExecutionUnit.
+	 * 
+	 * @param archExpProblemModule
+	 *            The {@link CompositeProblemModuleBase} declaring the architectural exploration
+	 *            problem.
+	 * @param dse
+	 *            The design space exploration description.
+	 * @param systemModelAdapter
+	 *            The adapter to model of the system on which the dse is executed.
+	 * @param execDepGraph
+	 *            Dependency graph defining the execution order.
+	 * @throws CycleFoundException
+	 *             if a cyclic dependency is discovered when registering the problem.
+	 */
+	@SuppressWarnings("unchecked")
+	private void createPartitionMappingProblem(
+			ArchitectureExplorationProblemModule archExpProblemModule, DseSpecification dse,
+			SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
+			DecoderDependencyGraph execDepGraph) throws CycleFoundException {
+		Class<PartitionMappingEncoding> pmEnodingClass = PartitionMappingEncoding.class;
+		PartitionMappingCreator pmCreator =
+				new PartitionMappingCreator(systemModelAdapter, execDepGraph);
+
+		@SuppressWarnings("rawtypes") List<ComposableDecoder> pmDecoders = new ArrayList<>();
+		PartitionMappingIdentityDecoder pmDecoder = new PartitionMappingIdentityDecoder();
+		TaskInstanceResourceAlignmentDecoder tiraDecoder =
+				new TaskInstanceResourceAlignmentDecoder();
+		pmDecoders.add(pmDecoder);
+		pmDecoders.add(tiraDecoder);
+		pmCreator.registerAssocDecoders(pmDecoder);
+		archExpProblemModule.registerSubProblem(pmEnodingClass, pmCreator, pmDecoders);
+	}
+
+	private void createPlatformCommunicationGraphProblem(
+			ArchitectureExplorationProblemModule archExpProblemModule, DseSpecification dse,
+			SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
+			DecoderDependencyGraph execDepGraph) throws CycleFoundException {
+		Class<PlatformCommunicationGraphEncoding> pmEnodingClass =
+				PlatformCommunicationGraphEncoding.class;
+		PlatformCommunicationGraphCreator pmCreator =
+				new PlatformCommunicationGraphCreator(systemModelAdapter, execDepGraph);
+
+		@SuppressWarnings("rawtypes") List<ComposableDecoder> pmDecoders = new ArrayList<>();
+		PartitionMappingDecoderGraph pmgDecoder = new PartitionMappingDecoderGraph();
+		pmDecoders.add(pmgDecoder);
+		// pmCreator.registerAssocDecoders(pmgDecoder);
+		archExpProblemModule.registerSubProblem(pmEnodingClass, pmCreator, pmDecoders);
+	}
+
 	/**
 	 * Creates a task mapping sub-problem (see {@link AbstractTaskMappingEncoding}) which describes
 	 * the problem of mapping a logical/functional application architecture to a defined platform
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java
index a4d04fec..554a98ed 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/Explorer.java
@@ -80,6 +80,8 @@ public class Explorer {
 		Map<ExplorationTarget<?>, ExplorationTarget<?>> targetAssocMap = new HashMap<>();
 		DseSpecification dseSpec = copyDSESpecification(dse, targetAssocMap);
 		ExplorationSpecification expSpec = dseSpec.getTargetSpecification();
+		// FIXME: temporally disable the the implicit constraint generation.
+		generateImplicitConstraints = false;
 		if(generateImplicitConstraints) {
 			expSpec.getTargets().addAll(ImplicitExplorationTargetFactory.getInstance()
 					.createImplicitExplorationTargets(dseSpec, systemModelAdapter));
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/TaskMappingFactory.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/TaskMappingFactory.java
index 0815c889..518ebf3e 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/TaskMappingFactory.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/TaskMappingFactory.java
@@ -32,9 +32,9 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskmap
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.EvaluatorWrapper;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.StrictTTDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.comm.MessageDecoder;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatemapping.AbstractTaskMappingDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoderAcyclic;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.AbstractTaskMappingDecoder;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm.IMessageRouter;
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java
index fcc00dfb..f934f458 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java
@@ -30,12 +30,17 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import org.fortiss.af3.exploration.alg.dse.CompositeExplorationSolution;
 import org.fortiss.af3.exploration.alg.dse.backend.ExplorerBackendBase;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.mating.MatingCrossoverMutateRepairModule;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.copy.partitionmapping.CopyPartitionMappingModule;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.copy.platform.CopyPlatformCommunicationGraphModule;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.copy.safetyfunctionarch.CopySafetyFunctionArchModule;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.copy.taskmapping.CopyTaskMappingModule;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover.CrossoverAbstractTaskMappingModule;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover.NopCrossoverInstantiatedTaskMappingModule;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover.NopCrossoverPartitionMappingModule;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover.NopCrossoverPlatformCommunicationGraphModule;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover.NopCrossoverSFArchModule;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.partitionmapping.PartitionMappingModule;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.platform.NopPlatformCommGraphMutateModule;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.safetyarch.MutateSafetyFunctionArchitectureModule;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskinstantiation.MutateTaskInstanceModule;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskmapping.MutateTaskMappingModule;
@@ -160,14 +165,11 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> {
 
 		// Configure operators
 		// 1. Crossover
-		CrossoverAbstractTaskMappingModule crossoverModule =
-				new CrossoverAbstractTaskMappingModule(systemModelAdapter, 0.3);
-		modules.add(crossoverModule);
-		NopCrossoverInstantiatedTaskMappingModule nopCrossoverInstMapping =
-				new NopCrossoverInstantiatedTaskMappingModule();
-		modules.add(nopCrossoverInstMapping);
-		NopCrossoverSFArchModule nopCrossoverSFArch = new NopCrossoverSFArchModule();
-		modules.add(nopCrossoverSFArch);
+		modules.add(new CrossoverAbstractTaskMappingModule(systemModelAdapter, 0.3));
+		modules.add(new NopCrossoverInstantiatedTaskMappingModule());
+		modules.add(new NopCrossoverSFArchModule());
+		modules.add(new NopCrossoverPartitionMappingModule());
+		modules.add(new NopCrossoverPlatformCommunicationGraphModule());
 
 		// =====================================
 		// 2. Mutation (in order)
@@ -180,6 +182,9 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> {
 			modules.add(sfArchModule);
 		}
 
+		// NOP for PlatformCommunicationGraph
+		modules.add(new NopPlatformCommGraphMutateModule());
+
 		// Partition Exploration
 		modules.add(new PartitionMappingModule(systemModelAdapter));
 
@@ -195,9 +200,13 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> {
 		// mutateModule.setMutationRate(0.125);
 		modules.add(mutateModule);
 
+		// =====================================
 		// 3. Genotype copy
+		// =====================================
 		modules.add(new CopyTaskMappingModule());
 		modules.add(new CopySafetyFunctionArchModule());
+		modules.add(new CopyPartitionMappingModule());
+		modules.add(new CopyPlatformCommunicationGraphModule());
 
 		// Define a completer module that "controls" the execution of the decode and the evaluation
 		// phases. It also allows to parallelize the execution of these phases.
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java
index 2e175344..46350306 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java
@@ -15,8 +15,8 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.partitionmapping;
 
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEncoding.CREATE_STARTEGY;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding.CREATE_STARTEGY;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.create.ComposableCreatorBase;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.genotype.FlatGenotypeMap;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.graph.DecoderDependencyGraph;
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.java
new file mode 100644
index 00000000..7178369b
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.java
@@ -0,0 +1,58 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2018 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.platform;
+
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.create.ComposableCreatorBase;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.genotype.FlatGenotypeMap;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.graph.DecoderDependencyGraph;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
+import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
+import org.fortiss.af3.exploration.alg.service.IExplorationEncoding;
+
+/**
+ * 
+ * @author diewald
+ */
+public class PlatformCommunicationGraphCreator
+		extends ComposableCreatorBase<PlatformCommunicationGraphEncoding> {
+	/** Constructor. */
+	public PlatformCommunicationGraphCreator(
+			SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
+			DecoderDependencyGraph depGraph) {
+		super(systemModelAdapter, depGraph);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public PlatformCommunicationGraphEncoding createComposable(FlatGenotypeMap createdGenotypes,
+			FlatPhenotypeMap<Phenotype> decodedPhenotypes) {
+		PlatformCommunicationGraphEncoding pcgEncoding = new PlatformCommunicationGraphEncoding(
+				systemModelAdapter, systemModelAdapter.createGraph());
+		// Debug code
+		// if(isDebugVerboseEnabled()) {
+		// pcgEncoding.display();
+		// }
+		return pcgEncoding;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<? extends IExplorationEncoding> getCreatedEncodingType() {
+		return PlatformCommunicationGraphEncoding.class;
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEncoding.java
index 044eecaf..80c2fe78 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEncoding.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEncoding.java
@@ -17,6 +17,7 @@ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -50,10 +51,6 @@ public abstract class MappingEncoding<G extends Genotype, S extends IRequestAdap
 	 */
 	protected ListMultimap<S, M> allocationMap = LinkedListMultimap.create();
 
-	public enum CREATE_STARTEGY {
-		MIN_SET, RANDOM_SET, MAX_SET
-	}
-
 	/**
 	 * Creates a copy of the internal allocation map of {@code this} {@link TaskMappingEncoding}.
 	 */
@@ -70,13 +67,34 @@ public abstract class MappingEncoding<G extends Genotype, S extends IRequestAdap
 	/** {@inheritDoc} */
 	@Override
 	public synchronized Collection<T> getAllocatedResourcesFor(S requester) {
-		Collection<T> allocatedResourcesForRequester = new ArrayList<>();
+		Collection<T> allocatedResourcesForRequester = new HashSet<>();
 		for(IMappingEntry<S, T> currentMappingEntry : allocationMap.get(requester)) {
 			allocatedResourcesForRequester.add(currentMappingEntry.getTarget());
 		}
 		return allocatedResourcesForRequester;
 	}
 
+	/** {@inheritDoc} */
+	@Override
+	public synchronized Collection<T> getResources() {
+		Collection<T> allocatedResourcesForRequester = new HashSet<>();
+		for(IMappingEntry<S, T> currentMappingEntry : allocationMap.values()) {
+			allocatedResourcesForRequester.add(currentMappingEntry.getTarget());
+		}
+		return allocatedResourcesForRequester;
+	}
+
+	/** NOTE: ONLY for one to one mappings! */
+	public List<S> getRequesters(T resource) {
+		List<S> allocatedRequesters = new ArrayList<>();
+		for(IMappingEntry<S, T> currentMappingEntry : allocationMap.values()) {
+			if(currentMappingEntry.getTarget() == resource) {
+				allocatedRequesters.add(currentMappingEntry.getSource());
+			}
+		}
+		return allocatedRequesters;
+	}
+
 	/** {@inheritDoc} */
 	@Override
 	public List<M> getMappingEntriesOf(S source) {
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEntryBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEntryBase.java
index 5c618d4e..057c56f8 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEntryBase.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/MappingEntryBase.java
@@ -42,6 +42,11 @@ public abstract class MappingEntryBase<S extends IRequestAdapter<?>, T extends I
 	protected ClassToInstanceMap<IMappingEntry<S, T>> associatedEntries =
 			MutableClassToInstanceMap.create();
 
+	public MappingEntryBase(S source, T target) {
+		this.source = source;
+		this.target = target;
+	}
+
 	/** {@inheritDoc} */
 	@Override
 	public S getSource() {
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEncoding.java
index fb22cc96..1ad321a3 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEncoding.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEncoding.java
@@ -23,14 +23,10 @@ import java.util.Map;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.genotype.ComposableGenotype;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype;
-import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.random.RandomExploration;
 
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ListMultimap;
-
 /**
  * Encoding that maps partition, which host tasks, to execution units. Typically, these are cores.
  * The encoding is essentially a two-dimensional table.
@@ -38,14 +34,14 @@ import com.google.common.collect.ListMultimap;
  * @author diewald
  */
 public class PartitionMappingEncoding extends
-		MappingEncoding<PartitionMappingEncoding, Partition, IExecutionUnitAdapter<?>, PartitionMappingEntry>
+		MappingEncoding<PartitionMappingEncoding, Partition, IResourceAdapter<?>, PartitionMappingEntry>
 		implements ComposableGenotype, Cloneable {
-	/** The allocation table. */
-	private ListMultimap<IResourceAdapter<?>, Partition> allocationTable =
-			ArrayListMultimap.create();
-
 	private Collection<? extends IResourceAdapter<?>> targetSet;
 
+	public enum CREATE_STARTEGY {
+		MIN_SET, RANDOM_SET, MAX_SET
+	}
+
 	/** Constructor. */
 	// TODO: The strategy can be replaced by lambdas for a cleaner design.
 	public PartitionMappingEncoding(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
@@ -56,19 +52,24 @@ public class PartitionMappingEncoding extends
 		targetSet = systemModelAdapter.getDeploymentTargets();
 		if(strategy == CREATE_STARTEGY.MIN_SET) {
 			for(IResourceAdapter<?> target : targetSet) {
-				allocationTable.put(target, new Partition());
+				Partition part = new Partition();
+				allocationMap.put(part, new PartitionMappingEntry(part, target));
 			}
 		} else if(strategy == CREATE_STARTEGY.RANDOM_SET) {
 			for(IResourceAdapter<?> target : targetSet) {
 				int randMaxPartitions = RandomExploration.getInstance().nextInt(taskNum);
+				// Ensure at least one partition per phys. execution unit.
+				randMaxPartitions = (randMaxPartitions < 1) ? 1 : randMaxPartitions;
 				for(int i = 0; i < randMaxPartitions; ++i) {
-					allocationTable.put(target, new Partition());
+					Partition part = new Partition();
+					allocationMap.put(part, new PartitionMappingEntry(part, target));
 				}
 			}
 		} else if(strategy == CREATE_STARTEGY.MAX_SET) {
 			for(IResourceAdapter<?> target : targetSet) {
 				for(int i = 0; i < taskNum; ++i) {
-					allocationTable.put(target, new Partition());
+					Partition part = new Partition();
+					allocationMap.put(part, new PartitionMappingEntry(part, target));
 				}
 			}
 		}
@@ -79,36 +80,33 @@ public class PartitionMappingEncoding extends
 		// Prototype for newInstance().
 	}
 
-	public Collection<IResourceAdapter<?>> getResources() {
-		return allocationTable.keySet();
-	}
-
-	public List<Partition> getRequesters(IResourceAdapter<?> resource) {
-		return allocationTable.get(resource);
-	}
-
 	/** Creates a {@link Partition} that is allocated to the given {@link IResourceAdapter}. */
 	public void createPartition(IResourceAdapter<?> resource) {
-		allocationTable.put(resource, new Partition());
+		Partition newPartition = new Partition();
+		allocationMap.put(newPartition, new PartitionMappingEntry(newPartition, resource));
 	}
 
 	/** Removes a random {@link Partition} allocation to the given {@link IResourceAdapter}. */
-	public void removeRandomPartition(IResourceAdapter<?> resource) {
-		List<Partition> partitions = allocationTable.get(resource);
+	public boolean removeRandomPartition(IResourceAdapter<?> resource) {
+		List<Partition> partitions = getRequesters(resource);
+		if(partitions.size() == 1) {
+			return false;
+		}
 		int randIdx = RandomExploration.getInstance().nextInt(partitions.size());
 		Partition rmPartition = partitions.get(randIdx);
 		removePartition(resource, rmPartition);
+		return true;
 	}
 
 	/** Removes the given {@link Partition} allocation to the given {@link IResourceAdapter}. */
 	public void removePartition(IResourceAdapter<?> resource, Partition partition) {
-		allocationTable.remove(resource, partition);
+		allocationMap.remove(resource, partition);
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public int size() {
-		return allocationTable.keySet().size();
+		return allocationMap.keySet().size();
 	}
 
 	/** {@inheritDoc} */
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEntry.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEntry.java
index b9a9289f..1af8d4e9 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEntry.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/partitionmapping/PartitionMappingEntry.java
@@ -16,19 +16,23 @@
 package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping;
 
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEntryBase;
-import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter;
+import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.IMappingEntry;
 
 /**
  * 
  * @author diewald
  */
-public class PartitionMappingEntry extends MappingEntryBase<Partition, IExecutionUnitAdapter<?>> {
+public class PartitionMappingEntry extends MappingEntryBase<Partition, IResourceAdapter<?>> {
+
+	/** Constructor. */
+	public PartitionMappingEntry(Partition partition, IResourceAdapter<?> execUnit) {
+		super(partition, execUnit);
+	}
 
 	/** {@inheritDoc} */
 	@Override
-	public IMappingEntry<Partition, IExecutionUnitAdapter<?>> clone() {
-		// TODO Auto-generated method stub
-		return null;
+	public IMappingEntry<Partition, IResourceAdapter<?>> clone() {
+		return new PartitionMappingEntry(getSource(), getTarget());
 	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java
new file mode 100644
index 00000000..7128803a
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java
@@ -0,0 +1,103 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2014 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform;
+
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.genotype.ComposableGenotype;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype;
+import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter;
+import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
+import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
+import org.fortiss.af3.exploration.alg.graph.display.JGraphTVisualizer;
+import org.fortiss.af3.exploration.alg.service.IExplorationEncoding;
+import org.jgrapht.DirectedGraph;
+import org.jgrapht.graph.DefaultEdge;
+
+/**
+ * Abstracts the communication network present in a platform system meta-model to a flat graph. This
+ * graph is needed to manage the communication of logical {@link IDeployableComponentAdapter}s after
+ * they have been deployed onto a concrete platform. More precisely, the graph is used for routing
+ * of (physical) messages and their scheduling on the communication resources, like busses.
+ * 
+ * @author diewald
+ */
+public class PlatformCommunicationGraphEncoding implements IExplorationEncoding, ComposableGenotype,
+		ComposablePhenotype<PartitionMappingEncoding>, Cloneable {
+
+	/** Representation of input system model */
+	protected SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter;
+
+	/** The graph representing the communication structure of a platform. */
+	protected DirectedGraph<IResourceAdapter<?>, DefaultEdge> platformGraph;
+
+	/** Constructor for the initial version of the Graph w/o available Partitions. */
+	public PlatformCommunicationGraphEncoding(
+			SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
+			DirectedGraph<IResourceAdapter<?>, DefaultEdge> platformGraph) {
+		this.systemModelAdapter = systemModelAdapter;
+		this.platformGraph = platformGraph;
+	}
+
+	/** Copy constructor. */
+	protected PlatformCommunicationGraphEncoding(
+			SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter) {
+		this.systemModelAdapter = systemModelAdapter;
+	}
+
+	/** Creates a Dialog that illustrates this {@link DirectedGraph}. */
+	public void display() {
+		JGraphTVisualizer<IResourceAdapter<?>, DefaultEdge> taskViz =
+				new JGraphTVisualizer<IResourceAdapter<?>, DefaultEdge>(platformGraph);
+		taskViz.displayGraph("Platform communication graph");
+	}
+
+	/**
+	 * Returns the actual graph that contains information about the {@link IResourceAdapter}s and
+	 * their connections.
+	 */
+	public DirectedGraph<IResourceAdapter<?>, DefaultEdge> getActualGraph() {
+		return platformGraph;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public int size() {
+		return platformGraph.vertexSet().size() + platformGraph.edgeSet().size();
+	}
+
+	/** {@inheritDoc} */
+	@SuppressWarnings("unchecked")
+	@Override
+	public PlatformCommunicationGraphEncoding newInstance() {
+		PlatformCommunicationGraphEncoding pcgEncoding =
+				new PlatformCommunicationGraphEncoding(systemModelAdapter, this.platformGraph);
+
+		// Graphs.addGraph(pcgEncoding.platformGraph, this.platformGraph);
+		return pcgEncoding;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<? extends ComposableGenotype> getGTypeToRegister() {
+		return PlatformCommunicationGraphEncoding.class;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<? extends ComposablePhenotype<?>> getPTypeToRegister() {
+		return PlatformCommunicationGraphEncoding.class;
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEncoding.java
index 690e2fc5..2b7476fd 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEncoding.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEncoding.java
@@ -38,7 +38,6 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.Task
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.constraint.InternalReplicationConstraint;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.constraint.InternalSeparationConstraint;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.genotype.ComposableGenotype;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.CompositePhenotype;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.encoding.ConstrainedEncoding;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter;
@@ -69,9 +68,8 @@ import com.google.common.collect.Multimap;
 // for the subclass of TaskMappingEncoding and passed to the CompositePhenotype.
 public abstract class TaskMappingEncoding<S extends IDeployableComponentAdapter<?>, T extends TaskMappingEntry<S, Partition>>
 		extends MappingEncoding<TaskMappingEncoding<S, T>, S, Partition, T>
-		implements IMappingEncoding<S, Partition, T>, ComposableGenotype,
-		CompositePhenotype<TaskMappingEncoding<S, T>>, ArchExpSubEncoding, IExplorationEncoding,
-		ConstrainedEncoding, Cloneable {
+		implements IMappingEncoding<S, Partition, T>, ComposableGenotype, ArchExpSubEncoding,
+		IExplorationEncoding, ConstrainedEncoding, Cloneable {
 	/** Random generator */
 	private RandomExploration rand = RandomExploration.getInstance();
 
@@ -148,7 +146,8 @@ public abstract class TaskMappingEncoding<S extends IDeployableComponentAdapter<
 	public TaskMappingEncoding(DseSpecification dse,
 			SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter, boolean initialize)
 			throws ExplorationException {
-		this(dse, systemModelAdapter, null, new TaskGraphEncoding<>(systemModelAdapter));
+		this(dse, systemModelAdapter, new PartitionMappingEncoding(systemModelAdapter, null),
+				new TaskGraphEncoding<>(systemModelAdapter));
 		if(initialize) {
 			resetEncoding();
 		}
@@ -187,6 +186,12 @@ public abstract class TaskMappingEncoding<S extends IDeployableComponentAdapter<
 		completeEncoding(incompleteEncoding);
 	}
 
+	// TODO: This is a HACK, which is required to get the recent set of target partitions. Here, the
+	// task mapping class architecture needs to be reworked.
+	public void updatePartitionMapping(PartitionMappingEncoding partMappingEncoding) {
+		this.partMappingEncoding = partMappingEncoding;
+	}
+
 	/**
 	 * Adds the given {@link TaskMappingEntry} to the internal allocation table and adds the
 	 * references between {@link TaskMappingEntry}s accordingly.
@@ -472,14 +477,14 @@ public abstract class TaskMappingEncoding<S extends IDeployableComponentAdapter<
 	 * {@link TaskMappingEntry} defines the source and the target for the created
 	 * {@link TaskMappingEntry}.
 	 * 
-	 * @param allocEntry
+	 * @param mappingEntry
 	 *            Existing {@link TaskMappingEntry} serving as a template for the created
 	 *            {@link TaskMappingEntry}.
 	 * @return The created {@link TaskMappingEntry}.
 	 */
-	public <S extends TaskMappingEntry<IDeployableComponentAdapter<?>, Partition>> T
-			createAndAddEntry(S allocEntry) {
-		T newEntry = createEntry(allocEntry);
+	public <U extends TaskMappingEntry<IDeployableComponentAdapter<?>, Partition>> T
+			createAndAddEntry(U mappingEntry) {
+		T newEntry = createEntry(mappingEntry);
 		addAllocation(newEntry);
 		return newEntry;
 	}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEntry.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEntry.java
index 4f4ca634..da713dc7 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEntry.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/TaskMappingEntry.java
@@ -32,8 +32,7 @@ public abstract class TaskMappingEntry<S extends IRequestAdapter<?>, T extends I
 
 	/** Constructs a mapping entry the represents the mapping to a given deployment target. */
 	protected TaskMappingEntry(S deployableComponent, T target) {
-		this.source = deployableComponent;
-		this.target = target;
+		super(deployableComponent, target);
 	}
 
 	/** {@inheritDoc} */
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/abstractmapping/AbstractTaskMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/abstractmapping/AbstractTaskMappingEncoding.java
index b2ae6901..7b087250 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/abstractmapping/AbstractTaskMappingEncoding.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/abstractmapping/AbstractTaskMappingEncoding.java
@@ -16,16 +16,13 @@
 package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping;
 
 import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
 
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.SafeTaskGraphEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.TaskGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.genotype.ComposableGenotype;
@@ -69,6 +66,14 @@ public class AbstractTaskMappingEncoding
 		super(dse, systemModelAdapter, partEnc, tgEncoding, initialize);
 	}
 
+	/** Copy Constructor. */
+	public AbstractTaskMappingEncoding(DseSpecification dse,
+			SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
+			PartitionMappingEncoding partEnc, TaskGraphEncoding<?, ?, ?> tgEncoding)
+			throws ExplorationException {
+		super(dse, systemModelAdapter, partEnc, tgEncoding);
+	}
+
 	/**
 	 * Constructor that optionally initializes the encoding to a random encoding
 	 * 
@@ -150,7 +155,8 @@ public class AbstractTaskMappingEncoding
 	public AbstractTaskMappingEncoding clone() {
 		AbstractTaskMappingEncoding clonedEncoding;
 		try {
-			clonedEncoding = new AbstractTaskMappingEncoding(dse, systemModelAdapter, false);
+			clonedEncoding = new AbstractTaskMappingEncoding(dse, systemModelAdapter,
+					partMappingEncoding, tgEncoding);
 		} catch(ExplorationException e) {
 			// Opt4J does not allow to throw Exceptions here.
 			throw new RuntimeException(e);
@@ -171,47 +177,8 @@ public class AbstractTaskMappingEncoding
 	}
 
 	/** {@inheritDoc} */
-	@SuppressWarnings("unchecked")
 	@Override
 	public Class<? extends ComposablePhenotype<?>> getPTypeToRegister() {
 		return AbstractTaskMappingEncoding.class;
 	}
-
-	/** {@inheritDoc} */
-	@Override
-	public <GT extends Genotype, CP extends ComposablePhenotype<GT>> CP
-			getSubPhenotype(Class<CP> subPhenotype) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public <GT extends Genotype, CP extends ComposablePhenotype<GT>> void
-			putSubPhenotype(Class<CP> subGenotype, CP curPhenotype) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public List<ComposablePhenotype<? extends Genotype>> getSubPhenotypes() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Set<Class<? extends ComposablePhenotype<? extends Genotype>>> keySet() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Iterator<Entry<Class<? extends ComposablePhenotype<? extends Genotype>>, ComposablePhenotype<? extends Genotype>>>
-			iterator() {
-		// TODO Auto-generated method stub
-		return null;
-	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FailSilentTaskMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FailSilentTaskMappingEncoding.java
index dcfe74af..3ff346fe 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FailSilentTaskMappingEncoding.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FailSilentTaskMappingEncoding.java
@@ -16,23 +16,17 @@
 
 package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping;
 
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
-
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.TaskGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEntry;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
 import org.fortiss.af3.exploration.alg.exception.ExplorationException;
 import org.fortiss.af3.exploration.moea.model.DseSpecification;
-import org.opt4j.core.Genotype;
 
 /**
  * Problem encoding consisting of redundant {@link TaskMappingEntry}s with fail-silent assumption.
@@ -52,6 +46,13 @@ public class FailSilentTaskMappingEncoding
 		super(dse, systemModelAdapter, partEnc, tgEncoding);
 	}
 
+	/** Copy Constructor. */
+	FailSilentTaskMappingEncoding(DseSpecification dse,
+			SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
+			PartitionMappingEncoding partEnc, TaskGraphEncoding<?, ?, ?> tgEncoding) {
+		super(dse, systemModelAdapter, partEnc, tgEncoding);
+	}
+
 	// TODO: Check whether the two constructors below are actually needed.
 	/**
 	 * Constructor that optionally initializes the encoding to a random encoding
@@ -126,50 +127,8 @@ public class FailSilentTaskMappingEncoding
 	public FailSilentTaskMappingEncoding clone() {
 		// TODO: Here, we should maintain the mapping.
 		FailSilentTaskMappingEncoding clonedEncoding;
-		try {
-			clonedEncoding = new FailSilentTaskMappingEncoding(dse, systemModelAdapter, false);
-		} catch(ExplorationException e) {
-			// Opt4J does not allow to throw Exceptions here.
-			throw new RuntimeException(e);
-		}
+		clonedEncoding = new FailSilentTaskMappingEncoding(dse, systemModelAdapter,
+				partMappingEncoding, tgEncoding);
 		return clonedEncoding;
 	}
-
-	/** {@inheritDoc} */
-	@Override
-	public <GT extends Genotype, CP extends ComposablePhenotype<GT>> CP
-			getSubPhenotype(Class<CP> subPhenotype) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public <GT extends Genotype, CP extends ComposablePhenotype<GT>> void
-			putSubPhenotype(Class<CP> subGenotype, CP curPhenotype) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public List<ComposablePhenotype<? extends Genotype>> getSubPhenotypes() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Set<Class<? extends ComposablePhenotype<? extends Genotype>>> keySet() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Iterator<Entry<Class<? extends ComposablePhenotype<? extends Genotype>>, ComposablePhenotype<? extends Genotype>>>
-			iterator() {
-		// TODO Auto-generated method stub
-		return null;
-	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FaultDetectionVotingTaskMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FaultDetectionVotingTaskMappingEncoding.java
index a6f89aae..6a4183ae 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FaultDetectionVotingTaskMappingEncoding.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/FaultDetectionVotingTaskMappingEncoding.java
@@ -15,11 +15,6 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping;
 
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
-
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding;
@@ -27,12 +22,10 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.Ta
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEntry;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
 import org.fortiss.af3.exploration.alg.exception.ExplorationException;
 import org.fortiss.af3.exploration.moea.model.DseSpecification;
-import org.opt4j.core.Genotype;
 
 /**
  * Problem encoding of redundant {@link TaskMappingEncoding}s with fault detection and voting.
@@ -142,42 +135,4 @@ public class FaultDetectionVotingTaskMappingEncoding extends
 		}
 		return clonedEncoding;
 	}
-
-	/** {@inheritDoc} */
-	@Override
-	public <GT extends Genotype, CP extends ComposablePhenotype<GT>> CP
-			getSubPhenotype(Class<CP> subPhenotype) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public <GT extends Genotype, CP extends ComposablePhenotype<GT>> void
-			putSubPhenotype(Class<CP> subGenotype, CP curPhenotype) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public List<ComposablePhenotype<? extends Genotype>> getSubPhenotypes() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Set<Class<? extends ComposablePhenotype<? extends Genotype>>> keySet() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Iterator<Entry<Class<? extends ComposablePhenotype<? extends Genotype>>, ComposablePhenotype<? extends Genotype>>>
-			iterator() {
-		// TODO Auto-generated method stub
-		return null;
-	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/InstantiatedTaskMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/InstantiatedTaskMappingEncoding.java
index d89ea963..a1aba735 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/InstantiatedTaskMappingEncoding.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/taskmapping/instantiatedmapping/InstantiatedTaskMappingEncoding.java
@@ -19,6 +19,7 @@ import java.util.Collection;
 
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.TaskGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEntry;
@@ -52,6 +53,13 @@ public abstract class InstantiatedTaskMappingEncoding<T extends InstantiatedTask
 		super(dse, systemModelAdapter, partEnc, tgEncoding);
 	}
 
+	/** Copy Constructor. */
+	protected InstantiatedTaskMappingEncoding(DseSpecification dse,
+			SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
+			PartitionMappingEncoding partEnc, TaskGraphEncoding<?, ?, ?> tgEncoding) {
+		super(dse, systemModelAdapter, partEnc, tgEncoding);
+	}
+
 	// TODO: Check whether the two constructors below are actually needed.
 	/**
 	 * Constructor that optionally initializes the encoding to a random encoding
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/ComposableCreatorBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/ComposableCreatorBase.java
index f9c8b7b5..b63db253 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/ComposableCreatorBase.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/create/ComposableCreatorBase.java
@@ -119,11 +119,13 @@ public abstract class ComposableCreatorBase<G extends ComposableGenotype>
 						.findAny();
 
 		for(ComposableDecoder<G, ? extends ComposablePhenotype<G>> decoder : subDecoders) {
-			if(!isHybridPhenoRequiredAndCreated(createdGenotypeTypeSet,
-					decoder.getRequiredTypes()) ||
-					Genotype.class.isAssignableFrom(decoder.getOutputType())) {
-				continue;
-			}
+			/*
+			 * if(!isHybridPhenoRequiredAndCreated(createdGenotypeTypeSet,
+			 * decoder.getRequiredTypes()) ||
+			 * Genotype.class.isAssignableFrom(decoder.getOutputType())) {
+			 * continue;
+			 * }
+			 */
 
 			@SuppressWarnings("unchecked") ComposableDecoder<G, P> castedDecoder =
 					(ComposableDecoder<G, P>)decoder;
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoder.java
index eaf66fe6..fc32f1b3 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/ComposableDecoder.java
@@ -36,6 +36,8 @@ import org.opt4j.core.problem.Decoder;
 public interface ComposableDecoder<G extends ComposableGenotype, P extends ComposablePhenotype<?>>
 		extends IDependencyModule<IExplorationEncoding, P> {
 
+	Class<?> getPrimaryInputType();
+
 	/**
 	 * Passes the {@link ComposableGenotype} to the concrete decode method of the concrete
 	 * {@link ComposableDecoder} and returns the resulting {@link ComposablePhenotype}.
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/CompositeDecoderBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/CompositeDecoderBase.java
index fdd5d9d0..b631f18f 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/CompositeDecoderBase.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/CompositeDecoderBase.java
@@ -130,12 +130,9 @@ public abstract class CompositeDecoderBase<C extends CompositeGenotype<Class<? e
 							(ComposableDecoder<ComposableGenotype, ComposablePhenotype<?>>)decoder;
 					subDecoders.put(castedDecoder, registeredSubDecoders.get(decoder));
 				} else {
-					throw new DecodingException(
-							genotype,
-							decoder,
-							"The sub-decoder " +
-									decoder.getClass().getSimpleName() +
-									" has been found in the dependency graph but it has not been regirstered at this composite decoder.");
+					throw new DecodingException(genotype, decoder, "The sub-decoder " +
+							decoder.getClass().getSimpleName() +
+							" has been found in the dependency graph but it has not been regirstered at this composite decoder.");
 				}
 			}
 		}
@@ -156,9 +153,8 @@ public abstract class CompositeDecoderBase<C extends CompositeGenotype<Class<? e
 			// shall not be just overridden.
 			if(Genotype.class.isAssignableFrom(decType)) {
 				CP oldGenotype = genotype.get(decType);
-				curPhenotype =
-						castedDecoder.updateComposable(decodeableGenotype, oldGenotype,
-								decodedPhenotypes);
+				curPhenotype = castedDecoder.updateComposable(decodeableGenotype, oldGenotype,
+						decodedPhenotypes);
 			} else {
 				curPhenotype =
 						castedDecoder.decodeComposable(decodeableGenotype, decodedPhenotypes);
@@ -241,14 +237,14 @@ public abstract class CompositeDecoderBase<C extends CompositeGenotype<Class<? e
 	 * @throws CycleFoundException
 	 */
 	@Override
-	public
-			<G extends ComposableGenotype, CP extends ComposablePhenotype<G>, D extends ComposableDecoder<G, CP>>
+	public <G extends ComposableGenotype, CP extends ComposablePhenotype<G>, D extends ComposableDecoder<G, CP>>
 			void registerSubDecoder(Class<G> subGenotype, D subDecoder) throws CycleFoundException {
 		if(subGenotype == null || subDecoder == null) {
 			return;
 		}
 
-		registeredSubDecoders.put(subDecoder, subGenotype);
+		registeredSubDecoders.put(subDecoder,
+				(Class<? extends ComposableGenotype>)subDecoder.getPrimaryInputType());
 
 		@SuppressWarnings("unchecked") ComposableDecoder<ComposableGenotype, ComposablePhenotype<?>> castedSubDecoder =
 				(ComposableDecoder<ComposableGenotype, ComposablePhenotype<?>>)subDecoder;
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/evaluate/CompositeEvaluatorBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/evaluate/CompositeEvaluatorBase.java
index 1633c9c5..06b23dd5 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/evaluate/CompositeEvaluatorBase.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/evaluate/CompositeEvaluatorBase.java
@@ -264,8 +264,7 @@ public abstract class CompositeEvaluatorBase<P extends CompositePhenotype<?>>
 					(Class<SP>)currSubPhenotype.getClass();
 			phenotypeTypeMap.putEncoding(currSupPhenotypeType, currSubPhenotype);
 			if(CompositePhenotype.class.isAssignableFrom(currSubPhenotype.getClass())) {
-				@SuppressWarnings("unchecked") List<SP> subPhenos =
-						(List<SP>)phenotype.getSubPhenotypes();
+				List<SP> subPhenos = ((CompositePhenotype)currSubPhenotype).getSubPhenotypes();
 				subPhenotypes.addAll(0, subPhenos);
 			}
 		}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/partitionmapping/CopyPartitionMapping.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/partitionmapping/CopyPartitionMapping.java
index 2a5e12e6..641348ea 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/partitionmapping/CopyPartitionMapping.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/partitionmapping/CopyPartitionMapping.java
@@ -28,6 +28,6 @@ public class CopyPartitionMapping implements Copy<PartitionMappingEncoding> {
 	/** {@inheritDoc} */
 	@Override
 	public PartitionMappingEncoding copy(PartitionMappingEncoding other) {
-		return ((PartitionMappingEncoding)other).clone();
+		return other.clone();
 	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraph.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraph.java
new file mode 100644
index 00000000..940b8a0b
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraph.java
@@ -0,0 +1,33 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2018 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.copy.platform;
+
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
+import org.opt4j.operators.copy.Copy;
+
+/**
+ * 
+ * @author diewald
+ */
+public class CopyPlatformCommunicationGraph implements Copy<PlatformCommunicationGraphEncoding> {
+
+	/** {@inheritDoc} */
+	@Override
+	public PlatformCommunicationGraphEncoding copy(PlatformCommunicationGraphEncoding genotype) {
+		return genotype.newInstance();
+	}
+
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java
new file mode 100644
index 00000000..ff27643c
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java
@@ -0,0 +1,32 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2018 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.copy.platform;
+
+import org.opt4j.operators.copy.CopyModule;
+
+/**
+ * 
+ * @author diewald
+ */
+public class CopyPlatformCommunicationGraphModule extends CopyModule {
+
+	/** {@inheritDoc} */
+	@Override
+	protected void config() {
+		addOperator(CopyPlatformCommunicationGraph.class);
+	}
+
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/taskmapping/CopyAbstractTaskMapping.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/taskmapping/CopyAbstractTaskMapping.java
index 7dd68378..41356d99 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/taskmapping/CopyAbstractTaskMapping.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/taskmapping/CopyAbstractTaskMapping.java
@@ -28,6 +28,6 @@ public class CopyAbstractTaskMapping implements Copy<AbstractTaskMappingEncoding
 	/** {@inheritDoc} */
 	@Override
 	public AbstractTaskMappingEncoding copy(AbstractTaskMappingEncoding other) {
-		return (AbstractTaskMappingEncoding)other.clone();
+		return other.clone();
 	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPartitionMappingModule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPartitionMappingModule.java
new file mode 100644
index 00000000..b7589a43
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPartitionMappingModule.java
@@ -0,0 +1,31 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2018 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover;
+
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
+
+/**
+ * 
+ * @author diewald
+ */
+public class NopCrossoverPartitionMappingModule extends CrossoverOperatorModuleBase {
+	/** {@inheritDoc} */
+	@Override
+	public void config() {
+		super.config();
+		addOperatorInstance(PartitionMappingEncoding.class, new NopCrossover());
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPlatformCommunicationGraphModule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPlatformCommunicationGraphModule.java
new file mode 100644
index 00000000..fbad012d
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/crossover/NopCrossoverPlatformCommunicationGraphModule.java
@@ -0,0 +1,31 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2018 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.crossover;
+
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
+
+/**
+ * 
+ * @author diewald
+ */
+public class NopCrossoverPlatformCommunicationGraphModule extends CrossoverOperatorModuleBase {
+	/** {@inheritDoc} */
+	@Override
+	public void config() {
+		super.config();
+		addOperatorInstance(PlatformCommunicationGraphEncoding.class, new NopCrossover());
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/NopMutateOperator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/NopMutateOperator.java
new file mode 100644
index 00000000..6cc7d102
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/NopMutateOperator.java
@@ -0,0 +1,32 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2018 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate;
+
+import org.opt4j.core.Genotype;
+import org.opt4j.operators.mutate.Mutate;
+
+/**
+ * No-Op Mutation for Identity Decoders.
+ * 
+ * @author diewald
+ */
+public class NopMutateOperator implements Mutate<Genotype> {
+	/** {@inheritDoc} */
+	@Override
+	public void mutate(Genotype genotype, double p) {
+		return;
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/partitionmapping/MutatePartitionBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/partitionmapping/MutatePartitionBase.java
index e983d69f..ee5d6032 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/partitionmapping/MutatePartitionBase.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/partitionmapping/MutatePartitionBase.java
@@ -16,6 +16,7 @@
 package org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.partitionmapping;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
@@ -32,7 +33,7 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
  */
 public abstract class MutatePartitionBase extends MutateBase<PartitionMappingEncoding> {
 	/** Elements to which other elements may be allocated. */
-	private Collection<IResourceAdapter<?>> allocationTargets;
+	private Collection<IResourceAdapter<?>> allocationTargets = new HashSet<>();
 
 	/** Defines the rate at which mutations shall happen: Typically 1 / size of the gene. */
 	private double rate;
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/platform/NopPlatformCommGraphMutateModule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/platform/NopPlatformCommGraphMutateModule.java
new file mode 100644
index 00000000..65589cc7
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/mutate/platform/NopPlatformCommGraphMutateModule.java
@@ -0,0 +1,31 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2018 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.platform;
+
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.NopMutateOperator;
+import org.opt4j.operators.mutate.MutateModule;
+
+/**
+ * 
+ * @author diewald
+ */
+public class NopPlatformCommGraphMutateModule extends MutateModule {
+	/** {@inheritDoc} */
+	@Override
+	protected void config() {
+		addOperator(NopMutateOperator.class);
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java
index 92aeaecf..03916df2 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java
@@ -21,6 +21,7 @@ import java.util.Collections;
 
 import org.fortiss.af3.exploration.alg.dse.TaskMappingFactory;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.comm.MessageEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedAcyclicTaskGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedTaskGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding;
@@ -84,6 +85,8 @@ public class StrictTTDecoder<S extends InstantiatedTaskMappingEntry, T extends I
 		@SuppressWarnings("unchecked") InstantiatedAcyclicTaskGraphEncoding<S, ?> acycItgEnc =
 				phenotypeTypeMap.getEncoding(InstantiatedAcyclicTaskGraphEncoding.class);
 		assert (acycItgEnc != null) : "The required acyclic and instantiated task graph encoding could not be found in the map of already decoded phenotypes.";
+		PlatformCommunicationGraphEncoding pcgEncoding =
+				phenotypeTypeMap.getEncoding(PlatformCommunicationGraphEncoding.class);
 
 		// TODO: Externalize the validation such that the encoding is not required to be passed to
 		// the constructor (is there for validation purposes)
@@ -94,7 +97,8 @@ public class StrictTTDecoder<S extends InstantiatedTaskMappingEntry, T extends I
 
 		// TODO: Find out why the message scheduler does not require the task graph. Actually, it
 		// should require it...
-		simpleBusScheduler.schedule(schedule, msgEnc.getPeriodicMessages(), acycItgEnc);
+		simpleBusScheduler.schedule(schedule, msgEnc.getPeriodicMessages(), acycItgEnc,
+				pcgEncoding);
 		assert (schedule.validateSchedule(true));
 
 		return schedule;
@@ -119,6 +123,7 @@ public class StrictTTDecoder<S extends InstantiatedTaskMappingEntry, T extends I
 		Collection<Class<?>> reqTypes = new ArrayList<>();
 		reqTypes.add(InstantiatedTaskMappingEncoding.class);
 		reqTypes.add(MessageEncoding.class);
+		reqTypes.add(PlatformCommunicationGraphEncoding.class);
 		reqTypes.add(InstantiatedAcyclicTaskGraphEncoding.class);
 		// FIXME: Remove as soon as the evaluators can declare their required Phenotypes!!! (Needed
 		// for the period evaluator)
@@ -140,4 +145,10 @@ public class StrictTTDecoder<S extends InstantiatedTaskMappingEntry, T extends I
 	public Collection<Class<?>> getOptionalTypes() {
 		return Collections.emptySet();
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return InstantiatedTaskMappingEncoding.class;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java
index b1128015..9a90cb32 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java
@@ -20,9 +20,9 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 
-import org.fortiss.af3.exploration.alg.dse.TaskMappingFactory;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.comm.MessageEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedTaskGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry;
@@ -38,6 +38,8 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.comm.Message;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.comm.MessageGenerator;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm.IMessageRouter;
+import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm.IMessageRouter.RoutingStrategy;
+import org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm.MessageRouter;
 import org.jgrapht.DirectedGraph;
 import org.jgrapht.graph.DefaultEdge;
 
@@ -69,11 +71,8 @@ public class MessageDecoder<S extends TaskMappingEntry<IDeployableComponentAdapt
 	@Inject
 	public MessageDecoder(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter) {
 		this.systemModelAdapter = systemModelAdapter;
-
-		TaskMappingFactory<?, ?> tmFactory = TaskMappingFactory.getInstance();
-
 		messageGenerator = new MessageGenerator<S, T>(systemModelAdapter);
-		messageRouter = tmFactory.createShortestPathRouter(systemModelAdapter);
+		messageRouter = new MessageRouter(systemModelAdapter);
 	}
 
 	/**
@@ -84,10 +83,15 @@ public class MessageDecoder<S extends TaskMappingEntry<IDeployableComponentAdapt
 	@Override
 	public MessageEncoding<S, T> decodeComposable(T genotype,
 			FlatPhenotypeMap<Phenotype> decodedPhenotypes) throws DecodingException {
-		Collection<Message> generatedMessages = messageGenerator.generateMessages(genotype);
+		PlatformCommunicationGraphEncoding pcgEncoding =
+				decodedPhenotypes.getEncoding(PlatformCommunicationGraphEncoding.class);
+		assert (pcgEncoding != null) : "The required platform communication graph encoding could not" +
+				" be found in the map of already decoded phenotypes.";
 
+		Collection<Message> generatedMessages = messageGenerator.generateMessages(genotype);
 		Map<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> messageRouteMap =
-				messageRouter.calculateMessageRoutes(generatedMessages);
+				messageRouter.calculateMessageRoutes(generatedMessages, pcgEncoding,
+						RoutingStrategy.SHORTEST_PATH);
 		if(messageRouteMap == null) {
 			// At least one *invalid* communication link is required by the given mapping =>
 			// infeasible mapping.
@@ -123,6 +127,7 @@ public class MessageDecoder<S extends TaskMappingEntry<IDeployableComponentAdapt
 		Collection<Class<?>> reqTypes = new ArrayList<>();
 		reqTypes.add(InstantiatedTaskMappingEncoding.class);
 		reqTypes.add(InstantiatedTaskGraphEncoding.class);
+		reqTypes.add(PlatformCommunicationGraphEncoding.class);
 		return reqTypes;
 	}
 
@@ -138,4 +143,10 @@ public class MessageDecoder<S extends TaskMappingEntry<IDeployableComponentAdapt
 	public Class<MessageEncoding> getOutputType() {
 		return MessageEncoding.class;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return InstantiatedTaskMappingEncoding.class;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java
index c626056e..c029197c 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java
@@ -281,4 +281,10 @@ public class InstantiatedTaskMappingDecoder<T extends InstantiatedTaskMappingEnt
 	public Class<InstantiatedTaskGraphEncoding> getOutputType() {
 		return InstantiatedTaskGraphEncoding.class;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return InstantiatedTaskMappingEncoding.class;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoderAcyclic.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoderAcyclic.java
index e03b667c..42983f82 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoderAcyclic.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoderAcyclic.java
@@ -114,4 +114,10 @@ public class InstantiatedTaskMappingDecoderAcyclic<T extends InstantiatedTaskMap
 	public Class<InstantiatedAcyclicTaskGraphEncoding> getOutputType() {
 		return InstantiatedAcyclicTaskGraphEncoding.class;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return InstantiatedTaskMappingEncoding.class;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java
new file mode 100644
index 00000000..eef9693b
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java
@@ -0,0 +1,133 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2018 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.partitionmapping;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.ComposableDecoderBase;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchExpSubDecoder;
+import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ICommunicationResourceAdapter;
+import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
+import org.fortiss.tooling.common.util.LambdaUtils;
+import org.jgrapht.Graphs;
+import org.jgrapht.graph.DefaultEdge;
+
+/**
+ * 
+ * @author diewald
+ */
+public class PartitionMappingDecoderGraph extends
+		ComposableDecoderBase<PlatformCommunicationGraphEncoding, PlatformCommunicationGraphEncoding>
+		implements ArchExpSubDecoder {
+	/** {@inheritDoc} */
+	@Override
+	public PlatformCommunicationGraphEncoding decodeComposable(
+			PlatformCommunicationGraphEncoding genotype,
+			FlatPhenotypeMap<Phenotype> decodedPhenotypes) {
+		PartitionMappingEncoding pmEnc =
+				decodedPhenotypes.getEncoding(PartitionMappingEncoding.class);
+		assert (pmEnc != null) : "The required platform communication graph encoding could not" +
+				" be found in the map of already decoded phenotypes.";
+
+		for(IResourceAdapter<?> execUnit : genotype.getActualGraph().vertexSet()) {
+			for(IResourceAdapter<?> partition : pmEnc.getRequesters(execUnit)) {
+				genotype.getActualGraph().addVertex(partition);
+				genotype.getActualGraph().addEdge(partition, execUnit);
+				genotype.getActualGraph().addEdge(execUnit, partition);
+			}
+		}
+
+		return genotype;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public PlatformCommunicationGraphEncoding updateComposable(
+			PlatformCommunicationGraphEncoding inGenotype,
+			PlatformCommunicationGraphEncoding outGenotype,
+			FlatPhenotypeMap<Phenotype> decodedPhenotypes) {
+		PartitionMappingEncoding pmEnc =
+				decodedPhenotypes.getEncoding(PartitionMappingEncoding.class);
+		assert (pmEnc != null) : "The required partition mapping encoding could not" +
+				" be found in the map of already decoded phenotypes.";
+		// Remove non-existing Partitions (from a previous iteration).
+		Collection<IResourceAdapter<?>> removeVertices = new ArrayList<>();
+		for(IResourceAdapter<?> resource : inGenotype.getActualGraph().vertexSet()) {
+			if((resource instanceof Partition) && !pmEnc.getRequesters().contains(resource)) {
+				Collection<DefaultEdge> edgeSet = inGenotype.getActualGraph().edgesOf(resource);
+				inGenotype.getActualGraph().removeAllEdges(edgeSet);
+				removeVertices.add(resource);
+			}
+		}
+		inGenotype.getActualGraph().removeAllVertices(removeVertices);
+		// Add missing Partitions.
+		for(Partition partition : pmEnc.getRequesters()) {
+			if(!inGenotype.getActualGraph().containsVertex(partition)) {
+				// We have only one Partition per entry --> Multiples for task mappings.
+				// TODO: Correct the return type for single and multi returns.
+				IResourceAdapter<?> execUnit =
+						pmEnc.getAllocatedResourcesFor(partition).iterator().next();
+				inGenotype.getActualGraph().addVertex(partition);
+				// FIXME: HACK!!! Connects the Partitions to the communication resource attached to
+				// the phys exec unit. This is used to avoid larger reworks in the TDMA Message
+				// scheduler. The scheduler must be reconsidered to reflect internal comm. of a
+				// core/processor correctly.
+				Collection<IResourceAdapter<?>> commResources =
+						Graphs.neighborListOf(inGenotype.getActualGraph(), execUnit);
+				IResourceAdapter<?> commresource = LambdaUtils
+						.getFirst(commResources, r -> r instanceof ICommunicationResourceAdapter)
+						.get();
+				inGenotype.getActualGraph().addEdge(partition, commresource);
+				inGenotype.getActualGraph().addEdge(commresource, partition);
+			}
+		}
+		return inGenotype;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Collection<Class<?>> getRequiredTypes() {
+		Collection<Class<?>> reqTypes = new ArrayList<>();
+		reqTypes.add(PlatformCommunicationGraphEncoding.class);
+		reqTypes.add(PartitionMappingEncoding.class);
+		return reqTypes;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Collection<Class<?>> getOptionalTypes() {
+		Collection<Class<?>> optTypes = new ArrayList<>();
+		return optTypes;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<PlatformCommunicationGraphEncoding> getOutputType() {
+		return PlatformCommunicationGraphEncoding.class;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return PlatformCommunicationGraphEncoding.class;
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingIdentityDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingIdentityDecoder.java
new file mode 100644
index 00000000..dcdd804f
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingIdentityDecoder.java
@@ -0,0 +1,75 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2018 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.partitionmapping;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.ComposableDecoderBase;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchExpSubDecoder;
+
+/**
+ * 
+ * @author diewald
+ */
+public class PartitionMappingIdentityDecoder
+		extends ComposableDecoderBase<PartitionMappingEncoding, PartitionMappingEncoding>
+		implements ArchExpSubDecoder {
+	/** {@inheritDoc} */
+	@Override
+	public PartitionMappingEncoding decodeComposable(PartitionMappingEncoding genotype,
+			FlatPhenotypeMap<Phenotype> decodedPhenotypes) {
+		return genotype;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public PartitionMappingEncoding updateComposable(PartitionMappingEncoding inGenotype,
+			PartitionMappingEncoding outGenotype, FlatPhenotypeMap<Phenotype> decodedPhenotypes) {
+		return inGenotype;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Collection<Class<?>> getRequiredTypes() {
+		Collection<Class<?>> reqTypes = new ArrayList<>();
+		reqTypes.add(PartitionMappingEncoding.class);
+		return reqTypes;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Collection<Class<?>> getOptionalTypes() {
+		Collection<Class<?>> optTypes = new ArrayList<>();
+		optTypes.add(PartitionMappingEncoding.class);
+		return optTypes;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<PartitionMappingEncoding> getOutputType() {
+		return PartitionMappingEncoding.class;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return PartitionMappingEncoding.class;
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java
index 247cd214..e4ada07b 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFEncodingDecoder.java
@@ -33,8 +33,8 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchExpSubDecod
  * 
  * @author diewald
  */
-public class SFEncodingDecoder<C> extends
-		ComposableDecoderBase<SafetyFunctionArchEncoding<C>, SafetyFunctionArchEncoding<C>>
+public class SFEncodingDecoder<C>
+		extends ComposableDecoderBase<SafetyFunctionArchEncoding<C>, SafetyFunctionArchEncoding<C>>
 		implements ArchExpSubDecoder {
 
 	/**
@@ -56,10 +56,9 @@ public class SFEncodingDecoder<C> extends
 	 *             see {@link ComposableDecoderBase}.
 	 */
 	@Override
-	public SafetyFunctionArchEncoding<C>
-			updateComposable(SafetyFunctionArchEncoding<C> inGenotype,
-					SafetyFunctionArchEncoding<C> outGenotype,
-					FlatPhenotypeMap<Phenotype> decodedPhenotypes) throws DecodingException {
+	public SafetyFunctionArchEncoding<C> updateComposable(SafetyFunctionArchEncoding<C> inGenotype,
+			SafetyFunctionArchEncoding<C> outGenotype,
+			FlatPhenotypeMap<Phenotype> decodedPhenotypes) throws DecodingException {
 		return inGenotype;
 	}
 
@@ -85,4 +84,10 @@ public class SFEncodingDecoder<C> extends
 		Class<? super SafetyFunctionArchEncoding<C>> retType = SafetyFunctionArchEncoding.class;
 		return (Class<SafetyFunctionArchEncoding<C>>)retType;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return SafetyFunctionArchEncoding.class;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFGraphDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFGraphDecoder.java
index a87044ac..39eaf80f 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFGraphDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFGraphDecoder.java
@@ -43,9 +43,9 @@ import com.google.inject.Inject;
  * 
  * @author diewald
  */
-public class SFGraphDecoder<C> extends
-		ComposableDecoderBase<SafetyFunctionArchEncoding<C>, SafeTaskGraphEncoding<C>> implements
-		ArchExpSubDecoder {
+public class SFGraphDecoder<C>
+		extends ComposableDecoderBase<SafetyFunctionArchEncoding<C>, SafeTaskGraphEncoding<C>>
+		implements ArchExpSubDecoder {
 
 	/** Reference to the {@link SystemModelAdapter} that handles input models for the DSE. */
 	SystemModelAdapter<C, ?, ?, ?, ?, ?> systemModelAdapter;
@@ -112,8 +112,8 @@ public class SFGraphDecoder<C> extends
 	 * Adds the diagnostic units from the {@link SafetyFunctionArchEntry} to the
 	 * {@link TaskGraphEncoding}.
 	 */
-	private void
-			addDiagUnits(SafetyFunctionArchEntry<C> sFAEntry, SafeTaskGraphEncoding<C> encoding) {
+	private void addDiagUnits(SafetyFunctionArchEntry<C> sFAEntry,
+			SafeTaskGraphEncoding<C> encoding) {
 		Collection<IDeployableComponentAdapter<C>> diagComps =
 				sFAEntry.getSafetyFunctionAdapter().getDiagnosticComponents();
 		addTasks(diagComps, encoding);
@@ -160,4 +160,10 @@ public class SFGraphDecoder<C> extends
 	public Class<AbstractTaskGraphEncoding> getOutputType() {
 		return AbstractTaskGraphEncoding.class;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return AbstractTaskMappingEncoding.class;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingConstraintDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingConstraintDecoder.java
index ac569f6a..e83a6b85 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingConstraintDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingConstraintDecoder.java
@@ -132,4 +132,10 @@ public class SFMappingConstraintDecoder<C>
 	public Class<? super AbstractTaskMappingEncoding> getOutputType() {
 		return AbstractTaskMappingEncoding.class;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return AbstractTaskMappingEncoding.class;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java
index 35fc4334..65136325 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java
@@ -296,4 +296,10 @@ public class SFMappingDecoder<C>
 	public Class<AbstractTaskMappingEncoding> getOutputType() {
 		return AbstractTaskMappingEncoding.class;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return AbstractTaskMappingEncoding.class;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java
index 1726e6d8..65d9b47f 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java
@@ -20,8 +20,8 @@ import java.util.Collection;
 
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEntry;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.ComposableDecoder;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.ComposableDecoderBase;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
@@ -33,10 +33,12 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.ArchExpSubDecod
  * 
  * @author diewald
  */
-public class AbstractTaskMappingIdentityDecoder
-		extends ComposableDecoderBase<AbstractTaskMappingEncoding, AbstractTaskMappingEncoding>
+// TODO: We actually need an additional AbstractTaskMappingDecoder, as this one is not an identity
+// decoder anymore. We'd need a clearer concept when to use which operators anyways (Dependent on
+// the selected features of the DSE).
+public class AbstractTaskMappingIdentityDecoder extends
+		TaskMappingDecoderBase<AbstractTaskMappingEntry, AbstractTaskMappingEncoding, AbstractTaskMappingEncoding>
 		implements ArchExpSubDecoder {
-
 	/** {@inheritDoc} */
 	@Override
 	public AbstractTaskMappingEncoding decodeComposable(AbstractTaskMappingEncoding genotype,
@@ -49,7 +51,11 @@ public class AbstractTaskMappingIdentityDecoder
 	public AbstractTaskMappingEncoding updateComposable(AbstractTaskMappingEncoding inGenotype,
 			AbstractTaskMappingEncoding outGenotype,
 			FlatPhenotypeMap<Phenotype> decodedPhenotypes) {
-		return inGenotype;
+		PartitionMappingEncoding pmEncoding =
+				decodedPhenotypes.getEncoding(PartitionMappingEncoding.class);
+		assert (pmEncoding != null);
+		inGenotype.updatePartitionMapping(pmEncoding);
+		return alignWithResourceModifications(inGenotype, decodedPhenotypes);
 	}
 
 	/** {@inheritDoc} */
@@ -57,6 +63,7 @@ public class AbstractTaskMappingIdentityDecoder
 	public Collection<Class<?>> getRequiredTypes() {
 		Collection<Class<?>> reqTypes = new ArrayList<>();
 		reqTypes.add(AbstractTaskMappingEncoding.class);
+		reqTypes.add(PartitionMappingEncoding.class);
 		return reqTypes;
 	}
 
@@ -64,7 +71,6 @@ public class AbstractTaskMappingIdentityDecoder
 	@Override
 	public Collection<Class<?>> getOptionalTypes() {
 		Collection<Class<?>> optTypes = new ArrayList<>();
-		optTypes.add(PartitionMappingEncoding.class);
 		return optTypes;
 	}
 
@@ -73,4 +79,10 @@ public class AbstractTaskMappingIdentityDecoder
 	public Class<AbstractTaskMappingEncoding> getOutputType() {
 		return AbstractTaskMappingEncoding.class;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return AbstractTaskMappingEncoding.class;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/TaskMappingDecoderBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/TaskMappingDecoderBase.java
new file mode 100644
index 00000000..98eea0ce
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/TaskMappingDecoderBase.java
@@ -0,0 +1,77 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2018 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEntry;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.ComposableDecoderBase;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.ComposablePhenotype;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
+import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IDeployableComponentAdapter;
+import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
+import org.fortiss.af3.exploration.alg.exception.ExplorationException;
+
+/**
+ * 
+ * @author diewald
+ */
+public abstract class TaskMappingDecoderBase<S extends TaskMappingEntry<IDeployableComponentAdapter<?>, Partition>, T extends TaskMappingEncoding<IDeployableComponentAdapter<?>, S>, P extends ComposablePhenotype<?>>
+		extends ComposableDecoderBase<T, P> {
+
+	/**
+	 * Reallocates the {@link IResourceAdapter}s if the set of {@link IResourceAdapter}s was changed
+	 * by a previous module. This is required to stay consistent.
+	 * 
+	 * @param taskMapping
+	 *            {@link TaskMappingEncoding} to adapt.
+	 * @param decodedPhenotypes
+	 *            {@link Phenotype} set required to gather the alignment information, .e.g.,
+	 *            resource encodings.
+	 * @return Aligned {@link TaskMappingEncoding}.
+	 */
+	protected T alignWithResourceModifications(T taskMapping,
+			FlatPhenotypeMap<Phenotype> decodedPhenotypes) {
+		PartitionMappingEncoding pmEncoding =
+				decodedPhenotypes.getEncoding(PartitionMappingEncoding.class);
+		assert (pmEncoding != null);
+
+		Collection<S> relocateEntries = new ArrayList<>();
+		Collection<IResourceAdapter<?>> existingPartitions = pmEncoding.getResources();
+		for(S mappingEntry : taskMapping.getMappingEntries()) {
+			if(!existingPartitions.contains(mappingEntry.getTarget())) {
+				relocateEntries.add(mappingEntry);
+			}
+		}
+
+		for(S mappingEntry : relocateEntries) {
+			taskMapping.removeEntry(mappingEntry);
+			try {
+				taskMapping.createAndAddRandomEntry(mappingEntry.getSource());
+			} catch(ExplorationException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+
+		return taskMapping;
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/AbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/AbstractTaskMappingDecoder.java
similarity index 99%
rename from org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/AbstractTaskMappingDecoder.java
rename to org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/AbstractTaskMappingDecoder.java
index 2eb9f2fb..bf042302 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/AbstractTaskMappingDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/AbstractTaskMappingDecoder.java
@@ -13,7 +13,7 @@
 | See the License for the specific language governing permissions and      |
 | limitations under the License.                                           |
 +--------------------------------------------------------------------------*/
-package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatemapping;
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FailSilentAbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java
similarity index 97%
rename from org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FailSilentAbstractTaskMappingDecoder.java
rename to org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java
index 897e4276..ecb43eb9 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FailSilentAbstractTaskMappingDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java
@@ -13,7 +13,7 @@
 | See the License for the specific language governing permissions and      |
 | limitations under the License.                                           |
 +--------------------------------------------------------------------------*/
-package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatemapping;
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate;
 
 import static org.fortiss.tooling.common.util.LambdaUtils.filterSet;
 
@@ -126,4 +126,10 @@ public class FailSilentAbstractTaskMappingDecoder extends
 
 		return outGenotype;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return AbstractTaskMappingEncoding.class;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FaultDetectionVotingAbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FaultDetectionVotingAbstractTaskMappingDecoder.java
similarity index 97%
rename from org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FaultDetectionVotingAbstractTaskMappingDecoder.java
rename to org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FaultDetectionVotingAbstractTaskMappingDecoder.java
index 66bab92a..9e0033f5 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatemapping/FaultDetectionVotingAbstractTaskMappingDecoder.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FaultDetectionVotingAbstractTaskMappingDecoder.java
@@ -13,7 +13,7 @@
 | See the License for the specific language governing permissions and      |
 | limitations under the License.                                           |
 +--------------------------------------------------------------------------*/
-package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatemapping;
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate;
 
 import static org.fortiss.tooling.common.util.LambdaUtils.filterSet;
 
@@ -126,4 +126,10 @@ public class FaultDetectionVotingAbstractTaskMappingDecoder extends
 
 		return outGenotype;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return AbstractTaskMappingEncoding.class;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/TaskInstanceResourceAlignmentDecoder.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/TaskInstanceResourceAlignmentDecoder.java
new file mode 100644
index 00000000..0a40b2db
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/TaskInstanceResourceAlignmentDecoder.java
@@ -0,0 +1,88 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2018 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.TaskMappingDecoderBase;
+
+/**
+ * 
+ * @author diewald
+ */
+public class TaskInstanceResourceAlignmentDecoder extends
+		TaskMappingDecoderBase<InstantiatedTaskMappingEntry, InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry>, InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry>> {
+
+	/** {@inheritDoc} */
+	@Override
+	public InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> decodeComposable(
+			InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> genotype,
+			FlatPhenotypeMap<Phenotype> decodedPhenotypes) {
+		PartitionMappingEncoding pmEncoding =
+				decodedPhenotypes.getEncoding(PartitionMappingEncoding.class);
+		assert (pmEncoding != null);
+		genotype.updatePartitionMapping(pmEncoding);
+		return genotype;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> updateComposable(
+			InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> inGenotype,
+			InstantiatedTaskMappingEncoding<InstantiatedTaskMappingEntry> outGenotype,
+			FlatPhenotypeMap<Phenotype> decodedPhenotypes) {
+		PartitionMappingEncoding pmEncoding =
+				decodedPhenotypes.getEncoding(PartitionMappingEncoding.class);
+		assert (pmEncoding != null);
+		inGenotype.updatePartitionMapping(pmEncoding);
+		return alignWithResourceModifications(inGenotype, decodedPhenotypes);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Collection<Class<?>> getRequiredTypes() {
+		Collection<Class<?>> reqTypes = new ArrayList<>();
+		reqTypes.add(InstantiatedTaskMappingEncoding.class);
+		reqTypes.add(PartitionMappingEncoding.class);
+		return reqTypes;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Collection<Class<?>> getOptionalTypes() {
+		Collection<Class<?>> optTypes = new ArrayList<>();
+		return optTypes;
+	}
+
+	/** {@inheritDoc} */
+	@SuppressWarnings("rawtypes")
+	@Override
+	public Class<InstantiatedTaskMappingEncoding> getOutputType() {
+		return InstantiatedTaskMappingEncoding.class;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<?> getPrimaryInputType() {
+		return InstantiatedTaskMappingEncoding.class;
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/StrictTTSchedule.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/StrictTTSchedule.java
index db33fd92..ca518264 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/StrictTTSchedule.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/solution/StrictTTSchedule.java
@@ -359,7 +359,9 @@ public class StrictTTSchedule<S extends TaskMappingEntry<IDeployableComponentAda
 		if(!(resource instanceof ITransmissionUnitAdapter ||
 				resource instanceof IGatewayUnitAdapter) &&
 				resource != systemModelAdapter.getHardwareResource(resource)) {
-			str += "@" + systemModelAdapter.getHardwareResource(resource).getName();
+			// FIXME: Use the name of the partition.
+			str += "@" + resource
+					.toString();/* systemModelAdapter.getHardwareResource(resource).getName(); */
 		}
 		return str;
 	}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/MappingEvaluator.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/TaskMappingEvaluator.java
similarity index 80%
rename from org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/MappingEvaluator.java
rename to org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/TaskMappingEvaluator.java
index dabe0f2c..c3746755 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/MappingEvaluator.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/TaskMappingEvaluator.java
@@ -19,6 +19,8 @@ import java.util.ArrayList;
 import java.util.Collection;
 
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.Partition;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IRequestAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
@@ -34,19 +36,23 @@ import org.fortiss.tooling.base.model.element.IModelElement;
  * 
  * @author diewald
  */
-public abstract class MappingEvaluator
-		extends ExpressionEvaluatorBase<MappingEncoding, Double, ExplorationTarget<Double>> {
+public abstract class TaskMappingEvaluator
+		extends ExpressionEvaluatorBase<TaskMappingEncoding, Double, ExplorationTarget<Double>> {
 
 	/** Reference to the mapping which shall be evaluated here. */
 	protected MappingEncoding mapping;
 
+	// FIXME: HACK in order to validate the mapping of components/tasks to phys exec units if
+	// partitions are used.
+	protected MappingEncoding virtMapping;
+
 	/** Empty prototype constructor. */
-	public MappingEvaluator() {
+	public TaskMappingEvaluator() {
 		super();
 	}
 
 	/** Constructor. */
-	public MappingEvaluator(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
+	public TaskMappingEvaluator(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
 			ExplorationTarget<Double> explorationTarget) throws Exception {
 		super(systemModelAdapter, explorationTarget);
 	}
@@ -66,6 +72,13 @@ public abstract class MappingEvaluator
 		for(IResourceAdapter<?> allocResource : allocResourceAdps) {
 			if(allocResource.getObject() == resource) {
 				return Boolean.valueOf(true);
+			} else if(allocResource instanceof Partition) {
+				// TODO: HACK, remove after transition to full table based representation.
+				IResourceAdapter<?> physResource = (IResourceAdapter<?>)virtMapping
+						.getAllocatedResourcesFor((Partition)allocResource).iterator().next();
+				if(physResource.getObject() == resource) {
+					return Boolean.valueOf(true);
+				}
 			}
 		}
 
@@ -108,13 +121,13 @@ public abstract class MappingEvaluator
 	@Override
 	public Collection<Class<?>> getRequiredInputTypes() {
 		Collection<Class<?>> requiredTypes = new ArrayList<>();
-		requiredTypes.add(MappingEncoding.class);
+		requiredTypes.add(TaskMappingEncoding.class);
 		return requiredTypes;
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public Class<?> getPrimaryInputType() {
-		return MappingEncoding.class;
+		return TaskMappingEncoding.class;
 	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java
index 172690d0..629b43d6 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/constraint/MappingEvaluatorConstraint.java
@@ -16,10 +16,11 @@
 package org.fortiss.af3.exploration.alg.dse.evaluator.constraint;
 
 import org.eclipse.emf.ecore.EObject;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
-import org.fortiss.af3.exploration.alg.dse.evaluator.MappingEvaluator;
+import org.fortiss.af3.exploration.alg.dse.evaluator.TaskMappingEvaluator;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
 import org.fortiss.af3.exploration.alg.service.IExplorationTargetEvaluator;
 import org.fortiss.af3.exploration.dsl_v2.model.function.Maximize;
@@ -35,8 +36,8 @@ import com.google.common.collect.ClassToInstanceMap;
  * 
  * @author diewald
  */
-public class MappingEvaluatorConstraint extends MappingEvaluator
-		implements IConstraintEvaluator<MappingEncoding, Boolean, ExplorationConstraint<Boolean>> {
+public class MappingEvaluatorConstraint extends TaskMappingEvaluator implements
+		IConstraintEvaluator<TaskMappingEncoding, Boolean, ExplorationConstraint<Boolean>> {
 
 	/** Prototype constructor. */
 	public MappingEvaluatorConstraint() {
@@ -53,10 +54,12 @@ public class MappingEvaluatorConstraint extends MappingEvaluator
 
 	/** {@inheritDoc} */
 	@Override
-	public Value<?> evaluateGoal(MappingEncoding phenotype,
+	public Value<?> evaluateGoal(TaskMappingEncoding phenotype,
 			FlatPhenotypeMap<Phenotype> phenotypeTypeMap,
 			ClassToInstanceMap<EObject> transformedModels) {
 		mapping = phenotype;
+		virtMapping = phenotypeTypeMap.getEncoding(PartitionMappingEncoding.class);
+		assert (virtMapping != null);
 
 		Boolean retVal = null;
 		// FIXME: pass parsing exception to upper layers.
@@ -88,7 +91,7 @@ public class MappingEvaluatorConstraint extends MappingEvaluator
 
 	/** {@inheritDoc} */
 	@Override
-	public IExplorationTargetEvaluator<MappingEncoding, Double, ExplorationTarget<Double>>
+	public IExplorationTargetEvaluator<TaskMappingEncoding, Double, ExplorationTarget<Double>>
 			createEvaluator(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
 					ExplorationTarget<Double> explorationTarget)
 					throws InstantiationException, Exception {
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java
index 5d0e67ba..a3a217f4 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/evaluator/objective/MappingEvaluatorObjective.java
@@ -18,10 +18,11 @@ package org.fortiss.af3.exploration.alg.dse.evaluator.objective;
 import java.math.BigInteger;
 
 import org.eclipse.emf.ecore.EObject;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.MappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmapping.PartitionMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.TaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.FlatPhenotypeMap;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
-import org.fortiss.af3.exploration.alg.dse.evaluator.MappingEvaluator;
+import org.fortiss.af3.exploration.alg.dse.evaluator.TaskMappingEvaluator;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
 import org.fortiss.af3.exploration.alg.service.IExplorationTargetEvaluator;
 import org.fortiss.af3.exploration.dsl_v2.model.arithmetic.IArithmeticExpression;
@@ -39,7 +40,7 @@ import com.google.common.collect.ClassToInstanceMap;
  * 
  * @author diewald
  */
-public class MappingEvaluatorObjective extends MappingEvaluator {
+public class MappingEvaluatorObjective extends TaskMappingEvaluator {
 
 	/** Prototype Constructor. */
 	public MappingEvaluatorObjective() {
@@ -62,10 +63,12 @@ public class MappingEvaluatorObjective extends MappingEvaluator {
 
 	/** {@inheritDoc} */
 	@Override
-	public Value<?> evaluateGoal(MappingEncoding phenotype,
+	public Value<?> evaluateGoal(TaskMappingEncoding phenotype,
 			FlatPhenotypeMap<Phenotype> phenotypeTypeMap,
 			ClassToInstanceMap<EObject> transformedModels) throws Exception {
 		mapping = phenotype;
+		virtMapping = phenotypeTypeMap.getEncoding(PartitionMappingEncoding.class);
+		assert (virtMapping != null);
 
 		// For ExplorationObjectives the expression begins either with a Minimize or Maximize
 		// operation.
@@ -101,7 +104,7 @@ public class MappingEvaluatorObjective extends MappingEvaluator {
 
 	/** {@inheritDoc} */
 	@Override
-	public IExplorationTargetEvaluator<MappingEncoding, Double, ExplorationTarget<Double>>
+	public IExplorationTargetEvaluator<TaskMappingEncoding, Double, ExplorationTarget<Double>>
 			createEvaluator(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter,
 					ExplorationTarget<Double> explorationTarget)
 					throws InstantiationException, Exception {
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FailSilentExecModelFactory.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FailSilentExecModelFactory.java
index 98d295f4..24efbb94 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FailSilentExecModelFactory.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FailSilentExecModelFactory.java
@@ -31,9 +31,9 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskmap
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.EvaluatorWrapper;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.StrictTTDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.comm.MessageDecoder;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatemapping.AbstractTaskMappingDecoder;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatemapping.FailSilentAbstractTaskMappingDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoderAcyclic;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.AbstractTaskMappingDecoder;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.FailSilentAbstractTaskMappingDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.StrictTTSchedule;
 import org.fortiss.af3.exploration.alg.dse.evaluator.constraint.ComponentMultiAllocationConstraintEvaluator;
 import org.fortiss.af3.exploration.alg.dse.evaluator.constraint.ComponentMultiDislocationConstraintEvaluator;
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FaultDetectionVotingExecModelFactory.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FaultDetectionVotingExecModelFactory.java
index db78fd26..7153d4be 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FaultDetectionVotingExecModelFactory.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/FaultDetectionVotingExecModelFactory.java
@@ -31,9 +31,9 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.operator.mutate.taskmap
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.EvaluatorWrapper;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.StrictTTDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.comm.MessageDecoder;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatemapping.AbstractTaskMappingDecoder;
-import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatemapping.FaultDetectionVotingAbstractTaskMappingDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.instantiatetaskgraph.InstantiatedTaskMappingDecoderAcyclic;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.AbstractTaskMappingDecoder;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.taskmapping.instantiate.FaultDetectionVotingAbstractTaskMappingDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.StrictTTSchedule;
 import org.fortiss.af3.exploration.alg.dse.evaluator.constraint.ComponentMultiAllocationConstraintEvaluator;
 import org.fortiss.af3.exploration.alg.dse.evaluator.constraint.ComponentMultiDislocationConstraintEvaluator;
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/PlatformCommunicationGraph.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/PlatformCommunicationGraph.java
deleted file mode 100644
index 9d243ce5..00000000
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/PlatformCommunicationGraph.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2014 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.af3.exploration.alg.dse.sysmodel.arch;
-
-import static org.fortiss.af3.exploration.util.ExplorationUtils.isDebugVerboseEnabled;
-
-import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceConnectionAdapter.ConnectionType;
-import org.fortiss.af3.exploration.alg.graph.display.JGraphTVisualizer;
-import org.jgrapht.DirectedGraph;
-import org.jgrapht.Graphs;
-import org.jgrapht.graph.DefaultDirectedGraph;
-import org.jgrapht.graph.DefaultEdge;
-
-/**
- * Abstracts the communication network present in a platform system meta-model to a flat graph. This
- * graph is needed to manage the communication of logical {@link IDeployableComponentAdapter}s after
- * they have been deployed onto a concrete platform. More precisely, the graph is used for routing
- * of (physical) messages and their scheduling on the communication resources, like busses.
- * 
- * @author diewald
- */
-public class PlatformCommunicationGraph {
-
-	/** Representation of input system model */
-	protected SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter;
-
-	/** The graph representing the communication structure of a platform. */
-	protected DirectedGraph<IResourceAdapter<?>, DefaultEdge> platformGraph;
-
-	/**
-	 * /**
-	 * Constructor.
-	 * 
-	 * @param systemModelAdapter
-	 *            The adapter for the input model which contains the platform
-	 */
-	public PlatformCommunicationGraph(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter) {
-		this.systemModelAdapter = systemModelAdapter;
-
-		platformGraph =
-				new DefaultDirectedGraph<IResourceAdapter<?>, DefaultEdge>(DefaultEdge.class);
-
-		createGraph();
-	}
-
-	/**
-	 * Creates the communication (or connection) graph which is implicitly given by the platform
-	 * referenced in the {@link SystemModelAdapter}. This graph is used for routing messages.
-	 */
-	private void createGraph() {
-		DirectedGraph<IResourceAdapter<?>, DefaultEdge> tempPlatformCommGraph =
-				new DefaultDirectedGraph<IResourceAdapter<?>, DefaultEdge>(DefaultEdge.class);
-
-		// Add all resources present in the platform as vertices to the "connection graph"
-		for(IResourceAdapter<?> resource : systemModelAdapter.getDeploymentTargets()) {
-			tempPlatformCommGraph.addVertex(resource);
-		}
-		for(IResourceAdapter<?> resource : systemModelAdapter.getMemoryUnits()) {
-			tempPlatformCommGraph.addVertex(resource);
-		}
-		for(IResourceAdapter<?> resource : systemModelAdapter.getGatewayUnits()) {
-			tempPlatformCommGraph.addVertex(resource);
-		}
-		for(IResourceAdapter<?> resource : systemModelAdapter.getTransmissionUnits()) {
-			tempPlatformCommGraph.addVertex(resource);
-		}
-
-		// Successively connect the resources in the graph. The edges are given within the
-		// collection resource connectors are assumed to be fully connected.
-		for(IResourceConnectionAdapter connection : systemModelAdapter.deploymentTargetConnectors) {
-			// We add edges for each receiver in order to support broadcast connections
-			for(IResourceAdapter<?> currentReceiverResource : connection.getTargetResources()) {
-				// If the current resource is a child of a {@link TransmissionUnit} (like a NoC
-				// router), respect the direction of connections such that complex networks are
-				// correctly reflected.
-				if(connection.getConnectionType(currentReceiverResource) == ConnectionType.OUTGOING) {
-					Graphs.addEdgeWithVertices(platformGraph, connection.getSourceResource(),
-							currentReceiverResource);
-				} else if(connection.getConnectionType(currentReceiverResource) == ConnectionType.INCOMING) {
-					Graphs.addEdgeWithVertices(platformGraph, currentReceiverResource,
-							connection.getSourceResource());
-				} else {
-					// Add the edges of a single connection. We add to edges for each connection
-					// such that an undirected graph is generated effectively. It is required to use
-					// this "trick" in order to be able to use the standard shortest path
-					// algorithms.
-					Graphs.addEdgeWithVertices(platformGraph, connection.getSourceResource(),
-							currentReceiverResource);
-					Graphs.addEdgeWithVertices(platformGraph, currentReceiverResource,
-							connection.getSourceResource());
-				}
-			}
-		}
-
-		// Debug code
-		if(isDebugVerboseEnabled()) {
-			display();
-		}
-	}
-
-	/** Creates a Dialog that illustrates this {@link DirectedGraph}. */
-	public void display() {
-		JGraphTVisualizer<IResourceAdapter<?>, DefaultEdge> taskViz =
-				new JGraphTVisualizer<IResourceAdapter<?>, DefaultEdge>(platformGraph);
-		taskViz.displayGraph("Platform communication graph");
-	}
-
-	/**
-	 * Returns the actual graph that contains information about the {@link IResourceAdapter}s and
-	 * their connections.
-	 */
-	public DirectedGraph<IResourceAdapter<?>, DefaultEdge> getActualGraph() {
-		return platformGraph;
-	}
-}
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java
index 3683f263..ac3d139e 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java
@@ -38,6 +38,7 @@ import org.eclipse.emf.ecore.EObject;
 import org.fortiss.af3.component.model.Component;
 import org.fortiss.af3.component.model.ComponentArchitecture;
 import org.fortiss.af3.component.model.Port;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceConnectionAdapter.ConnectionType;
@@ -64,8 +65,11 @@ import org.fortiss.tooling.base.model.element.IConnection;
 import org.fortiss.tooling.base.model.element.IConnector;
 import org.fortiss.tooling.base.model.element.IHierarchicElement;
 import org.fortiss.tooling.base.model.element.IModelElement;
+import org.jgrapht.DirectedGraph;
 import org.jgrapht.Graphs;
 import org.jgrapht.alg.ConnectivityInspector;
+import org.jgrapht.graph.DefaultDirectedGraph;
+import org.jgrapht.graph.DefaultEdge;
 
 /**
  * Adapter to the system model used as input for the DSE which is created for a specific DSE run.
@@ -164,7 +168,7 @@ public class SystemModelAdapter<C, E, S, G, TR, M> {
 	protected Collection<IResourceAdapter<?>> deploymentTargetResources;
 
 	/** Contains the connections between the {@link IResourceAdapter}s of the platform. */
-	protected Collection<IResourceConnectionAdapter> deploymentTargetConnectors;
+	private Collection<IResourceConnectionAdapter> deploymentTargetConnectors;
 
 	/**
 	 * Collection of the safety functions adapters that represent the safety functions from the
@@ -172,8 +176,8 @@ public class SystemModelAdapter<C, E, S, G, TR, M> {
 	 */
 	protected Collection<ISafetyFunctionAdapter<C>> safetyFunctionAdapters = new ArrayList<>();
 
-	/** The {@link PlatformCommunicationGraph} that is given by the current platform. */
-	protected PlatformCommunicationGraph platformCommunicationGraph;
+	/** The {@link PlatformCommunicationGraphEncoding} that is given by the current platform. */
+	protected PlatformCommunicationGraphEncoding platformCommunicationGraph;
 
 	/** The set of independent {@link DefaultTaskGraph}s derived from the logical architecture. */
 	protected Collection<TaskGraph> taskGraphs;
@@ -528,12 +532,69 @@ public class SystemModelAdapter<C, E, S, G, TR, M> {
 	}
 
 	/**
-	 * Creates the {@link PlatformCommunicationGraph} that is used to determine the routing of
+	 * Creates the {@link PlatformCommunicationGraphEncoding} that is used to determine the routing
+	 * of
 	 * messages between {@link IDeployableComponentAdapter}s and their respective
 	 * {@link IExecutionUnitAdapter}s.
 	 */
 	protected void setupPlatformGraph() {
-		platformCommunicationGraph = new PlatformCommunicationGraph(this);
+		platformCommunicationGraph = new PlatformCommunicationGraphEncoding(this, createGraph());
+	}
+
+	/**
+	 * Creates the communication (or connection) graph which is implicitly given by the platform
+	 * referenced in the {@link SystemModelAdapter}. This graph is used for routing messages.
+	 */
+	public DirectedGraph<IResourceAdapter<?>, DefaultEdge> createGraph() {
+		DirectedGraph<IResourceAdapter<?>, DefaultEdge> tempPlatformCommGraph =
+				new DefaultDirectedGraph<IResourceAdapter<?>, DefaultEdge>(DefaultEdge.class);
+		DirectedGraph<IResourceAdapter<?>, DefaultEdge> platformGraph =
+				new DefaultDirectedGraph<IResourceAdapter<?>, DefaultEdge>(DefaultEdge.class);
+
+		// Add all resources present in the platform as vertices to the "connection graph"
+		for(IResourceAdapter<?> resource : getDeploymentTargets()) {
+			tempPlatformCommGraph.addVertex(resource);
+		}
+		for(IResourceAdapter<?> resource : getMemoryUnits()) {
+			tempPlatformCommGraph.addVertex(resource);
+		}
+		for(IResourceAdapter<?> resource : getGatewayUnits()) {
+			tempPlatformCommGraph.addVertex(resource);
+		}
+		for(IResourceAdapter<?> resource : getTransmissionUnits()) {
+			tempPlatformCommGraph.addVertex(resource);
+		}
+
+		// Successively connect the resources in the graph. The edges are given within the
+		// collection resource connectors are assumed to be fully connected.
+		for(IResourceConnectionAdapter connection : getDeploymentTargetConnectors()) {
+			// We add edges for each receiver in order to support broadcast connections
+			for(IResourceAdapter<?> currentReceiverResource : connection.getTargetResources()) {
+				// If the current resource is a child of a {@link TransmissionUnit} (like a NoC
+				// router), respect the direction of connections such that complex networks are
+				// correctly reflected.
+				if(connection
+						.getConnectionType(currentReceiverResource) == ConnectionType.OUTGOING) {
+					Graphs.addEdgeWithVertices(platformGraph, connection.getSourceResource(),
+							currentReceiverResource);
+				} else if(connection
+						.getConnectionType(currentReceiverResource) == ConnectionType.INCOMING) {
+					Graphs.addEdgeWithVertices(platformGraph, currentReceiverResource,
+							connection.getSourceResource());
+				} else {
+					// Add the edges of a single connection. We add to edges for each connection
+					// such that an undirected graph is generated effectively. It is required to use
+					// this "trick" in order to be able to use the standard shortest path
+					// algorithms.
+					Graphs.addEdgeWithVertices(platformGraph, connection.getSourceResource(),
+							currentReceiverResource);
+					Graphs.addEdgeWithVertices(platformGraph, currentReceiverResource,
+							connection.getSourceResource());
+				}
+			}
+		}
+
+		return platformGraph;
 	}
 
 	/**
@@ -707,10 +768,11 @@ public class SystemModelAdapter<C, E, S, G, TR, M> {
 	}
 
 	/**
-	 * Returns the {@link PlatformCommunicationGraph} required for routing of the messages located
+	 * Returns the {@link PlatformCommunicationGraphEncoding} required for routing of the messages
+	 * located
 	 * in different parts of the platform.
 	 */
-	public PlatformCommunicationGraph getPlatformCommunicationGraph() {
+	public PlatformCommunicationGraphEncoding getPlatformCommunicationGraph() {
 		return platformCommunicationGraph;
 	}
 
@@ -1125,4 +1187,15 @@ public class SystemModelAdapter<C, E, S, G, TR, M> {
 	public Class<? extends IPlatformResource> getFaultContainmentRegion() {
 		return faultContainmentRegion;
 	}
+
+	/** Returns deploymentTargetConnectors. */
+	public Collection<IResourceConnectionAdapter> getDeploymentTargetConnectors() {
+		return deploymentTargetConnectors;
+	}
+
+	/** Sets deploymentTargetConnectors. */
+	public void setDeploymentTargetConnectors(
+			Collection<IResourceConnectionAdapter> deploymentTargetConnectors) {
+		this.deploymentTargetConnectors = deploymentTargetConnectors;
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3DeployableComponentAdapter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3DeployableComponentAdapter.java
index 87be31ed..14cb34aa 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3DeployableComponentAdapter.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3DeployableComponentAdapter.java
@@ -135,7 +135,10 @@ public class AF3DeployableComponentAdapter extends AF3RequestAdapter<Component>
 	/** {@inheritDoc} */
 	@Override
 	public Double getWcet(IExecutionUnitAdapter<?> executionUnit) {
-		return wcetMap.get(executionUnit);
+		// TODO: HACK More flexible approach is needed: We distinguish between phys. exec Units and
+		// Partitions.
+		return 10.0;
+		// return wcetMap.get(executionUnit);
 	}
 
 	/** {@inheritDoc} */
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3SystemModelAdapter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3SystemModelAdapter.java
index 481b0e77..623841b5 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3SystemModelAdapter.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/af3/AF3SystemModelAdapter.java
@@ -180,8 +180,8 @@ public class AF3SystemModelAdapter extends
 
 		parameterAdapter = createDeploymentParameterMap(componentArchitecture, platformArchitecture,
 				systemParameters.getReplacementComponents());
-		deploymentTargetConnectors =
-				createDeploymentTargetConnectors(systemParameters.getDeploymentTargets());
+		setDeploymentTargetConnectors(
+				createDeploymentTargetConnectors(systemParameters.getDeploymentTargets()));
 		Multimap<Component, IDeployableComponentAdapter<Component>> componentToReplacementAdapter =
 				createComponentReplacementAdapters(systemParameters.getReplacementComponents());
 		deployableComponents = createDeployableComponents(componentToReplacementAdapter,
@@ -201,6 +201,7 @@ public class AF3SystemModelAdapter extends
 		setupTaskGraphs();
 		setupEmittedMessages();
 		setupPlatformGraph();
+		registerInputEncoding(getPlatformCommunicationGraph());
 		createAbstractTaskGraphEncoding();
 
 		// Re-enable annotation view updates.
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/IMappingEncoding.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/IMappingEncoding.java
index ac16e64e..84560179 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/IMappingEncoding.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/IMappingEncoding.java
@@ -34,6 +34,8 @@ public interface IMappingEncoding<S extends IRequestAdapter<?>, T extends IResou
 	 */
 	public Collection<T> getAllocatedResourcesFor(S source);
 
+	public Collection<T> getResources();
+
 	/**
 	 * Returns the collection of {@link IMappingEntry}s which represent the (multi-)allocation of
 	 * the given {@link IRequestAdapter}s to {@link IResourceAdapter}s.
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/IMessageRouter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/IMessageRouter.java
index 1ec90ec9..d70bea0a 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/IMessageRouter.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/IMessageRouter.java
@@ -18,6 +18,7 @@ package org.fortiss.af3.exploration.alg.dse.sysmodel.mapping.comm;
 import java.util.Collection;
 import java.util.Map;
 
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ICommunicationResourceAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.comm.Message;
@@ -31,6 +32,10 @@ import org.jgrapht.graph.DefaultEdge;
  */
 public interface IMessageRouter {
 
+	public enum RoutingStrategy {
+		SHORTEST_PATH;
+	}
+
 	/**
 	 * Calculates the message routes for each {@link Message} given in the {@link Collection} {#link
 	 * messagesToRoute}.
@@ -38,7 +43,8 @@ public interface IMessageRouter {
 	 * @return {@link Map} that relates the Message to its route.
 	 */
 	Map<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> calculateMessageRoutes(
-			Collection<Message> messagesToRoute);
+			Collection<Message> messagesToRoute, PlatformCommunicationGraphEncoding pcgEncoding,
+			RoutingStrategy strategy);
 
 	/**
 	 * Returns the remaining {@link Message}/communication graphs for the given {@link Message},
@@ -46,6 +52,7 @@ public interface IMessageRouter {
 	 */
 	// TODO: replace the IResourceAdapter with an ICommunicationResourceAdapter.
 	Map<IResourceAdapter<?>, DirectedGraph<IResourceAdapter<?>, DefaultEdge>>
+
 			getRemainingMessageGraphs(Message message, IResourceAdapter<?> processedResource,
 					DirectedGraph<IResourceAdapter<?>, DefaultEdge> messageRoute);
 
@@ -54,7 +61,8 @@ public interface IMessageRouter {
 	 * {@link DirectedGraph} whose leaves are the target {@link IResourceAdapter}s.
 	 */
 	DirectedGraph<IResourceAdapter<?>, DefaultEdge> calculateMessageRoute(
-			IResourceAdapter<?> source, Collection<IResourceAdapter<?>> receiverResources);
+			IResourceAdapter<?> source, Collection<IResourceAdapter<?>> receiverResources,
+			PlatformCommunicationGraphEncoding pcgEncoding);
 
 	/** Returns the route which the given {@link Message} must traverse to deliver its content. */
 	DirectedGraph<IResourceAdapter<?>, DefaultEdge> getRouteOf(Message msg);
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouterBase.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouter.java
similarity index 67%
rename from org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouterBase.java
rename to org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouter.java
index d37da328..9548c8bb 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouterBase.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/MessageRouter.java
@@ -20,11 +20,11 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.comm.Message;
 import org.jgrapht.DirectedGraph;
-import org.jgrapht.Graph;
 import org.jgrapht.graph.DefaultEdge;
 
 /**
@@ -33,30 +33,34 @@ import org.jgrapht.graph.DefaultEdge;
  * 
  * @author diewald
  */
-public abstract class MessageRouterBase implements IMessageRouter {
+public class MessageRouter implements IMessageRouter {
 
 	/** Representation of input system model */
 	protected SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter;
 
-	/** Graph containing the communication graph of the platform onto which the deployment is done. */
-	protected Graph<IResourceAdapter<?>, DefaultEdge> platformCommunicationGraph;
+	private IMessageRouter delegate;
 
 	/** Contains the calculated routes of the generated {@link Message}s. */
 	private Map<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> messagesRoutes;
 
 	/** Constructs a scheduler for a given input model. */
-	protected MessageRouterBase(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter) {
+	public MessageRouter(SystemModelAdapter<?, ?, ?, ?, ?, ?> systemModelAdapter) {
 		this.systemModelAdapter = systemModelAdapter;
 		messagesRoutes =
 				new ConcurrentHashMap<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>>();
-		platformCommunicationGraph =
-				systemModelAdapter.getPlatformCommunicationGraph().getActualGraph();
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public synchronized Map<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>>
-			calculateMessageRoutes(Collection<Message> messagesToRoute) {
+			calculateMessageRoutes(Collection<Message> messagesToRoute,
+					PlatformCommunicationGraphEncoding pcgEncoding, RoutingStrategy strategy) {
+		// For now, we have only one routing strategy, so define the delegate if it is not already
+		// constructed. Later, the specific routers can be constructed here, if needed.
+		if(delegate == null) {
+			delegate = new ShortestPathRouter(systemModelAdapter);
+		}
+
 		Map<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> messagesRoutes =
 				new HashMap<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>>();
 
@@ -64,15 +68,14 @@ public abstract class MessageRouterBase implements IMessageRouter {
 		for(Message currentMessage : messagesToRoute) {
 			DirectedGraph<IResourceAdapter<?>, DefaultEdge> calculatedMessageRoute =
 					calculateMessageRoute(currentMessage.getSender().getTarget(),
-							currentMessage.getReceiverResources());
+							currentMessage.getReceiverResources(), pcgEncoding);
 			// Check if any *invalid* communication were required by the mapping.
 			if(calculatedMessageRoute == null) {
 				return null;
 			}
-			messagesRoutes.put(
-					currentMessage,
+			messagesRoutes.put(currentMessage,
 					calculateMessageRoute(currentMessage.getSender().getTarget(),
-							currentMessage.getReceiverResources()));
+							currentMessage.getReceiverResources(), pcgEncoding));
 		}
 
 		return messagesRoutes;
@@ -83,4 +86,20 @@ public abstract class MessageRouterBase implements IMessageRouter {
 	public DirectedGraph<IResourceAdapter<?>, DefaultEdge> getRouteOf(Message msg) {
 		return messagesRoutes.get(msg);
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Map<IResourceAdapter<?>, DirectedGraph<IResourceAdapter<?>, DefaultEdge>>
+			getRemainingMessageGraphs(Message message, IResourceAdapter<?> processedResource,
+					DirectedGraph<IResourceAdapter<?>, DefaultEdge> messageRoute) {
+		return delegate.getRemainingMessageGraphs(message, processedResource, messageRoute);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public DirectedGraph<IResourceAdapter<?>, DefaultEdge> calculateMessageRoute(
+			IResourceAdapter<?> source, Collection<IResourceAdapter<?>> receiverResources,
+			PlatformCommunicationGraphEncoding pcgEncoding) {
+		return delegate.calculateMessageRoute(source, receiverResources, pcgEncoding);
+	}
 }
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/ShortestPathRouter.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/ShortestPathRouter.java
index 3c85c604..86878edf 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/ShortestPathRouter.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/mapping/comm/ShortestPathRouter.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.comm.Message;
@@ -40,7 +41,7 @@ import org.jgrapht.graph.DirectedSubgraph;
  * 
  * @author diewald
  */
-public class ShortestPathRouter extends MessageRouterBase {
+public class ShortestPathRouter extends MessageRouter {
 
 	/** Buffers the already calculated shortest paths for the sender {@link IResourceAdapter}. */
 	private Map<IResourceAdapter<?>, BellmanFordShortestPath<IResourceAdapter<?>, DefaultEdge>> shortestPathForSender;
@@ -58,7 +59,8 @@ public class ShortestPathRouter extends MessageRouterBase {
 	/** {@inheritDoc} */
 	@Override
 	public synchronized DirectedGraph<IResourceAdapter<?>, DefaultEdge> calculateMessageRoute(
-			IResourceAdapter<?> source, Collection<IResourceAdapter<?>> receiverResources) {
+			IResourceAdapter<?> source, Collection<IResourceAdapter<?>> receiverResources,
+			PlatformCommunicationGraphEncoding pcgEncoding) {
 		// Generates a graph that contains the message's path to each receiver in the following
 		// manner:
 		// - Find the shortest path from the sender to each receiver (using BellmanFord)
@@ -68,24 +70,39 @@ public class ShortestPathRouter extends MessageRouterBase {
 
 		// Check, if the shortest paths have already been calculated for the given sender/source. If
 		// not start a new shortest path analysis using BellmanFord.
+		// TODO: Disabled caching for now.
 		BellmanFordShortestPath<IResourceAdapter<?>, DefaultEdge> shortestPathForCurrentMessage =
-				shortestPathForSender.get(source);
+				null;
+		// try {
+		// shortestPathForCurrentMessage = shortestPathForSender.get(source);
+		// } catch(IllegalArgumentException e) {
+		// pcgEncoding.display();
+		// throw e;
+		// }
+
 		if(shortestPathForCurrentMessage == null) {
 			shortestPathForCurrentMessage =
 					new BellmanFordShortestPath<IResourceAdapter<?>, DefaultEdge>(
-							platformCommunicationGraph, source);
-			shortestPathForSender.put(source, shortestPathForCurrentMessage);
+							pcgEncoding.getActualGraph(), source);
+			// shortestPathForSender.put(source, shortestPathForCurrentMessage);
 		}
 
 		for(IResourceAdapter<?> currentReceiver : receiverResources) {
-			List<DefaultEdge> shortestMessagePath =
-					shortestPathForCurrentMessage.getPathEdgeList(currentReceiver);
+			List<DefaultEdge> shortestMessagePath = null;
+			try {
+				shortestMessagePath =
+						shortestPathForCurrentMessage.getPathEdgeList(currentReceiver);
+			} catch(IllegalArgumentException e) {
+				pcgEncoding.display();
+				throw e;
+			}
+
 			// No valid path between source and receiver => invalid mapping;
 			if(shortestMessagePath == null) {
 				return null;
 			}
 			// Add all vertices and edges.
-			Graphs.addAllEdges(messageGraph, platformCommunicationGraph, shortestMessagePath);
+			Graphs.addAllEdges(messageGraph, pcgEncoding.getActualGraph(), shortestMessagePath);
 		}
 
 		return messageGraph;
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/sched/comm/TDMABusScheduler.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/sched/comm/TDMABusScheduler.java
index 67f5294c..ae189da1 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/sched/comm/TDMABusScheduler.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/dse/sysmodel/sched/comm/TDMABusScheduler.java
@@ -30,6 +30,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedAcyclicTaskGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEntry;
@@ -80,10 +81,10 @@ public class TDMABusScheduler<S extends InstantiatedTaskMappingEntry, T extends
 
 	/** Add simple TDMA bus schedule / communication time to a pure task schedule. */
 	public void schedule(StrictTTSchedule<S, T> schedule, Collection<Message> generatedMessages,
-			InstantiatedAcyclicTaskGraphEncoding<S, ?> acycItgEnc) {
+			InstantiatedAcyclicTaskGraphEncoding<S, ?> acycItgEnc,
+			PlatformCommunicationGraphEncoding pcgEncoding) {
 		Multimap<TimeSlot, Message> emitableMessagesPerSlot = HashMultimap.create();
 		Map<TimeSlot, Integer> reqRecvMsgsPerSlot = new HashMap<TimeSlot, Integer>();
-
 		// Add the information about the allocated TimeSlots for the senders and the receivers of
 		// the messages to the generated messages. This information stems from the schedule of the
 		// the execution units
@@ -99,7 +100,6 @@ public class TDMABusScheduler<S extends InstantiatedTaskMappingEntry, T extends
 					senderSlot.getDeployedRequester().getSource();
 			message.addMessageSenderTimeSlot(senderSlot);
 			emitableMessagesPerSlot.put(senderSlot, message);
-
 			for(InstantiatedTaskMappingEntry receiverEntry : message.getReceiverMappingEntries()) {
 				// If the receiver entry is only executed during the next hyperperiod, do not
 				// consider this receiver here.
@@ -118,8 +118,10 @@ public class TDMABusScheduler<S extends InstantiatedTaskMappingEntry, T extends
 					reqRecvMsgsPerSlot.put(recvTimeSlot, numReqMsgs);
 				}
 			}
-			messageRoutes.put(message, messageRouter.calculateMessageRoute(
-					message.getSenderTimeSlot().getResource(), message.getReceiverResources()));
+			// TODO: Why is this needed here? Conceptually, we have a seperate message router.
+			messageRoutes.put(message,
+					messageRouter.calculateMessageRoute(message.getSenderTimeSlot().getResource(),
+							message.getReceiverResources(), pcgEncoding));
 		}
 
 		// Construct a message queue whose ordering defines the type of scheduling, i.e. ESF, EDF
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/DependencyGraph.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/DependencyGraph.java
index a107f56a..7c5b263a 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/DependencyGraph.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/DependencyGraph.java
@@ -16,6 +16,8 @@
 package org.fortiss.af3.exploration.alg.graph;
 
 import static org.apache.commons.collections4.CollectionUtils.isEqualCollection;
+import static org.fortiss.af3.exploration.util.ExplorationUtils.isDebugVerboseEnabled;
+import static org.fortiss.tooling.common.util.LambdaUtils.getFirst;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -35,12 +37,11 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegen
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.exception.MissingDependencyException;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.SystemModelAdapter;
+import org.fortiss.af3.exploration.alg.graph.display.ObjectJGraphTVisualizer;
 import org.fortiss.af3.exploration.alg.util.GraphUtils;
-import org.jgrapht.DirectedGraph;
 import org.jgrapht.Graphs;
 import org.jgrapht.experimental.dag.DirectedAcyclicGraph;
 import org.jgrapht.experimental.dag.DirectedAcyclicGraph.CycleFoundException;
-import org.jgrapht.graph.DefaultDirectedGraph;
 import org.opt4j.core.optimizer.IncompatibilityException;
 import org.opt4j.core.problem.Creator;
 import org.opt4j.core.problem.Decoder;
@@ -78,8 +79,11 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend
 	/** Operators which implement an identity operation. */
 	private Multimap<Class<? extends V>, T> identityOperators = HashMultimap.create();
 
+	private Map<Class<? extends V>, T> pureIdentityOperators = new HashMap<>();
+
 	/** Constructor. */
-	public DependencyGraph(Set<Class<? extends V>> reqTypeCollection, Class<? extends V> vertexType) {
+	public DependencyGraph(Set<Class<? extends V>> reqTypeCollection,
+			Class<? extends V> vertexType) {
 		requestedTypes = reqTypeCollection;
 		this.vertexType = vertexType;
 	}
@@ -102,14 +106,18 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend
 			// Decoder graph. Add vertices, then edges.
 			dependencyDagGraph.addVertex(outType);
 			requiredTypes.forEach(p -> dependencyDagGraph.addVertex(p));
+			if(requiredTypes.size() == 1 &&
+					(getFirst(requiredTypes).orElse(null) == edgeOperator.getOutputType())) {
+				pureIdentityOperators.put(getFirst(requiredTypes).get(), edgeOperator);
+			}
 			for(Class<? extends V> inputPheno : requiredTypes) {
 				// Allow Identity Decoders.
 				if(inputPheno.equals(edgeOperator.getOutputType())) {
 					identityOperators.put(inputPheno, edgeOperator);
 				} else {
-					E edge = dependencyDagGraph.getEdge(inputPheno, outType);
+					E edge = dependencyDagGraph.getEdge(outType, inputPheno);
 					if(edge == null) {
-						edge = dependencyDagGraph.addDagEdge(inputPheno, outType);
+						edge = dependencyDagGraph.addDagEdge(outType, inputPheno);
 					}
 					edge.addDecoder(edgeOperator);
 				}
@@ -127,9 +135,9 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend
 		Collection<Class<? extends V>> castedInputTypes = new HashSet<>();
 		for(Class<?> curInputType : module.getRequiredTypes()) {
 			if(curInputType.isAssignableFrom(vertexType)) {
-				throw new IncompatibilityException("The required input type " +
-						curInputType.getSimpleName() + " is not an " + vertexType.getSimpleName() +
-						".");
+				throw new IncompatibilityException(
+						"The required input type " + curInputType.getSimpleName() + " is not an " +
+								vertexType.getSimpleName() + ".");
 			}
 			castedInputTypes.add((Class<? extends V>)curInputType);
 		}
@@ -161,17 +169,17 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend
 	 */
 	private void calculateExecutionOrder() throws MissingDependencyException {
 		// TODO: add comments to explain the resoning inside this method.
-		@SuppressWarnings("unchecked") DirectedGraph<Class<? extends V>, E> execOrderGraph =
-				new DefaultDirectedGraph<>((Class<? extends E>)DependencyEdge.class);
+		@SuppressWarnings("unchecked") DirectedAcyclicGraph<Class<? extends V>, E> execOrderGraph =
+				new DirectedAcyclicGraph<>((Class<? extends E>)DependencyEdge.class);
 		Queue<Class<? extends V>> inputTypes = new LinkedList<>();
 		Set<Class<? extends V>> traversedTypes = new HashSet<>();
 		Set<E> requiredOperators = new HashSet<>();
 		inputTypes.addAll(requestedTypes);
 		while(!inputTypes.isEmpty()) {
 			@SuppressWarnings("unchecked") Class<V> operatorInputType = (Class<V>)inputTypes.poll();
-			requiredOperators.addAll(dependencyDagGraph.incomingEdgesOf(operatorInputType));
+			requiredOperators.addAll(dependencyDagGraph.outgoingEdgesOf(operatorInputType));
 			for(E edge : requiredOperators) {
-				Class<? extends V> srcType = dependencyDagGraph.getEdgeSource(edge);
+				Class<? extends V> srcType = dependencyDagGraph.getEdgeTarget(edge);
 				if(!traversedTypes.contains(srcType)) {
 					inputTypes.add(srcType);
 					traversedTypes.add(srcType);
@@ -179,13 +187,13 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend
 			}
 		}
 
-		Collection<Class<? extends V>> inTypes =
-				requiredOperators.stream().map(d -> dependencyDagGraph.getEdgeSource(d))
-						.collect(Collectors.toList());
-		getIdentityOperatorsOf(inTypes).entrySet().forEach(
-				e -> identityOperators.put(e.getKey(), e.getValue()));
-		getIdentityOperatorsOf(requestedTypes).entrySet().forEach(
-				e -> identityOperators.put(e.getKey(), e.getValue()));
+		// required Operators --> additional Identity decoders.
+		Collection<Class<? extends V>> inTypes = requiredOperators.stream()
+				.map(d -> dependencyDagGraph.getEdgeSource(d)).collect(Collectors.toList());
+		getIdentityOperatorsOf(inTypes).entrySet()
+				.forEach(e -> identityOperators.put(e.getKey(), e.getValue()));
+		getIdentityOperatorsOf(requestedTypes).entrySet()
+				.forEach(e -> identityOperators.put(e.getKey(), e.getValue()));
 
 		for(E edge : requiredOperators) {
 			Graphs.addEdgeWithVertices(execOrderGraph, dependencyDagGraph, edge);
@@ -193,19 +201,19 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend
 
 		// DEBUG code: only include if the dependency graph shall be debugged. Otherwise, two
 		// windows for each individual and iteration will be produced.
-		// if(isDebugVerboseEnabled()) {
-		// ObjectJGraphTVisualizer<Class<? extends V>, E> graphViz =
-		// new ObjectJGraphTVisualizer<Class<? extends V>, E>(dependencyDagGraph);
-		// graphViz.displayGraph("Dependency graph");
-		//
-		// }
-		//
-		// if(isDebugVerboseEnabled()) {
-		// ObjectJGraphTVisualizer<Class<? extends V>, E> graphViz =
-		// new ObjectJGraphTVisualizer<Class<? extends V>, E>(execOrderGraph);
-		// graphViz.displayGraph("Dependency graph (Exec Order)");
-		//
-		// }
+		if(isDebugVerboseEnabled()) {
+			ObjectJGraphTVisualizer<Class<? extends V>, E> graphViz =
+					new ObjectJGraphTVisualizer<Class<? extends V>, E>(dependencyDagGraph);
+			graphViz.displayGraph("Dependency graph");
+
+		}
+
+		if(isDebugVerboseEnabled()) {
+			ObjectJGraphTVisualizer<Class<? extends V>, E> graphViz =
+					new ObjectJGraphTVisualizer<Class<? extends V>, E>(execOrderGraph);
+			graphViz.displayGraph("Dependency graph (Exec Order)");
+
+		}
 
 		calculateExecOrderList(execOrderGraph);
 
@@ -226,30 +234,26 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend
 	 * Calculates the effective execution order of the operators and adds them to the internal list
 	 * of {@code this} {@link DependencyGraph}.
 	 */
-	private void calculateExecOrderList(DirectedGraph<Class<? extends V>, E> execOrderGraph) {
-		Queue<Class<? extends V>> traversalQueue = new LinkedList<>();
-		traversalQueue.addAll(requestedTypes);
-
-		while(!traversalQueue.isEmpty()) {
-			Class<? extends V> encType = traversalQueue.poll();
-
-			if(execOrderGraph.containsVertex(encType)) {
-				for(E decoderEdge : execOrderGraph.incomingEdgesOf(encType)) {
-					decoderEdge.getElements().forEach(e -> operatorExecOrder.addFirst(e));
-
-					// If not yet present, consider the results for the iteration over the next
-					// "graph layer".
-					Class<? extends V> decInputType = execOrderGraph.getEdgeSource(decoderEdge);
-					if(decInputType != null && !traversalQueue.contains(decInputType)) {
-						traversalQueue.add(decInputType);
+	private void
+			calculateExecOrderList(DirectedAcyclicGraph<Class<? extends V>, E> execOrderGraph) {
+		Iterator<Class<? extends V>> encodingIter = execOrderGraph.iterator();
+		while(encodingIter.hasNext()) {
+			Class<? extends V> encoding = encodingIter.next();
+			// Itentity Decoders must be launched as soon as possible to forward the produced
+			// phenoytpes to the later steps.
+			T identDec = pureIdentityOperators.get(encoding);
+			if(identDec != null) {
+				operatorExecOrder.addFirst(identDec);
+			}
+			Collection<E> launchableDecoders = execOrderGraph.outgoingEdgesOf(encoding);
+			for(E decoderEdge : launchableDecoders) {
+				// assert (decoderEdge.getElements().size() == 1);
+				for(T dec : decoderEdge.getElements()) {
+					if(!operatorExecOrder.contains(dec)) {
+						operatorExecOrder.addFirst(dec);
 					}
 				}
 			}
-
-			if(identityOperators.containsKey(encType)) {
-				identityOperators.get(encType).stream().filter(i -> !operatorExecOrder.contains(i))
-						.forEach(i -> operatorExecOrder.addFirst(i));
-			}
 		}
 
 		if(getSubExecListComparator() != null) {
@@ -325,20 +329,28 @@ public abstract class DependencyGraph<V, T extends IDependencyModule<V, ? extend
 	 * Returns a collection of identity operators which operate on the given input types. The set of
 	 * operators to be checked equals the set of operators in the graph.
 	 */
-	private Map<Class<? extends V>, T> getIdentityOperatorsOf(
-			Collection<Class<? extends V>> encodingTypes) {
+	private Map<Class<? extends V>, T>
+			getIdentityOperatorsOf(Collection<Class<? extends V>> encodingTypes) {
 		Map<Class<? extends V>, T> filteredIdentityOperators = new HashMap<>();
 		for(E edge : dependencyDagGraph.edgeSet()) {
 			Class<? extends V> srcType = dependencyDagGraph.getEdgeSource(edge);
 			if((srcType == dependencyDagGraph.getEdgeTarget(edge)) &&
 					encodingTypes.contains(srcType)) {
-				assert (edge.getElements().size() > 1) : "Only one identity decoder for each element type is supported.";
+				assert (edge.getElements()
+						.size() > 1) : "Only one identity decoder for each element type is supported.";
 				filteredIdentityOperators.put(srcType, edge.getElements().stream().findAny().get());
 			}
 		}
 		return filteredIdentityOperators;
 	}
 
+	// private Map<Class<? extends V>, T>
+	// getPureIdentityOperators(Collection<Class<? extends V>> encodingTypes) {
+	// for(Class<? extends V> encoding : encodingTypes) {
+	//
+	// }
+	// }
+
 	/**
 	 * Comparator to allow ordering of operator lists by means of the execution
 	 * order defined in a {@link DependencyGraph}.
diff --git a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/display/NamedVertex.java b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/display/NamedVertex.java
index eab4f4f6..a2cdd4a5 100644
--- a/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/display/NamedVertex.java
+++ b/org.fortiss.af3.exploration.alg/trunk/src/org/fortiss/af3/exploration/alg/graph/display/NamedVertex.java
@@ -39,6 +39,9 @@ public class NamedVertex<V extends IModelElementAdapter<?>> implements Serializa
 	/** {@inheritDoc} */
 	@Override
 	public String toString() {
+		if(namedElement == null) {
+			return super.toString();
+		}
 		return namedElement.getName() + "(ID: " + namedElement.getId() + ")";
 	}
 }
-- 
GitLab