diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/action/CutModelElementsAction.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/action/CutModelElementsAction.java
index ec69425e4fdd261c4ec2ede388535aa1412ccacb..a055041b4bceb8c2ab8242275d8a72e6ad7f5828 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/action/CutModelElementsAction.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/action/CutModelElementsAction.java
@@ -79,7 +79,7 @@ public class CutModelElementsAction extends ModelElementsActionBase {
 			public boolean canExecute() {
 				for (EObject o : selection) {
 					if (!IElementCompositorService.INSTANCE.canDecompose(
-							o.eContainer(), o, null)) {
+							o)) {
 						return false;
 					}
 				}
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java
index e8c667477c0acec2bcdbd04bb606b9d7a7cc258e..3122556dd427be4cebd1f0458564e510202d0ba0 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/compose/HierarchicElementConnectionCompositorBase.java
@@ -136,4 +136,10 @@ public abstract class HierarchicElementConnectionCompositorBase<HE extends IHier
 
 		return true;
 	}
+
+	/** Base implementation returns true by default */
+	public boolean canDisconnectSpecific(S source, T target,
+			EObject connection, IConnectionCompositionContext context) {
+		return true;
+	}
 }
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RemoveEditPolicy.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RemoveEditPolicy.java
index a0d73ff456d591463a4fa80a06439936320f8755..86bdfba96c8d7cd0beeaaba270b2b18793fc27bf 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RemoveEditPolicy.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editpart/policy/RemoveEditPolicy.java
@@ -47,7 +47,7 @@ public final class RemoveEditPolicy extends ComponentEditPolicy {
 		for (EditPart ep : (List<EditPart>) request.getEditParts()) {
 			EObject model = (EObject) ep.getModel();
 			boolean canDelete = IElementCompositorService.INSTANCE
-					.canDecompose(model.eContainer(), model, null);
+					.canDecompose(model);
 			if (canDelete) {
 				compound.add(new RemoveCommand(model));
 			} else {
@@ -79,7 +79,7 @@ public final class RemoveEditPolicy extends ComponentEditPolicy {
 		@Override
 		public boolean canExecute() {
 			return IElementCompositorService.INSTANCE.canDecompose(
-					toRemove.eContainer(), toRemove, null);
+					toRemove);
 		}
 	}
 }
diff --git a/org.fortiss.tooling.base/trunk/META-INF/MANIFEST.MF b/org.fortiss.tooling.base/trunk/META-INF/MANIFEST.MF
index 851edabd629286c06bb3c681b3bdee9c8fdfc7ff..d94afc3b9168af7c90be295236a6a0ea6cbd4f82 100644
--- a/org.fortiss.tooling.base/trunk/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.base/trunk/META-INF/MANIFEST.MF
@@ -10,6 +10,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Require-Bundle: org.fortiss.tooling.kernel;bundle-version="0.0.1";visibility:=reexport
 Bundle-ActivationPolicy: lazy
 Export-Package: org.fortiss.tooling.base,
+ org.fortiss.tooling.base.decompose,
  org.fortiss.tooling.base.model.base,
  org.fortiss.tooling.base.model.base.impl,
  org.fortiss.tooling.base.model.base.util,
diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b727b54bd1d51d14a70f4592598b05e46d90e37
--- /dev/null
+++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/HierarchicElementCompositorBase.java
@@ -0,0 +1,155 @@
+/*--------------------------------------------------------------------------+
+$Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $
+|                                                                          |
+| Copyright 2011 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.tooling.base.decompose;
+
+import java.util.HashSet;
+
+import org.eclipse.emf.ecore.EObject;
+import org.fortiss.tooling.base.model.element.IConnection;
+import org.fortiss.tooling.base.model.element.IConnector;
+import org.fortiss.tooling.base.model.element.IHierarchicElement;
+import org.fortiss.tooling.base.model.element.IHierarchicElementContainer;
+import org.fortiss.tooling.base.model.element.IModelElement;
+import org.fortiss.tooling.base.model.element.IModelElementSpecification;
+import org.fortiss.tooling.kernel.extension.IElementCompositor;
+import org.fortiss.tooling.kernel.service.IConnectionCompositorService;
+
+/**
+ * 
+ * @author doebber
+ * @author $Author: hoelzl $
+ * @version $Rev: 18709 $
+ * @ConQAT.Rating RED Hash:
+ */
+public abstract class HierarchicElementCompositorBase<HE extends IHierarchicElementContainer>
+		implements IElementCompositor<HE> {
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean canDecompose(EObject contained) {
+		return iterateCanDecompose(contained, new CanDecomposeIterator());
+	}
+
+	/** recursive traversion of all model elements in subtree */
+	private boolean iterateCanDecompose(EObject contained,
+			CanDecomposeIterator cdi) {
+
+		if (!canDecomposeSpecific(contained)) {
+			return false;
+		}
+
+		if (contained instanceof IConnection) {
+			IConnection c = (IConnection) contained;
+			return IConnectionCompositorService.INSTANCE.canDecomposeSpecific(
+					c.getSource(), c.getTarget(), c, null);
+		}
+
+		if (contained instanceof IModelElement) {
+			IModelElement me = (IModelElement) contained;
+			for (IModelElementSpecification spec : me.getSpecificationsList()) {
+				if (cdi.contains(spec)) {
+					continue;
+				}
+				if (!iterateCanDecompose(spec, cdi)) {
+					return false;
+				}
+				cdi.add(spec);
+			}
+			// TODO CD: handle references
+		}
+		if (contained instanceof IHierarchicElement) {
+			IHierarchicElement he = (IHierarchicElement) contained;
+			for (IHierarchicElement subelement : he.getContainedElementsList()) {
+				if (cdi.contains(subelement)) {
+					continue;
+				}
+				if (!iterateCanDecompose(subelement, cdi)) {
+					return false;
+				}
+				cdi.add(subelement);
+			}
+			for (IConnection conn : he.getConnectionsList()) {
+				if (cdi.contains(conn)) {
+					continue;
+				}
+				if (!iterateCanDecompose(conn, cdi)) {
+					return false;
+				}
+				cdi.add(conn);
+			}
+			for (IConnector c : he.getConnectorsList()) {
+				if (cdi.contains(c)) {
+					continue;
+				}
+				if (!iterateCanDecompose(c, cdi)) {
+					return false;
+				}
+				cdi.add(c);
+			}
+		}
+		if (contained instanceof IConnector) {
+			IConnector connector = (IConnector) contained;
+			for (IConnection conn : connector.getIncomingList()) {
+				if (cdi.contains(conn)) {
+					continue;
+				}
+				if (!iterateCanDecompose(conn, cdi)) {
+					return false;
+				}
+				cdi.add(conn);
+			}
+			for (IConnection conn : connector.getOutgoingList()) {
+				if (cdi.contains(conn)) {
+					continue;
+				}
+				if (!iterateCanDecompose(conn, cdi)) {
+					return false;
+				}
+				cdi.add(conn);
+			}
+		}
+
+		return true;
+	}
+
+	/** Base implementation returns true by default. Subclasses may override. */
+	public boolean canDecomposeSpecific(
+			@SuppressWarnings("unused") EObject contained) {
+		return true;
+	}
+
+	/** Helper class to iterate over model elements in subtree to remove */
+	private class CanDecomposeIterator {
+
+		/** holds the model elements already visited */
+		private HashSet<EObject> set = new HashSet<EObject>();
+
+		/** add model element to traversed elements */
+		public void add(EObject element) {
+			set.add(element);
+		}
+
+		/**
+		 * returns whether this model element has been inquired for
+		 * decomposition ability before
+		 */
+		public boolean contains(EObject element) {
+			return set.contains(element);
+		}
+	}
+}
diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/IConnectionCompositorBase.java b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/IConnectionCompositorBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..e341a4770b8b57f79f9cced0285331a7e1e34ac6
--- /dev/null
+++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/decompose/IConnectionCompositorBase.java
@@ -0,0 +1,54 @@
+/*--------------------------------------------------------------------------+
+$Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $
+|                                                                          |
+| Copyright 2011 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.tooling.base.decompose;
+
+import org.eclipse.emf.ecore.EObject;
+import org.fortiss.tooling.base.model.element.IConnection;
+import org.fortiss.tooling.base.model.element.IHierarchicElement;
+import org.fortiss.tooling.base.model.element.IModelElementSpecification;
+import org.fortiss.tooling.kernel.extension.IConnectionCompositor;
+import org.fortiss.tooling.kernel.extension.data.IConnectionCompositionContext;
+import org.fortiss.tooling.kernel.service.IElementCompositorService;
+
+/**
+ * 
+ * @author doebber
+ * @author $Author: hoelzl $
+ * @version $Rev: 18709 $
+ * @ConQAT.Rating RED Hash:
+ */
+public abstract class IConnectionCompositorBase<HE extends IHierarchicElement, S extends IHierarchicElement, T extends IHierarchicElement>
+		implements IConnectionCompositor<HE, S, T> {
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean canDisconnect(S source, T target, EObject connection,
+			IConnectionCompositionContext context) {
+		if (connection instanceof IConnection) {
+			IConnection conn = (IConnection) connection;
+			for (IModelElementSpecification spec : conn.getSpecificationsList()) {
+				if (!IElementCompositorService.INSTANCE.canDecompose(spec)) {
+					return false;
+				}
+			}
+		}
+
+		return true;
+	}
+
+}
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java
index 089e0d80d7a78a11c6be7ac831c84edf26d0c10f..a3361ec842a1e04241ff50f7252994cbc66c5646 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java
@@ -156,7 +156,7 @@ public class ActionService implements IActionService,
 				.canRedo(target));
 
 		boolean canDelete = IElementCompositorService.INSTANCE.canDecompose(
-				target.eContainer(), target, null);
+				target);
 		canDelete = canDelete
 				&& !IPersistencyService.INSTANCE.isTopLevelElement(target);
 		globalDeleteAction.setTarget(target);
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IElementCompositor.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IElementCompositor.java
index 1d56a48817a4937b94544cdaad3ccf015eec250b..e05d97f48c68c13a813a0f75c0a26628876e6e33 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IElementCompositor.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/IElementCompositor.java
@@ -71,14 +71,12 @@ public interface IElementCompositor<C extends EObject> extends IEObjectAware<C>
 	 * Returns whether the given contained element may be removed from the given
 	 * container element.
 	 */
-	boolean canDecompose(C container, EObject contained,
-			IElementCompositionContext context);
+	boolean canDecompose(EObject contained);
 
 	/**
 	 * Asks the compositor to remove the contained object from the container.
 	 * This method returns a boolean, since user-interaction during compose
 	 * might cancel the command.
 	 */
-	boolean decompose(C container, EObject contained,
-			IElementCompositionContext context);
+	boolean decompose(EObject contained);
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java
index c96c8ac342b8a77342e045a55cc126d94cb1fae7..4224f2df6e4d7319113df0561d643c47c9df968a 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConnectionCompositorService.java
@@ -69,7 +69,7 @@ public class ConnectionCompositorService
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean canDecompose(EObject source, EObject destination,
+	public boolean canDecomposeSpecific(EObject source, EObject destination,
 			EObject connection, IConnectionCompositionContext context) {
 		return findWorkingConnector(source, destination, connection, false,
 				context) != null;
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ElementCompositorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ElementCompositorService.java
index 491a40bfc1b13aefb5e9f4904b47beb5968f3640..24ed4529dbd6fc6ec2062db07590ffb4e3c7ee02 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ElementCompositorService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ElementCompositorService.java
@@ -84,9 +84,9 @@ public final class ElementCompositorService extends
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean canDecompose(EObject container, EObject contained,
-			IElementCompositionContext context) {
-		return findWorkingCompositor(container, contained, context, true) != null;
+	public boolean canDecompose(EObject contained) {
+		return findWorkingCompositor(contained.eContainer(), contained, null,
+				true) != null;
 	}
 
 	/** {@inheritDoc} */
@@ -94,7 +94,7 @@ public final class ElementCompositorService extends
 	public boolean decompose(EObject container, EObject contained,
 			IElementCompositionContext context) {
 		return findWorkingCompositor(container, contained, context, true)
-				.decompose(container, contained, context);
+				.decompose(contained);
 	}
 
 	/**
@@ -116,8 +116,7 @@ public final class ElementCompositorService extends
 			if (!decompose
 					&& compositor.canCompose(container, contained, context)) {
 				return compositor;
-			} else if (decompose
-					&& compositor.canDecompose(container, contained, context)) {
+			} else if (decompose && compositor.canDecompose(contained)) {
 				return compositor;
 			}
 		}
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java
index 44f794ef0ba32e7037e37c8d5cad6bdab4f9723a..19172451cafd7fd2dd619e74a777e321fcd1ed0e 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IConnectionCompositorService.java
@@ -75,7 +75,7 @@ public interface IConnectionCompositorService {
 	 * Determines if there is a compositor that allows the decomposition of the
 	 * connection between the source and target model element.
 	 */
-	boolean canDecompose(EObject source, EObject destination,
+	boolean canDecomposeSpecific(EObject source, EObject destination,
 			EObject connection, IConnectionCompositionContext context);
 
 	/**
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IElementCompositorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IElementCompositorService.java
index 4be9a647a58d88535f3ddc76cf962879456ea181..728c9ed237a43e9501a5930dd4fa78dbc12050f9 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IElementCompositorService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/service/IElementCompositorService.java
@@ -70,8 +70,7 @@ public interface IElementCompositorService {
 	 * Determines if there is a compositor that allows the decomposition of the
 	 * container and the contained {@link EObject}.
 	 */
-	boolean canDecompose(EObject container, EObject contained,
-			IElementCompositionContext context);
+	boolean canDecompose(EObject contained);
 
 	/**
 	 * Decomposes the container and the element. Since this operation may be