diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings
index 2effda820afa7fbcdc2d1e7bc72356fac2629b5e..76396f2c269dac4b8a3526fc7dd9c343cbe763a9 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings
@@ -1,9 +1,9 @@
 ContextMenuUtil.java 405387151d45b09dffb3b6ba44f980313c8edcaf GREEN
 CurvedLinkLayoutedContentAnchorangeController.java 67c20e31ddb82fe2fd499117193353b0545839a0 GREEN
-EObjectDiagramController.java 2b253941592ee25ead95223470f983f23ef9776f YELLOW
-EObjectEllipticResizableContentControllerBase.java 7c862a03b97d2f2cfdcc2fcee7434de2e1e257d2 YELLOW
+EObjectDiagramController.java 2b253941592ee25ead95223470f983f23ef9776f GREEN
+EObjectEllipticResizableContentControllerBase.java 7c862a03b97d2f2cfdcc2fcee7434de2e1e257d2 GREEN
 EObjectModelChangeProvider.java f4b60cebb088a5c81ca92a41614e1a5d40030502 GREEN
-EObjectRectangularResizableContentControllerBase.java 28a17bf87f6a7222d927bc1c6b80967cb14b5f03 YELLOW
+EObjectRectangularResizableContentControllerBase.java 28a17bf87f6a7222d927bc1c6b80967cb14b5f03 GREEN
 KernelServiceBasedModelChangeProviderBase.java 8d1f8ef79ecd383ff74e5a2bbcf24345aabe70af GREEN
 LayoutModelChangeProvider.java b5449d02eaf39086909720c43e21bd061005fc9e GREEN
 LayoutedContentAnchorageController.java 9fc513a7404277514c730f7702d45588f2d81878 GREEN
@@ -13,3 +13,4 @@ LayoutedEllipticResizableContentController.java 93bdeb7ecd5f7386724a9d7df5fff317
 LayoutedLineLinkBendPointController.java f5fac4fe8e4b4c0259407acb6bfc80dbe9c3a1fb GREEN
 LayoutedLinkBendPointController.java 3203d946de233274934dca1bcd47bbdc1d0a3b13 GREEN
 LayoutedRectangularResizableContentController.java 3232d423572924363702898cf8ba240ce7042b65 GREEN
+ModelElementFXEditorUIProviderBase.java b81bf7fc945d40f1f842876f07ba70799ab65f6d GREEN
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ModelElementFXEditorUIProviderBase.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ModelElementFXEditorUIProviderBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..b81bf7fc945d40f1f842876f07ba70799ab65f6d
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ModelElementFXEditorUIProviderBase.java
@@ -0,0 +1,73 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2020 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.ui.editor.fx.controller;
+
+import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createPrototypeMenu;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.fortiss.tooling.base.model.element.IModelElement;
+import org.fortiss.tooling.common.ui.javafx.control.treetableview.DynamicTreeTableUIProviderBase;
+import org.fortiss.tooling.kernel.ui.extension.base.FXEditorBase;
+import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
+
+import javafx.scene.Node;
+import javafx.scene.control.ContextMenu;
+
+/**
+ * Base implementation for FX UIProvider for ModelElements.
+ * 
+ * @author bayha
+ */
+public abstract class ModelElementFXEditorUIProviderBase<T extends IModelElement>
+		extends DynamicTreeTableUIProviderBase<T> {
+
+	/** The editor used to post selection changes. */
+	protected final FXEditorBase<?> editor;
+
+	/** Constructor. */
+	public ModelElementFXEditorUIProviderBase(FXEditorBase<?> editor) {
+		this.editor = editor;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Node getIconNode(IModelElement element, int column) {
+		if(element == null) {
+			return null;
+		}
+		return IModelElementHandlerService.getInstance().getFXIcon(element);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public ContextMenu createContextMenu(IModelElement element, int column) {
+		if(element == null || column != 0) {
+			return null;
+		}
+		ContextMenu contextMenu = new ContextMenu();
+		contextMenu.getItems().addAll(createPrototypeMenu(element, null));
+		return contextMenu;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void select(IModelElement oldValue, IModelElement newValue) {
+		IStructuredSelection selection =
+				newValue == null ? StructuredSelection.EMPTY : new StructuredSelection(newValue);
+		editor.getSite().getSelectionProvider().setSelection(selection);
+	}
+}
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings
index 8d6a106e24d63b6430e36627a00f64c04a9436d7..d62ac3736d877b3ebc3db9be04eecb910b812ca1 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings
@@ -1,8 +1,8 @@
 DynamicTreeContentProviderBase.java e801da995a1b6e5a1b757247c1638bafb6073e6d GREEN
 DynamicTreeItem.java 75dc5534b119ffdb3c10a65810c2a0f330b7955e GREEN
 DynamicTreeTableUIProviderBase.java 75ddf3e91c08fd6a5853ab261593040d1039d774 GREEN
-DynamicTreeTableViewer.java 7d35586715715a2b2b29bac37913480b18ca00d2 GREEN
+DynamicTreeTableViewer.java 431ac62cbd6ad7df25852fce1b5a62a05ba510e3 GREEN
 DynamicTreeUIProviderBase.java e9b68607683de279d0cb8712a28dc131c5c33ece GREEN
-DynamicTreeViewer.java 4f17aa4279b6403d3a90ac8547fa86de780fc0ac GREEN
-DynamicTreeViewerBase.java 47124c847de322a0ae26eb7a114f85ce4bd02d7e GREEN
+DynamicTreeViewer.java e9f19d16a2a7e5a1b03b8a8b543453ac7eb6a051 GREEN
+DynamicTreeViewerBase.java a2013538b62d86f6a09efdf2cd78babac2072484 GREEN
 IDoubleClickHandler.java 447f7769dead9a106b3ea3139ef0da51eb0b9a89 GREEN
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java
index 7d35586715715a2b2b29bac37913480b18ca00d2..431ac62cbd6ad7df25852fce1b5a62a05ba510e3 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java
@@ -15,6 +15,8 @@
  *******************************************************************************/
 package org.fortiss.tooling.common.ui.javafx.control.treetableview;
 
+import static java.lang.Integer.MAX_VALUE;
+
 import javafx.beans.property.SimpleObjectProperty;
 import javafx.scene.control.SelectionMode;
 import javafx.scene.control.TreeItem;
@@ -46,7 +48,7 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
 	public DynamicTreeTableViewer(TreeTableView<T> view, T root, boolean showRoot, int revealLevel,
 			DynamicTreeContentProviderBase<T> contentProvider,
 			DynamicTreeTableUIProviderBase<T> uiProvider) {
-		super(contentProvider);
+		super(view, contentProvider);
 		this.uiProvider = uiProvider;
 		// construct view
 		this.view = view;
@@ -116,6 +118,16 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
 		}
 	}
 
+	/** Expands all items on all levels. */
+	public void expandAllItems() {
+		TreeItem<T> root = view.getRoot();
+		if(root == null) {
+			return;
+		}
+
+		expandItem(root, MAX_VALUE);
+	}
+
 	/**
 	 * Adds a column to the table part of the view. The labels, context menus and icons are shown as
 	 * defined in the {@link DynamicTreeTableUIProviderBase}.
@@ -151,4 +163,12 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
 	public TreeTableView<T> getControl() {
 		return view;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected T getSelectedObject() {
+		T value = view.getSelectionModel().getSelectedItem().getValue();
+
+		return value;
+	}
 }
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java
index 4f17aa4279b6403d3a90ac8547fa86de780fc0ac..e9f19d16a2a7e5a1b03b8a8b543453ac7eb6a051 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewer.java
@@ -16,9 +16,6 @@
 package org.fortiss.tooling.common.ui.javafx.control.treetableview;
 
 import javafx.beans.value.ChangeListener;
-import javafx.event.Event;
-import javafx.event.EventDispatchChain;
-import javafx.event.EventDispatcher;
 import javafx.scene.control.ContextMenu;
 import javafx.scene.control.TreeCell;
 import javafx.scene.control.TreeItem;
@@ -26,7 +23,6 @@ import javafx.scene.control.TreeView;
 import javafx.scene.input.ClipboardContent;
 import javafx.scene.input.DragEvent;
 import javafx.scene.input.Dragboard;
-import javafx.scene.input.MouseButton;
 import javafx.scene.input.MouseEvent;
 import javafx.scene.input.TransferMode;
 
@@ -44,14 +40,12 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
 	private final DynamicTreeUIProviderBase<T> uiProvider;
 	/** The selection change listener. */
 	private ChangeListener<Object> selectionChangeListener = null;
-	/** The double click handler. */
-	private IDoubleClickHandler doubleClickHandler;
 
 	/** Constructor. */
 	public DynamicTreeViewer(TreeView<T> view, T root, boolean showRoot, int revealLevel,
 			DynamicTreeContentProviderBase<T> contentProvider,
 			DynamicTreeUIProviderBase<T> uiProvider) {
-		super(contentProvider);
+		super(view, contentProvider);
 		this.uiProvider = uiProvider;
 		// construct view
 		this.view = view;
@@ -123,11 +117,6 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
 		this.selectionChangeListener = listener;
 	}
 
-	/** Sets the double click handler. */
-	public void setDoubleClickHandler(IDoubleClickHandler handler) {
-		this.doubleClickHandler = handler;
-	}
-
 	/** Configures the cell factory for the viewer. */
 	private void configureCellFactory() {
 		view.setCellFactory(param -> {
@@ -138,8 +127,6 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
 					ContextMenu menu = null;
 					if(!empty && item != null) {
 						menu = uiProvider.createContextMenu(item);
-						EventDispatcher original = this.getEventDispatcher();
-						this.setEventDispatcher(new DoubleClickEventDispatcher(original));
 						this.setText(uiProvider.getLabel(item));
 						this.setGraphic(uiProvider.getIconNode(item));
 						this.setOnDragDetected(evt -> {
@@ -227,37 +214,15 @@ public final class DynamicTreeViewer<T> extends DynamicTreeViewerBase<T> {
 		return uiProvider;
 	}
 
-	/**
-	 * Customized event dispatcher to fix double-click behavior. This prevents opening/closing of
-	 * tree items with double click listeners assigned.
-	 */
-	private class DoubleClickEventDispatcher implements EventDispatcher {
-		/** The original event dispatcher. */
-		private final EventDispatcher original;
+	/** {@inheritDoc} */
+	@Override
+	protected Object getSelectedObject() {
+		DynamicTreeItem<T> item = (DynamicTreeItem<T>)view.getSelectionModel().getSelectedItem();
 
-		/** Constructor. */
-		public DoubleClickEventDispatcher(EventDispatcher original) {
-			this.original = original;
+		if(item != null) {
+			return item.getValue();
 		}
 
-		/** {@inheritDoc} */
-		@Override
-		public Event dispatchEvent(Event event, EventDispatchChain tail) {
-			if(event instanceof MouseEvent) {
-				MouseEvent mevt = (MouseEvent)event;
-				if(mevt.getButton() == MouseButton.PRIMARY && mevt.getClickCount() >= 2) {
-					if(mevt.getEventType().equals(MouseEvent.MOUSE_CLICKED) &&
-							doubleClickHandler != null) {
-						DynamicTreeItem<T> item =
-								(DynamicTreeItem<T>)view.getSelectionModel().getSelectedItem();
-						if(item != null) {
-							doubleClickHandler.doubleClicked(item.getValue());
-						}
-					}
-					event.consume();
-				}
-			}
-			return original.dispatchEvent(event, tail);
-		}
+		return null;
 	}
 }
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewerBase.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewerBase.java
index 47124c847de322a0ae26eb7a114f85ce4bd02d7e..a2013538b62d86f6a09efdf2cd78babac2072484 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewerBase.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeViewerBase.java
@@ -15,20 +15,91 @@
  *******************************************************************************/
 package org.fortiss.tooling.common.ui.javafx.control.treetableview;
 
+import javafx.event.Event;
+import javafx.event.EventDispatchChain;
+import javafx.event.EventDispatcher;
+import javafx.scene.control.Control;
+import javafx.scene.control.TreeItem;
+import javafx.scene.input.MouseButton;
+import javafx.scene.input.MouseEvent;
+
 /**
  * Base class for {@link DynamicTreeViewer} and {@link DynamicTreeTableViewer}.
  */
 abstract class DynamicTreeViewerBase<T> {
+	/** The double click handler. */
+	private IDoubleClickHandler doubleClickHandler;
+
+	/** The double click event dispatcher. */
+	protected DoubleClickEventDispatcher doubleClickEventDispatcher;
+
 	/** The content provider implementation. */
 	private final DynamicTreeContentProviderBase<T> contentProvider;
 
 	/** Constructor. */
-	public DynamicTreeViewerBase(DynamicTreeContentProviderBase<T> contentProvider) {
+	public DynamicTreeViewerBase(Control control,
+			DynamicTreeContentProviderBase<T> contentProvider) {
 		this.contentProvider = contentProvider;
+
+		setupEventDispatcher(control);
+	}
+
+	/** Creates and installs the EventDispatcher. Might be overwritten to change behavior. */
+	protected void setupEventDispatcher(Control control) {
+		EventDispatcher original = control.getEventDispatcher();
+		control.setEventDispatcher(new DoubleClickEventDispatcher(original));
 	}
 
 	/** Returns the content provider. */
 	public final DynamicTreeContentProviderBase<T> getContentProvider() {
 		return contentProvider;
 	}
+
+	/**
+	 * Customized event dispatcher to fix double-click behavior. This prevents opening/closing of
+	 * tree items with double click listeners assigned.
+	 */
+	private class DoubleClickEventDispatcher implements EventDispatcher {
+		/** The original event dispatcher. */
+		private final EventDispatcher original;
+
+		/** Constructor. */
+		public DoubleClickEventDispatcher(EventDispatcher original) {
+			this.original = original;
+		}
+
+		/** {@inheritDoc} */
+		@Override
+		public Event dispatchEvent(Event event, EventDispatchChain tail) {
+			if(event instanceof MouseEvent) {
+				MouseEvent mevt = (MouseEvent)event;
+				if(mevt.getButton() == MouseButton.PRIMARY && mevt.getClickCount() >= 2) {
+					if(mevt.getEventType().equals(MouseEvent.MOUSE_CLICKED) &&
+							doubleClickHandler != null) {
+						Object item = getSelectedObject();
+						if(item != null) {
+							doubleClickHandler.doubleClicked(item);
+						}
+					}
+					event.consume();
+				}
+			}
+			return original.dispatchEvent(event, tail);
+		}
+	}
+
+	/** Sets the double click handler. */
+	public void setDoubleClickHandler(IDoubleClickHandler handler) {
+		this.doubleClickHandler = handler;
+	}
+
+	/**
+	 * Retrieves the currently selected {@link Object} from this viewer.
+	 * 
+	 * Note: This usually is not e.g. the {@link TreeItem} or similar, but the model object, that is
+	 * represented by it. Usually this will be some EObject.
+	 * 
+	 * @return The currently selected {@link Object}.
+	 */
+	protected abstract Object getSelectedObject();
 }