diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings
index 1008aedfb929e3676dd8664538032565f3e98ced..316c66d44d1a97ecd6db1c6c73f5ec2e570804ab 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/.ratings
@@ -1,2 +1,2 @@
 DynamicTreeTableNameProvider.java 3ca45f24b94e97b02313e80b16ba8b370f541541 GREEN
-ModelElementTreeViewer.java c27c57ae21b32de790c6fb5a86695dd5952fcf32 GREEN
+ModelElementTreeViewer.java af87b0aa1780f3b02a60d09db9676b4e54903be5 YELLOW
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java
index c27c57ae21b32de790c6fb5a86695dd5952fcf32..af87b0aa1780f3b02a60d09db9676b4e54903be5 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/javafx/control/treetableview/ModelElementTreeViewer.java
@@ -18,6 +18,7 @@ package org.fortiss.tooling.base.ui.javafx.control.treetableview;
 import static javafx.embed.swt.SWTFXUtils.toFXImage;
 import static org.fortiss.tooling.kernel.ui.util.KernelUIUtils.getName;
 
+import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -31,6 +32,8 @@ import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeVie
 import org.fortiss.tooling.kernel.model.INamedElement;
 import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
 
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
 import javafx.scene.Node;
 import javafx.scene.control.ContextMenu;
 import javafx.scene.control.MenuItem;
@@ -77,21 +80,76 @@ public class ModelElementTreeViewer<T extends INamedElement> {
 
 		/** {@inheritDoc} */
 		@Override
-		public ContextMenu createContextMenu(T element) {
+		public final ContextMenu createContextMenu(T element) {
 			ContextMenu menu = new ContextMenu();
-			contextMenuEntries.forEach(entry -> menu.getItems().add(entry));
+			for(Class<? extends TreeContextMenuItem> entryType : contextMenuEntryTypes) {
+
+				try {
+					Constructor<? extends TreeContextMenuItem> ctr =
+							entryType.getConstructor(INamedElement.class);
+					TreeContextMenuItem entry = ctr.newInstance(element);
+					if(!entry.isHidden()) {
+						menu.getItems().add(entry);
+						entry.setDisable(entry.isDisabled());
+					}
+				} catch(Exception e) {
+					e.printStackTrace();
+				}
+			}
 			return menu;
 		}
 	}
 
+	/** Base class for {@link MenuItem}s used by {@link ModelElementTreeViewer}s. */
+	protected static abstract class TreeContextMenuItem extends MenuItem {
+
+		/** The model element on which the context menu operates. */
+		private INamedElement element;
+
+		/** Constructor. */
+		public TreeContextMenuItem(INamedElement element, String label) {
+			super(label);
+			init(element);
+		}
+
+		/** Constructor. */
+		public TreeContextMenuItem(INamedElement element, String label, Node graphic) {
+			super(label, graphic);
+			init(element);
+		}
+
+		/** Helper for constructors. */
+		private void init(INamedElement element) {
+			this.element = element;
+			setOnAction(createOnActionHandler());
+		}
+
+		/** Getter for {@link #element}. */
+		protected INamedElement getElement() {
+			return element;
+		}
+
+		/** Predicate iff this {@link TreeContextMenuItem} is hidden. */
+		public abstract boolean isHidden();
+
+		/** Predicate when this {@link TreeContextMenuItem} is disabled. */
+		public abstract boolean isDisabled();
+
+		/**
+		 * Factory method for {@link EventHandler} that implements the action triggered by the
+		 * context menu.
+		 */
+		protected abstract EventHandler<ActionEvent> createOnActionHandler();
+	}
+
 	/** References the constructed {@link DynamicTreeViewer} "controller". */
 	protected DynamicTreeViewer<T> dynTreeViewer;
 
 	/**
-	 * List of context menu entries that supplied by clients (see
-	 * {@link #addContextMenuEntry(MenuItem)}).
+	 * List of context menu entries types that supplied by clients
+	 * (see{@link #addContextMenuEntry(Class)}).
 	 */
-	protected List<MenuItem> contextMenuEntries = new ArrayList<>();
+	protected List<Class<? extends TreeContextMenuItem>> contextMenuEntryTypes = new ArrayList<>();
 
 	/** Constructor. */
 	public ModelElementTreeViewer(TreeView<T> treeView, T modelRoot,
@@ -113,15 +171,11 @@ public class ModelElementTreeViewer<T extends INamedElement> {
 	}
 
 	/**
-	 * Method to define context {@link MenuItem}s for items of the underlying content. The given
-	 * function may use the selected element (given as a parameter to the function) to define
-	 * dynamic behavior.
-	 *
-	 * @param menuItem
-	 *            {@link MenuItem} and its logic to be added to the context menu.
+	 * Method to define context {@link TreeContextMenuItem}s. Depending on the selected content, the
+	 * editor will show and enable the context menu.
 	 */
-	public void addContextMenuEntry(MenuItem menuItem) {
-		contextMenuEntries.add(menuItem);
+	public void addContextMenuEntry(Class<? extends TreeContextMenuItem> menuItemType) {
+		contextMenuEntryTypes.add(menuItemType);
 	}
 
 	/** Update the internal viewer. */