diff --git a/org.fortiss.af3.exploration.alg/.classpath b/org.fortiss.af3.exploration.alg/.classpath
index 371de5fdd2cc52c7db498a6697c11891bcf95a0d..66cc3ddb464545835549991678de7414dc1c5204 100644
--- a/org.fortiss.af3.exploration.alg/.classpath
+++ b/org.fortiss.af3.exploration.alg/.classpath
@@ -21,9 +21,9 @@
 	<classpathentry exported="true" kind="lib" path="lib/apfloat.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/jgrapht-ext-0.9.0.jar"/>
 	<classpathentry exported="true" kind="lib" path="lib/jgraphx-2.0.0.1.jar"/>
-	<classpathentry kind="lib" path="lib/guice-assistedinject-4.2.0.jar" sourcepath="lib/guice-assistedinject-4.2.0-sources.jar"/>
-	<classpathentry kind="lib" path="lib/guice-4.2.0.jar" sourcepath="lib/guice-4.2.0-sources.jar"/>
-	<classpathentry kind="lib" path="lib/guice-multibindings-4.2.0.jar" sourcepath="lib/guice-multibindings-4.2.0-sources.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/guice-4.2.1-SNAPSHOT.jar" sourcepath="lib/guice-4.2.1-SNAPSHOT-sources.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/guice-assistedinject-4.2.1-SNAPSHOT.jar" sourcepath="lib/guice-assistedinject-4.2.1-SNAPSHOT-sources.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/guice-multibindings-4.2.1-SNAPSHOT.jar" sourcepath="lib/guice-multibindings-4.2.1-SNAPSHOT-sources.jar"/>
 	<classpathentry kind="lib" path="lib/jcommon-1.0.23.jar"/>
 	<classpathentry kind="lib" path="lib/jfreechart-1.0.19.jar" sourcepath="lib/jfreechart-1.0.19-src.jar"/>
 	<classpathentry kind="output" path="build"/>
diff --git a/org.fortiss.af3.exploration.alg/META-INF/MANIFEST.MF b/org.fortiss.af3.exploration.alg/META-INF/MANIFEST.MF
index b0eb425520f99345e88d2d590e7b93a40b8eabaf..bf4241218532bf6436ef087e58a7a89d96f6e67b 100644
--- a/org.fortiss.af3.exploration.alg/META-INF/MANIFEST.MF
+++ b/org.fortiss.af3.exploration.alg/META-INF/MANIFEST.MF
@@ -9,9 +9,9 @@ Bundle-ClassPath: .,
  lib/apfloat.jar,
  lib/jgrapht-ext-0.9.0.jar,
  lib/jgraphx-2.0.0.1.jar,
- lib/guice-assistedinject-4.2.0.jar,
- lib/guice-4.2.0.jar,
- lib/guice-multibindings-4.2.0.jar,
+ lib/guice-4.2.1-SNAPSHOT.jar,
+ lib/guice-assistedinject-4.2.1-SNAPSHOT.jar,
+ lib/guice-multibindings-4.2.1-SNAPSHOT.jar,
  lib/commons-collections4-4.1.jar,
  lib/opt4j-optimizers-SNAPSHOT-20161110.jar,
  lib/guava-25.1-jre.jar,
diff --git a/org.fortiss.af3.exploration.alg/build.properties b/org.fortiss.af3.exploration.alg/build.properties
index 60e7d0cdc7a6fc47e05cb5ac131590a589772395..b8f44e865f6d3cd8e5394fd1a266fd6929cc59c8 100644
--- a/org.fortiss.af3.exploration.alg/build.properties
+++ b/org.fortiss.af3.exploration.alg/build.properties
@@ -1,27 +1,27 @@
-# (c) 2017 fortiss GmbH
-
-bin.includes = .,\
-               META-INF/,\
-               plugin.xml,\
-               plugin.properties,\
-               lib/aopalliance-1.0.jar,\
-               lib/apfloat.jar,\
-               lib/jgrapht-core-0.9.0.jar,\
-               lib/licenses/,\
-               lib/opt4j-core-SNAPSHOT-20180714.jar,\
-               lib/opt4j-operators-SNAPSHOT-20180714.jar,\
-               lib/opt4j-satdecoding-3.1.3.jar,\
-               lib/opt4j-viewer-3.1.3.jar,\
-               lib/jgrapht-ext-0.9.0.jar,\
-               lib/jgraphx-2.0.0.1.jar,\
-               lib/guice-assistedinject-4.2.0.jar,\
-               lib/guice-4.2.0.jar,\
-               lib/guice-multibindings-4.2.0.jar,\
-               lib/commons-collections4-4.1.jar,\
-               lib/opt4j-optimizers-SNAPSHOT-20161110.jar,\
-               lib/guava-25.1-jre.jar,\
-               lib/jfreechart-1.0.19.jar,\
-               lib/jcommon-1.0.23.jar
-source.. = src/, \
-           generated-src
-output.. = build/
+# (c) 2017 fortiss GmbH
+
+bin.includes = .,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               lib/aopalliance-1.0.jar,\
+               lib/apfloat.jar,\
+               lib/jgrapht-core-0.9.0.jar,\
+               lib/licenses/,\
+               lib/opt4j-core-SNAPSHOT-20180714.jar,\
+               lib/opt4j-operators-SNAPSHOT-20180714.jar,\
+               lib/opt4j-satdecoding-3.1.3.jar,\
+               lib/opt4j-viewer-3.1.3.jar,\
+               lib/jgrapht-ext-0.9.0.jar,\
+               lib/jgraphx-2.0.0.1.jar,\
+               lib/guice-4.2.1-SNAPSHOT.jar,\
+               lib/guice-assistedinject-4.2.1-SNAPSHOT.jar,\
+               lib/guice-multibindings-4.2.1-SNAPSHOT.jar,\
+               lib/commons-collections4-4.1.jar,\
+               lib/opt4j-optimizers-SNAPSHOT-20161110.jar,\
+               lib/guava-25.1-jre.jar,\
+               lib/jfreechart-1.0.19.jar,\
+               lib/jcommon-1.0.23.jar
+source.. = src/, \
+           generated-src
+output.. = build/
diff --git a/org.fortiss.af3.exploration.alg/lib/guice-4.2.0.jar b/org.fortiss.af3.exploration.alg/lib/guice-4.2.0.jar
deleted file mode 100644
index b71d669886ace13a7e146a06636f5c5179527a21..0000000000000000000000000000000000000000
Binary files a/org.fortiss.af3.exploration.alg/lib/guice-4.2.0.jar and /dev/null differ
diff --git a/org.fortiss.af3.exploration.alg/lib/guice-4.2.0-sources.jar b/org.fortiss.af3.exploration.alg/lib/guice-4.2.1-SNAPSHOT-sources.jar
similarity index 88%
rename from org.fortiss.af3.exploration.alg/lib/guice-4.2.0-sources.jar
rename to org.fortiss.af3.exploration.alg/lib/guice-4.2.1-SNAPSHOT-sources.jar
index a65645519e6adc1bd6693c6420e17f02dd3744f3..9e91db90ed622464b81440158e6eadb74432d974 100644
Binary files a/org.fortiss.af3.exploration.alg/lib/guice-4.2.0-sources.jar and b/org.fortiss.af3.exploration.alg/lib/guice-4.2.1-SNAPSHOT-sources.jar differ
diff --git a/org.fortiss.af3.exploration.alg/lib/guice-4.2.1-SNAPSHOT.jar b/org.fortiss.af3.exploration.alg/lib/guice-4.2.1-SNAPSHOT.jar
new file mode 100644
index 0000000000000000000000000000000000000000..434b8c2b3717b72ac61c34f07588aa98ea0928e7
Binary files /dev/null and b/org.fortiss.af3.exploration.alg/lib/guice-4.2.1-SNAPSHOT.jar differ
diff --git a/org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.0.jar b/org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.0.jar
deleted file mode 100644
index 604fe0f55f3738bc006ffc6f784a0c821e2d7df4..0000000000000000000000000000000000000000
Binary files a/org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.0.jar and /dev/null differ
diff --git a/org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.0-sources.jar b/org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.1-SNAPSHOT-sources.jar
similarity index 81%
rename from org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.0-sources.jar
rename to org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.1-SNAPSHOT-sources.jar
index 661022c21170a7dda4349718f93abc55a52c652c..22dc34ae573e8470234cd3bc0e5671dde912fa77 100644
Binary files a/org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.0-sources.jar and b/org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.1-SNAPSHOT-sources.jar differ
diff --git a/org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.1-SNAPSHOT.jar b/org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.1-SNAPSHOT.jar
new file mode 100644
index 0000000000000000000000000000000000000000..22529e2d39504e5f554a9d37f77bb10abe3ed40e
Binary files /dev/null and b/org.fortiss.af3.exploration.alg/lib/guice-assistedinject-4.2.1-SNAPSHOT.jar differ
diff --git a/org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.0-sources.jar b/org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.0-sources.jar
deleted file mode 100644
index cde8d9203c9155ac2e5a052d4302d8194f1cca38..0000000000000000000000000000000000000000
Binary files a/org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.0-sources.jar and /dev/null differ
diff --git a/org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.0.jar b/org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.1-SNAPSHOT-sources.jar
similarity index 69%
rename from org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.0.jar
rename to org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.1-SNAPSHOT-sources.jar
index f856348967e7eb0a82cdf8beb00bcf3fab7d0b60..b982f511c509cc0972fd65d7afc35a6c8abac342 100644
Binary files a/org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.0.jar and b/org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.1-SNAPSHOT-sources.jar differ
diff --git a/org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.1-SNAPSHOT.jar b/org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.1-SNAPSHOT.jar
new file mode 100644
index 0000000000000000000000000000000000000000..d67166e5ca164a274ccd2e053560a7df32efc8cf
Binary files /dev/null and b/org.fortiss.af3.exploration.alg/lib/guice-multibindings-4.2.1-SNAPSHOT.jar differ
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings
index a18c43f873d9ac53ee84a65785938d2efa252f51..ddcee2b01b83d601f4011a244a2e302e65d6f244 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/.ratings
@@ -1,6 +1,6 @@
 CompositeExplorationSolution.java db9dadb94e6696cddaf12f0c5238fecfc4348afc RED
-DSEFactory.java b2eda5cf4b3fb41f0247751116276c3f7a3fd33c RED
-Explorer.java be3ff1506a4aa34861de98e0a7e56743630f5afe RED
+DSEFactory.java e8fa834b94a01ca7117d96c152f221d1952fdcc8 RED
+Explorer.java eb33cc2a910233fb3d9d2d5ff0249938d7e0ce89 RED
 ImplicitExplorationTargetFactory.java 25c3c668ed268843f8af7e37eb03370ed513b482 RED
 SolutionQuantification.java 19cd7caa721bbca3112af7825c7fb20a96a4a799 RED
 TaskMappingFactory.java 13f4e8104769a1592050ebb6e23d6fbcf864d1d2 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java
index b2eda5cf4b3fb41f0247751116276c3f7a3fd33c..e8fa834b94a01ca7117d96c152f221d1952fdcc8 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/DSEFactory.java
@@ -16,14 +16,12 @@
 package org.fortiss.af3.exploration.alg.dse;
 
 import java.util.ArrayList;
-import java.util.Collection;
 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;
@@ -45,11 +43,7 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.problem.partitionmappin
 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;
-import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter;
-import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IGatewayUnitAdapter;
-import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IMemoryUnitAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITaskAdapter;
-import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITransmissionUnitAdapter;
 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;
@@ -140,8 +134,8 @@ public class DSEFactory {
 	 */
 	@SuppressWarnings("unchecked")
 	private <C, T extends SafetyFunctionArchEncoding> void createSafetyFunctionArchProblem(
-			DseProcessProblemModule archExpProblemModule,
-			DecoderDependencyGraph execDepGraph) throws Exception {
+			DseProcessProblemModule archExpProblemModule, DecoderDependencyGraph execDepGraph)
+			throws Exception {
 		// These suppress warnings are required since type erasure in Java does not allow to pass
 		// XY<Z>.class.
 		SafetyFunctionArchCreator sfCreator = new SafetyFunctionArchCreator();
@@ -166,9 +160,8 @@ public class DSEFactory {
 	 * @throws CycleFoundException
 	 *             if a cyclic dependency is discovered when registering the problem.
 	 */
-	private void createPartitionMappingProblem(
-			DseProcessProblemModule archExpProblemModule, DseSpecification dse,
-			DecoderDependencyGraph execDepGraph) throws CycleFoundException {
+	private void createPartitionMappingProblem(DseProcessProblemModule archExpProblemModule,
+			DseSpecification dse, DecoderDependencyGraph execDepGraph) throws CycleFoundException {
 		Class<PartitionMappingEncoding> pmEnodingClass = PartitionMappingEncoding.class;
 		PartitionMappingCreator pmCreator = new PartitionMappingCreator();
 
@@ -184,25 +177,25 @@ public class DSEFactory {
 	 */
 	@SuppressWarnings("unchecked")
 	private void createPlatformCommunicationGraphProblem(
-			DseProcessProblemModule archExpProblemModule,
-			DecoderDependencyGraph execDepGraph) throws CycleFoundException {
+			DseProcessProblemModule archExpProblemModule, DecoderDependencyGraph execDepGraph)
+			throws CycleFoundException {
 		Class<PlatformCommunicationGraphEncoding> pmEnodingClass =
 				PlatformCommunicationGraphEncoding.class;
-		PlatformCommunicationGraphCreator pmCreator =
-				new PlatformCommunicationGraphCreator(execDepGraph,
-						(Collection<IExecutionUnitAdapter<?>>)(Collection<?>)systemModelAdapter
-								.getDeploymentTargets(),
-						(Collection<IMemoryUnitAdapter<?>>)(Collection<?>)systemModelAdapter
-								.getMemoryUnits(),
-						(Collection<IGatewayUnitAdapter<?>>)(Collection<?>)systemModelAdapter
-								.getGatewayUnits(),
-						(Collection<ITransmissionUnitAdapter<?>>)(Collection<?>)systemModelAdapter
-								.getTransmissionUnits(), systemModelAdapter.getResouceConnections());
+		// PlatformCommunicationGraphCreator pmCreator =
+		// new PlatformCommunicationGraphCreator(execDepGraph,
+		// (Collection<IExecutionUnitAdapter<?>>)(Collection<?>)systemModelAdapter
+		// .getDeploymentTargets(),
+		// (Collection<IMemoryUnitAdapter<?>>)(Collection<?>)systemModelAdapter
+		// .getMemoryUnits(),
+		// (Collection<IGatewayUnitAdapter<?>>)(Collection<?>)systemModelAdapter
+		// .getGatewayUnits(),
+		// (Collection<ITransmissionUnitAdapter<?>>)(Collection<?>)systemModelAdapter
+		// .getTransmissionUnits(), systemModelAdapter.getResouceConnections());
 
 		@SuppressWarnings("rawtypes") List<ComposableDecoder> pmDecoders = new ArrayList<>();
 		PartitionMappingDecoderGraph pmgDecoder = new PartitionMappingDecoderGraph();
-		execDepGraph.addCreatedEncoding(pmCreator.getCreatedEncodingType());
-		archExpProblemModule.registerSubProblem(pmEnodingClass, pmCreator, pmDecoders);
+		// execDepGraph.addCreatedEncoding(pmCreator.getCreatedEncodingType());
+		// archExpProblemModule.registerSubProblem(pmEnodingClass, pmCreator, pmDecoders);
 	}
 
 	/**
@@ -226,8 +219,8 @@ public class DSEFactory {
 	@SuppressWarnings("unchecked")
 	private <S extends InstantiatedTaskMappingEntry, T extends InstantiatedTaskMappingEncoding<S>>
 			void createAbstractTaskMappingProblem(TaskMappingFactory<S, T> tmFactory,
-					DseProcessProblemModule archExpProblemModule,
-					DseSpecification dse, DecoderDependencyGraph execDepGraph) throws Exception {
+					DseProcessProblemModule archExpProblemModule, DseSpecification dse,
+					DecoderDependencyGraph execDepGraph) throws Exception {
 		Class<AbstractTaskMappingEncoding> tmEnodingClass = AbstractTaskMappingEncoding.class;
 		AbstractTaskMappingCreator tmCreator =
 				tmFactory.createAbstractTaskMappingCreator(execDepGraph);
@@ -260,8 +253,8 @@ public class DSEFactory {
 	@SuppressWarnings("unchecked")
 	private <S extends InstantiatedTaskMappingEntry, T extends InstantiatedTaskMappingEncoding<S>>
 			void createTaskMappingInstantiationProblem(TaskMappingFactory<S, T> tmFactory,
-					DseProcessProblemModule archExpProblemModule,
-					DseSpecification dse, DecoderDependencyGraph execDepGraph) throws Exception {
+					DseProcessProblemModule archExpProblemModule, DseSpecification dse,
+					DecoderDependencyGraph execDepGraph) throws Exception {
 		// These suppress warnings are required since type erasure in Java does not allow to pass
 		// XY<Z>.class.
 		@SuppressWarnings("rawtypes") TaskMappingCreator tmCreator =
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/Explorer.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/Explorer.java
index be3ff1506a4aa34861de98e0a7e56743630f5afe..eb33cc2a910233fb3d9d2d5ff0249938d7e0ce89 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/Explorer.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/Explorer.java
@@ -29,6 +29,8 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.emf.ecore.EObject;
 import org.fortiss.af3.exploration.alg.dse.backend.IExplorerBackend;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.Opt4JExplorerBackend;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.DecodingInterceptModule;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.DecodingPluginInterceptor;
 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.IExplorationConstraintTransformationService;
@@ -232,7 +234,9 @@ public class Explorer {
 			SystemModelAdapter<?, ?, ?, ?, ?, ?, ?> systemModelAdapter,
 			Set<Class<? extends Phenotype>> requestedSolutions, IProgressMonitor progressMonitor)
 			throws Exception {
-		Injector dseInjector = Guice.createInjector(systemModelAdapter);
+		Injector dseInjector =
+				Guice.createInjector(systemModelAdapter, new DecodingInterceptModule(
+						new DecodingPluginInterceptor()));
 
 		if(dse.getOptimizer() instanceof EAOptimizer) {
 			return new Opt4JExplorerBackend(dse, expSpec, targetAssocMap, dseInjector,
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings
index f98c91472303287a8f446561c8e27c4bfd4c714d..7f892fee50b10732b08e188d7dba7e91d466b9b0 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/.ratings
@@ -1,5 +1,5 @@
 Opt4JDseTask.java b5cb9e664e7a8fc2b5157bcdcaca740c2fa85336 YELLOW
 Opt4JDseTaskProvider.java ff2bbc6da2b21bd0bc64c3fa77dc8fa9939d10af RED
 Opt4JExplorationSolutionSet.java 8578ee9c438bc3327a64172e996306a89606c782 RED
-Opt4JExplorerBackend.java cddd1dc5ff5833b7e23cca7328682d88ee782677 RED
+Opt4JExplorerBackend.java a2b73a1640a16e551641b4514d1b35bdae41ffc5 RED
 Opt4JSingleExplorationSolution.java 41ce92d11b2e7a6a8c39bffa990c691160c36c8d RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java
index cddd1dc5ff5833b7e23cca7328682d88ee782677..a2b73a1640a16e551641b4514d1b35bdae41ffc5 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/Opt4JExplorerBackend.java
@@ -218,6 +218,7 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> {
 		// 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.
 		IndividualCompleterModule comp = new IndividualCompleterModule();
+
 		if(opt4JParameters.isParallelExecution()) {
 			comp.setType(IndividualCompleterModule.Type.PARALLEL);
 			comp.setThreads(Runtime.getRuntime().availableProcessors());
@@ -265,6 +266,8 @@ public class Opt4JExplorerBackend extends ExplorerBackendBase<EAOptimizer> {
 						dse.getFeatures());
 		Collection<DecoderModule<?>> enabledDecoders = newHashSet();
 		enabledFeatures.forEach(f -> enabledDecoders.addAll(f.getDecoders()));
+		// Note: The interceptor is not used: It is only activated if a Phenotype instance is
+		// requested from the decoders.
 		GuiceDecoder guiceDecoder = new GuiceDecoder(resultTypes, enabledDecoders);
 		buildCheckedDecodingInjector(guiceDecoder);
 	}
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/.ratings
index 66bdddf50ec5e12fbce9a42e6a1e6b88c397ccf1..107c3eeb71fb8ec661658f505e5a443c7e73717a 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/.ratings
@@ -1 +1 @@
-PartitionMappingCreator.java 087de657669392f17b1bd3c84de4fb794d2f4da5 RED
+PartitionMappingCreator.java 5234835b1e94f2226e33bf04c2705598ad166858 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java
index 087de657669392f17b1bd3c84de4fb794d2f4da5..5234835b1e94f2226e33bf04c2705598ad166858 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/partitionmapping/PartitionMappingCreator.java
@@ -17,6 +17,7 @@ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.partitionmappin
 
 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.partitionmapping.PartitionMappingEncoding.CREATE_STARTEGY;
 import org.fortiss.af3.exploration.alg.dse.module.CreatorModule;
@@ -34,28 +35,23 @@ import com.google.inject.Provides;
  */
 public class PartitionMappingCreator extends CreatorModule<PartitionMappingEncoding> {
 
-	// /** Constructor. */
-	// public PartitionMappingCreator(Collection<IExecutionUnitAdapter<?>> execUnits, int numTasks)
-	// {
-	// this.execUnits = execUnits;
-	// this.numTasks = numTasks;
-	// }
-
-	/** {@inheritDoc} */
+	/**
+	 * Creates an initial {@link PartitionMappingEncoding} using strategies using the minimal,
+	 * maximal, or a random number of created {@link Partition}s w.r.t. the number of
+	 * {@link ITaskAdapter}s
+	 */
 	@Provides
 	public PartitionMappingEncoding create(Collection<IExecutionUnitAdapter<?>> execUnits,
 			Collection<ITaskAdapter<?>> tasks) {
 		int numTasks = tasks.size();
 		// "Probability distribution" for the strategy selection: |1|numTasks - 2|1| ==> numTasks
 		int strategySelIdx = RandomExploration.getInstance().nextInt(numTasks);
-		switch(strategySelIdx) {
-			case 0:
-				return new PartitionMappingEncoding(execUnits, numTasks, CREATE_STARTEGY.MIN_SET);
-			case 24:
-				return new PartitionMappingEncoding(execUnits, numTasks, CREATE_STARTEGY.MAX_SET);
-			default:
-				return new PartitionMappingEncoding(execUnits, numTasks, CREATE_STARTEGY.RANDOM_SET);
+		if(strategySelIdx == 0) {
+			return new PartitionMappingEncoding(execUnits, numTasks, CREATE_STARTEGY.MIN_SET);
+		} else if(strategySelIdx == numTasks) {
+			return new PartitionMappingEncoding(execUnits, numTasks, CREATE_STARTEGY.MAX_SET);
 		}
+		return new PartitionMappingEncoding(execUnits, numTasks, CREATE_STARTEGY.RANDOM_SET);
 	}
 
 	/** {@inheritDoc} */
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/.ratings
index 0076d06e09699b98f7fe84119620420d1dbe5a3f..1b2e21eebe90c736e775aacb603e8e0beab0160d 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/.ratings
@@ -1 +1 @@
-PlatformCommunicationGraphCreator.java 54301f92ded2065b76a45ad27aeb6a8dcbac01fb RED
+PlatformCommunicationGraphCreator.java 2a6d6c22f178f4323f60396e71b53c1c748a7610 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.java
index 54301f92ded2065b76a45ad27aeb6a8dcbac01fb..2a6d6c22f178f4323f60396e71b53c1c748a7610 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/create/platform/PlatformCommunicationGraphCreator.java
@@ -18,11 +18,7 @@ package org.fortiss.af3.exploration.alg.dse.backend.opt4j.create.platform;
 import java.util.Collection;
 
 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.module.CreatorModule;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IExecutionUnitAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IGatewayUnitAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IMemoryUnitAdapter;
@@ -30,48 +26,28 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceConnectionAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceConnectionAdapter.ConnectionType;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITransmissionUnitAdapter;
-import org.fortiss.af3.exploration.alg.service.IExplorationEncoding;
 import org.jgrapht.DirectedGraph;
 import org.jgrapht.Graphs;
 import org.jgrapht.graph.DefaultDirectedGraph;
 import org.jgrapht.graph.DefaultEdge;
 
+import com.google.inject.Provides;
+
 /**
  * 
  * @author diewald
  */
-public class PlatformCommunicationGraphCreator
-		extends ComposableCreatorBase<PlatformCommunicationGraphEncoding> {
-	/** Execution Units present in the input models. */
-	private Collection<IExecutionUnitAdapter<?>> execUnits;
-	/** Memories present in the input models. */
-	private Collection<IMemoryUnitAdapter<?>> memoryUnits;
-	/** Gateways present in the input models. */
-	private Collection<IGatewayUnitAdapter<?>> gatewayUnits;
-	/** Transmission Units present in the input models. */
-	private Collection<ITransmissionUnitAdapter<?>> transmissionUnits;
-	/** Connections between resources present in the input models. */
-	private Collection<IResourceConnectionAdapter> resourceConnections;
+public class PlatformCommunicationGraphCreator extends
+		CreatorModule<PlatformCommunicationGraphEncoding> {
 
-	/** Constructor. */
-	public PlatformCommunicationGraphCreator(DecoderDependencyGraph depGraph,
+	/** Creates a {@link PlatformCommunicationGraphEncoding} from the input model. */
+	@Provides
+	public PlatformCommunicationGraphEncoding create(
 			Collection<IExecutionUnitAdapter<?>> execUnits,
 			Collection<IMemoryUnitAdapter<?>> memoryUnits,
 			Collection<IGatewayUnitAdapter<?>> gatewayUnits,
 			Collection<ITransmissionUnitAdapter<?>> transmissionUnits,
 			Collection<IResourceConnectionAdapter> resourceConnections) {
-		super(depGraph);
-		this.execUnits = execUnits;
-		this.memoryUnits = memoryUnits;
-		this.gatewayUnits = gatewayUnits;
-		this.transmissionUnits = transmissionUnits;
-		this.resourceConnections = resourceConnections;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public PlatformCommunicationGraphEncoding createComposable(FlatGenotypeMap createdGenotypes,
-			FlatPhenotypeMap<Phenotype> decodedPhenotypes) {
 		DirectedGraph<IResourceAdapter<?>, DefaultEdge> tempPlatformCommGraph =
 				new DefaultDirectedGraph<IResourceAdapter<?>, DefaultEdge>(DefaultEdge.class);
 		DirectedGraph<IResourceAdapter<?>, DefaultEdge> platformGraph =
@@ -91,12 +67,10 @@ public class PlatformCommunicationGraphCreator
 				// 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) {
+				if(connection.getConnectionType(currentReceiverResource) == ConnectionType.OUTGOING) {
 					Graphs.addEdgeWithVertices(platformGraph, connection.getSourceResource(),
 							currentReceiverResource);
-				} else if(connection
-						.getConnectionType(currentReceiverResource) == ConnectionType.INCOMING) {
+				} else if(connection.getConnectionType(currentReceiverResource) == ConnectionType.INCOMING) {
 					Graphs.addEdgeWithVertices(platformGraph, currentReceiverResource,
 							connection.getSourceResource());
 				} else {
@@ -116,7 +90,8 @@ public class PlatformCommunicationGraphCreator
 
 	/** {@inheritDoc} */
 	@Override
-	public Class<? extends IExplorationEncoding> getCreatedEncodingType() {
-		return PlatformCommunicationGraphEncoding.class;
+	public PlatformCommunicationGraphEncoding create() {
+		// TODO Auto-generated method stub
+		return null;
 	}
 }
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/.ratings
index 3fab49e2b949464825decea21a2b7739839d17ec..94e29e7ac7c9bafd8bac6eb6cf8a3066da5756e3 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/.ratings
@@ -1 +1 @@
-PlatformCommunicationGraphEncoding.java f0361039e0d012f0de4f4f29982cb271039dcf1a RED
+PlatformCommunicationGraphEncoding.java 492515975564dbffbb1a797a2f51d2c2ad8e3c05 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java
index f0361039e0d012f0de4f4f29982cb271039dcf1a..492515975564dbffbb1a797a2f51d2c2ad8e3c05 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/encoding/platform/PlatformCommunicationGraphEncoding.java
@@ -15,7 +15,6 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform;
 
-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.Phenotype;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.PhenotypeBase;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
@@ -24,6 +23,7 @@ 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;
+import org.opt4j.core.Genotype;
 
 /**
  * Abstracts the communication network present in a platform system meta-model to a flat graph. This
@@ -34,7 +34,7 @@ import org.jgrapht.graph.DefaultEdge;
  * @author diewald
  */
 public class PlatformCommunicationGraphEncoding extends PhenotypeBase implements
-		IExplorationEncoding, ComposableGenotype, Cloneable {
+		IExplorationEncoding, Genotype, Cloneable {
 	/** The graph representing the communication structure of a platform. */
 	protected DirectedGraph<IResourceAdapter<?>, DefaultEdge> platformGraph;
 
@@ -76,12 +76,6 @@ public class PlatformCommunicationGraphEncoding extends PhenotypeBase implements
 		return new PlatformCommunicationGraphEncoding(platformGraph);
 	}
 
-	/** {@inheritDoc} */
-	@Override
-	public Class<? extends ComposableGenotype> getGTypeToRegister() {
-		return PlatformCommunicationGraphEncoding.class;
-	}
-
 	/** {@inheritDoc} */
 	@Override
 	public Class<? extends Phenotype> getPTypeToRegister() {
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings
index db66ca2fedaecb7d43f0e3f7c2f522d1e35529ad..baebb4aa6685e26b5ec4c53cd379540070272b24 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/.ratings
@@ -2,8 +2,11 @@ ComposableDecoder.java 0ef247e0e8424968cd8dab8317df0e504c5018d4 RED
 ComposableDecoderBase.java 7c47b41e609b6911128efa469c2dd65122276bcc RED
 CompositeDecoder.java 68864146cbd7b0d1444d4157cf88023deb4a21ea RED
 CompositeDecoderBase.java cc878483ec3dcf3afd60509579c7c17a3433893c RED
+DecodingInterceptModule.java 5268f6418e703245ce16b264ccc19efbb36ae9ee RED
+DecodingPluginInterceptor.java f7e7f9c96507c6a5b8f659993784ac5bfe491579 RED
 Genotyped.java c74c870c570597bdb373308fa339ccf2c8e88942 YELLOW
-GuiceDecoder.java ed4e3e79d95a7f0ab7f0dfdbf602a06af930c432 RED
+GuiceDecoder.java 87c4cc8d429719977dfa4608c67179d2360cbfba RED
 PhenotypeDecoder.java 042d35c9bcba9a2cddc5e82ca5abe6f52438d1c3 RED
+PluginDecoder.java 5982d51cd73da4057e4d3b2ca1d04bfe3ff36855 YELLOW
 ThreadScope.java f3a2b90fdbf0b2aabde4112c94623da5c262952b RED
 ThreadScoped.java a8335b0831586ea6ced17a5e7adf2952b72957d9 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/DecodingInterceptModule.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/DecodingInterceptModule.java
new file mode 100644
index 0000000000000000000000000000000000000000..5268f6418e703245ce16b264ccc19efbb36ae9ee
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/DecodingInterceptModule.java
@@ -0,0 +1,57 @@
+/*-------------------------------------------------------------------------+
+| 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.extensions.compositegene.decode;
+
+import org.aopalliance.intercept.MethodInterceptor;
+import org.fortiss.af3.exploration.alg.dse.module.DecoderModule;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import com.google.inject.Provides;
+import com.google.inject.matcher.Matchers;
+
+/**
+ * {@link Module} that defines the method interceptors of {@link DecoderModule}s. This module must
+ * be installed at the {@link Injector} that creates the concrete {@link DecoderModule}s. Otherwise,
+ * the injection is not known at construction time of the {@link DecoderModule}s and thus method
+ * interception is not operational.
+ * 
+ * @author diewald
+ */
+public class DecodingInterceptModule extends AbstractModule {
+
+	/** Reference to the {@link DecodingPluginInterceptor} handling the method interceptions. */
+	private DecodingPluginInterceptor decodingPluginInterceptor;
+
+	/** Constructor. The given {@link DecodingPluginInterceptor} is installed with the binder. */
+	public DecodingInterceptModule(DecodingPluginInterceptor decodingPluginInterceptor) {
+		this.decodingPluginInterceptor = decodingPluginInterceptor;
+	}
+
+	/** Returns the {@link MethodInterceptor} handling Plugin-capable {@link DecoderModule}s. */
+	@Provides
+	public DecodingPluginInterceptor get() {
+		return decodingPluginInterceptor;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void configure() {
+		bindInterceptor(Matchers.subclassesOf(DecoderModule.class),
+				Matchers.annotatedWith(PluginDecoder.class), decodingPluginInterceptor);
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/DecodingPluginInterceptor.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/DecodingPluginInterceptor.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7e7f9c96507c6a5b8f659993784ac5bfe491579
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/DecodingPluginInterceptor.java
@@ -0,0 +1,103 @@
+/*-------------------------------------------------------------------------+
+| 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.extensions.compositegene.decode;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.List;
+
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+import org.fortiss.af3.exploration.alg.dse.module.DecoderModule;
+
+import com.google.inject.Binding;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import com.google.inject.spi.ElementSource;
+
+/**
+ * This {@link MethodInterceptor} is intended to be used with {@link DecoderModule}s where multiple
+ * ones "produce" the same {@link PhenotypeDecoder}.
+ * It intercepts the decode method call (defined by an annotation) and launches all sub-
+ * {@link DecoderModule}s before executing its own decoding. Sub-{@link DecoderModule}s are not
+ * allowed to interfere with each other.
+ * 
+ * @author diewald
+ */
+public class DecodingPluginInterceptor implements MethodInterceptor {
+
+	/**
+	 * Reference to the {@link Injector} used to execute the decoding. Required to find all
+	 * {@link DecoderModule}s that produce the same type.
+	 */
+	protected Injector decodingInjector;
+
+	/** Sets the {@link Injector} used in the {@link DecodingInterceptModule} phase. */
+	public void setDecodingInjector(Injector decodingInjector) {
+		this.decodingInjector = decodingInjector;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Object invoke(MethodInvocation invocation) throws Throwable {
+		Class<?> returnType = invocation.getMethod().getReturnType();
+		@SuppressWarnings("unchecked") List<Binding<?>> subDecoderBindings =
+				(List<Binding<?>>)(List<?>)decodingInjector.findBindingsByType(TypeLiteral
+						.get(returnType));
+
+		for(Binding<?> decodeBinding : subDecoderBindings) {
+			Provider<?> provider = decodeBinding.getProvider();
+			ElementSource source = (ElementSource)decodeBinding.getSource();
+			Object declaringSource = source.getDeclaringSource();
+			if(!(declaringSource instanceof Method)) {
+				// TODO: Proper error message, modify the exception to take the phenotype instead of
+				// the genotype.
+				System.out.println("Wrong");
+			}
+			Method declaringMethod = (Method)declaringSource;
+			if(!overrides(invocation.getMethod(), declaringMethod)) {
+				provider.get();
+			}
+			System.out.println("Hi");
+		}
+
+		return invocation.proceed();
+	}
+
+	/**
+	 * Returns true if {@code override} overrides {@code base}, assumes that the signatures match.
+	 * Taken from Google Guice.
+	 */
+	private static boolean overrides(Method override, Method base) {
+		// First, check the inheritance hierarchy, then compare the method modifiers and signatures.
+		if(!base.getDeclaringClass().isAssignableFrom(override.getDeclaringClass())) {
+			return false;
+		}
+
+		// See JLS section 8.4.8.1
+		int modifiers = base.getModifiers();
+		if(Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers)) {
+			return true;
+		}
+		if(Modifier.isPrivate(modifiers)) {
+			return false;
+		}
+		// b must be package-private
+		return override.getDeclaringClass().getPackage()
+				.equals(base.getDeclaringClass().getPackage());
+	}
+}
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java
index ed4e3e79d95a7f0ab7f0dfdbf602a06af930c432..87c4cc8d429719977dfa4608c67179d2360cbfba 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/GuiceDecoder.java
@@ -20,7 +20,10 @@ import static org.fortiss.tooling.common.util.LambdaUtils.getFirst;
 import java.util.Collection;
 import java.util.Set;
 
+import org.aopalliance.intercept.MethodInterceptor;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.Opt4JDseTaskProvider;
+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.abstractmapping.AbstractTaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEncoding;
@@ -37,7 +40,6 @@ import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Provides;
-import com.google.inject.name.Named;
 
 /**
  * {@link Decoder} that handles dependencies between {@link Decoder}s, {@link Genotype}s, and
@@ -57,13 +59,19 @@ public class GuiceDecoder extends AbstractModule implements Decoder<Genotype, Ph
 	/** Set of {@link CreatorModule}s provided by the enabled exploration features. */
 	private Collection<DecoderModule<?>> enabledDecoders;
 
-	/** {@link Opt4JTask} provider used to obtain the opt4j injector. */
+	/** {@link Opt4JTask} provider used to obtain the opt4j {@link Injector}. */
 	@Inject
 	protected Opt4JDseTaskProvider opt4JProvider;
 
 	/** Child {@link Injector} for the dependency management of the decode phase. */
 	protected Injector decodingInjector;
 
+	/**
+	 * Holds the {@link MethodInterceptor} that is executed when a decode method capable of
+	 * launching sub-decoders is hit.
+	 */
+	protected DecodingPluginInterceptor decodingInterceptor;
+
 	/** Reference to the input {@link Genotype}. */
 	// @ThreadScoped
 	protected ThreadLocal<CompositeGenotype<Class<? extends Genotype>, ? extends Genotype>> genotype =
@@ -95,9 +103,13 @@ public class GuiceDecoder extends AbstractModule implements Decoder<Genotype, Ph
 		}
 		this.genotype
 				.set((CompositeGenotype<Class<? extends Genotype>, ? extends Genotype>)genotype);
-		// TODO(AD): See configure(): We need a service machenism and user configuration to select
+		// TODO(AD): See configure(): We need a service mechanism and user configuration to select
 		// the desired set of activated decoders.
 		decodingInjector = opt4JProvider.get().get().createChildInjector(this);
+		DecodingPluginInterceptor interceptor =
+				decodingInjector.getInstance(DecodingPluginInterceptor.class);
+		interceptor.setDecodingInjector(decodingInjector);
+
 		// FIXME: Hack to get the correct instance: Is multiprovisioning supported by Guice?
 		Class<? extends Phenotype> resultType = getFirst(resultTypes).get();
 		decodingInjector.getInstance(resultType);
@@ -121,6 +133,7 @@ public class GuiceDecoder extends AbstractModule implements Decoder<Genotype, Ph
 	@Override
 	protected void configure() {
 		// bindScope(ThreadScoped.class, new ThreadScope());
+		install(this);
 
 		for(DecoderModule<?> module : enabledDecoders) {
 			install(module);
@@ -143,12 +156,26 @@ public class GuiceDecoder extends AbstractModule implements Decoder<Genotype, Ph
 		return getGenotype(SafetyFunctionArchEncoding.class);
 	}
 
+	/** Returns the {@link PartitionMappingEncoding} from the {@link CompositeGenotype}. */
+	@Provides
+	@Genotyped
+	public PartitionMappingEncoding getPMEnc() {
+		return getGenotype(PartitionMappingEncoding.class);
+	}
+
+	/** Returns the {@link PlatformCommunicationGraphEncoding} from the {@link CompositeGenotype}. */
+	@Provides
+	@Genotyped
+	public PlatformCommunicationGraphEncoding getPCGEnc() {
+		return getGenotype(PlatformCommunicationGraphEncoding.class);
+	}
+
 	/**
 	 * Returns the {@link AbstractTaskMappingEncoding} sub-{@link Genotype} passed to this decoder.
 	 * (Testing!!!)
 	 */
 	@Provides
-	@Named("Genotyped")
+	@Genotyped
 	public AbstractTaskMappingEncoding getATMEnc() {
 		return getGenotype(AbstractTaskMappingEncoding.class);
 	}
@@ -157,9 +184,8 @@ public class GuiceDecoder extends AbstractModule implements Decoder<Genotype, Ph
 	 * Returns the {@link FailSilentTaskMappingEncoding} sub-{@link Genotype} passed to this
 	 * decoder. (Testing!!!)
 	 */
-	/**  */
 	@Provides
-	@Named("Genotyped")
+	@Genotyped
 	public FailSilentTaskMappingEncoding getITMEnc() {
 		return getGenotype(FailSilentTaskMappingEncoding.class);
 	}
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/PluginDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/PluginDecoder.java
new file mode 100644
index 0000000000000000000000000000000000000000..5982d51cd73da4057e4d3b2ca1d04bfe3ff36855
--- /dev/null
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/decode/PluginDecoder.java
@@ -0,0 +1,36 @@
+/*-------------------------------------------------------------------------+
+| 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.extensions.compositegene.decode;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
+import org.fortiss.af3.exploration.alg.dse.module.DecoderModule;
+
+/**
+ * Denotes a "primary" {@link DecoderModule} that has the capability to launch sub-
+ * {@link DecoderModule}s that return the same {@link Phenotype}.
+ * 
+ * @author diewald
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface PluginDecoder {
+	// Just an annotation...
+}
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/exception/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/exception/.ratings
index afc426e4c2d40e2f1935f6d87a36a4383ecc6412..c6441792994aa5995cf0fce4b148b2d9844bfdf7 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/exception/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/exception/.ratings
@@ -1,4 +1,4 @@
 DecodingException.java 40bb717fbcdfbceabbc0b7610d6c5bb85ec78cc1 YELLOW
-DecodingRuntimeException.java b464b624cd1b387210206c53e63c4b367705bde7 YELLOW
+DecodingRuntimeException.java 8d7371f307c947c6e65b6dab45ec64b86c89ff47 YELLOW
 DependencyException.java b5ebab9ef715091cfe6d998c0acc70658a8e5536 RED
 MissingDependencyException.java 474cd48820802b026a7109abb2ae56a2ab8eb7b3 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/exception/DecodingRuntimeException.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/exception/DecodingRuntimeException.java
index b464b624cd1b387210206c53e63c4b367705bde7..8d7371f307c947c6e65b6dab45ec64b86c89ff47 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/exception/DecodingRuntimeException.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/extensions/compositegene/exception/DecodingRuntimeException.java
@@ -16,6 +16,7 @@
 package org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.exception;
 
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.ComposableDecoder;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
 import org.fortiss.af3.exploration.alg.exception.ExplorationRuntimeException;
 import org.opt4j.core.Genotype;
 import org.opt4j.core.problem.Decoder;
@@ -26,6 +27,19 @@ import org.opt4j.core.problem.Decoder;
  * @author diewald
  */
 public class DecodingRuntimeException extends ExplorationRuntimeException {
+	/** Constructor specialized for decoding errors. */
+	public DecodingRuntimeException(Phenotype phenotype, Decoder<?, ?> decoder) {
+		super("Decoding Error: The Decoder " + decoder.getClass().getSimpleName() +
+				" failed to create the phenotype " + phenotype.getClass().getSimpleName() + ".");
+	}
+
+	/** Constructor specialized for decoding errors. Takes an additional message. */
+	public DecodingRuntimeException(Phenotype phenotype, Decoder<?, ?> decoder, String msg) {
+		super("Decoding Error: The Decoder " + decoder.getClass().getSimpleName() +
+				" failed to create the phenotype " + phenotype.getClass().getSimpleName() + ". " +
+				msg);
+	}
+
 	/** Constructor specialized for decoding errors. */
 	public DecodingRuntimeException(Genotype genotype, Decoder<?, ?> decoder) {
 		super("Decoding Error: Could not decode " + genotype + " using the decoder " + decoder +
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/.ratings
index d64fb46b18a29f41ffeff4e72d451a5907ad2abd..de2d270e636e07f634bfb507fd2a66ec10c16d72 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/.ratings
@@ -1,2 +1,2 @@
 CopyPlatformCommunicationGraph.java 940b8a0b104f8ee9809c53fa8d364cd3c892854d RED
-CopyPlatformCommunicationGraphModule.java ff27643cf25d732fd46106847a544d5a0bc4a39e RED
+CopyPlatformCommunicationGraphModule.java daec92401c363c42f28e19c32d53627b4869e6c3 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java
index ff27643cf25d732fd46106847a544d5a0bc4a39e..daec92401c363c42f28e19c32d53627b4869e6c3 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/operator/copy/platform/CopyPlatformCommunicationGraphModule.java
@@ -28,5 +28,4 @@ public class CopyPlatformCommunicationGraphModule extends CopyModule {
 	protected void config() {
 		addOperator(CopyPlatformCommunicationGraph.class);
 	}
-
 }
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings
index 2219771a712bf1c6483769e4016ad115ad5d7fd3..fac6809477d9df10290b6ddaf9e1c9bb2a848e33 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/.ratings
@@ -1,7 +1,7 @@
 ArchitectureDecoder.java d067dc995e0895860d98d717647c0f7b061f5908 RED
 DseProblemModuleBase.java bfe6dadc48386308ccbf40dbb0da18f74e43a986 RED
-DseProcessProblemModule.java c7f76c9926e6d49c058fe550ac8d0b31bd6b4d30 RED
+DseProcessProblemModule.java b61c20547b1a7eb904f511e9a978374f8e908628 RED
 EvaluatorWrapper.java 3747e5b78b1dcef8e1595c1ae9354e8ef2738e79 RED
 ExplorationGoalPriorityMultiEvaluator.java 1f6d2aa6ece8acdf4f57face0439f3429ab87329 RED
 ProblemModuleBase.java 460f7a8a07435eb13634caa9072e425bdf20e399 RED
-StrictTTDecoder.java d55ece0076bec24d74fd18dae3e33aaa9d2ac854 RED
+StrictTTDecoder.java 3155f514cdf8f341e17e4d188fcb6ec6956e705c RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/DseProcessProblemModule.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/DseProcessProblemModule.java
index c7f76c9926e6d49c058fe550ac8d0b31bd6b4d30..b61c20547b1a7eb904f511e9a978374f8e908628 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/DseProcessProblemModule.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/DseProcessProblemModule.java
@@ -22,8 +22,14 @@ import static org.fortiss.af3.exploration.alg.util.ExplorationAlgUtils.rethrow;
 import java.util.Collection;
 import java.util.Set;
 
+import org.aopalliance.intercept.MethodInterceptor;
 import org.fortiss.af3.exploration.alg.dse.DSEFactory;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.ArchitectureExplorationEncoding;
+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.abstractmapping.AbstractTaskMappingEncoding;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.create.GuiceCreator;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.GuiceDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.graph.GenotypeFinder;
@@ -40,6 +46,7 @@ import org.opt4j.core.problem.Creator;
 import org.opt4j.core.problem.Decoder;
 import org.opt4j.core.problem.Evaluator;
 
+import com.google.common.collect.Sets;
 import com.google.inject.Injector;
 
 /**
@@ -95,11 +102,10 @@ public class DseProcessProblemModule
 		// bindProblem(dseFactory.createArchitectureExplorationCreator(),
 		// dseFactory.createArchitectureDecoder(execDepGraph), archEvaluator);
 
-		GuiceDecoder guiceDecoder = new GuiceDecoder(requestedSolutions, enabledDecoders);
-
+		GuiceDecoder guiceDecoder = createGuiceDecoder(enabledDecoders);
 		Set<Class<? extends Genotype>> requiredGenotypes = findRequiredGenotypes(guiceDecoder);
-		bindProblem(new GuiceCreator(requiredGenotypes, enabledCreators), new GuiceDecoder(
-				requestedSolutions, enabledDecoders), archEvaluator);
+		bindProblem(new GuiceCreator(requiredGenotypes, enabledCreators), guiceDecoder,
+				archEvaluator);
 
 		// Create/Bind the subproblems of the architectural exploration problem.
 		try {
@@ -118,6 +124,24 @@ public class DseProcessProblemModule
 		}
 	}
 
+	/**
+	 * Creates a {@link GuiceDecoder}, prepares all {@link DecoderModule}s, and defines the
+	 * {@link MethodInterceptor} for plugin-type {@link DecoderModule}s.
+	 * 
+	 * @param enabledDecoders
+	 *            Set of {@link DecoderModule}s configure for this DSE execution.
+	 * @return The created/configured {@link GuiceDecoder}.
+	 */
+	private GuiceDecoder createGuiceDecoder(Collection<DecoderModule<?>> enabledDecoders) {
+		Collection<DecoderModule<?>> injectedDecoders = Sets.newHashSet();
+		for(DecoderModule<?> decoderModule : enabledDecoders) {
+			DecoderModule<?> currInjectedDecoderModule =
+					dseInjector.getInstance(decoderModule.getClass());
+			injectedDecoders.add(currInjectedDecoderModule);
+		}
+		return new GuiceDecoder(requestedSolutions, injectedDecoders);
+	}
+
 	/**
 	 * Returns the collection of {@link Genotype}s that are required as inputs to decoders to obtain
 	 * the requested {@link Phenotype}.
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java
index d55ece0076bec24d74fd18dae3e33aaa9d2ac854..3155f514cdf8f341e17e4d188fcb6ec6956e705c 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/StrictTTDecoder.java
@@ -24,6 +24,7 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.in
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEntry;
 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.decode.Genotyped;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.solution.StrictTTSchedule;
 import org.fortiss.af3.exploration.alg.dse.module.DecoderModule;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.FailSilentExecModelFactory;
@@ -31,6 +32,7 @@ import org.fortiss.af3.exploration.alg.dse.sysmodel.sched.comm.TDMABusScheduler;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.sched.proc.EDFSchedulerBase;
 import org.opt4j.core.Genotype;
 
+import com.google.inject.Inject;
 import com.google.inject.Provides;
 
 /**
@@ -51,6 +53,7 @@ public class StrictTTDecoder<S extends InstantiatedTaskMappingEntry, T extends I
 	 * run.
 	 */
 	@SuppressWarnings("unchecked")
+	@Inject
 	public StrictTTDecoder() {
 		// FIXME: HACK to create the FailSilentTaskMappingFactory. Support for FaultDetection will
 		// be added again after switching to DI mechanisms completely.
@@ -60,16 +63,35 @@ public class StrictTTDecoder<S extends InstantiatedTaskMappingEntry, T extends I
 		simpleBusScheduler = new TDMABusScheduler<S, T>();
 	}
 
+	/**
+	 * Performs the actual decoding triggered by calling
+	 * {@link #decode(FailSilentTaskMappingEncoding, MessageEncoding, InstantiatedAcyclicTaskGraphEncoding, PlatformCommunicationGraphEncoding, PartitionMappingEncoding)}
+	 * . This method is used since Guice doesn't allow bindings to undefined generics.
+	 */
+	// FIXME: Dirty casts: Remove the generics?
 	@Provides
-	public StrictTTSchedule<FailSilentTaskMappingEntry, FailSilentTaskMappingEncoding> decode(
-			FailSilentTaskMappingEncoding itmEnc,
+	public StrictTTSchedule decode(FailSilentTaskMappingEncoding itmEnc,
 			MessageEncoding<FailSilentTaskMappingEntry, FailSilentTaskMappingEncoding> msgEnc,
 			InstantiatedAcyclicTaskGraphEncoding<FailSilentTaskMappingEntry> acycItgEnc,
-			PlatformCommunicationGraphEncoding pcgEncoding, PartitionMappingEncoding partEnc) {
-		return decode(itmEnc, msgEnc, acycItgEnc, pcgEncoding, partEnc);
+			PlatformCommunicationGraphEncoding pcgEncoding,
+			@Genotyped PartitionMappingEncoding partEnc) {
+		// TODO: Externalize the validation such that the encoding is not required to be passed to
+		// the constructor (is there for validation purposes)
+		StrictTTSchedule<S, T> schedule = new StrictTTSchedule<S, T>((T)itmEnc);
+		simpleEDFScheduler.schedule((InstantiatedAcyclicTaskGraphEncoding<S>)acycItgEnc, partEnc,
+				(T)itmEnc, schedule);
+		assert (schedule.validateSchedule(true));
+
+		// TODO: Find out why the message scheduler does not require the task graph. Actually, it
+		// should require it...
+		simpleBusScheduler.schedule(schedule, msgEnc.getPeriodicMessages(),
+				(InstantiatedAcyclicTaskGraphEncoding<S>)acycItgEnc, pcgEncoding);
+		assert (schedule.validateSchedule(true));
+
+		return schedule;
 	}
 
-	public StrictTTSchedule<S, T> decode(T itmEnc, MessageEncoding<S, T> msgEnc,
+	public StrictTTSchedule<S, T> decodeInternal(T itmEnc, MessageEncoding<S, T> msgEnc,
 			InstantiatedAcyclicTaskGraphEncoding<S> acycItgEnc,
 			PlatformCommunicationGraphEncoding pcgEncoding, PartitionMappingEncoding partEnc) {
 		// TODO: Externalize the validation such that the encoding is not required to be passed to
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/.ratings
index 96d2ad9c606a2e76a3c187d3a2aa49af55d5fa47..33b62ab420e194020a721bab3f527ebf62b0b0c4 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/.ratings
@@ -1 +1 @@
-MessageDecoder.java 5faf743c30edc661d4f9c4b39483c34a5148a8a9 RED
+MessageDecoder.java 50fab8c29ccec8a4f9d5149ecc2ee59c562737f5 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java
index 5faf743c30edc661d4f9c4b39483c34a5148a8a9..50fab8c29ccec8a4f9d5149ecc2ee59c562737f5 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/comm/MessageDecoder.java
@@ -22,6 +22,7 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.comm.MessageEn
 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.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.TaskMappingEntry;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEncoding;
@@ -30,6 +31,7 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.in
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.ComposableDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.exception.DecodingException;
 import org.fortiss.af3.exploration.alg.dse.module.DecoderModule;
+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.ITaskAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.comm.Message;
@@ -67,14 +69,38 @@ public class MessageDecoder<S extends TaskMappingEntry<ITaskAdapter<?>, Partitio
 		messageRouter = new MessageRouter();
 	}
 
+	/**
+	 * Produces a {@link MessageEncoding} that contains the multicast messages that are required to
+	 * exchange signals between {@link IExecutionUnitAdapter}s. For each signal that is exchanged
+	 * between two tasks or more (only one sender) that are located on different
+	 * {@link IExecutionUnitAdapter}s, a {@link Message} is generated.
+	 * 
+	 * @param tmEnc
+	 *            {@link TaskMappingEncoding} defining the "location" of {@link ITaskAdapter}s.
+	 * @param pcgEnc
+	 *            Graph of the platform defining potential routes for {@link Message}s.
+	 * @param atgEnc
+	 *            {@link TaskGraphEncoding} containing the signals exchanged between
+	 *            {@link ITaskAdapter}s.
+	 * @return {@link MessageEncoding} that contains the multicast messages that are required to
+	 *         exchange signals between {@link IExecutionUnitAdapter}s
+	 * @throws DecodingException
+	 */
+	@SuppressWarnings("unchecked")
 	@Provides
 	public MessageEncoding<FailSilentTaskMappingEntry, FailSilentTaskMappingEncoding> decode(
 			FailSilentTaskMappingEncoding tmEnc, PlatformCommunicationGraphEncoding pcgEnc,
 			AbstractTaskGraphEncoding atgEnc) throws DecodingException {
-		return decode(tmEnc, pcgEnc, atgEnc);
+		return (MessageEncoding<FailSilentTaskMappingEntry, FailSilentTaskMappingEncoding>)decodeInternal(
+				(T)tmEnc, pcgEnc, atgEnc);
 	}
 
-	public MessageEncoding<S, T> decode(T tmEnc, PlatformCommunicationGraphEncoding pcgEnc,
+	/**
+	 * Performs the actual decoding triggered by calling
+	 * {@link #decode(FailSilentTaskMappingEncoding, PlatformCommunicationGraphEncoding, AbstractTaskGraphEncoding)}
+	 * . This method is used since Guice doesn't allow bindings to undefined generics.
+	 */
+	public MessageEncoding<S, T> decodeInternal(T tmEnc, PlatformCommunicationGraphEncoding pcgEnc,
 			AbstractTaskGraphEncoding atgEnc) throws DecodingException {
 		Collection<Message> generatedMessages = messageGenerator.generateMessages(tmEnc, atgEnc);
 		Map<Message, DirectedGraph<IResourceAdapter<?>, DefaultEdge>> messageRouteMap =
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/.ratings
index 71055902a70cd2d2ef0b8db007fb54b0aaaca701..5d5d4374cdf0b15236672155b06b30e19b69c8e6 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/.ratings
@@ -1,2 +1,2 @@
-InstantiatedTaskMappingDecoder.java 4738a0c2a31312add96f9ee9425be841038885d9 RED
+InstantiatedTaskMappingDecoder.java 8e4e3abe4d231a6afe561e7823b8264899a3226a RED
 InstantiatedTaskMappingDecoderAcyclic.java 5a6462fcf57680abe11163e5838aea4c84e03b88 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java
index 4738a0c2a31312add96f9ee9425be841038885d9..8e4e3abe4d231a6afe561e7823b8264899a3226a 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/instantiatetaskgraph/InstantiatedTaskMappingDecoder.java
@@ -25,6 +25,8 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.safetyfunction
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.safetyfunctionarch.SafetyFunctionArchEntry;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.AbstractTaskGraphEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskgraph.InstantiatedTaskGraphEncoding;
+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.instantiatedmapping.FailSilentTaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEntry;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.InstantiatedTaskMappingEncoding;
@@ -50,16 +52,38 @@ import com.google.inject.Provides;
 public class InstantiatedTaskMappingDecoder<T extends InstantiatedTaskMappingEntry> extends
 		DecoderModule<InstantiatedTaskGraphEncoding<T>> {
 
+	/**
+	 * Decodes a {@link FailSilentTaskMappingEncoding} into an {@link InstantiatedTaskGraphEncoding}
+	 * that is a {@link TaskGraphEncoding} which contains only {@link ITaskAdapter}s backed by an
+	 * implementation.
+	 * 
+	 * @param itmEnc
+	 *            {@link TaskMappingEncoding} with {@link ITaskAdapter}s backed by an
+	 *            implementation.
+	 * @param atgEnc
+	 *            {@link TaskGraphEncoding} with potentially "abstract" {@link ITaskAdapter}s.
+	 * @param sfEnc
+	 * @return {@link TaskGraphEncoding} which contains only {@link ITaskAdapter}s backed by an
+	 *         implementation
+	 * @throws DecodingException
+	 */
+	@SuppressWarnings("unchecked")
 	@Provides
 	public InstantiatedTaskGraphEncoding<FailSilentTaskMappingEntry> decode(
 			FailSilentTaskMappingEncoding itmEnc, AbstractTaskGraphEncoding atgEnc,
 			SafetyFunctionArchEncoding sfEnc) throws DecodingException {
-		return decode(itmEnc, atgEnc, sfEnc);
+		return (InstantiatedTaskGraphEncoding<FailSilentTaskMappingEntry>)decodeInternal(
+				(InstantiatedTaskMappingEncoding<T>)itmEnc, atgEnc, sfEnc);
 	}
 
-	public InstantiatedTaskGraphEncoding<T> decode(InstantiatedTaskMappingEncoding<T> itmEnc,
-			AbstractTaskGraphEncoding atgEnc, SafetyFunctionArchEncoding sfEnc)
-			throws DecodingException {
+	/**
+	 * Performs the actual decoding triggered by calling
+	 * {@link #decode(FailSilentTaskMappingEncoding, AbstractTaskGraphEncoding, SafetyFunctionArchEncoding)}
+	 * . This method is used since Guice doesn't allow bindings to undefined generics.
+	 */
+	public InstantiatedTaskGraphEncoding<T> decodeInternal(
+			InstantiatedTaskMappingEncoding<T> itmEnc, AbstractTaskGraphEncoding atgEnc,
+			SafetyFunctionArchEncoding sfEnc) throws DecodingException {
 		Collection<TaskGraph> tgColl = atgEnc.getTaskGraphs();
 		TaskGraphInstantiator<TaskGraph> tgInstatiator =
 				new TaskGraphInstantiator<>(tgColl, itmEnc);
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/.ratings
index cf38bc17c2e296902320ab33e46af896cf44f537..fd7bbb4f5f8abc330dfa0f3ba01286e89bc5288e 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/.ratings
@@ -1 +1 @@
-PartitionMappingDecoderGraph.java 7e1578be1cd243b11994085d599310ba669ba263 RED
+PartitionMappingDecoderGraph.java dd454f451bcd1de4cda93dfd82f6f0400c9a19ca RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java
index 7e1578be1cd243b11994085d599310ba669ba263..dd454f451bcd1de4cda93dfd82f6f0400c9a19ca 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/partitionmapping/PartitionMappingDecoderGraph.java
@@ -21,6 +21,7 @@ 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.Genotyped;
 import org.fortiss.af3.exploration.alg.dse.module.DecoderModule;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ICommunicationResourceAdapter;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.IResourceAdapter;
@@ -28,7 +29,6 @@ import org.fortiss.tooling.common.util.LambdaUtils;
 import org.jgrapht.Graphs;
 import org.jgrapht.graph.DefaultEdge;
 import org.opt4j.core.Genotype;
-import org.opt4j.core.genotype.CompositeGenotype;
 
 import com.google.inject.Provides;
 
@@ -41,15 +41,10 @@ import com.google.inject.Provides;
 // TODO: DecodeUpdate: We may consider moving the decode method to the creator.
 public class PartitionMappingDecoderGraph extends DecoderModule<PlatformCommunicationGraphEncoding> {
 
-	@Provides
-	PartitionMappingEncoding getPmEnc(
-			CompositeGenotype<Class<? extends Genotype>, ? extends Genotype> compGene) {
-		return compGene.get(PartitionMappingEncoding.class);
-	}
-
 	@Provides
 	public PlatformCommunicationGraphEncoding decodeComposable(
-			PlatformCommunicationGraphEncoding pcmEnc, PartitionMappingEncoding pmEnc) {
+			@Genotyped PlatformCommunicationGraphEncoding pcmEnc,
+			@Genotyped PartitionMappingEncoding pmEnc) {
 		for(IResourceAdapter<?> execUnit : pcmEnc.getActualGraph().vertexSet()) {
 			for(IResourceAdapter<?> partition : pmEnc.getRequesters(execUnit)) {
 				pcmEnc.getActualGraph().addVertex(partition);
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings
index 8ad342ed64a92c2185c612d9f7800dd71012757b..836dcad87cf93b348568499185e1ef092f4d0e19 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/.ratings
@@ -1,3 +1,3 @@
 SFGraphDecoder.java 0b42b83465213eb13ae59765f6bf53c1c8bd3b66 RED
 SFMappingConstraintDecoder.java 01e8f450a78ffff9572a7f203b3699cff507e99f RED
-SFMappingDecoder.java 689365b0718847258decd9f20f3cca5b0ff3c6e3 RED
+SFMappingDecoder.java 31a49d3d9bb3fb878c1af24d3da595a662f82512 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java
index 689365b0718847258decd9f20f3cca5b0ff3c6e3..31a49d3d9bb3fb878c1af24d3da595a662f82512 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/safetyfunction/SFMappingDecoder.java
@@ -29,6 +29,7 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.safetyfunction
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.safetyfunctionarch.SafetyFunctionArchEntry;
 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.Genotyped;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.exception.DecodingException;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.decode.ConstraintGenerationDecoder;
 import org.fortiss.af3.exploration.alg.dse.module.DecoderModule;
@@ -48,13 +49,6 @@ import com.google.inject.name.Named;
 public class SFMappingDecoder<C> extends DecoderModule<AbstractTaskMappingEncoding> implements
 		ConstraintGenerationDecoder {
 
-	/** {@inheritDoc} */
-	@Override
-	protected void configure() {
-		// TODO: Check whether overriding is a reasonable approach to interchange decoders.
-		// Modules.override(AbstractTaskMappingIdentityDecoder()).
-	}
-
 	/** {@inheritDoc} */
 	@Override
 	public AbstractTaskMappingEncoding decode(Genotype genotype) {
@@ -76,8 +70,9 @@ public class SFMappingDecoder<C> extends DecoderModule<AbstractTaskMappingEncodi
 	 *             if the creation of some mapping entry fails.
 	 */
 	@Provides
+	@Named("SFMappingDecoder")
 	public AbstractTaskMappingEncoding decode(SafetyFunctionArchEncoding sfaEnc,
-			@Named("Genotyped") AbstractTaskMappingEncoding atmEnc) throws DecodingException {
+			@Genotyped AbstractTaskMappingEncoding atmEnc) throws DecodingException {
 
 		// TODO: replace with a dynamic mechanism for the retrieval of deployable components.
 		for(SafetyFunctionArchEntry sFAEntry : sfaEnc.getAllEntries()) {
@@ -85,10 +80,10 @@ public class SFMappingDecoder<C> extends DecoderModule<AbstractTaskMappingEncodi
 			int channelNumber = sFAEntry.getNumChannels();
 
 			// TODO: Encapsulate in the encoding / adapter --> Raw cast.
-			Collection<ITaskAdapter<?>> sfComps =
+			@SuppressWarnings("unchecked") Collection<ITaskAdapter<?>> sfComps =
 					(Collection<ITaskAdapter<?>>)(Collection<?>)sFAEntry.getSafetyFunctionAdapter()
 							.getRealizingComponents();
-			Collection<ITaskAdapter<?>> diagComps =
+			@SuppressWarnings("unchecked") Collection<ITaskAdapter<?>> diagComps =
 					(Collection<ITaskAdapter<?>>)(Collection<?>)sFAEntry.getSafetyFunctionAdapter()
 							.getDiagnosticComponents();
 			ITaskAdapter<?> outComponent = sFAEntry.getSafetyFunctionAdapter().getOutputComponent();
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/.ratings
index 8ba618a6fbf94673f7728db83453674bb8844b21..dd544c5cc594e83035dd71b3914c7daa432e9874 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/.ratings
@@ -1,2 +1,2 @@
-AbstractTaskMappingIdentityDecoder.java 88806dc773c1f8c5fdc899b119bd99d06087e835 RED
+AbstractTaskMappingIdentityDecoder.java 83ca90087f0cfef31466b9a6486730e408599b54 YELLOW
 TaskMappingDecoderBase.java 38993e58fbb58bb577827079cacf04d487670713 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java
index 88806dc773c1f8c5fdc899b119bd99d06087e835..83ca90087f0cfef31466b9a6486730e408599b54 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/AbstractTaskMappingIdentityDecoder.java
@@ -19,10 +19,13 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.partitionmappi
 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.Genotyped;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.PluginDecoder;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.phenotype.Phenotype;
 import org.opt4j.core.Genotype;
 
 import com.google.inject.Provides;
+import com.google.inject.Singleton;
 
 /**
  * Provides a {@link AbstractTaskMappingEncoding} to the set of {@link Phenotype} types.
@@ -33,13 +36,18 @@ import com.google.inject.Provides;
 // 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).
+@Singleton
 public class AbstractTaskMappingIdentityDecoder extends
 		TaskMappingDecoderBase<AbstractTaskMappingEntry, AbstractTaskMappingEncoding> {
 
-	// FIXME: Update the mapping. --> Provides
+	/**
+	 * Decodes/Updates the given {@link AbstractTaskMappingEncoding} with the number of additional
+	 * resources of an update {@link PartitionMappingEncoding}.
+	 */
 	@Provides
-	public AbstractTaskMappingEncoding decode(AbstractTaskMappingEncoding atmEnc,
-			PartitionMappingEncoding partEnc) {
+	@PluginDecoder
+	public AbstractTaskMappingEncoding decode(@Genotyped AbstractTaskMappingEncoding atmEnc,
+			@Genotyped PartitionMappingEncoding partEnc) {
 		return alignWithResourceModifications(atmEnc, partEnc);
 	}
 
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings
index 68dd117fb9ff9d15bf0b66dc12da9ab766263cb0..121356adfe767ba0c01bc1ff107dc579288d1100 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/.ratings
@@ -1,3 +1,3 @@
-FailSilentAbstractTaskMappingDecoder.java 4ef8ebd557e31ad61fa0e90df06434c98e121452 RED
+FailSilentAbstractTaskMappingDecoder.java 04081bd9e41ae6ecfb6c308165574bd6f273f87c RED
 FaultDetectionVotingAbstractTaskMappingDecoder.java fe6777288a89b1ca3e5eaf842653fbc768016a08 RED
 TaskInstanceResourceAlignmentDecoder.java 8567290ebc74927263f5265f44d7acdcbf99797f RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java
index 4ef8ebd557e31ad61fa0e90df06434c98e121452..04081bd9e41ae6ecfb6c308165574bd6f273f87c 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/backend/opt4j/problem/taskmapping/instantiate/FailSilentAbstractTaskMappingDecoder.java
@@ -24,12 +24,12 @@ import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.ab
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.abstractmapping.AbstractTaskMappingEntry;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.taskmapping.instantiatedmapping.FailSilentTaskMappingEntry;
+import org.fortiss.af3.exploration.alg.dse.backend.opt4j.extensions.compositegene.decode.Genotyped;
 import org.fortiss.af3.exploration.alg.dse.module.DecoderModule;
 import org.fortiss.af3.exploration.alg.dse.sysmodel.arch.ITaskAdapter;
 import org.opt4j.core.Genotype;
 
 import com.google.inject.Provides;
-import com.google.inject.name.Named;
 
 /**
  * Decoder for instantiating an {@link AbstractTaskMappingEncoding} to a
@@ -56,7 +56,7 @@ public class FailSilentAbstractTaskMappingDecoder extends
 	 */
 	@Provides
 	public FailSilentTaskMappingEncoding decode(AbstractTaskMappingEncoding atmEnc,
-			@Named("Genotyped") FailSilentTaskMappingEncoding fstmEnc) {
+			@Genotyped FailSilentTaskMappingEncoding fstmEnc) {
 		fstmEnc.replaceConstraints(atmEnc.getConstraints());
 
 		for(ITaskAdapter<?> comp : atmEnc.getRequesters()) {
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/.ratings
index 8b4bf19dab38a0a0769bccb46907eb533cd2c3ad..32fe2421a9d7f05d15e2c80d0d5c4de05093993e 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/.ratings
@@ -1,17 +1,17 @@
-ICommunicationResourceAdapter.java 05fba6a2c158545f28393eb4c845b2ace86eb99d RED
-IComponentAdapter.java 2dfb64428d4edc278e6b5f7c3f21e44d07196917 RED
-IExecutionUnitAdapter.java a73348f4bff9a9c8f4a3f0e60177490e2e228388 RED
-IGatewayUnitAdapter.java dcf6aa0afcb20d3035b3034e2183c5dfc867e9b9 RED
-ILogicalArchitectureAdapter.java 2dea1c829c1542ffa788b669ae979854ae7e8480 RED
-IMemoryUnitAdapter.java c4093302720e21dec978479051184c842f1061d4 RED
-IModelElementAdapter.java a7620a897eb9ebfdcaf869ebb25e112d900b5622 RED
-IPlatformArchitectureAdapter.java 399d3cdff468c5ac95ca4cf6f17caabdeb2fef16 RED
-IRequestAdapter.java d9298837caf9e15971471aae0bb567e416e82a41 RED
-IResourceAdapter.java 4d41218b96f25daedad66098250baf622a3f89b3 RED
-IResourceConnectionAdapter.java 67d0a7f54de3e3fe21532fc33f6b853eb844b993 RED
-ISafetyFunctionAdapter.java 6a16258729ba9dff91c35285d18bc06cc99a713a RED
-ISignalAdapter.java 2bdb578564cf1d3351c99811c9090e2e9bd70715 RED
-ITaskAdapter.java 0f8c8699bb48e609211713aef6a7e1e82a00c963 RED
-ITransmissionUnitAdapter.java 217aca158641261dc8035805f341fe4c4c527a36 RED
-InternalComponentParameters.java cd5eea4ddf104c4cb3c4521d3256566812876027 RED
-SystemModelAdapter.java 2927e62f6642b78e9caf6bb61f8b0d39f93f7e87 RED
+ICommunicationResourceAdapter.java 05fba6a2c158545f28393eb4c845b2ace86eb99d RED
+IComponentAdapter.java 2dfb64428d4edc278e6b5f7c3f21e44d07196917 RED
+IExecutionUnitAdapter.java a73348f4bff9a9c8f4a3f0e60177490e2e228388 RED
+IGatewayUnitAdapter.java dcf6aa0afcb20d3035b3034e2183c5dfc867e9b9 RED
+ILogicalArchitectureAdapter.java 2dea1c829c1542ffa788b669ae979854ae7e8480 RED
+IMemoryUnitAdapter.java c4093302720e21dec978479051184c842f1061d4 RED
+IModelElementAdapter.java a7620a897eb9ebfdcaf869ebb25e112d900b5622 RED
+IPlatformArchitectureAdapter.java 399d3cdff468c5ac95ca4cf6f17caabdeb2fef16 RED
+IRequestAdapter.java d9298837caf9e15971471aae0bb567e416e82a41 RED
+IResourceAdapter.java 4d41218b96f25daedad66098250baf622a3f89b3 RED
+IResourceConnectionAdapter.java 67d0a7f54de3e3fe21532fc33f6b853eb844b993 RED
+ISafetyFunctionAdapter.java 6a16258729ba9dff91c35285d18bc06cc99a713a RED
+ISignalAdapter.java 2bdb578564cf1d3351c99811c9090e2e9bd70715 RED
+ITaskAdapter.java 0f8c8699bb48e609211713aef6a7e1e82a00c963 RED
+ITransmissionUnitAdapter.java 217aca158641261dc8035805f341fe4c4c527a36 RED
+InternalComponentParameters.java cd5eea4ddf104c4cb3c4521d3256566812876027 RED
+SystemModelAdapter.java 9811b12c26aa21dff3cd0e6e2b99b777153ccaf1 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java
index 2927e62f6642b78e9caf6bb61f8b0d39f93f7e87..9811b12c26aa21dff3cd0e6e2b99b777153ccaf1 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/dse/sysmodel/arch/SystemModelAdapter.java
@@ -500,21 +500,24 @@ public class SystemModelAdapter<C, E, SO, SI, G, TR, M> extends AbstractModule {
 	}
 
 	/** Returns the {@link IMemoryUnitAdapter} present in the target platform. */
+	@SuppressWarnings("unchecked")
 	@Provides
-	public Collection<IMemoryUnitAdapter<M>> getMemoryUnits() {
-		return memoryUnits;
+	public Collection<IMemoryUnitAdapter<?>> getMemoryUnits() {
+		return (Collection<IMemoryUnitAdapter<?>>)(Collection<?>)memoryUnits;
 	}
 
 	/** Returns the gateway units present in the platform. */
+	@SuppressWarnings("unchecked")
 	@Provides
-	public Collection<IGatewayUnitAdapter<G>> getGatewayUnits() {
-		return gatewayUnits;
+	public Collection<IGatewayUnitAdapter<?>> getGatewayUnits() {
+		return (Collection<IGatewayUnitAdapter<?>>)(Collection<?>)gatewayUnits;
 	}
 
 	/** Returns the systems TDMA arbitrated transmission unit */
+	@SuppressWarnings("unchecked")
 	@Provides
-	public Collection<ITransmissionUnitAdapter<TR>> getTransmissionUnits() {
-		return transmissionUnits;
+	public Collection<ITransmissionUnitAdapter<?>> getTransmissionUnits() {
+		return (Collection<ITransmissionUnitAdapter<?>>)(Collection<?>)transmissionUnits;
 	}
 
 	/** Returns all the {@link IResourceAdapter}s present in the platform. */
@@ -531,6 +534,12 @@ public class SystemModelAdapter<C, E, SO, SI, G, TR, M> extends AbstractModule {
 		return virtualResourceToHardwareResourceMap.get(virtualResource);
 	}
 
+	/** Returns the present connections between platform resources. */
+	@Provides
+	public Collection<IResourceConnectionAdapter> getResouceConnections() {
+		return platformConnections;
+	}
+
 	/**
 	 * Returns the {@link ISafetyFunctionAdapter}s constructed from the safety functions that are
 	 * present in the input models.
@@ -807,9 +816,4 @@ public class SystemModelAdapter<C, E, SO, SI, G, TR, M> extends AbstractModule {
 	public Class<? extends IPlatformResource> getFaultContainmentRegion() {
 		return faultContainmentRegion;
 	}
-
-	/** Returns the present connections between platform resources. */
-	public Collection<IResourceConnectionAdapter> getResouceConnections() {
-		return platformConnections;
-	}
 }
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/.ratings b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/.ratings
index a32aa1c150ba06dd1fdba0d8b1b4ef4af90cba05..6871291acdfaa97697adae42c40ed0e6d09e5884 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/.ratings
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/.ratings
@@ -1,7 +1,7 @@
 DesignDiversityExploration.java 7769f449def9cc3cb147da5e1991074bc2669c8a RED
 ExplorationFeature.java 9e077fed7f0485f1ccaa2b5b4d0407161ec787ca YELLOW
 IExplorationFeature.java f0057888990fb5c35e7e97c5d74b7f22d09eabe9 YELLOW
-PartitionArchitectureExploration.java 61ea586e3acade91d3c9cc0d37a349e0bb26b3af YELLOW
+PartitionArchitectureExploration.java fb35b60297bcaacb7c6677e5febef99d6c2a9615 RED
 SafetyArchitectureExploration.java 89a5c8c5e42c8c55857699ba7d2503e6342cd401 RED
 TTScheduleExploration.java 9d7e6b4eea4030881006fa85f0be4cb584383b09 RED
 TaskMappingExploration.java a548b4757ad6560c3ae640f956910f83fd77b1e1 RED
diff --git a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/PartitionArchitectureExploration.java b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/PartitionArchitectureExploration.java
index 61ea586e3acade91d3c9cc0d37a349e0bb26b3af..fb35b60297bcaacb7c6677e5febef99d6c2a9615 100644
--- a/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/PartitionArchitectureExploration.java
+++ b/org.fortiss.af3.exploration.alg/src/org/fortiss/af3/exploration/alg/feature/PartitionArchitectureExploration.java
@@ -16,9 +16,11 @@
 package org.fortiss.af3.exploration.alg.feature;
 
 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.encoding.partitionmapping.PartitionMappingEncoding;
 import org.fortiss.af3.exploration.alg.dse.backend.opt4j.encoding.platform.PlatformCommunicationGraphEncoding;
 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.problem.partitionmapping.PartitionMappingDecoderGraph;
 
 /**
@@ -33,6 +35,8 @@ public class PartitionArchitectureExploration extends ExplorationFeature {
 
 		addVariable(PartitionMappingEncoding.class, new PartitionMappingCreator(),
 				new PartitionMappingModule());
+		addVariable(PlatformCommunicationGraphEncoding.class,
+				new PlatformCommunicationGraphCreator(), new NopPlatformCommGraphMutateModule());
 		addProblem(PlatformCommunicationGraphEncoding.class, new PartitionMappingDecoderGraph());
 	}
 }