diff --git a/org.fortiss.tooling.base.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.base.ui/META-INF/MANIFEST.MF
index 002ab0c85b01f37576899d202ac73a275b949554..1e4971a47f04654885710d833069031d3d752804 100644
--- a/org.fortiss.tooling.base.ui/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.base.ui/META-INF/MANIFEST.MF
@@ -2,10 +2,10 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: Tooling Base UI
 Bundle-SymbolicName: org.fortiss.tooling.base.ui;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-Activator: org.fortiss.tooling.base.ui.ToolingBaseUIActivator
-Require-Bundle: org.fortiss.tooling.base;bundle-version="2.21.0";visibility:=reexport,
- org.fortiss.tooling.kernel.ui;bundle-version="2.21.0";visibility:=reexport,
+Require-Bundle: org.fortiss.tooling.base;bundle-version="2.23.0";visibility:=reexport,
+ org.fortiss.tooling.kernel.ui;bundle-version="2.23.0";visibility:=reexport,
  org.eclipse.swt,
  org.fortiss.tooling.common.ui
 Bundle-ActivationPolicy: lazy
diff --git a/org.fortiss.tooling.base/META-INF/MANIFEST.MF b/org.fortiss.tooling.base/META-INF/MANIFEST.MF
index 5722cd4deddbac4bea79964e17b6626a8004b91a..6d2a040e9483ddb40a3653f6652788cefa51d094 100644
--- a/org.fortiss.tooling.base/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.base/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.fortiss.tooling.base;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/.ratings b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/.ratings
index 9a97e8c0bbc4bc4ea15fdea3ed48c5ee078cb849..eb80d32eec8d5a7a44ea50099240336f16fc50ae 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/.ratings
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/.ratings
@@ -1,6 +1,8 @@
 DefaultLayoutConstants.java 10ba39d25701f7aff7ef545ec69e42a6117ae7b1 GREEN
-DiagramTapeMeasure.java 2aaf2d0765d0ba5292ec2468d0d04d52f36370a6 GREEN
+DiagramTapeMeasure.java 4ac1310faa82746f0a66e684677588cbcdfcdde9 GREEN
+HorizontalDiagramTapeMeasure.java 98bcb18ed5171c5ff191225cf21a305d5ef06440 GREEN
 IAutoLayouter.java 8f22d3813491159151a8753dd683a5043554fb67 GREEN
 IAutoLayouterTapeMeasure.java 5ef5c7d0a124714d582de283d3915d8b4bf7fda8 GREEN
-KielerAutoLayouter.java 94de655f6abf6d7d6d747f96de07e0be50588abd GREEN
-LayoutKeyConstants.java 1e35b73f26f2691ef80fa885e4c5fc6c6a60bd05 GREEN
+KielerAutoLayouter.java 9cc7943ff90c55851b81bf7c4cde7b279992e925 GREEN
+LayoutKeyConstants.java 00d19473f69e2e9bdd541d41e737d2c99a0fd281 GREEN
+VerticalDiagramTapeMeasure.java 0b83af2189b4f55d0dfe121ae4e86cee064c5164 GREEN
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/DiagramTapeMeasure.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/DiagramTapeMeasure.java
index 2aaf2d0765d0ba5292ec2468d0d04d52f36370a6..4ac1310faa82746f0a66e684677588cbcdfcdde9 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/DiagramTapeMeasure.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/DiagramTapeMeasure.java
@@ -35,18 +35,16 @@ import javafx.geometry.Bounds;
 import javafx.scene.text.Text;
 
 /**
- * {@link IAutoLayouterTapeMeasure} specialization to for automatic layout of models to be displayed
- * in JavaFX-based editors.
+ * {@link IAutoLayouterTapeMeasure} base class of models to be displayed in JavaFX-based editors.
  * 
  * @author barner
  */
-public class DiagramTapeMeasure implements IAutoLayouterTapeMeasure {
-
+public abstract class DiagramTapeMeasure implements IAutoLayouterTapeMeasure {
 	/**
 	 * Returns the an estimation of the text extent of the given {@code element}'s label (may be
 	 * {@code null}).
 	 */
-	private Bounds getTextExtent(IModelElement element) {
+	protected Bounds getTextExtent(IModelElement element) {
 		if(!(element instanceof INamedElement)) {
 			return null;
 		}
@@ -55,6 +53,19 @@ public class DiagramTapeMeasure implements IAutoLayouterTapeMeasure {
 		return text.getBoundsInLocal();
 	}
 
+	/**
+	 * Returns the maximum of the given length and a default length derived from the element's
+	 * connector count.
+	 */
+	protected int getElementLength(int length, IHierarchicElement element) {
+		int numElemConnectors = element.getConnectors().size();
+		int numElemInputConnectors =
+				pickInstanceOf(EntryConnectorBase.class, element.getConnectors()).size();
+		int numConnectors = max(numElemInputConnectors, numElemConnectors - numElemInputConnectors);
+
+		return max((1 + 2 * numConnectors) * DEFAULT_CONNECTOR_SIZE, length);
+	}
+
 	/** {@inheritDoc} */
 	@Override
 	public int getElementWidth(IHierarchicElement element) {
@@ -73,12 +84,7 @@ public class DiagramTapeMeasure implements IAutoLayouterTapeMeasure {
 	@Override
 	public int getElementHeight(IHierarchicElement element) {
 		Dimension dimension = getNodeSize((ILayoutedModelElement)element);
-		int numElemConnectors = element.getConnectors().size();
-		int numElemInputConnectors =
-				pickInstanceOf(EntryConnectorBase.class, element.getConnectors()).size();
-		int numConnectors = max(numElemInputConnectors, numElemConnectors - numElemInputConnectors);
-
-		return max((1 + 2 * numConnectors) * DEFAULT_CONNECTOR_SIZE, dimension.getHeight());
+		return dimension.getHeight();
 	}
 
 	/** {@inheritDoc} */
diff --git a/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/util/VariabilityViewUtils.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/HorizontalDiagramTapeMeasure.java
similarity index 60%
rename from org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/util/VariabilityViewUtils.java
rename to org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/HorizontalDiagramTapeMeasure.java
index 5846115ef3e0cc828ac6d868c00800146bcfac1c..98bcb18ed5171c5ff191225cf21a305d5ef06440 100644
--- a/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/util/VariabilityViewUtils.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/HorizontalDiagramTapeMeasure.java
@@ -1,6 +1,5 @@
-/*--------------------------------------------------------------------------+
-|                                                                          |
-| Copyright 2022 fortiss GmbH         						               |
+/*-------------------------------------------------------------------------+
+| 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.         |
@@ -14,26 +13,23 @@
 | See the License for the specific language governing permissions and      |
 | limitations under the License.                                           |
 +--------------------------------------------------------------------------*/
-package org.fortiss.tooling.ext.variability.ui.util;
+package org.fortiss.tooling.base.layout;
 
-import org.fortiss.tooling.kernel.ui.service.INavigatorService;
+import org.fortiss.tooling.base.model.element.IHierarchicElement;
 
 /**
- * Utility functions related to the variability visualization.
+ * {@link IAutoLayouterTapeMeasure} specialization for automatic horizontal layout of models to be
+ * displayed in JavaFX-based editors.
  * 
- * @author bayha
+ * @author barner
  */
-public class VariabilityViewUtils {
+public class HorizontalDiagramTapeMeasure extends DiagramTapeMeasure {
+
+	/** {@inheritDoc} */
+	@Override
+	public int getElementHeight(IHierarchicElement element) {
+		int height = super.getElementHeight(element);
 
-	/**
-	 * Retrieves the information whether variability options shall be displayed in
-	 * the UI.
-	 * 
-	 * Currently this is coupled to the expert view.
-	 * 
-	 * @return True if variability shall be available, otherwise false.
-	 */
-	public static boolean isVariabilityViewActive() {
-		return INavigatorService.getInstance().isExpertViewActive();
+		return getElementLength(height, element);
 	}
 }
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/KielerAutoLayouter.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/KielerAutoLayouter.java
index 94de655f6abf6d7d6d747f96de07e0be50588abd..9cc7943ff90c55851b81bf7c4cde7b279992e925 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/KielerAutoLayouter.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/KielerAutoLayouter.java
@@ -35,6 +35,7 @@ import org.eclipse.elk.alg.layered.options.LayeredMetaDataProvider;
 import org.eclipse.elk.alg.layered.options.LayeredOptions;
 import org.eclipse.elk.core.AbstractLayoutProvider;
 import org.eclipse.elk.core.data.LayoutMetaDataService;
+import org.eclipse.elk.core.math.ElkPadding;
 import org.eclipse.elk.core.options.Direction;
 import org.eclipse.elk.core.options.EdgeRouting;
 import org.eclipse.elk.core.options.PortLabelPlacement;
@@ -57,8 +58,10 @@ import org.fortiss.tooling.base.model.element.IHierarchicElement;
 import org.fortiss.tooling.base.model.layout.EOrientation;
 import org.fortiss.tooling.base.model.layout.ILayoutData;
 import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.base.model.layout.OffsetOrientation;
 import org.fortiss.tooling.base.model.layout.Points;
 import org.fortiss.tooling.base.model.layout.impl.PointsImpl;
+import org.fortiss.tooling.base.utils.OffsetOrientationUtils;
 import org.fortiss.tooling.kernel.model.INamedElement;
 
 /**
@@ -105,9 +108,18 @@ public class KielerAutoLayouter implements IAutoLayouter {
 		LayoutMetaDataService.getInstance()
 				.registerLayoutMetaDataProviders(new LayeredMetaDataProvider());
 
-		ElkNode rootNode = createELKGraph(element);
+		Direction direction = getDiagramDirection(element);
+		int offset = getDiagramOffset(element);
+		IAutoLayouterTapeMeasure tapeMeasure;
+		if(direction.isHorizontal()) {
+			tapeMeasure = new HorizontalDiagramTapeMeasure();
+		} else {
+			tapeMeasure = new VerticalDiagramTapeMeasure();
+		}
 
-		rootNode.setProperty(LayeredOptions.DIRECTION, Direction.RIGHT);
+		ElkNode rootNode = createELKGraph(element, tapeMeasure);
+		rootNode.setProperty(LayeredOptions.DIRECTION, direction);
+		rootNode.setProperty(LayeredOptions.PADDING, new ElkPadding(offset));
 		rootNode.setProperty(LayeredOptions.INTERACTIVE_LAYOUT, true);
 		rootNode.setProperty(LayeredOptions.FEEDBACK_EDGES, true);
 		rootNode.setProperty(LayeredOptions.EDGE_ROUTING, EdgeRouting.ORTHOGONAL);
@@ -126,6 +138,40 @@ public class KielerAutoLayouter implements IAutoLayouter {
 		applyLayout(rootNode, element);
 	}
 
+	/** Reads the diagram direction from the model element or returns default */
+	private static Direction getDiagramDirection(IHierarchicElement diagram) {
+		if(diagram instanceof ILayoutedModelElement) {
+			OffsetOrientation offsetOrientation = OffsetOrientationUtils.getOffsetOrientation(
+					(ILayoutedModelElement)diagram, LayoutKeyConstants.DIAGRAM_OFFSET_ORIENTATION);
+
+			if(offsetOrientation != null) {
+				switch(offsetOrientation.getOrientation()) {
+					case NORTH:
+						return Direction.UP;
+					case EAST:
+						return Direction.RIGHT;
+					case SOUTH:
+						return Direction.DOWN;
+					case WEST:
+						return Direction.LEFT;
+				}
+			}
+		}
+		return Direction.RIGHT;
+	}
+
+	/** Reads the diagram offset from the model element or returns default */
+	private static int getDiagramOffset(IHierarchicElement diagram) {
+		if(diagram instanceof ILayoutedModelElement) {
+			OffsetOrientation offsetOrientation = OffsetOrientationUtils.getOffsetOrientation(
+					(ILayoutedModelElement)diagram, LayoutKeyConstants.DIAGRAM_OFFSET_ORIENTATION);
+			if(offsetOrientation != null) {
+				return offsetOrientation.getOffset();
+			}
+		}
+		return 0;
+	}
+
 	/**
 	 * Truncates a given {@code float} value and decreases the value until it is a multiple of the
 	 * grid size.
@@ -248,12 +294,18 @@ public class KielerAutoLayouter implements IAutoLayouter {
 					break;
 			}
 
-			// The parent component need not be aligned to the grid. The Y-coordinate
-			// of the parent is truncated. Since elkPort.getY() is relative to the
-			// Y-coordinate of the parent, we need to correct when snapping to the grid.
-			double parentGridOffset = elkPort.getParent().getY() % DEFAULT_GRID_SIZE;
-			setStickyConnectorLayoutData((ILayoutedModelElement)connector, orientation,
-					truncateSnap2Grid(elkPort.getY() + parentGridOffset));
+			if(side == PortSide.WEST || side == PortSide.EAST) {
+				// The parent component need not be aligned to the grid. The Y-coordinate
+				// of the parent is truncated. Since elkPort.getY() is relative to the
+				// Y-coordinate of the parent, we need to correct when snapping to the grid.
+				double parentGridOffset = elkPort.getParent().getY() % DEFAULT_GRID_SIZE;
+				setStickyConnectorLayoutData((ILayoutedModelElement)connector, orientation,
+						truncateSnap2Grid(elkPort.getY() + parentGridOffset));
+			} else {
+				double parentGridOffset = elkPort.getParent().getX() % DEFAULT_GRID_SIZE;
+				setStickyConnectorLayoutData((ILayoutedModelElement)connector, orientation,
+						truncateSnap2Grid(elkPort.getX() + parentGridOffset));
+			}
 		}
 	}
 
@@ -275,11 +327,15 @@ public class KielerAutoLayouter implements IAutoLayouter {
 	 * @param element
 	 *            The {@link IHierarchicElement} for which the {@link ElkNode} graph should be
 	 *            created
+	 *
+	 * @param tapeMeasure
+	 *            The {@link IAutoLayouterTapeMeasure} to estimate node sizes
 	 * 
 	 * @return A {@link ElkNode} graph with the same structure as the graph contained in the
 	 *         {@link IHierarchicElement}.
 	 */
-	private ElkNode createELKGraph(IHierarchicElement element) {
+	private ElkNode createELKGraph(IHierarchicElement element,
+			IAutoLayouterTapeMeasure tapeMeasure) {
 
 		ElkNode rootNode = createGraph();
 
@@ -289,8 +345,6 @@ public class KielerAutoLayouter implements IAutoLayouter {
 		connectionsToElkEdges = new BasicEMap<IConnection, ElkEdge>();
 		undirectedConnectorsToElkPorts = new BasicEMap<IConnector, ElkPort>();
 
-		IAutoLayouterTapeMeasure tapeMeasure = new DiagramTapeMeasure();
-
 		// Create nodes
 		for(IHierarchicElement child : element.getContainedElements()) {
 			if(!(child instanceof ILayoutedModelElement)) {
@@ -400,6 +454,7 @@ public class KielerAutoLayouter implements IAutoLayouter {
 			IConnector connector, ElkNode elkNode, EMap<IConnector, ElkPort> connectorsToelkPorts) {
 		ElkPort elkPort = createPort(elkNode);
 		elkPort.setParent(elkNode);
+		elkPort.setWidth(DEFAULT_CONNECTOR_SIZE);
 		elkPort.setHeight(DEFAULT_CONNECTOR_SIZE);
 
 		if(connector instanceof INamedElement) {
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/LayoutKeyConstants.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/LayoutKeyConstants.java
index 1e35b73f26f2691ef80fa885e4c5fc6c6a60bd05..00d19473f69e2e9bdd541d41e737d2c99a0fd281 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/LayoutKeyConstants.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/LayoutKeyConstants.java
@@ -36,18 +36,21 @@ public final class LayoutKeyConstants {
 	/** Points layout data key. */
 	public static final String CONNECTION_POINTS = "points";
 
-	/** Sticky position layout data key */
+	/** Sticky position layout data key. */
 	public static final String CONNECTOR_POSITION = "cpos";
 
-	/** Sticky dimension layout data key */
+	/** Sticky dimension layout data key. */
 	public static final String CONNECTOR_DIMENSION = "cdim";
 
-	/** Sticky offset orientation layout data key */
+	/** Sticky offset orientation layout data key. */
 	public static final String CONNECTOR_OFFSET_ORIENTATION = "coffsetorient";
 
-	/** Sticky offset layout data key */
+	/** Sticky offset layout data key. */
 	public static final String CONNECTOR_OFFSET = "coffset";
 
-	/** Sticky angle layout data key */
+	/** Sticky angle layout data key. */
 	public static final String CONNECTOR_ANGLE = "cangle";
+
+	/** Diagram offset orientation. */
+	public static final String DIAGRAM_OFFSET_ORIENTATION = "diagorient";
 }
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/VerticalDiagramTapeMeasure.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/VerticalDiagramTapeMeasure.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b83af2189b4f55d0dfe121ae4e86cee064c5164
--- /dev/null
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/layout/VerticalDiagramTapeMeasure.java
@@ -0,0 +1,35 @@
+/*-------------------------------------------------------------------------+
+| 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.tooling.base.layout;
+
+import org.fortiss.tooling.base.model.element.IHierarchicElement;
+
+/**
+ * {@link IAutoLayouterTapeMeasure} specialization for automatic vertical layout of models to be
+ * displayed in JavaFX-based editors.
+ * 
+ * @author barner
+ */
+public class VerticalDiagramTapeMeasure extends DiagramTapeMeasure {
+
+	/** {@inheritDoc} */
+	@Override
+	public int getElementWidth(IHierarchicElement element) {
+		int width = super.getElementWidth(element);
+
+		return getElementLength(width, element);
+	}
+}
diff --git a/org.fortiss.tooling.common.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.common.ui/META-INF/MANIFEST.MF
index 70bfe152e2452915ccd0da538ef4415db0cdeeba..4a6f529cf3c8fb6781dce1762571608f672d65a5 100644
--- a/org.fortiss.tooling.common.ui/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.common.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: Tooling Commons UI
 Bundle-SymbolicName: org.fortiss.tooling.common.ui;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Require-Bundle: org.fortiss.tooling.common;visibility:=reexport,
  org.eclipse.core.resources;visibility:=reexport,
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 4a765254cb3ee197cfc78a075b6e10c26e95ba68..8739f2bf5878a44bafe2c3ecf21573c59fbe563a 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,11 +1,11 @@
 DynamicList.java 786300e2e914826da239329d190abea1710478ea GREEN
 DynamicListContentProvider.java 817cba44f246a361207a88ef9a4e1869215803f7 GREEN
 DynamicStreamContentProvider.java f46e91400609cba54793dd240be0fe2aa0d5cced GREEN
-DynamicTextFieldTreeTableCell.java de24117e6f785b328f1ff62383626a0b4b54e8ff GREEN
+DynamicTextFieldTreeTableCell.java 62fa0c08b11d87e0eed41f84be85505c2740e75d GREEN
 DynamicTreeContentProviderBase.java 91896b1fb5104d126544c44c1ff8c30f2a13a8d6 GREEN
 DynamicTreeItem.java 7e81ea98038b5eca90df583e0268d4e8f37aaf25 GREEN
 DynamicTreeItemBase.java d883066ecc181120302ca32f328538de7a45b093 GREEN
-DynamicTreeTableUIProviderBase.java 25592d4d2fb4a6cf904e8bdd98fc5138cbea5f17 GREEN
+DynamicTreeTableUIProviderBase.java 29aa753793ab90676d45e5b76b11f7b46ce02a97 GREEN
 DynamicTreeTableViewer.java 77e9995a3bee37d57578dad9434a53c702128efa YELLOW
 DynamicTreeUIProviderBase.java 82d3c051213f0147f4c67ad247a08696cee73110 GREEN
 DynamicTreeViewer.java 33066062a82101cf28410e4d04f85bb9c24251db GREEN
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTextFieldTreeTableCell.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTextFieldTreeTableCell.java
index de24117e6f785b328f1ff62383626a0b4b54e8ff..62fa0c08b11d87e0eed41f84be85505c2740e75d 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTextFieldTreeTableCell.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTextFieldTreeTableCell.java
@@ -42,11 +42,21 @@ public class DynamicTextFieldTreeTableCell<T> extends TextFieldTreeTableCell<T,
 	/** The current entered text in the TextField. */
 	private String currentInput = "";
 
+	/** The UIProvider of the editor in which this cell is embedded in. */
+	DynamicTreeTableUIProviderBase<T> uiProvider;
+
+	/** The column index, this cell is embedded in. */
+	int columnIndex;
+
 	/**
 	 * Constructor.
 	 */
-	public DynamicTextFieldTreeTableCell() {
+	public DynamicTextFieldTreeTableCell(DynamicTreeTableUIProviderBase<T> uiProvider,
+			int columnIndex) {
 		this(new DefaultStringConverter());
+
+		this.uiProvider = uiProvider;
+		this.columnIndex = columnIndex;
 	}
 
 	/**
@@ -103,19 +113,28 @@ public class DynamicTextFieldTreeTableCell<T> extends TextFieldTreeTableCell<T,
 
 			// Remember currently edited element.
 			currentlyEditedElement = currentEntry;
+
+			String initialEditorContent =
+					uiProvider.getInitialEditorContent(currentlyEditedElement, columnIndex);
+
 			// Reset currentInput buffer for the new element.
-			currentInput = "";
+			currentInput = initialEditorContent;
+
+			// We keep the current input in the buffer variable currentInput to be able to
+			// use it during unintended cancel options. See cancelEdit().
+			TextField textField = (TextField)getGraphic();
+
+			if(textField != null) {
+				textField.setOnKeyReleased(event -> {
+					currentInput = textField.getText();
+				});
+
+				textField.setText(initialEditorContent);
+			}
 		} else {
+			// Reset buffer
 			currentlyEditedElement = null;
-		}
-
-		// We keep the current input in the buffer variable currentInput to be able to
-		// use it during unintended cancel options. See cancelEdit().
-		TextField textField = (TextField)getGraphic();
-		if(textField != null) {
-			textField.setOnKeyReleased(event -> {
-				currentInput = textField.getText();
-			});
+			currentInput = null;
 		}
 	}
 
@@ -133,10 +152,16 @@ public class DynamicTextFieldTreeTableCell<T> extends TextFieldTreeTableCell<T,
 
 			// Set the current TextField value if intended.
 			if(currentlyEditedElement != null) {
-				setValueOnLeavingCell(currentlyEditedElement, currentInput);
+				String initialEditorContent =
+						uiProvider.getInitialEditorContent(currentlyEditedElement, columnIndex);
+				if(!currentInput.equals(initialEditorContent)) {
+					setValueOnLeavingCell(currentlyEditedElement, currentInput);
+				}
 				currentlyEditedElement = null;
 			}
 		}
+
+		getTreeTableView().refresh();
 	}
 
 	/** {@inheritDoc} */
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableUIProviderBase.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableUIProviderBase.java
index 25592d4d2fb4a6cf904e8bdd98fc5138cbea5f17..29aa753793ab90676d45e5b76b11f7b46ce02a97 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableUIProviderBase.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableUIProviderBase.java
@@ -64,6 +64,19 @@ public abstract class DynamicTreeTableUIProviderBase<T> {
 		return "";
 	}
 
+	/**
+	 * Determines, which {@link String} is in text editor cells when stating to edit.
+	 * 
+	 * @param element
+	 *            The element for which eitr content shall be provided
+	 * @param column
+	 *            The column index for which the content shall be provided
+	 * @return The {@link String} which shal be displayed in the editor.
+	 */
+	public String getInitialEditorContent(T element, int column) {
+		return getLabel(element, column);
+	}
+
 	/**
 	 * @param element
 	 *            the element to be displayed in the current row
@@ -534,27 +547,29 @@ public abstract class DynamicTreeTableUIProviderBase<T> {
 	 */
 	public void applyToTextColumn(int columnIndex, TreeTableColumn<T, String> column) {
 		column.setCellFactory(ttColumn -> {
-			DynamicTextFieldTreeTableCell<T> cell = new DynamicTextFieldTreeTableCell<T>() {
+			DynamicTextFieldTreeTableCell<T> cell =
+					new DynamicTextFieldTreeTableCell<T>(this, columnIndex) {
 
-				/** {@inheritDoc} */
-				@Override
-				protected boolean canEdit(T element) {
-					return DynamicTreeTableUIProviderBase.this.isEditable(columnIndex, element);
-				}
+						/** {@inheritDoc} */
+						@Override
+						protected boolean canEdit(T element) {
+							return DynamicTreeTableUIProviderBase.this.isEditable(columnIndex,
+									element);
+						}
 
-				/** {@inheritDoc} */
-				@Override
-				protected void setValueOnLeavingCell(T element, String currentValue) {
-					updateValue(element, columnIndex, currentValue);
-				}
+						/** {@inheritDoc} */
+						@Override
+						protected void setValueOnLeavingCell(T element, String currentValue) {
+							updateValue(element, columnIndex, currentValue);
+						}
 
-				/** {@inheritDoc} */
-				@Override
-				public void updateItem(String item, boolean empty) {
-					super.updateItem(item, empty);
-					styleCell(this, columnIndex);
-				}
-			};
+						/** {@inheritDoc} */
+						@Override
+						public void updateItem(String item, boolean empty) {
+							super.updateItem(item, empty);
+							styleCell(this, columnIndex);
+						}
+					};
 
 			styleCell(cell, columnIndex);
 
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/visual/elliptic/CircularContentVisualBase.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/visual/elliptic/CircularContentVisualBase.java
index cc3caea328e36e90069b915e413c8e7e9522a939..e1c17f39fc510e25f6ca3ae84e7ef1188a7c7b72 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/visual/elliptic/CircularContentVisualBase.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/lwfxef/visual/elliptic/CircularContentVisualBase.java
@@ -90,8 +90,8 @@ public abstract class CircularContentVisualBase extends ContentVisualBase {
 		double angleRad = toRadians(angleDeg);
 		double nx = cos(angleRad);
 		double ny = sin(angleRad);
-		double x = pb.getMinX() + w2 + radius * nx;
-		double y = pb.getMinY() + h2 + radius * ny;
+		double x = w2 + radius * nx;
+		double y = h2 + radius * ny;
 		return new DiagramCoordinate(x, y);
 	}
 
diff --git a/org.fortiss.tooling.common/META-INF/MANIFEST.MF b/org.fortiss.tooling.common/META-INF/MANIFEST.MF
index 5965f4c74fb03f2f242dbc3e5d42c325b90578ad..eb8d6da0ffd75aebc033e4a95b69fc0462770f4f 100644
--- a/org.fortiss.tooling.common/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.common/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: Tooling Commons
 Bundle-SymbolicName: org.fortiss.tooling.common;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Require-Bundle: org.eclipse.core.runtime;visibility:=reexport,
  com.ibm.icu;visibility:=reexport,
  org.junit;visibility:=reexport
diff --git a/org.fortiss.tooling.ext.reuse.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.ext.reuse.ui/META-INF/MANIFEST.MF
index 58414355b0f81835ca4eebf4e0da03c3ecd3bd0c..3ac20b12b06029da3be9348c33fd7e907a26c895 100644
--- a/org.fortiss.tooling.ext.reuse.ui/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.ext.reuse.ui/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Automatic-Module-Name: org.fortiss.tooling.ext.reuse.ui
 Bundle-ManifestVersion: 2
 Bundle-Name: AF3 Reuse UI
 Bundle-SymbolicName: org.fortiss.tooling.ext.reuse.ui;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-Activator: org.fortiss.tooling.ext.reuse.ui.ToolingReuseUIActivator
 Require-Bundle: org.eclipse.ui.ide;visibility:=reexport,
  org.fortiss.tooling.base.ui;visibility:=reexport,
diff --git a/org.fortiss.tooling.ext.reuse.ui/icons/af3_icon64.png b/org.fortiss.tooling.ext.reuse.ui/icons/af3_icon64.png
new file mode 100644
index 0000000000000000000000000000000000000000..28744fdefd36c21e7c7d835fac44506fcde83008
Binary files /dev/null and b/org.fortiss.tooling.ext.reuse.ui/icons/af3_icon64.png differ
diff --git a/org.fortiss.tooling.ext.reuse.ui/icons/af3_logo.png b/org.fortiss.tooling.ext.reuse.ui/icons/af3_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c08d006b36f6bad28696e7d0378dde8d8687273
Binary files /dev/null and b/org.fortiss.tooling.ext.reuse.ui/icons/af3_logo.png differ
diff --git a/org.fortiss.tooling.ext.reuse.ui/icons/af3_logo_square.png b/org.fortiss.tooling.ext.reuse.ui/icons/af3_logo_square.png
new file mode 100644
index 0000000000000000000000000000000000000000..40852c78044208854fa19912ce4e5e0157dab913
Binary files /dev/null and b/org.fortiss.tooling.ext.reuse.ui/icons/af3_logo_square.png differ
diff --git a/org.fortiss.tooling.ext.reuse.ui/icons/lib_update_info.png b/org.fortiss.tooling.ext.reuse.ui/icons/lib_update_info.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff3b8d285acb099499961ffb1651efa6e0fe8a73
Binary files /dev/null and b/org.fortiss.tooling.ext.reuse.ui/icons/lib_update_info.png differ
diff --git a/org.fortiss.tooling.ext.reuse.ui/plugin.xml b/org.fortiss.tooling.ext.reuse.ui/plugin.xml
index 7de4606d1211a65daae787bf9b9d368e47b69cca..610ca80d2f4fc1ae69380f89b7f09643a9b1d91d 100644
--- a/org.fortiss.tooling.ext.reuse.ui/plugin.xml
+++ b/org.fortiss.tooling.ext.reuse.ui/plugin.xml
@@ -36,6 +36,12 @@
             contributor="org.fortiss.tooling.ext.reuse.ui.commands.UpdateFromLibContextMenu">
       </contextMenuContribution>
    </extension>
+   <extension
+         point="org.fortiss.tooling.kernel.ui.contextMenuContribution">
+      <contextMenuContribution
+            contributor="org.fortiss.tooling.ext.reuse.ui.commands.GetUpdatedOriginsContextMenu">
+      </contextMenuContribution>
+   </extension>
    <extension
          point="org.eclipse.ui.views">
       <view
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/.ratings b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/.ratings
index 01a4a1be58c42e47eceaa37e00654bd557cb73b7..ac0692f78816a9d391d2f95d4479d24689437d37 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/.ratings
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/.ratings
@@ -1,3 +1,4 @@
-AddElementContextMenu.java 1b5436d37bd93fe9106a3f21cf3d5a2b3656490e GREEN
-UpdateFromLibContextMenu.java 0a260b57afc76e88a2957c520d3ecbfe3390eeb3 GREEN
-UpdateInLibContextMenu.java 139ab2c43e13a38bb6eecbb3a44bdbc611e29213 GREEN
+AddElementContextMenu.java ab4536e73323802e46d50d0bb9f62d6becc9db39 GREEN
+GetUpdatedOriginsContextMenu.java cfb16bb084be5a76a7ec70c2882242543535bc87 GREEN
+UpdateFromLibContextMenu.java 58f56f4c2da66655a5c1bf93c370bd4f2dba5dd4 GREEN
+UpdateInLibContextMenu.java cb5aeb92f8e511339bec675a3764284d977dd45d GREEN
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/AddElementContextMenu.java b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/AddElementContextMenu.java
index 1b5436d37bd93fe9106a3f21cf3d5a2b3656490e..ab4536e73323802e46d50d0bb9f62d6becc9db39 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/AddElementContextMenu.java
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/AddElementContextMenu.java
@@ -23,12 +23,12 @@ import static org.eclipse.ui.PlatformUI.getWorkbench;
 import static org.fortiss.tooling.ext.reuse.ui.prototypes.PrototypeProvider.DEFAULT_ROOT_REUSE_ELEMENT_NAME;
 import static org.fortiss.tooling.ext.reuse.ui.utils.ReuseLibraryUIUtils.manageExternalReferencesOfReuseElement;
 import static org.fortiss.tooling.ext.reuse.ui.utils.ReuseLibraryViewUtils.raiseAndUpdateReuseLibraryView;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.addElementToLibrary;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.createAndAddReuseLibrary;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.createElementForLibrary;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getAllLocalReuseLibraries;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementName;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.hasReusePossibility;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getAllLocalReuseLibraries;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.hasReusePossibility;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsManipulation.addElementToLibrary;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsManipulation.createAndAddReuseLibrary;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsManipulation.createElementForLibrary;
 import static org.fortiss.tooling.kernel.ui.service.IContextMenuService.TOP_MOST_MENU_SECTION_ID;
 
 import java.util.ArrayList;
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/GetUpdatedOriginsContextMenu.java b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/GetUpdatedOriginsContextMenu.java
new file mode 100644
index 0000000000000000000000000000000000000000..cfb16bb084be5a76a7ec70c2882242543535bc87
--- /dev/null
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/GetUpdatedOriginsContextMenu.java
@@ -0,0 +1,140 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2022 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.ext.reuse.ui.commands;
+
+import static java.util.Collections.emptyList;
+import static org.conqat.ide.commons.ui.dialog.MessageUtils.showInfo;
+import static org.fortiss.tooling.ext.reuse.ui.commands.UpdateFromLibContextMenu.UPDATE_FROM_CONTEXT_MENU_STRING;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getAllUpdatedOrigins;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getFirstSourceLibraryOfElement;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getLibraryIDName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementLastUpdateString;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.isCorrectReuseElement;
+import static org.fortiss.tooling.kernel.ui.service.IContextMenuService.TOP_MOST_MENU_SECTION_ID;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IContributionItem;
+import org.fortiss.tooling.ext.reuse.model.ReuseLibrary;
+import org.fortiss.tooling.ext.reuse.ui.ToolingReuseUIActivator;
+import org.fortiss.tooling.kernel.service.ICommandStackService;
+import org.fortiss.tooling.kernel.ui.extension.IContextMenuContributor;
+import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider;
+
+/**
+ * Context menu contributions to include getting information about updated of
+ * origin reuse elements to {@link ReuseLibrary}.
+ *
+ * @author bergemann
+ */
+public class GetUpdatedOriginsContextMenu implements IContextMenuContributor {
+
+	/** The title of the dialog shell(s). */
+	private final String shellTitle = "Information about updated reuse origins";
+
+	/** The string of the context menu entry. */
+	public static final String updatedOrigincontextMenuString = "Get reuse update information";
+
+	/** {@inheritDoc} */
+	@Override
+	public List<IContributionItem> getContributedItems(EObject selection, ContextMenuContextProvider contextProvider) {
+		if (selection != null && canBeAdded(selection)) {
+			GetUpdateInfoAction action = new GetUpdateInfoAction(selection);
+			List<IContributionItem> contributionItems = new ArrayList<IContributionItem>();
+			contributionItems.add(new ActionContributionItem(action));
+			return contributionItems;
+		}
+		return emptyList();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public String getMenuSectionID() {
+		return TOP_MOST_MENU_SECTION_ID;
+	}
+
+	/**
+	 * Checks whether the given element has a link to a {@link ReuseLibrary} and can
+	 * be updated from a {@link ReuseLibrary}.
+	 */
+	protected boolean canBeAdded(EObject element) {
+		return isCorrectReuseElement(element);
+	}
+
+	/**
+	 * Displays information about possible origin updates of the given reuse
+	 * element.
+	 */
+	protected void displayOriginUpdateInfo(EObject reuseElement) {
+		if (reuseElement == null) {
+			return;
+		}
+
+		List<EObject> updatedReuseOrigins = getAllUpdatedOrigins(reuseElement);
+
+		// Currently, it is just a brief text message about this information.
+		// It could also be possible to provide directly update options within this
+		// info/dialog box.
+		String infoMessage;
+		if (updatedReuseOrigins.isEmpty()) {
+			infoMessage = "None of the found reuse origins was updated since the selected reuse element was reused or updated (based of these origins)."
+					+ "\n\nTherefore, it is not needed to get updates from any of them except you want to get the original version (e.g., if you have manipulated the selected reuse element in the meantime and wants to reset it)."
+					+ "\n\nKeep in mind: Updated reuse origins cannot be found if your local reuse libraries are not up to date as well!";
+		} else {
+			infoMessage = "The following reuse origins of the selected reuse element were updated since the selected reuse element was reused or updated (based of these origins):\n";
+			for (EObject updatedReuseOrigin : updatedReuseOrigins) {
+				String reuseElementName = getReuseElementName(updatedReuseOrigin);
+				ReuseLibrary library = getFirstSourceLibraryOfElement(updatedReuseOrigin);
+				String libraryName = getLibraryIDName(library);
+				boolean stringIsForDisplay = true;
+				String lastUpdate = getReuseElementLastUpdateString(updatedReuseOrigin, stringIsForDisplay);
+				infoMessage += "\nName: '" + reuseElementName + "'\n";
+				infoMessage += "Within library: '" + libraryName + "'\n";
+				infoMessage += "Last updated: " + lastUpdate + "\n";
+			}
+			infoMessage += "\nIf you want to get one of these updates, please use the '"
+					+ UPDATE_FROM_CONTEXT_MENU_STRING + "' context menu entry.";
+		}
+		showInfo(shellTitle, infoMessage);
+	}
+
+	/** The action "get info about reuse origin updates". */
+	private class GetUpdateInfoAction extends Action {
+
+		/** The selected element. */
+		private EObject selectedElement;
+
+		/** Constructor. Takes the selected element as input. */
+		GetUpdateInfoAction(EObject element) {
+			super(updatedOrigincontextMenuString,
+					ToolingReuseUIActivator.getImageDescriptor("icons/lib_update_info.png"));
+			selectedElement = element;
+		}
+
+		/** {@inheritDoc} */
+		@Override
+		public void run() {
+			ICommandStackService.getInstance().runAsCommand(selectedElement, () -> {
+				displayOriginUpdateInfo(selectedElement);
+			});
+		}
+	}
+}
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/UpdateFromLibContextMenu.java b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/UpdateFromLibContextMenu.java
index 0a260b57afc76e88a2957c520d3ecbfe3390eeb3..58f56f4c2da66655a5c1bf93c370bd4f2dba5dd4 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/UpdateFromLibContextMenu.java
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/UpdateFromLibContextMenu.java
@@ -21,15 +21,17 @@ import static org.conqat.ide.commons.ui.dialog.MessageUtils.confirm;
 import static org.conqat.ide.commons.ui.dialog.MessageUtils.showInfo;
 import static org.eclipse.jface.window.Window.OK;
 import static org.fortiss.tooling.ext.reuse.ui.utils.ReuseLibraryUIUtils.checkForElementInLibrary;
+import static org.fortiss.tooling.ext.reuse.ui.utils.ReuseLibraryUIUtils.isKeepingAdditionalReferencesRequested;
 import static org.fortiss.tooling.ext.reuse.ui.utils.ReuseLibraryUIUtils.manageExternalReferencesOfReuseElement;
 import static org.fortiss.tooling.ext.reuse.ui.utils.ReuseLibraryUIUtils.selectCorrectReuseSpec;
 import static org.fortiss.tooling.ext.reuse.ui.utils.ReuseLibraryUIUtils.warnOfMissingLib;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.fixIds;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getLibraryIDName;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getLocalReuseLibraryByID;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementName;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.isCorrectReuseElement;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.replaceElementInProject;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getLibraryIDName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getLocalReuseLibraryByID;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getNumberOfContainedReuseSpecs;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.isCorrectReuseElement;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsManipulation.fixIDs;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsManipulation.replaceElementInProject;
 import static org.fortiss.tooling.kernel.ui.service.IContextMenuService.TOP_MOST_MENU_SECTION_ID;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.getParentsWithType;
 
@@ -61,7 +63,10 @@ import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider;
 public class UpdateFromLibContextMenu implements IContextMenuContributor {
 
 	/** The title of the dialog shell(s). */
-	private final String shellTitle = "Update Element From Reuse Library";
+	private static final String SHELL_TITLE = "Update Element From Reuse Library";
+
+	/** The string of the context menu entry. */
+	public static final String UPDATE_FROM_CONTEXT_MENU_STRING = "Update from Reuse Library";
 
 	/** {@inheritDoc} */
 	@Override
@@ -94,31 +99,32 @@ public class UpdateFromLibContextMenu implements IContextMenuContributor {
 	 * {@link ReuseLibrary}. The {@link ReuseElementSpec} is the one that connects
 	 * reuse element and {@link ReuseLibrary}.
 	 */
-	protected void updateElemFromLib(EObject elementToBeUpdated, ReuseLibrary library, ReuseElementSpec referencingSpec,
-			String newName) {
+	protected void updateElementFromLibrary(EObject elementToBeUpdated, ReuseLibrary library,
+			ReuseElementSpec referencingSpec, String newName, boolean keepAdditionalReferences) {
 		if (library == null || elementToBeUpdated == null || referencingSpec == null || newName == null) {
 			return;
 		}
 
 		// find original element inside the library
-		EObject originalLibraryElement = checkForElementInLibrary(library, referencingSpec, shellTitle);
+		EObject originalLibraryElement = checkForElementInLibrary(library, referencingSpec, SHELL_TITLE);
 		if (originalLibraryElement == null) {
 			return;
 		}
 
-		EObject updatedElement = replaceElementInProject(elementToBeUpdated, originalLibraryElement, newName);
+		EObject updatedElement = replaceElementInProject(elementToBeUpdated, originalLibraryElement, newName,
+				keepAdditionalReferences);
 		if (updatedElement == null) {
-			String infoTitle = shellTitle + " - Replacement Failed";
+			String infoTitle = SHELL_TITLE + " - Replacement Failed";
 			String infoMessage = "The replacement of '" + getReuseElementName(elementToBeUpdated) + "' with '"
 					+ getReuseElementName(originalLibraryElement) + "' has failed.";
 			showInfo(infoTitle, infoMessage);
 			return;
 		}
 
-		fixIds(updatedElement);
+		fixIDs(updatedElement);
 
 		String currentActionType = "updateFromLibrary";
-		manageExternalReferencesOfReuseElement(originalLibraryElement, currentActionType, shellTitle);
+		manageExternalReferencesOfReuseElement(originalLibraryElement, currentActionType, SHELL_TITLE);
 	}
 
 	/** The action "update element from {@link ReuseLibrary}". */
@@ -129,7 +135,7 @@ public class UpdateFromLibContextMenu implements IContextMenuContributor {
 
 		/** Constructor. Takes the selected element as input. */
 		UpdateFromLibAction(EObject element) {
-			super("Update From Reuse Library",
+			super(UPDATE_FROM_CONTEXT_MENU_STRING,
 					ToolingReuseUIActivator.getImageDescriptor("icons/update_from_library.png"));
 			selectedElement = element;
 		}
@@ -137,14 +143,14 @@ public class UpdateFromLibContextMenu implements IContextMenuContributor {
 		/** {@inheritDoc} */
 		@Override
 		public void run() {
-			ReuseElementSpec correctLibrarySpec = selectCorrectReuseSpec(selectedElement, shellTitle);
+			ReuseElementSpec correctLibrarySpec = selectCorrectReuseSpec(selectedElement, SHELL_TITLE);
 			if (correctLibrarySpec == null) {
 				return;
 			}
 			ReuseLibrary correctLibrary = getLocalReuseLibraryByID(correctLibrarySpec.getSourceLibUUID());
 
 			if (correctLibrary == null) {
-				warnOfMissingLib(correctLibrarySpec, shellTitle);
+				warnOfMissingLib(correctLibrarySpec, SHELL_TITLE);
 				return;
 			}
 
@@ -159,11 +165,17 @@ public class UpdateFromLibContextMenu implements IContextMenuContributor {
 			}
 
 			// find original element inside the library
-			EObject originalLibraryElement = checkForElementInLibrary(correctLibrary, correctLibrarySpec, shellTitle);
+			EObject originalLibraryElement = checkForElementInLibrary(correctLibrary, correctLibrarySpec, SHELL_TITLE);
 			if (originalLibraryElement == null) {
 				return;
 			}
 
+			// in case of multiple library references within the selected element, ask if
+			// they should be kept or if all should be overridden/replaced by the library
+			// reference of the current update
+			boolean keepAdditionalReferences = isKeepingAdditionalReferencesRequested(selectedElement,
+					correctLibrarySpec, SHELL_TITLE);
+
 			// confirm the update
 			String currentNameInLibrary = getReuseElementName(originalLibraryElement);
 			List<String> textLines = new ArrayList<String>();
@@ -174,14 +186,23 @@ public class UpdateFromLibContextMenu implements IContextMenuContributor {
 			textLines.add("\n- Update target: element in current project");
 			textLines.add("    > element name: " + currentNameInProject);
 			textLines.add("    > in project: " + currentProjectName);
-			boolean confirmed = confirm(shellTitle, join("\n", textLines));
+			if (getNumberOfContainedReuseSpecs(selectedElement) > 1) {
+				if (keepAdditionalReferences) {
+					textLines.add(
+							"\nBesides the current update reference, all (old) additional library references will be kept within the element.");
+				} else {
+					textLines.add(
+							"\nAfter this step, the element will only contain the current update reference and all (old) additional library references will be removed.");
+				}
+			}
+			boolean confirmed = confirm(SHELL_TITLE, join("\n", textLines));
 
 			if (!confirmed) {
 				return;
 			}
 
 			// ask for element name (when updating element in project)
-			final InputDialog updateDialog = new InputDialog(Display.getCurrent().getActiveShell(), shellTitle,
+			final InputDialog updateDialog = new InputDialog(Display.getCurrent().getActiveShell(), SHELL_TITLE,
 					"Enter the name with which the element should be updated in the project:\n(Current name in project: "
 							+ currentNameInProject + ")\n ",
 					currentNameInProject, new UpdatedNameValidator());
@@ -192,7 +213,8 @@ public class UpdateFromLibContextMenu implements IContextMenuContributor {
 
 			// execute "updating" action
 			ICommandStackService.getInstance().runAsCommand(selectedElement, () -> {
-				updateElemFromLib(selectedElement, correctLibrary, correctLibrarySpec, updateName);
+				updateElementFromLibrary(selectedElement, correctLibrary, correctLibrarySpec, updateName,
+						keepAdditionalReferences);
 			});
 		}
 
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/UpdateInLibContextMenu.java b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/UpdateInLibContextMenu.java
index 139ab2c43e13a38bb6eecbb3a44bdbc611e29213..cb5aeb92f8e511339bec675a3764284d977dd45d 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/UpdateInLibContextMenu.java
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/commands/UpdateInLibContextMenu.java
@@ -27,11 +27,11 @@ import static org.fortiss.tooling.ext.reuse.ui.utils.ReuseLibraryUIUtils.manageE
 import static org.fortiss.tooling.ext.reuse.ui.utils.ReuseLibraryUIUtils.selectCorrectReuseSpec;
 import static org.fortiss.tooling.ext.reuse.ui.utils.ReuseLibraryUIUtils.warnOfMissingLib;
 import static org.fortiss.tooling.ext.reuse.ui.utils.ReuseLibraryViewUtils.raiseAndUpdateReuseLibraryView;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getLibraryIDName;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getLocalReuseLibraryByID;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementName;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.isCorrectReuseElement;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.replaceElementInLibrary;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getLibraryIDName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getLocalReuseLibraryByID;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.isCorrectReuseElement;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsManipulation.replaceElementInLibrary;
 import static org.fortiss.tooling.kernel.ui.service.IContextMenuService.TOP_MOST_MENU_SECTION_ID;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.getParentsWithType;
 
@@ -64,7 +64,10 @@ import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider;
 public class UpdateInLibContextMenu implements IContextMenuContributor {
 
 	/** The title of the dialog shell(s). */
-	private final String shellTitle = "Update Element In Reuse Library";
+	private static final String SHELL_TITLE = "Update Element In Reuse Library";
+
+	/** The string of the context menu entry. */
+	public static final String UPDATE_IN_CONTEXT_MENU_STRING = "Update in Reuse Library";
 
 	/** {@inheritDoc} */
 	@Override
@@ -104,7 +107,7 @@ public class UpdateInLibContextMenu implements IContextMenuContributor {
 			return;
 		}
 
-		EObject originalLibraryElement = checkForElementInLibrary(library, referencingSpec, shellTitle);
+		EObject originalLibraryElement = checkForElementInLibrary(library, referencingSpec, SHELL_TITLE);
 		if (originalLibraryElement == null) {
 			return;
 		}
@@ -113,13 +116,13 @@ public class UpdateInLibContextMenu implements IContextMenuContributor {
 		try {
 			saveReuseLibrary(library);
 		} catch (Exception e) {
-			openError(getActiveWorkbenchWindow().getShell(), "Error in '" + shellTitle + "'", e.getMessage());
+			openError(getActiveWorkbenchWindow().getShell(), "Error in '" + SHELL_TITLE + "'", e.getMessage());
 		}
 
 		PrototypeService.getInstance().updatePrototypes();
 
 		String currentActionType = "updateInLibrary";
-		manageExternalReferencesOfReuseElement(newElement, currentActionType, shellTitle);
+		manageExternalReferencesOfReuseElement(newElement, currentActionType, SHELL_TITLE);
 	}
 
 	/** The action "update element in {@link ReuseLibrary}". */
@@ -133,26 +136,27 @@ public class UpdateInLibContextMenu implements IContextMenuContributor {
 
 		/** Constructor. Takes the selected element as input. */
 		UpdateInLibAction(EObject element) {
-			super("Update In Reuse Library", ToolingReuseUIActivator.getImageDescriptor("icons/update_in_library.png"));
+			super(UPDATE_IN_CONTEXT_MENU_STRING,
+					ToolingReuseUIActivator.getImageDescriptor("icons/update_in_library.png"));
 			selectedElement = element;
 		}
 
 		/** {@inheritDoc} */
 		@Override
 		public void run() {
-			ReuseElementSpec correctLibrarySpec = selectCorrectReuseSpec(selectedElement, shellTitle);
+			ReuseElementSpec correctLibrarySpec = selectCorrectReuseSpec(selectedElement, SHELL_TITLE);
 			if (correctLibrarySpec == null) {
 				return;
 			}
 			ReuseLibrary correctLibrary = getLocalReuseLibraryByID(correctLibrarySpec.getSourceLibUUID());
 
 			if (correctLibrary == null) {
-				warnOfMissingLib(correctLibrarySpec, shellTitle);
+				warnOfMissingLib(correctLibrarySpec, SHELL_TITLE);
 				return;
 			}
 
 			// find original element inside the library
-			EObject originalLibraryElement = checkForElementInLibrary(correctLibrary, correctLibrarySpec, shellTitle);
+			EObject originalLibraryElement = checkForElementInLibrary(correctLibrary, correctLibrarySpec, SHELL_TITLE);
 			if (originalLibraryElement == null) {
 				return;
 			}
@@ -175,7 +179,7 @@ public class UpdateInLibContextMenu implements IContextMenuContributor {
 			textLines.add("\n- Update target: element in library");
 			textLines.add("    > element name: " + currentNameInLibrary);
 			textLines.add("    > in library: " + getLibraryIDName(correctLibrary));
-			boolean confirmed = confirm(shellTitle, join("\n", textLines));
+			boolean confirmed = confirm(SHELL_TITLE, join("\n", textLines));
 
 			if (!confirmed) {
 				return;
@@ -192,7 +196,7 @@ public class UpdateInLibContextMenu implements IContextMenuContributor {
 			}
 
 			// ask for element name (when updating element in library)
-			final InputDialog updateDialog = new InputDialog(Display.getCurrent().getActiveShell(), shellTitle,
+			final InputDialog updateDialog = new InputDialog(Display.getCurrent().getActiveShell(), SHELL_TITLE,
 					"Enter the name with which the element should be updated in the library '"
 							+ getReuseElementName(correctLibrary) + "':\n(Current name in library: "
 							+ currentNameInLibrary + ")\n ",
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/dialog/.ratings b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/dialog/.ratings
index 03766cb932a49b4a9f8f69a516cb5267d5379971..dbfd77231264fbfac3c33cbdb9ce554213cc39e5 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/dialog/.ratings
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/dialog/.ratings
@@ -1,2 +1,2 @@
-AddElementToLibDialog.java a67b6f17964c28c20c05051d2d64837f617aa7f1 GREEN
+AddElementToLibDialog.java 357ddbf24d5e1776ae248c611ab6b40861cc548b GREEN
 SelectLibDialog.java dce5cabd034a8a517d782fae05bda7b183b11bc6 GREEN
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/dialog/AddElementToLibDialog.java b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/dialog/AddElementToLibDialog.java
index a67b6f17964c28c20c05051d2d64837f617aa7f1..357ddbf24d5e1776ae248c611ab6b40861cc548b 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/dialog/AddElementToLibDialog.java
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/dialog/AddElementToLibDialog.java
@@ -24,7 +24,7 @@ import static org.eclipse.swt.SWT.LEFT;
 import static org.eclipse.swt.SWT.NONE;
 import static org.eclipse.swt.SWT.READ_ONLY;
 import static org.eclipse.swt.SWT.TITLE;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getLibraryIDName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getLibraryIDName;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/prototypes/.ratings b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/prototypes/.ratings
index ca4dcdc6b95dc304832373532d4e803eadf544ea..1b7f53a38f57c568b1110ed607bdbc016c2bd2f0 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/prototypes/.ratings
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/prototypes/.ratings
@@ -1 +1 @@
-PrototypeProvider.java 98466335d6927db689639642159db43acd244ad9 GREEN
+PrototypeProvider.java 76ee1b194635f76b1ca09f93ac37f8155b53ddb5 GREEN
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/prototypes/PrototypeProvider.java b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/prototypes/PrototypeProvider.java
index 98466335d6927db689639642159db43acd244ad9..76ee1b194635f76b1ca09f93ac37f8155b53ddb5 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/prototypes/PrototypeProvider.java
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/prototypes/PrototypeProvider.java
@@ -15,8 +15,8 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.ext.reuse.ui.prototypes;
 
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getAllLocalReuseLibraries;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getAllLocalReuseLibraries;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementName;
 
 import java.util.List;
 
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/utils/.ratings b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/utils/.ratings
index f8ebe946826e510a18c7e00f58b007d7e7d1411e..e057b2fb5a0d78886b8f9ca83ae197146e330326 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/utils/.ratings
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/utils/.ratings
@@ -1,2 +1,2 @@
-ReuseLibraryUIUtils.java 18f5bdc0a80ebdaab235f912217df85884e88d01 GREEN
+ReuseLibraryUIUtils.java fed62784975bf8e6fc1625505636e247dfb6c86e GREEN
 ReuseLibraryViewUtils.java 34a852dc692ec56cb3e9fd8dcea99d64f31503b3 GREEN
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/utils/ReuseLibraryUIUtils.java b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/utils/ReuseLibraryUIUtils.java
index 18f5bdc0a80ebdaab235f912217df85884e88d01..fed62784975bf8e6fc1625505636e247dfb6c86e 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/utils/ReuseLibraryUIUtils.java
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/utils/ReuseLibraryUIUtils.java
@@ -16,15 +16,18 @@
 package org.fortiss.tooling.ext.reuse.ui.utils;
 
 import static java.lang.String.join;
+import static javafx.scene.control.Alert.AlertType.INFORMATION;
+import static org.conqat.ide.commons.ui.dialog.MessageUtils.askQuestion;
 import static org.conqat.ide.commons.ui.dialog.MessageUtils.showInfo;
 import static org.conqat.ide.commons.ui.dialog.MessageUtils.showWarning;
 import static org.conqat.ide.commons.ui.ui.WorkbenchUtils.getActiveWorkbenchWindow;
+import static org.fortiss.tooling.common.ui.javafx.util.GraphicUtils.getFXImage;
 import static org.fortiss.tooling.ext.reuse.storage.ReuseLibraryStorageManager.REUSE_PROJECT_DIR;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getAllReuseSpecs;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getElementInsideLibrary;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getExternalReferencesOfElement;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getLibraryIDNameFormat;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getAllReuseSpecs;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getElementInsideLibrary;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getExternalReferencesOfElement;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getLibraryIDNameFormat;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementName;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -34,8 +37,16 @@ import org.eclipse.swt.widgets.Shell;
 import org.fortiss.tooling.base.model.element.IModelElement;
 import org.fortiss.tooling.ext.reuse.model.ReuseElementSpec;
 import org.fortiss.tooling.ext.reuse.model.ReuseLibrary;
+import org.fortiss.tooling.ext.reuse.ui.ToolingReuseUIActivator;
 import org.fortiss.tooling.ext.reuse.ui.dialog.SelectLibDialog;
 
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.control.DialogPane;
+import javafx.scene.control.TextArea;
+import javafx.scene.image.Image;
+import javafx.stage.Stage;
+
 /**
  * Utility methods for {@link ReuseLibrary}s' UI.
  *
@@ -43,6 +54,12 @@ import org.fortiss.tooling.ext.reuse.ui.dialog.SelectLibDialog;
  */
 public class ReuseLibraryUIUtils {
 
+	/** Standard width preference for dialog windows used in the reuse context. */
+	private final static Double DIALOG_WINDOW_WIDTH_PREF = 700.0;
+
+	/** Standard height preference for dialog windows used in the reuse context. */
+	private final static Double DIALOG_WINDOW_HEIGHT_PREF = 500.0;
+
 	/**
 	 * Returns the selected {@link ReuseElementSpec} by user from all
 	 * {@link ReuseElementSpec}s of the given element. Returns null if no
@@ -54,29 +71,76 @@ public class ReuseLibraryUIUtils {
 	 * @return The {@link ReuseElementSpec} selected by the user
 	 */
 	public static ReuseElementSpec selectCorrectReuseSpec(EObject element, String dialogTitle) {
-		List<ReuseElementSpec> specs = getAllReuseSpecs((IModelElement) element);
-		if (specs.size() == 1) {
-			// get(0) is safe due to size check
-			return specs.get(0);
-		} else if (specs.size() > 1) {
-			// ask for selection
-			List<String> referencedLibrarySelection = new ArrayList<String>();
-			for (ReuseElementSpec spec : specs) {
-				referencedLibrarySelection.add(getLibraryIDNameFormat(spec.getSourceLibUUID(), spec.getSourceLibName())
-						+ " with reference to element '" + spec.getElementName() + "'");
-			}
-			final Shell shell = getActiveWorkbenchWindow().getShell();
-			final SelectLibDialog selectLibraryDialog = new SelectLibDialog(shell, dialogTitle);
-			selectLibraryDialog.setLibraryNameList(referencedLibrarySelection);
-			selectLibraryDialog.open();
+		if (element instanceof IModelElement) {
+			List<ReuseElementSpec> specs = getAllReuseSpecs((IModelElement) element);
+			if (specs.size() == 1) {
+				// get(0) is safe due to size check
+				return specs.get(0);
+			} else if (specs.size() > 1) {
+				// ask for selection
+				List<String> referencedLibrarySelection = new ArrayList<String>();
+				for (ReuseElementSpec spec : specs) {
+					referencedLibrarySelection
+							.add(getLibraryIDNameFormat(spec.getSourceLibUUID(), spec.getSourceLibName())
+									+ " with reference to element '" + spec.getElementName() + "'");
+				}
+				final Shell shell = getActiveWorkbenchWindow().getShell();
+				final SelectLibDialog selectLibraryDialog = new SelectLibDialog(shell, dialogTitle);
+				selectLibraryDialog.setLibraryNameList(referencedLibrarySelection);
+				selectLibraryDialog.open();
 
-			if (selectLibraryDialog.goAhead()) {
-				return specs.get(selectLibraryDialog.getSelectionIndex());
+				if (selectLibraryDialog.goAhead()) {
+					return specs.get(selectLibraryDialog.getSelectionIndex());
+				}
 			}
 		}
 		return null;
 	}
 
+	/**
+	 * Returns whether the user wants to keep all the additional
+	 * {@link ReuseElementSpec}s in the given reuse {@link EObject} besides the
+	 * given main {@link ReuseElementSpec} or wants to override/delete all of them.
+	 * If no additional {@link ReuseElementSpec} was found, it will return true.
+	 *
+	 * @param element       The target reuse element (containing the library
+	 *                      references)
+	 * @param mainReference The main library reference to which the others are
+	 *                      additional
+	 * @param dialogTitle   The title for the dialog with the user
+	 * @return True if (possible) additional library references should be kept or
+	 *         false if they should be overridden
+	 */
+	public static boolean isKeepingAdditionalReferencesRequested(EObject element, ReuseElementSpec mainReference,
+			String dialogTitle) {
+		if (element instanceof IModelElement) {
+			List<ReuseElementSpec> specs = getAllReuseSpecs((IModelElement) element);
+			// only if we have any additional references/reuse specifications, we need to
+			// ask (otherwise keeping is false, because "not existing refs/specs" do not be
+			// need to kept)
+			if (specs.size() > 1) {
+				List<String> additionalLibraryReferences = new ArrayList<String>();
+				for (ReuseElementSpec spec : specs) {
+					if (spec != mainReference) {
+						additionalLibraryReferences.add(
+								"- Library '" + getLibraryIDNameFormat(spec.getSourceLibUUID(), spec.getSourceLibName())
+										+ "' with '" + spec.getElementName() + "' as element name in the library");
+					}
+				}
+
+				List<String> textLines = new ArrayList<String>();
+				textLines.add("The following additional library references were found in the selected element:");
+				textLines.addAll(additionalLibraryReferences);
+				textLines.add("\nDo you want to keep them after the update?");
+				textLines.add(
+						"- Yes: All additional (old) references will be kept together with the one of the current update.");
+				textLines.add("- No: Then, only the library reference of the current update will further exist.");
+				return askQuestion(dialogTitle, join("\n", textLines));
+			}
+		}
+		return false;
+	}
+
 	/**
 	 * Returns the original element inside the given {@link ReuseLibrary} referenced
 	 * by the given {@link ReuseElementSpec}. Also, displays warning (with
@@ -90,7 +154,8 @@ public class ReuseLibraryUIUtils {
 	 */
 	public static EObject checkForElementInLibrary(ReuseLibrary library, ReuseElementSpec referencingSpec,
 			String dialogTitle) {
-		EObject originalElementInLibrary = getElementInsideLibrary(library, referencingSpec);
+		String targetUuid = referencingSpec.getElementUUID();
+		EObject originalElementInLibrary = getElementInsideLibrary(library, targetUuid);
 		if (originalElementInLibrary == null) {
 			warnOfMissingReuseElem(referencingSpec, dialogTitle);
 		}
@@ -182,18 +247,84 @@ public class ReuseLibraryUIUtils {
 
 		List<EObject> externalRefs = getExternalReferencesOfElement(reuseElement);
 		if (!externalRefs.isEmpty()) {
-			String infoMessage = "The following elements were found as references inside the reuse element you "
+			String headerText = "The following elements were found as references inside the reuse element you "
 					+ actionText + ".\n\nIn case of reusing this element" + currentReuseTest
 					+ ", these referenced elements will be needed in the new environment, too. "
 					+ "Therefore, you might want to add/update these reference elements as well (if not already done).\n";
+			String bodyText = "";
 			for (EObject externalRef : externalRefs) {
-				infoMessage += "\n- " + getReuseElementName(externalRef) + " (" + externalRef.getClass().getSimpleName()
+				bodyText += "\n- " + getReuseElementName(externalRef) + " (" + externalRef.getClass().getSimpleName()
 						+ ")";
 				if (getReuseElementName(externalRef).equals(getReuseElementName(reuseElement))) {
-					infoMessage += " [ignore this if it is actually " + sourceText + "]";
+					bodyText += " [ignore this if it is actually " + sourceText + "]";
 				}
 			}
-			showInfo(infoTitle, infoMessage);
+
+			showBasicScrollableInformation(shellTitle, headerText, bodyText);
+		}
+	}
+
+	/**
+	 * Creates and displays a information box with only an OK button. Everything is
+	 * already set except the text for the title, the header and the body.
+	 *
+	 * @param windowTitle The title of the dialog window
+	 * @param headerText  The text of the header between title and body
+	 * @param bodyText    The actual text body
+	 */
+	public static void showBasicScrollableInformation(String windowTitle, String headerText, String bodyText) {
+		boolean showSymbol = true;
+		showCustomScrollableAlert(INFORMATION, windowTitle, headerText, bodyText, showSymbol, DIALOG_WINDOW_WIDTH_PREF,
+				DIALOG_WINDOW_HEIGHT_PREF);
+	}
+
+	/**
+	 * Creates and displays a dialog/alert message box depending on the given
+	 * {@link AlertType}. You can customize the title, the text in the header, if
+	 * the symbol besides the header should be displayed, the actual text body and
+	 * the preferred size of the window (null if nothing is preferred).
+	 *
+	 * @param alertType        The alert type like Information, Error, etc.
+	 * @param windowTitle      The title of the dialog window
+	 * @param headerText       The text of the header between title and body
+	 * @param bodyText         The actual text body
+	 * @param showSymbol       Whether the symbol besides the header text should be
+	 *                         displayed
+	 * @param windowPrefWidth  Preferred width of the window
+	 * @param windowPrefHeight Preferred height of the window
+	 */
+	public static void showCustomScrollableAlert(AlertType alertType, String windowTitle, String headerText,
+			String bodyText, boolean showSymbol, Double windowPrefWidth, Double windowPrefHeight) {
+
+		Alert alert = new Alert(alertType);
+
+		if (!showSymbol) {
+			alert.setGraphic(null);
 		}
+		alert.setTitle(windowTitle);
+		alert.setHeaderText(headerText);
+		alert.setResizable(true);
+
+		TextArea area = new TextArea(bodyText);
+		area.setWrapText(true);
+		area.setEditable(false);
+
+		DialogPane dialogPane = alert.getDialogPane();
+		Image taskbarIcon = getFXImage(ToolingReuseUIActivator.PLUGIN_ID, "icons/af3_icon64.png");
+		Stage stage = (Stage) dialogPane.getScene().getWindow();
+		stage.getIcons().add(taskbarIcon);
+
+		// use setExpandableContent(area) if the scrollable text should be first hidden
+		// under "Show details". Then, alert.setContentText() can be used to show a
+		// short message before
+		dialogPane.setContent(area);
+		if (windowPrefWidth != null && windowPrefWidth > 0.0) {
+			dialogPane.setPrefWidth(windowPrefWidth);
+		}
+		if (windowPrefHeight != null && windowPrefHeight > 0.0) {
+			dialogPane.setPrefHeight(windowPrefHeight);
+		}
+
+		alert.showAndWait();
 	}
 }
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/.ratings b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/.ratings
index 01d2021bde4225d8944c89e5a8eeb21a8b24478f..9eb40bc71af4b99867d53e66c40d4fcb786b8a73 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/.ratings
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/.ratings
@@ -1,5 +1,5 @@
 IReuseLibraryViewPart.java 5a1764ffae9cf35b94bd8b640f82daa95c44c8ac GREEN
-ReuseLibraryFXContentProvider.java 3fc54cb4c0449810bcfe65bf6a4e1ec1ae04a1d8 GREEN
-ReuseLibraryFXController.java e3c65d5785aedef2025c32f5da91943e446a09d6 GREEN
-ReuseLibraryFXTreeTableUIProvider.java 7d1b513e3613621b72aaff3d334243c94236e439 GREEN
+ReuseLibraryFXContentProvider.java 4cd1ca617347c9edbcca0d7b3e0d3d6c1dbd6a38 GREEN
+ReuseLibraryFXController.java f559c4bad03607089394c48b2517ac778812a91e GREEN
+ReuseLibraryFXTreeTableUIProvider.java b7414ba62e6fe40358886b18906a87c92c0f75a6 GREEN
 ReuseLibraryFXViewPart.java d4664c851e485e1d6c349a23952db69093ef25dc GREEN
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXContentProvider.java b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXContentProvider.java
index 3fc54cb4c0449810bcfe65bf6a4e1ec1ae04a1d8..4cd1ca617347c9edbcca0d7b3e0d3d6c1dbd6a38 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXContentProvider.java
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXContentProvider.java
@@ -16,11 +16,11 @@
 package org.fortiss.tooling.ext.reuse.ui.view.fx;
 
 import static java.util.Collections.emptyList;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementComment;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementLastUpdateString;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementName;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementUUID;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.isCorrectReuseElementOrLibrary;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getFirstReuseElementUUID;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementComment;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementLastUpdateString;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.isCorrectReuseElementOrLibrary;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -86,14 +86,17 @@ public class ReuseLibraryFXContentProvider extends DynamicTreeContentProviderBas
 			}
 
 			boolean matchFound = false;
+			boolean isForDisplay = true;
 			for (EObject elementToCheck : elementsToCheck) {
 				String elementName = getReuseElementName(elementToCheck);
-				String elementUUID = getReuseElementUUID(elementToCheck);
-				String elementUpdateDate = getReuseElementLastUpdateString(elementToCheck);
+				String elementUUID = getFirstReuseElementUUID(elementToCheck);
+				String elementUpdateDateForDisplay = getReuseElementLastUpdateString(elementToCheck, isForDisplay);
+				String elementUpdateDateForInternalUse = getReuseElementLastUpdateString(elementToCheck, !isForDisplay);
 				String elementComment = getReuseElementComment(elementToCheck);
 
 				matchFound = isNameMatchForFilter(elementName, filter) || isNameMatchForFilter(elementUUID, filter)
-						|| isNameMatchForFilter(elementUpdateDate, filter)
+						|| isNameMatchForFilter(elementUpdateDateForDisplay, filter)
+						|| isNameMatchForFilter(elementUpdateDateForInternalUse, filter)
 						|| isNameMatchForFilter(elementComment, filter);
 				if (matchFound) {
 					return true;
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXController.java b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXController.java
index e3c65d5785aedef2025c32f5da91943e446a09d6..f559c4bad03607089394c48b2517ac778812a91e 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXController.java
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXController.java
@@ -16,7 +16,7 @@
 package org.fortiss.tooling.ext.reuse.ui.view.fx;
 
 import static java.util.Collections.emptyList;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getAllLocalReuseLibraries;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getAllLocalReuseLibraries;
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
diff --git a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXTreeTableUIProvider.java b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXTreeTableUIProvider.java
index 7d1b513e3613621b72aaff3d334243c94236e439..b7414ba62e6fe40358886b18906a87c92c0f75a6 100644
--- a/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXTreeTableUIProvider.java
+++ b/org.fortiss.tooling.ext.reuse.ui/src/org/fortiss/tooling/ext/reuse/ui/view/fx/ReuseLibraryFXTreeTableUIProvider.java
@@ -17,17 +17,17 @@ package org.fortiss.tooling.ext.reuse.ui.view.fx;
 
 import static org.conqat.ide.commons.ui.dialog.MessageUtils.confirm;
 import static org.eclipse.jface.window.Window.OK;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.deleteReuseElementInLibraryFile;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.deleteReuseLibrary;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getAllLocalReuseLibraries;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getFirstSourceLibraryOfElement;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getLibraryIDName;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementComment;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementLastUpdateString;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementName;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementUUID;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.updateReuseElementFileWithComment;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.updateReuseElementFileWithName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getAllLocalReuseLibraries;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getFirstReuseElementUUID;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getFirstSourceLibraryOfElement;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getLibraryIDName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementComment;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementLastUpdateString;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsManipulation.deleteReuseElementInLibraryFile;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsManipulation.deleteReuseLibrary;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsManipulation.updateReuseElementFileWithComment;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsManipulation.updateReuseElementFileWithName;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -88,10 +88,11 @@ final class ReuseLibraryFXTreeTableUIProvider extends DynamicTreeTableUIProvider
 			}
 		case 2:
 			// UUID
-			return getReuseElementUUID(element);
+			return getFirstReuseElementUUID(element);
 		case 3:
 			// Last Update
-			return getReuseElementLastUpdateString(element);
+			boolean stringIsForDisplay = true;
+			return getReuseElementLastUpdateString(element, stringIsForDisplay);
 		case 4:
 			// Comment
 			return getReuseElementComment(element);
diff --git a/org.fortiss.tooling.ext.reuse/META-INF/MANIFEST.MF b/org.fortiss.tooling.ext.reuse/META-INF/MANIFEST.MF
index 95cf04b2e170fbd1a3d9499d0e4edd681b6e75a4..63c7277ad71516a7358c66a25e93bfe90674a069 100644
--- a/org.fortiss.tooling.ext.reuse/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.ext.reuse/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Automatic-Module-Name: org.fortiss.tooling.ext.reuse
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.fortiss.tooling.ext.reuse;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/org.fortiss.tooling.ext.reuse/html/developer/.ratings b/org.fortiss.tooling.ext.reuse/html/developer/.ratings
index 12d1ff647b92df5e5248af9a3d81a70d6b574621..bebc3732e2b3150c74d3cec62463ed86f3d7b61f 100644
--- a/org.fortiss.tooling.ext.reuse/html/developer/.ratings
+++ b/org.fortiss.tooling.ext.reuse/html/developer/.ratings
@@ -1 +1 @@
-documentation.html c61291c1f8f77b6a418ba24cd29c2cfa7f661696 GREEN
+documentation.html 99fa035c6b4de639d7ca4cd73380a02d3e364e80 GREEN
diff --git a/org.fortiss.tooling.ext.reuse/html/developer/documentation.html b/org.fortiss.tooling.ext.reuse/html/developer/documentation.html
index c61291c1f8f77b6a418ba24cd29c2cfa7f661696..99fa035c6b4de639d7ca4cd73380a02d3e364e80 100644
--- a/org.fortiss.tooling.ext.reuse/html/developer/documentation.html
+++ b/org.fortiss.tooling.ext.reuse/html/developer/documentation.html
@@ -15,11 +15,24 @@
 <p>This plugin contains the basic functionality of reuse in AF3 projects. 
 With it a user can create reuse libraries that are stored in a separate local project. 
 These libraries can store supported reuse elements (which are standard AF3 elements to 
-which a reuse specification is added). The stored reuse elements are displayed in the model
+which a reuse specification is added; see below). The stored reuse elements are displayed in the model
 elements view and can be drag & dropped from there in AF3 projects. They are still linked
 with their libraries, which is why the elements can be updated at any time from the library
 and vice versa (update the original element inside the library). Currently supported AF3 
-elements for reuse are: components, requirements and entries of data dictionaries.</p>
+elements for reuse are: components, tasks, requirements and entries of data dictionaries (functions, structures, enumerations).</p>
+
+
+<p>If an AF3 element supports reuse libraries, it can get a reuse specification (not directly visible in AF3). 
+As soon as it has at least one reuse specification, the AF3 element is now a reuse element. It looks still 
+like the usual AF3 element and can also be used like before, but it has now at least one reference to a reuse 
+library via this reuse specification (or several reuse libraries if it has several reuse specifications). 
+If an AF3 element has a reuse specification, it means that an identical AF3 element ("deep copy") exists now 
+in this referenced reuse library. It is now possible to reuse this AF3 element from the reuse library and 
+insert it again in the same project but also in other projects of the same workspace or even of other workspaces
+(and exchange updates). </p>
+
+<p>Through the UUIDs and the reuse specifications it is ensured that you can only propagate modifications 
+between (reuse) elements that are connected due to their (reuse) origin. </p>
 
 <h1><font size="5" style="font-size: 20pt">Package description</font></h1>
 <p>The plugin contains the following packages (besides standard ones): 
diff --git a/org.fortiss.tooling.ext.reuse/model/.ratings b/org.fortiss.tooling.ext.reuse/model/.ratings
index b0d7f7fe907c1d8e2f05d4b5fc918a3215895bda..262cbb57ccf90af2891fa17e35af499fc54f10a6 100644
--- a/org.fortiss.tooling.ext.reuse/model/.ratings
+++ b/org.fortiss.tooling.ext.reuse/model/.ratings
@@ -1 +1 @@
-reuse.ecore 25970c708374ed809312d31e49b682f954204d00 GREEN
+reuse.ecore 44b0eed2f51c4b529a6a31b2f74025020e758b5e GREEN
diff --git a/org.fortiss.tooling.ext.reuse/model/reuse.ecore b/org.fortiss.tooling.ext.reuse/model/reuse.ecore
index 25970c708374ed809312d31e49b682f954204d00..44b0eed2f51c4b529a6a31b2f74025020e758b5e 100644
--- a/org.fortiss.tooling.ext.reuse/model/reuse.ecore
+++ b/org.fortiss.tooling.ext.reuse/model/reuse.ecore
@@ -41,7 +41,7 @@
         <details key="documentation" value="The UUID of the reuse library in which the reuse element (to which this specification is attached to) is stored. "/>
       </eAnnotations>
     </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lastUpdate" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lastUpdate" eType="#//EZonedDateTime">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
         <details key="documentation" value="The date at which the reuse element (to which this specification is attached to) was updated the latest. "/>
       </eAnnotations>
@@ -52,4 +52,5 @@
       </eAnnotations>
     </eStructuralFeatures>
   </eClassifiers>
+  <eClassifiers xsi:type="ecore:EDataType" name="EZonedDateTime" instanceClassName="java.time.ZonedDateTime"/>
 </ecore:EPackage>
diff --git a/org.fortiss.tooling.ext.reuse/model/reuse.genmodel b/org.fortiss.tooling.ext.reuse/model/reuse.genmodel
index 84c5330e34e20549d18d97c50542f97833729323..d300aedd00851e58ff1e1471b88ac97496537289 100644
--- a/org.fortiss.tooling.ext.reuse/model/reuse.genmodel
+++ b/org.fortiss.tooling.ext.reuse/model/reuse.genmodel
@@ -9,6 +9,8 @@
   <foreignModel>reuse.ecore</foreignModel>
   <genPackages prefix="AF3Reuse" basePackage="org.fortiss.tooling.ext.reuse" disposableProviderFactory="true"
       ecorePackage="reuse.ecore#/">
+    <genDataTypes ecoreDataType="reuse.ecore#//EZonedDateTime" create="return java.time.ZonedDateTime.parse(it);"
+        convert="return java.time.format.DateTimeFormatter.ISO_ZONED_DATE_TIME.format(it);"/>
     <genClasses ecoreClass="reuse.ecore#//ReuseLibrary">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference reuse.ecore#//ReuseLibrary/reuseElementList"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute reuse.ecore#//ReuseLibrary/libraryUUID"/>
diff --git a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/compose/.ratings b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/compose/.ratings
index 0a2cc9d6183ed8a74b9e8e3d31b87b9515be215f..54c2438733c30968895838726c82a56dc311f657 100644
--- a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/compose/.ratings
+++ b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/compose/.ratings
@@ -1 +1 @@
-ReuseLibraryCompositor.java 184297737ee36bac8514687d0f5accf0d87d1159 GREEN
+ReuseLibraryCompositor.java be959527c044c842362146503f4eddf2ea378f97 GREEN
diff --git a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/compose/ReuseLibraryCompositor.java b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/compose/ReuseLibraryCompositor.java
index 184297737ee36bac8514687d0f5accf0d87d1159..be959527c044c842362146503f4eddf2ea378f97 100644
--- a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/compose/ReuseLibraryCompositor.java
+++ b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/compose/ReuseLibraryCompositor.java
@@ -15,7 +15,7 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.ext.reuse.compose;
 
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.hasReusePossibility;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.hasReusePossibility;
 
 import org.eclipse.emf.ecore.EObject;
 import org.fortiss.tooling.base.compose.ModelElementCompositorBase;
diff --git a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/.ratings b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/.ratings
index 37d493d105bc298fe0fab3ade2dd8632200ab264..0037e17bc479904365d87a17f6aebae128fcc1e4 100644
--- a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/.ratings
+++ b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/.ratings
@@ -1,2 +1,3 @@
-ReuseLibraryModelElementFactory.java 2e7e8f0b3b6a93225204bfbfc6223e28c2bd69b4 GREEN
-ReuseLibraryUtils.java 9ba005d6be2e2e2fc0c8635a9567c000b8dd9e9b GREEN
+ReuseLibraryModelElementFactory.java 4ee3eb7449e212643992a3dec6cfb8f4278efb70 GREEN
+ReuseLibraryUtilsBasics.java b651b31f6d94ff98a8f965440d662bfc4655c31b GREEN
+ReuseLibraryUtilsManipulation.java 77a646db5a63ba7c61664dbcaf34a9036003fde5 GREEN
diff --git a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryModelElementFactory.java b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryModelElementFactory.java
index 2e7e8f0b3b6a93225204bfbfc6223e28c2bd69b4..4ee3eb7449e212643992a3dec6cfb8f4278efb70 100644
--- a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryModelElementFactory.java
+++ b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryModelElementFactory.java
@@ -16,12 +16,16 @@
 package org.fortiss.tooling.ext.reuse.utils;
 
 import static org.eclipse.emf.ecore.util.EcoreUtil.generateUUID;
-import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtils.getReuseElementName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsBasics.getReuseElementName;
+import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryUtilsManipulation.createReuseHashAsString;
 
-import java.util.Date;
+import java.time.ZonedDateTime;
 import java.util.Random;
 
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.ENamedElement;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EContentAdapter;
 import org.fortiss.tooling.ext.reuse.model.AF3ReuseFactory;
 import org.fortiss.tooling.ext.reuse.model.ReuseElementSpec;
 import org.fortiss.tooling.ext.reuse.model.ReuseLibrary;
@@ -75,13 +79,32 @@ public class ReuseLibraryModelElementFactory {
 	 * @return The created reuse specification
 	 */
 	public static ReuseElementSpec createReuseElementSpec(EObject element, ReuseLibrary sourceLibrary) {
+		ZonedDateTime now = ZonedDateTime.now();
 		ReuseElementSpec spec = AF3ReuseFactory.eINSTANCE.createReuseElementSpec();
 		spec.setElementUUID(generateReuseUUID());
 		spec.setElementName(getReuseElementName(element));
-		spec.setElementHash("todo"); // TODO #4149 (low prio) create and use hash to detect updates
+		spec.setElementHash(createReuseHashAsString(element, now));
 		spec.setSourceLibUUID(sourceLibrary.getLibraryUUID());
 		spec.setSourceLibName(sourceLibrary.getName());
-		spec.setLastUpdate(new Date());
+		spec.setLastUpdate(now);
+
+		// if the new reuse element is changed, the update date needs to be updated
+		element.eAdapters().add(new EContentAdapter() {
+			@Override
+			public void notifyChanged(Notification notification) {
+				// only update if the change was not already a previous date update
+				Object feature = notification.getFeature();
+				if (feature instanceof ENamedElement) {
+					String featureName = ((ENamedElement) feature).getName();
+					if (!featureName.equals("lastUpdate")) {
+						spec.setLastUpdate(ZonedDateTime.now());
+					}
+				}
+
+				super.notifyChanged(notification);
+			}
+		});
+
 		return spec;
 	}
 
diff --git a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryUtilsBasics.java b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryUtilsBasics.java
new file mode 100644
index 0000000000000000000000000000000000000000..b651b31f6d94ff98a8f965440d662bfc4655c31b
--- /dev/null
+++ b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryUtilsBasics.java
@@ -0,0 +1,592 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2022 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.ext.reuse.utils;
+
+import static java.time.format.DateTimeFormatter.ISO_DATE_TIME;
+import static java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME;
+import static org.fortiss.tooling.ext.reuse.service.ReuseProviderService.getPossibleExternalReferenceClasses;
+import static org.fortiss.tooling.ext.reuse.service.ReuseProviderService.getReuseElementClasses;
+import static org.fortiss.tooling.ext.reuse.storage.ReuseLibraryStorageManager.getAllSeparatelyStoredReuseLibraries;
+import static org.fortiss.tooling.kernel.utils.EcoreUtils.getChildrenWithType;
+
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.fortiss.tooling.base.model.element.IModelElement;
+import org.fortiss.tooling.base.model.element.IModelElementSpecification;
+import org.fortiss.tooling.ext.reuse.model.ReuseElementSpec;
+import org.fortiss.tooling.ext.reuse.model.ReuseLibrary;
+import org.fortiss.tooling.ext.reuse.service.IReuseProviderService;
+import org.fortiss.tooling.kernel.model.INamedCommentedElement;
+import org.fortiss.tooling.kernel.model.INamedElement;
+
+/**
+ * Utility methods for {@link ReuseLibrary}s and related reuse elements and
+ * actions with basics like getters and setters.
+ *
+ * @author bergemann
+ */
+public class ReuseLibraryUtilsBasics {
+
+	/** Standard internal date format used for reuse (e.g. for hash dates) */
+	public final static DateTimeFormatter INTERNAL_REUSE_DATE_FORMATTER = ISO_DATE_TIME;
+
+	/** Standard date format used for reuse (easier readable) */
+	public final static DateTimeFormatter DISPLAY_REUSE_DATE_FORMATTER = RFC_1123_DATE_TIME;
+
+	/**
+	 * Returns whether the given element can be used as reuse element.
+	 *
+	 * @param element The element that should be checked
+	 * @return True if the given element can be used as reuse element otherwise
+	 *         false
+	 */
+	public static boolean hasReusePossibility(EObject element) {
+		for (Class<? extends EObject> cls : getReuseElementClasses()) {
+			if (cls.isInstance(element)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Returns whether the given element is a reuse element and has at least one
+	 * valid link to a {@link ReuseLibrary}.
+	 *
+	 * @param element The element that should be checked
+	 * @return True if the given element is a reuse element, otherwise false
+	 */
+	public static boolean isCorrectReuseElement(EObject element) {
+		// first, check if it is a (possible) reuse element in general
+		if (hasReusePossibility(element)) {
+			// second, check if it has a library reference
+			// (only then it is an actual (active) reuse element)
+			if (element instanceof IModelElement) {
+				for (IModelElementSpecification spec : ((IModelElement) element).getSpecifications()) {
+					if (spec instanceof ReuseElementSpec) {
+						String libID = ((ReuseElementSpec) spec).getSourceLibUUID();
+						if (libID != null && !libID.isEmpty()) {
+							return true;
+						}
+					}
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Returns whether the given element is a reuse element and has at least one
+	 * valid link to a {@link ReuseLibrary} OR is a {@link ReuseLibrary} itself.
+	 *
+	 * @param element The element that should be checked
+	 * @return True if the given element is a reuse element OR a reuse library,
+	 *         otherwise false
+	 */
+	public static boolean isCorrectReuseElementOrLibrary(EObject element) {
+		return (element instanceof ReuseLibrary) || isCorrectReuseElement(element);
+	}
+
+	/**
+	 * Returns display name of given {@link ReuseLibrary} (name and UUID).
+	 *
+	 * @param library The target reuse library
+	 * @return Display name as string
+	 */
+	public static String getLibraryIDName(ReuseLibrary library) {
+		return getLibraryIDNameFormat(library.getLibraryUUID(), library.getName());
+	}
+
+	/**
+	 * Returns the current format for displaying name and UUID of
+	 * {@link ReuseLibrary}s.
+	 *
+	 * @param libraryUUID The UUID of the target library
+	 * @param libraryName The name of the target library
+	 * @return Formatted string
+	 */
+	public static String getLibraryIDNameFormat(String libraryUUID, String libraryName) {
+		return libraryName + " (" + libraryUUID + ")";
+	}
+
+	/**
+	 * Returns the (converted) name of the given reuse element (or
+	 * {@link ReuseLibrary}), independent of the type as long as its class was
+	 * registered for reuse.
+	 *
+	 * @param element The target reuse element
+	 * @return Name as string
+	 */
+	public static String getReuseElementName(EObject element) {
+		if (element instanceof ReuseLibrary) {
+			return ((ReuseLibrary) element).getName();
+		}
+		String name = IReuseProviderService.getInstance().getReuseElementName(element);
+		if (name == null) {
+			if (element instanceof INamedElement) {
+				name = ((INamedElement) element).getName();
+			} else {
+				name = element.toString();
+			}
+		}
+		return name;
+	}
+
+	/**
+	 * Sets the name of the given reuse element (or {@link ReuseLibrary}),
+	 * independent of the type as long as its class was registered for reuse.
+	 *
+	 * @param element The target reuse element
+	 * @param name    The new name
+	 * @return True if action was successful, otherwise false
+	 */
+	public static boolean setReuseElementName(EObject element, String name) {
+		if (element instanceof ReuseLibrary) {
+			((ReuseLibrary) element).setName(name);
+			return true;
+		}
+		return IReuseProviderService.getInstance().setReuseElementName(element, name);
+	}
+
+	/**
+	 * Returns the comment of the given reuse element (or {@link ReuseLibrary}),
+	 * independent of the type as long as its class was registered for reuse.
+	 *
+	 * @param element The target reuse element
+	 * @return The requested comment as string
+	 */
+	public static String getReuseElementComment(EObject element) {
+		String comment = null;
+		if (element instanceof ReuseLibrary) {
+			comment = ((ReuseLibrary) element).getComment();
+		} else {
+			comment = IReuseProviderService.getInstance().getReuseElementComment(element);
+			if (comment == null) {
+				if (element instanceof INamedCommentedElement) {
+					comment = ((INamedCommentedElement) element).getComment();
+				}
+			}
+		}
+		return (comment == null) ? "" : comment;
+	}
+
+	/**
+	 * Sets the comment of the given reuse element (or {@link ReuseLibrary}),
+	 * independent of the type as long as its class was registered for reuse.
+	 *
+	 * @param element The target reuse element
+	 * @param comment The new comment
+	 * @return True if action was successful, otherwise false
+	 */
+	public static boolean setReuseElementComment(EObject element, String comment) {
+		if (element instanceof ReuseLibrary) {
+			((ReuseLibrary) element).setComment(comment);
+			return true;
+		}
+		return IReuseProviderService.getInstance().setReuseElementComment(element, comment);
+	}
+
+	/**
+	 * Returns the first UUID of the given reuse element (or {@link ReuseLibrary})
+	 * as long as it has (already) a {@link ReuseElementSpec}. If this is not the
+	 * case, an empty {@link String} will be returned. This method is perfect for
+	 * reuse elements within reuse libraries, because they have definitely only one
+	 * {@link ReuseElementSpec} and thus exactly one UUID (= the first one). Reuse
+	 * elements that are already placed in projects can have multiple
+	 * {@link ReuseElementSpec}s and thus multiple UUIDs, because they could have
+	 * been added to several {@link ReuseLibrary}s.
+	 *
+	 * @param element The target reuse element
+	 * @return The requested UUID as string (or empty string)
+	 */
+	public static String getFirstReuseElementUUID(EObject element) {
+		List<String> allUUIDs = getAllReuseElementUUID(element);
+		if (allUUIDs != null && !allUUIDs.isEmpty()) {
+			// get(0) is safe due to check above
+			return allUUIDs.get(0);
+		}
+		return "";
+	}
+
+	/**
+	 * Returns all UUIDs of the given reuse element (or {@link ReuseLibrary}) as
+	 * long as it has (already) at least one {@link ReuseElementSpec}. If this is
+	 * not the case, an empty list will be returned. This method exists because
+	 * reuse elements that are already placed in projects can have multiple
+	 * {@link ReuseElementSpec}s and thus multiple UUIDs, because they could have
+	 * been added to several {@link ReuseLibrary}s.
+	 *
+	 * @param element The target reuse element
+	 * @return The requested UUID as string (or empty string)
+	 */
+	public static List<String> getAllReuseElementUUID(EObject element) {
+		List<String> allUUIDs = new ArrayList<>();
+		if (element instanceof ReuseLibrary) {
+			allUUIDs.add(((ReuseLibrary) element).getLibraryUUID());
+		} else {
+			if (element instanceof IModelElement) {
+				List<ReuseElementSpec> specs = getAllReuseSpecs((IModelElement) element);
+				for (ReuseElementSpec spec : specs) {
+					allUUIDs.add(spec.getElementUUID());
+				}
+			}
+		}
+		return allUUIDs;
+	}
+
+	/**
+	 * Returns the UUID of the given reuse element that is stored in the
+	 * {@link ReuseElementSpec} which is connected to the given
+	 * {@link ReuseLibrary}. If such a {@link ReuseElementSpec} does not exist, an
+	 * empty {@link String} will be returned.
+	 *
+	 * @param element The target reuse element
+	 * @param library The reuse library to which the reuse UUID of the element
+	 *                should belong
+	 * @return The requested UUID as string (or empty string)
+	 */
+	public static String getReuseElementUUIDForLibrary(EObject element, ReuseLibrary library) {
+		if (element instanceof IModelElement) {
+			List<ReuseElementSpec> specs = getAllReuseSpecs((IModelElement) element);
+			for (ReuseElementSpec spec : specs) {
+				if (spec.getSourceLibUUID().equals(library.getLibraryUUID())) {
+					return spec.getElementUUID();
+				}
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * Returns the hash code string of the given reuse element for its origin inside
+	 * a specific (given) {@link ReuseLibrary}. If it cannot be found, an empty
+	 * {@link String} will be returned.
+	 *
+	 * @param element       The target reuse element
+	 * @param sourceLibrary The library of the original reuse element for the hash
+	 * @return The requested hash code as string (or empty string)
+	 */
+	public static String getReuseElementHashForLibrary(EObject element, ReuseLibrary sourceLibrary) {
+		String libraryUuid = sourceLibrary.getLibraryUUID();
+		if (element instanceof IModelElement) {
+			List<ReuseElementSpec> specs = getAllReuseSpecs((IModelElement) element);
+			for (ReuseElementSpec spec : specs) {
+				String referenceLibraryUuid = spec.getSourceLibUUID();
+				if (referenceLibraryUuid.equals(libraryUuid)) {
+					return spec.getElementHash();
+				}
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * Returns the Last Update Date of the given reuse element as
+	 * {@link ZonedDateTime} as long as it has (already) a {@link ReuseElementSpec}.
+	 * If this is not the case, null will be returned.
+	 *
+	 * @param element The target reuse element
+	 * @return The requested (update) date (or null)
+	 */
+	public static ZonedDateTime getReuseElementLastUpdate(EObject element) {
+		if (element instanceof IModelElement) {
+			List<ReuseElementSpec> specs = getAllReuseSpecs((IModelElement) element);
+			if (specs != null && !specs.isEmpty()) {
+				// get(0) is safe due to check above
+				return specs.get(0).getLastUpdate();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the Last Update Date of the given reuse element as formatted
+	 * {@link String} as long as it has (already) a {@link ReuseElementSpec}. If
+	 * this is not the case, an empty {@link String} will be returned.
+	 *
+	 * @param element    The target reuse element
+	 * @param forDisplay If it should be the format for user display or the one that
+	 *                   is internally used
+	 * @return The requested (update) date as string (or empty string)
+	 */
+	public static String getReuseElementLastUpdateString(EObject element, boolean forDisplay) {
+		ZonedDateTime updateDate = getReuseElementLastUpdate(element);
+		return getDateAsString(updateDate, forDisplay);
+	}
+
+	/**
+	 * Returns the given {@link ZonedDateTime} as formatted {@link String} as long
+	 * as it is valid, otherwise an empty {@link String} will be returned.
+	 *
+	 * @param date       The date
+	 * @param forDisplay If it should be the format for user display or the one that
+	 *                   is internally used
+	 * @return The requested date as string (or empty string)
+	 */
+	public static String getDateAsString(ZonedDateTime date, boolean forDisplay) {
+		if (date != null) {
+			if (forDisplay) {
+				return DISPLAY_REUSE_DATE_FORMATTER.format(date);
+			} else {
+				return INTERNAL_REUSE_DATE_FORMATTER.format(date);
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * Sets the Last Update Date of the given reuse element with the given {link
+	 * Date} as long as it has (already) a {@link ReuseElementSpec}.
+	 *
+	 * @param element The target reuse element
+	 * @param newDate The new (update) date
+	 */
+	public static void setReuseElementLastUpdate(EObject element, ZonedDateTime newDate) {
+		if (element instanceof IModelElement) {
+			for (ReuseElementSpec spec : getAllReuseSpecs((IModelElement) element)) {
+				spec.setLastUpdate(newDate);
+			}
+		}
+	}
+
+	/**
+	 * Sets the Last Update Date of the given reuse element with the current {link
+	 * ZonedDateTime} as long as it has (already) a {@link ReuseElementSpec}.
+	 *
+	 * @param element The target reuse element
+	 */
+	public static void setReuseElementLastUpdateNow(EObject element) {
+		setReuseElementLastUpdate(element, ZonedDateTime.now());
+	}
+
+	/**
+	 * Returns all {@link ReuseElementSpec}s of the given element to a
+	 * {@link ReuseLibrary}. If none exist, an empty list will be returned.
+	 *
+	 * @param element The target reuse element
+	 * @return A list of all found reuse specifications (or empty list)
+	 */
+	public static List<ReuseElementSpec> getAllReuseSpecs(IModelElement element) {
+		List<ReuseElementSpec> specs = new ArrayList<>();
+		for (IModelElementSpecification spec : element.getSpecifications()) {
+			if (spec instanceof ReuseElementSpec) {
+				// (cast is safe due to instance check)
+				specs.add((ReuseElementSpec) spec);
+			}
+		}
+		return specs;
+	}
+
+	/**
+	 * Returns the number of all {@link ReuseElementSpec}s of the given element.
+	 *
+	 * @param element The target reuse element
+	 * @return Number of all found reuse specifications
+	 */
+	public static int getNumberOfContainedReuseSpecs(EObject element) {
+		if (element instanceof IModelElement) {
+			return getAllReuseSpecs((IModelElement) element).size();
+		} else {
+			return 0;
+		}
+	}
+
+	/**
+	 * Returns the {@link ReuseElementSpec} of the given (project) reuse element
+	 * that is linked with the given reuse element inside a library. If none could
+	 * be found, null will be returned.
+	 *
+	 * @param projectElement The reuse element inside a project from which the reuse
+	 *                       specification should be selected
+	 * @param libraryElement The reuse element inside a library
+	 * @return The found/matched reuse specification (or null)
+	 */
+	public static ReuseElementSpec getReuseSpecLinkedToThisLibraryElement(IModelElement projectElement,
+			IModelElement libraryElement) {
+		List<ReuseElementSpec> projectSpecs = getAllReuseSpecs(projectElement);
+		List<ReuseElementSpec> librarySpecs = getAllReuseSpecs(libraryElement);
+		// elements in library must have only a single specification
+		if (librarySpecs.size() == 1) {
+			// get(0) is safe due to size check above
+			ReuseElementSpec librarySpec = librarySpecs.get(0);
+
+			for (ReuseElementSpec specToBeChecked : projectSpecs) {
+				// both UUIDs (of element and library) must be identical
+				if (specToBeChecked.getSourceLibUUID().equals(librarySpec.getSourceLibUUID())
+						&& specToBeChecked.getElementUUID().equals(librarySpec.getElementUUID())) {
+					return specToBeChecked;
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns all {@link ReuseLibrary}s that are present in the local workspace.
+	 * Will return empty list if no {@link ReuseLibrary} exists.
+	 *
+	 * @return A list of all local reuse libraries (or empty list)
+	 */
+	public static List<ReuseLibrary> getAllLocalReuseLibraries() {
+		// currently, this is just all existing local libraries which are stored
+		// separately in the library directory
+		return getAllSeparatelyStoredReuseLibraries();
+	}
+
+	/**
+	 * Returns the {@link ReuseLibrary} with the given UUID out of all local
+	 * {@link ReuseLibrary}. Will return null if no {@link ReuseLibrary} exists with
+	 * this UUID. Note: it will return the {@link ReuseLibrary} even if the folder
+	 * or file name is not correct (as long as it is in the reuse directory and has
+	 * the right UUID)!
+	 *
+	 * @param libraryUUID The UUID of the requested reuse library
+	 * @return The requested reuse library (or null)
+	 */
+	public static ReuseLibrary getLocalReuseLibraryByID(String libraryUUID) {
+		for (ReuseLibrary library : getAllLocalReuseLibraries()) {
+			if (libraryUUID.equals(library.getLibraryUUID())) {
+				return library;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the {@link ReuseLibrary} that is mentioned as source library in the
+	 * first {link ReuseElementSpec} of the given reuse element. If no {link
+	 * ReuseElementSpec} exists, the return will be null. This method is faster than
+	 * calling getAllSourceLibrariesOfElement() and returning the first library,
+	 * because it does not fetch all libraries - only the one of the first {link
+	 * ReuseElementSpec}.
+	 *
+	 * @param element The target reuse element
+	 * @return The requested reuse library (or null)
+	 */
+	public static ReuseLibrary getFirstSourceLibraryOfElement(EObject element) {
+		if (element instanceof IModelElement) {
+			List<ReuseElementSpec> specList = getAllReuseSpecs((IModelElement) element);
+			if (specList != null && !specList.isEmpty()) {
+				// get(0) is safe due to check above
+				String libraryUUID = specList.get(0).getSourceLibUUID();
+				return getLocalReuseLibraryByID(libraryUUID);
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns a list of {@link ReuseLibrary}s that are each mentioned as source
+	 * library in the {link ReuseElementSpec}s of the given reuse element. If no
+	 * {link ReuseElementSpec} exists, the return will be an empty list.
+	 *
+	 * @param element The target reuse element
+	 * @return All found reuse libraries for the given element (or empty list)
+	 */
+	public static List<ReuseLibrary> getAllSourceLibrariesOfElement(EObject element) {
+		List<ReuseLibrary> foundLibraries = new ArrayList<>();
+		if (element instanceof IModelElement) {
+			List<ReuseElementSpec> reuseSpecs = getAllReuseSpecs((IModelElement) element);
+			for (ReuseElementSpec reuseSpec : reuseSpecs) {
+				String libraryUUID = reuseSpec.getSourceLibUUID();
+				ReuseLibrary sourceLibrary = getLocalReuseLibraryByID(libraryUUID);
+				if (sourceLibrary != null) {
+					foundLibraries.add(sourceLibrary);
+				}
+			}
+		}
+		return foundLibraries;
+	}
+
+	/**
+	 * Returns the element that exists in the given {@link ReuseLibrary} and is
+	 * referenced by the given {@link ReuseElementSpec}. Returns null if it could
+	 * not be found.
+	 *
+	 * @param library     The target reuse library
+	 * @param elementUUID The UUID string of the requested element
+	 * @return The requested reuse element (or null)
+	 */
+	public static EObject getElementInsideLibrary(ReuseLibrary library, String elementUUID) {
+		// find original element inside the library by identical UUID
+		for (EObject libraryElement : library.getReuseElementList()) {
+			for (IModelElementSpecification spec : ((IModelElement) libraryElement).getSpecifications()) {
+				if (spec instanceof ReuseElementSpec) {
+					if (((ReuseElementSpec) spec).getElementUUID().equals(elementUUID)) {
+						return libraryElement;
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns a list of external elements that are used within the given element
+	 * (e.g. an external stored function inside a code specification of a
+	 * component). If nothing was found, an empty list is returned.
+	 *
+	 * @param element The target reuse element
+	 * @return A list of external elements referencing the target reuse element (or
+	 *         empty list)
+	 */
+	public static List<EObject> getExternalReferencesOfElement(EObject element) {
+		List<EObject> references = new ArrayList<>();
+		for (Class<? extends EObject> referenceClass : getPossibleExternalReferenceClasses()) {
+			for (EObject reference : getChildrenWithType(element, referenceClass)) {
+				references.add(reference);
+			}
+		}
+		return references;
+	}
+
+	/**
+	 * Returns a list with all found origin {@link EObject}s of the given
+	 * {@link EObject} that were in the meantime updated inside their referenced
+	 * {@link ReuseLibrary}. If no reuse reference could be found or if some could
+	 * be found but all of these origins have not changed until the given
+	 * {@link EObject} was reused based on the origin (i.e., the hash codes are
+	 * identical), an empty list will be returned.
+	 *
+	 * @param element The element whose reuse origin(s) should be checked for
+	 *                updates
+	 * @return List of elements that are reuse origins and were updated in the
+	 *         meantime
+	 */
+	public static List<EObject> getAllUpdatedOrigins(EObject element) {
+		List<EObject> updatedOrigins = new ArrayList<>();
+
+		List<ReuseLibrary> foundLibraries = getAllSourceLibrariesOfElement(element);
+
+		for (ReuseLibrary sourceLibrary : foundLibraries) {
+			String uuid = getReuseElementUUIDForLibrary(element, sourceLibrary);
+			EObject originElementInLib = getElementInsideLibrary(sourceLibrary, uuid);
+			String storedHashForThisLibrary = getReuseElementHashForLibrary(element, sourceLibrary);
+			String currentHashForThisLibrary = getReuseElementHashForLibrary(originElementInLib, sourceLibrary);
+			// if hashes are valid but different, the origin was updated
+			if (!storedHashForThisLibrary.isEmpty() && !currentHashForThisLibrary.isEmpty()) {
+				if (!storedHashForThisLibrary.equals(currentHashForThisLibrary)) {
+					updatedOrigins.add(originElementInLib);
+				}
+			}
+		}
+		return updatedOrigins;
+	}
+}
diff --git a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryUtils.java b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryUtilsManipulation.java
similarity index 54%
rename from org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryUtils.java
rename to org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryUtilsManipulation.java
index 9ba005d6be2e2e2fc0c8635a9567c000b8dd9e9b..77a646db5a63ba7c61664dbcaf34a9036003fde5 100644
--- a/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryUtils.java
+++ b/org.fortiss.tooling.ext.reuse/src/org/fortiss/tooling/ext/reuse/utils/ReuseLibraryUtilsManipulation.java
@@ -1,5 +1,5 @@
 /*-------------------------------------------------------------------------+
-| Copyright 2021 fortiss GmbH                                              |
+| Copyright 2022 fortiss GmbH                                              |
 |                                                                          |
 | Licensed under the Apache License, Version 2.0 (the "License");          |
 | you may not use this file except in compliance with the License.         |
@@ -18,16 +18,12 @@ package org.fortiss.tooling.ext.reuse.utils;
 import static org.eclipse.emf.ecore.util.EcoreUtil.delete;
 import static org.eclipse.emf.ecore.util.EcoreUtil.replace;
 import static org.fortiss.tooling.ext.reuse.ToolingReuseActivator.getDefault;
-import static org.fortiss.tooling.ext.reuse.service.ReuseProviderService.getPossibleExternalReferenceClasses;
-import static org.fortiss.tooling.ext.reuse.service.ReuseProviderService.getReuseElementClasses;
 import static org.fortiss.tooling.ext.reuse.storage.ReuseLibraryStorageManager.deleteReuseLibraryFolder;
-import static org.fortiss.tooling.ext.reuse.storage.ReuseLibraryStorageManager.getAllSeparatelyStoredReuseLibraries;
 import static org.fortiss.tooling.ext.reuse.storage.ReuseLibraryStorageManager.saveReuseLibrary;
 import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryModelElementFactory.createReuseElementSpec;
 import static org.fortiss.tooling.ext.reuse.utils.ReuseLibraryModelElementFactory.createReuseLibrary;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.copy;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.getAllReferencesSetting;
-import static org.fortiss.tooling.kernel.utils.EcoreUtils.getChildrenWithType;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.replaceEObjectReferences;
 import static org.fortiss.tooling.kernel.utils.LoggingUtils.error;
 import static org.fortiss.tooling.kernel.utils.LoggingUtils.showError;
@@ -36,11 +32,9 @@ import static org.fortiss.tooling.kernel.utils.UniqueIDUtils.getLargestID;
 import static org.fortiss.tooling.kernel.utils.UniqueIDUtils.removeDuplicateIds;
 
 import java.io.IOException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
+import java.time.ZonedDateTime;
 import java.util.ArrayList;
 import java.util.Comparator;
-import java.util.Date;
 import java.util.List;
 
 import org.eclipse.core.runtime.CoreException;
@@ -51,20 +45,18 @@ import org.fortiss.tooling.base.model.element.IConnection;
 import org.fortiss.tooling.base.model.element.IConnector;
 import org.fortiss.tooling.base.model.element.IHierarchicElement;
 import org.fortiss.tooling.base.model.element.IModelElement;
-import org.fortiss.tooling.base.model.element.IModelElementSpecification;
 import org.fortiss.tooling.ext.reuse.model.ReuseElementSpec;
 import org.fortiss.tooling.ext.reuse.model.ReuseLibrary;
 import org.fortiss.tooling.ext.reuse.service.IReuseProviderService;
-import org.fortiss.tooling.kernel.model.INamedCommentedElement;
-import org.fortiss.tooling.kernel.model.INamedElement;
 
 /**
  * Utility methods for {@link ReuseLibrary}s and related reuse elements and
- * actions.
+ * actions where major manipulations play a role (like creations, removals,
+ * updates).
  *
  * @author bergemann
  */
-public class ReuseLibraryUtils {
+public class ReuseLibraryUtilsManipulation {
 
 	/**
 	 * Fixes the IDs of the model containing the given {@link EObject}, since
@@ -72,7 +64,7 @@ public class ReuseLibraryUtils {
 	 *
 	 * @param element A reuse element of the model
 	 */
-	public static void fixIds(EObject element) {
+	public static void fixIDs(EObject element) {
 		EObject root = element;
 		while (root.eContainer() != null) {
 			root = root.eContainer();
@@ -82,241 +74,33 @@ public class ReuseLibraryUtils {
 	}
 
 	/**
-	 * Returns whether the given element can be used as reuse element.
+	 * Creates a hash code for the given {@link EObject} as reuse element and
+	 * returns it as {@link String}. This has code format is used for detecting
+	 * changes between reuse elements with the same origin. Returns null if given
+	 * element is invalid (e.g. not a reuse element).
 	 *
-	 * @param element The element that should be checked
-	 * @return True if the given element can be used as reuse element otherwise
-	 *         false
+	 * @param element    The element of which a hash code should be created
+	 * @param modifyDate The date of the last update/modification of the given
+	 *                   element
+	 * @return String of the created hash code integer (or null for an invalid
+	 *         input)
 	 */
-	public static boolean hasReusePossibility(EObject element) {
-		for (Class<? extends EObject> cls : getReuseElementClasses()) {
-			if (cls.isInstance(element)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Returns whether the given element is a reuse element and has at least one
-	 * valid link to a {@link ReuseLibrary}.
-	 *
-	 * @param element The element that should be checked
-	 * @return True if the given element is a reuse element, otherwise false
-	 */
-	public static boolean isCorrectReuseElement(EObject element) {
-		// first, check if it is a (possible) reuse element in general
-		if (hasReusePossibility(element)) {
-			// second, check if it has a library reference
-			// (only then it is an actual (active) reuse element)
-			if (element instanceof IModelElement) {
-				for (IModelElementSpecification spec : ((IModelElement) element).getSpecifications()) {
-					if (spec instanceof ReuseElementSpec) {
-						String libID = ((ReuseElementSpec) spec).getSourceLibUUID();
-						if (libID != null && !libID.isEmpty()) {
-							return true;
-						}
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Returns whether the given element is a reuse element and has at least one
-	 * valid link to a {@link ReuseLibrary} OR is a {@link ReuseLibrary} itself.
-	 *
-	 * @param element The element that should be checked
-	 * @return True if the given element is a reuse element OR a reuse library,
-	 *         otherwise false
-	 */
-	public static boolean isCorrectReuseElementOrLibrary(EObject element) {
-		return (element instanceof ReuseLibrary) || isCorrectReuseElement(element);
-	}
-
-	/**
-	 * Returns display name of given {@link ReuseLibrary} (name and UUID).
-	 *
-	 * @param library The target reuse library
-	 * @return Display name as string
-	 */
-	public static String getLibraryIDName(ReuseLibrary library) {
-		return getLibraryIDNameFormat(library.getLibraryUUID(), library.getName());
-	}
-
-	/**
-	 * Returns the current format for displaying name and UUID of
-	 * {@link ReuseLibrary}s.
-	 *
-	 * @param libraryUUID The UUID of the target library
-	 * @param libraryName The name of the target library
-	 * @return Formatted string
-	 */
-	public static String getLibraryIDNameFormat(String libraryUUID, String libraryName) {
-		return libraryName + " (" + libraryUUID + ")";
-	}
-
-	/**
-	 * Returns the (converted) name of the given reuse element (or
-	 * {@link ReuseLibrary}), independent of the type as long as its class was
-	 * registered for reuse.
-	 *
-	 * @param element The target reuse element
-	 * @return Name as string
-	 */
-	public static String getReuseElementName(EObject element) {
-		if (element instanceof ReuseLibrary) {
-			return ((ReuseLibrary) element).getName();
-		}
-		String name = IReuseProviderService.getInstance().getReuseElementName(element);
-		if (name == null) {
-			if (element instanceof INamedElement) {
-				name = ((INamedElement) element).getName();
-			} else {
-				name = element.toString();
-			}
-		}
-		return name;
-	}
-
-	/**
-	 * Sets the name of the given reuse element (or {@link ReuseLibrary}),
-	 * independent of the type as long as its class was registered for reuse.
-	 *
-	 * @param element The target reuse element
-	 * @param name    The new name
-	 * @return True if action was successful, otherwise false
-	 */
-	public static boolean setReuseElementName(EObject element, String name) {
-		if (element instanceof ReuseLibrary) {
-			((ReuseLibrary) element).setName(name);
-			return true;
-		}
-		return IReuseProviderService.getInstance().setReuseElementName(element, name);
-	}
-
-	/**
-	 * Returns the comment of the given reuse element (or {@link ReuseLibrary}),
-	 * independent of the type as long as its class was registered for reuse.
-	 *
-	 * @param element The target reuse element
-	 * @return The requested comment as string
-	 */
-	public static String getReuseElementComment(EObject element) {
-		String comment = null;
-		if (element instanceof ReuseLibrary) {
-			comment = ((ReuseLibrary) element).getComment();
-		} else {
-			comment = IReuseProviderService.getInstance().getReuseElementComment(element);
-			if (comment == null) {
-				if (element instanceof INamedCommentedElement) {
-					comment = ((INamedCommentedElement) element).getComment();
-				}
-			}
-		}
-		return (comment == null) ? "" : comment;
-	}
-
-	/**
-	 * Sets the comment of the given reuse element (or {@link ReuseLibrary}),
-	 * independent of the type as long as its class was registered for reuse.
-	 *
-	 * @param element The target reuse element
-	 * @param comment The new comment
-	 * @return True if action was successful, otherwise false
-	 */
-	public static boolean setReuseElementComment(EObject element, String comment) {
-		if (element instanceof ReuseLibrary) {
-			((ReuseLibrary) element).setComment(comment);
-			return true;
-		}
-		return IReuseProviderService.getInstance().setReuseElementComment(element, comment);
-	}
-
-	/**
-	 * Returns the UUID of the given reuse element (or {@link ReuseLibrary}) as long
-	 * as it has (already) a {@link ReuseElementSpec}. If this is not the case, an
-	 * empty {@link String} will be returned.
-	 *
-	 * @param element The target reuse element
-	 * @return The requested UUID as string (or empty string)
-	 */
-	public static String getReuseElementUUID(EObject element) {
-		if (element instanceof ReuseLibrary) {
-			return ((ReuseLibrary) element).getLibraryUUID();
-		}
-		if (element instanceof IModelElement) {
-			List<ReuseElementSpec> specs = getAllReuseSpecs((IModelElement) element);
-			if (specs != null && !specs.isEmpty()) {
-				// get(0) is safe due to check above
-				return specs.get(0).getElementUUID();
-			}
-		}
-		return "";
-	}
-
-	/**
-	 * Returns the Last Update Date of the given reuse element as {link Date} as
-	 * long as it has (already) a {@link ReuseElementSpec}. If this is not the case,
-	 * null will be returned.
-	 *
-	 * @param element The target reuse element
-	 * @return The requested (update) date (or null)
-	 */
-	public static Date getReuseElementLastUpdate(EObject element) {
-		if (element instanceof IModelElement) {
-			List<ReuseElementSpec> specs = getAllReuseSpecs((IModelElement) element);
-			if (specs != null && !specs.isEmpty()) {
-				// get(0) is safe due to check above
-				return specs.get(0).getLastUpdate();
-			}
+	public static String createReuseHashAsString(EObject element, ZonedDateTime modifyDate) {
+		if (element != null && modifyDate != null) {
+			// hashCode() does not change through element differences caused by simple
+			// changes like name or new ports, etc.
+			// Therefore, we are currently modifying the hash with the date of the last
+			// update to be sure that the hash is different after a reuse update (to see
+			// e.g. if the original reuse element in the library was updated by someone else
+			// in the meantime).
+			int hash = element.hashCode();
+			String hashString = String.valueOf(hash) + "__"
+					+ ReuseLibraryUtilsBasics.getDateAsString(modifyDate, false);
+			return hashString;
 		}
 		return null;
 	}
 
-	/**
-	 * Returns the Last Update Date of the given reuse element as formatted {link
-	 * String} as long as it has (already) a {@link ReuseElementSpec}. If this is
-	 * not the case, an empty {@link String} will be returned.
-	 *
-	 * @param element The target reuse element
-	 * @return The requested (update) date as string (or empty string)
-	 */
-	public static String getReuseElementLastUpdateString(EObject element) {
-		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-		Date updateDate = getReuseElementLastUpdate(element);
-		if (updateDate != null) {
-			return dateFormat.format(updateDate);
-		}
-		return "";
-	}
-
-	/**
-	 * Sets the Last Update Date of the given reuse element with the given {link
-	 * Date} as long as it has (already) a {@link ReuseElementSpec}.
-	 *
-	 * @param element The target reuse element
-	 * @param newDate The new (update) date
-	 */
-	public static void setReuseElementLastUpdate(EObject element, Date newDate) {
-		if (element instanceof IModelElement) {
-			for (ReuseElementSpec spec : getAllReuseSpecs((IModelElement) element)) {
-				spec.setLastUpdate(newDate);
-			}
-		}
-	}
-
-	/**
-	 * Sets the Last Update Date of the given reuse element with the current {link
-	 * Date} as long as it has (already) a {@link ReuseElementSpec}.
-	 *
-	 * @param element The target reuse element
-	 */
-	public static void setReuseElementLastUpdateNow(EObject element) {
-		setReuseElementLastUpdate(element, new Date());
-	}
-
 	/**
 	 * Removes all {@link IConnection}s from/to the target element except the
 	 * {@link IConnection} that belongs to a {@link IConnector} of the target
@@ -382,38 +166,6 @@ public class ReuseLibraryUtils {
 		}
 	}
 
-	/**
-	 * Returns all {@link ReuseElementSpec}s of the given element to a
-	 * {@link ReuseLibrary}. If none exist, an empty list will be returned.
-	 *
-	 * @param element The target reuse element
-	 * @return A list of all found reuse specifications (or empty list)
-	 */
-	public static List<ReuseElementSpec> getAllReuseSpecs(IModelElement element) {
-		List<ReuseElementSpec> specs = new ArrayList<ReuseElementSpec>();
-		for (IModelElementSpecification spec : element.getSpecifications()) {
-			if (spec instanceof ReuseElementSpec) {
-				// (cast is save due to instance check)
-				specs.add((ReuseElementSpec) spec);
-			}
-		}
-		return specs;
-	}
-
-	/**
-	 * Adds a {@link ReuseElementSpec} to the given element pointing to the given
-	 * {@link ReuseLibrary} (as source).
-	 *
-	 * @param element The target reuse element
-	 * @param library The connected reuse library
-	 * @return The created reuse specification
-	 */
-	public static ReuseElementSpec addReuseSpecToElement(IModelElement element, ReuseLibrary library) {
-		ReuseElementSpec spec = createReuseElementSpec(element, library);
-		element.getSpecifications().add(spec);
-		return spec;
-	}
-
 	/**
 	 * Setups a given reuse element for its placement inside a {@link ReuseLibrary}.
 	 *
@@ -423,7 +175,7 @@ public class ReuseLibraryUtils {
 	public static void setupElementForLibrary(IModelElement element, ReuseElementSpec connectingSpec) {
 		// currently, it is needed that only the original specification for this library
 		// should exist (and also only the newest one) -> remove all others
-		for (ReuseElementSpec spec : getAllReuseSpecs(element)) {
+		for (ReuseElementSpec spec : ReuseLibraryUtilsBasics.getAllReuseSpecs(element)) {
 			if (!(connectingSpec.getElementUUID().equals(spec.getElementUUID())
 					&& connectingSpec.getLastUpdate().equals(spec.getLastUpdate()))) {
 				element.getSpecifications().remove(spec);
@@ -448,18 +200,33 @@ public class ReuseLibraryUtils {
 		// add to the original element a reuse reference to the new library
 		// (cast is safe: elements within the ReuseElementList are always IModelElement
 		// by design)
-		ReuseElementSpec spec = addReuseSpecToElement((IModelElement) originalElement, library);
+		ReuseElementSpec spec = ReuseLibraryUtilsManipulation.addReuseSpecToElement((IModelElement) originalElement,
+				library);
 		spec.setElementName(saveName);
-		fixIds(originalElement);
+		ReuseLibraryUtilsManipulation.fixIDs(originalElement);
 
 		// copy, because origin should still exist further (but change name of copy)
 		EObject newElementForLibrary = copy(originalElement);
-		setReuseElementName(newElementForLibrary, saveName);
+		ReuseLibraryUtilsBasics.setReuseElementName(newElementForLibrary, saveName);
 		setupElementForLibrary((IModelElement) newElementForLibrary, spec);
 
 		return newElementForLibrary;
 	}
 
+	/**
+	 * Adds a {@link ReuseElementSpec} to the given element pointing to the given
+	 * {@link ReuseLibrary} (as source).
+	 *
+	 * @param element The target reuse element
+	 * @param library The connected reuse library
+	 * @return The created reuse specification
+	 */
+	public static ReuseElementSpec addReuseSpecToElement(IModelElement element, ReuseLibrary library) {
+		ReuseElementSpec spec = createReuseElementSpec(element, library);
+		element.getSpecifications().add(spec);
+		return spec;
+	}
+
 	/**
 	 * Adds a given element to the given {@link ReuseLibrary}.
 	 *
@@ -473,57 +240,6 @@ public class ReuseLibraryUtils {
 		saveReuseLibrary(library);
 	}
 
-	/**
-	 * Returns all {@link ReuseLibrary}s that are present in the local workspace.
-	 * Will return empty list if no {@link ReuseLibrary} exists.
-	 *
-	 * @return A list of all local reuse libraries (or empty list)
-	 */
-	public static List<ReuseLibrary> getAllLocalReuseLibraries() {
-		// currently, this is just all existing local libraries which are stored
-		// separately in the library directory
-		return getAllSeparatelyStoredReuseLibraries();
-	}
-
-	/**
-	 * Returns the {@link ReuseLibrary} with the given UUID out of all local
-	 * {@link ReuseLibrary}. Will return null if no {@link ReuseLibrary} exists with
-	 * this UUID. Note: it will return the {@link ReuseLibrary} even if the folder
-	 * or file name is not correct (as long as it is in the reuse directory and has
-	 * the right UUID)!
-	 *
-	 * @param libraryUUID The UUID of the requested reuse library
-	 * @return The requested reuse library (or null)
-	 */
-	public static ReuseLibrary getLocalReuseLibraryByID(String libraryUUID) {
-		for (ReuseLibrary library : getAllLocalReuseLibraries()) {
-			if (libraryUUID.equals(library.getLibraryUUID())) {
-				return library;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the {@link ReuseLibrary} that is mentioned as source library in the
-	 * first {link ReuseElementSpec} of the given reuse element. If no {link
-	 * ReuseElementSpec} exists, the return will be null.
-	 *
-	 * @param element The target reuse element
-	 * @return The requested reuse library (or null)
-	 */
-	public static ReuseLibrary getFirstSourceLibraryOfElement(EObject element) {
-		if (element instanceof IModelElement) {
-			List<ReuseElementSpec> specList = getAllReuseSpecs((IModelElement) element);
-			if (specList != null && !specList.isEmpty()) {
-				// get(0) is safe due to check above
-				String libraryUUID = specList.get(0).getSourceLibUUID();
-				return getLocalReuseLibraryByID(libraryUUID);
-			}
-		}
-		return null;
-	}
-
 	/**
 	 * Creates a new {@link ReuseLibrary} with the given name. If no name is
 	 * received, the default library name will be used.
@@ -539,48 +255,6 @@ public class ReuseLibraryUtils {
 		}
 	}
 
-	/**
-	 * Returns the element that exists in the given {@link ReuseLibrary} and is
-	 * referenced by the given {@link ReuseElementSpec}. Returns null if it could
-	 * not be found.
-	 *
-	 * @param library         The target reuse library
-	 * @param referencingSpec The reuse specification used as link/trace/reference
-	 * @return The requested reuse element (or null)
-	 */
-	public static EObject getElementInsideLibrary(ReuseLibrary library, ReuseElementSpec referencingSpec) {
-		// find original element inside the library by identical UUID
-		for (EObject libraryElement : library.getReuseElementList()) {
-			for (IModelElementSpecification spec : ((IModelElement) libraryElement).getSpecifications()) {
-				if (spec instanceof ReuseElementSpec) {
-					if (((ReuseElementSpec) spec).getElementUUID().equals(referencingSpec.getElementUUID())) {
-						return libraryElement;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns a list of external elements that are used within the given element
-	 * (e.g. an external stored function inside a code specification of a
-	 * component). If nothing was found, an empty list is returned.
-	 *
-	 * @param element The target reuse element
-	 * @return A list of external elements referencing the target reuse element (or
-	 *         empty list)
-	 */
-	public static List<EObject> getExternalReferencesOfElement(EObject element) {
-		List<EObject> references = new ArrayList<>();
-		for (Class<? extends EObject> referenceClass : getPossibleExternalReferenceClasses()) {
-			for (EObject reference : getChildrenWithType(element, referenceClass)) {
-				references.add(reference);
-			}
-		}
-		return references;
-	}
-
 	/**
 	 * Replaces the given target/original reuse element in the given
 	 * {@link ReuseLibrary} with the given new reuse element (which should have the
@@ -601,11 +275,13 @@ public class ReuseLibraryUtils {
 			ReuseElementSpec referencingSpec, String newName) {
 		// first, the information of the reference and the new element
 		// needs to be updated and set up
-		referencingSpec.setLastUpdate(new Date());
+		ZonedDateTime now = ZonedDateTime.now();
+		referencingSpec.setLastUpdate(now);
 		referencingSpec.setElementName(newName);
+		referencingSpec.setElementHash(ReuseLibraryUtilsManipulation.createReuseHashAsString(newElement, now));
 
 		EObject newLibraryElement = copy(newElement);
-		setReuseElementName(newLibraryElement, newName);
+		ReuseLibraryUtilsBasics.setReuseElementName(newLibraryElement, newName);
 		setupElementForLibrary((IModelElement) newLibraryElement, referencingSpec);
 
 		replace(originalElementInLibrary, newLibraryElement);
@@ -617,34 +293,58 @@ public class ReuseLibraryUtils {
 	 * the given name in the end). Returns the new element in the project if the
 	 * replacement/update was successful, otherwise null.
 	 *
-	 * @param elementInProject         The new reuse element which is the
-	 *                                 replacement of the current element in the
-	 *                                 given library
-	 * @param originalElementInLibrary The target reuse element inside a reuse
-	 *                                 library that should be replace by the new
-	 *                                 reuse element
-	 * @param newName                  The new name of the element after replacement
+	 * @param elementInProject             The new reuse element which is the
+	 *                                     replacement of the current element in the
+	 *                                     given library
+	 * @param originalElementInLibrary     The target reuse element inside a reuse
+	 *                                     library that should be replace by the new
+	 *                                     reuse element
+	 * @param newName                      The new name of the element after
+	 *                                     replacement
+	 * @param overrideAdditionalReferences Flag whether all other possibly existing
+	 *                                     references in the (old) project element
+	 *                                     should be overridden/deleted (true) or if
+	 *                                     they should be kept (false)
 	 *
 	 * @return The new element in the project if the replacement/update was
 	 *         successful, otherwise null.
 	 */
 	public static EObject replaceElementInProject(EObject elementInProject, EObject originalElementInLibrary,
-			String newName) {
-		// first, the information of the reference and the new element
-		// needs to be updated and set up
-		List<ReuseElementSpec> specs = getAllReuseSpecs((IModelElement) originalElementInLibrary);
-		if (specs.size() == 1) {
-			// get(0) is safe due to size check
-			specs.get(0).setLastUpdate(new Date());
-		} else {
-			return null;
-		}
-
-		EObject sourceElement = copy(originalElementInLibrary);
-		setReuseElementName(sourceElement, newName);
+			String newName, boolean keepAdditionalReferences) {
+		if (originalElementInLibrary instanceof IModelElement && elementInProject instanceof IModelElement) {
+			IModelElement sourceElement = copy((IModelElement) originalElementInLibrary);
+			IModelElement modelElementInProject = (IModelElement) elementInProject;
+			// first, the information of the reference and the new element
+			// needs to be updated and set up
+			List<ReuseElementSpec> specs = ReuseLibraryUtilsBasics.getAllReuseSpecs(sourceElement);
+			ZonedDateTime now = ZonedDateTime.now();
+			if (specs.size() == 1) {
+				// get(0) is safe due to size check
+				specs.get(0).setLastUpdate(now);
+			} else {
+				return null;
+			}
+			ReuseLibraryUtilsBasics.setReuseElementName(sourceElement, newName);
+
+			// if additional references should not be overridden but kept, they need to be
+			// saved/added in the source element (otherwise they will be overridden anyway)
+			if (keepAdditionalReferences) {
+				List<ReuseElementSpec> oldSpecs = ReuseLibraryUtilsBasics.getAllReuseSpecs(modelElementInProject);
+				// remove the specification of the current update/replacement (only additional
+				// ones added)
+				ReuseElementSpec mainSpec = ReuseLibraryUtilsBasics
+						.getReuseSpecLinkedToThisLibraryElement(modelElementInProject, sourceElement);
+				oldSpecs.remove(mainSpec);
+				sourceElement.getSpecifications().addAll(oldSpecs);
+			}
 
-		boolean success = IReuseProviderService.getInstance().updateReuseElement(elementInProject, sourceElement);
-		return success ? sourceElement : null;
+			boolean success = IReuseProviderService.getInstance().updateReuseElement(modelElementInProject,
+					sourceElement);
+			if (success) {
+				return sourceElement;
+			}
+		}
+		return null;
 	}
 
 	/**
@@ -659,7 +359,7 @@ public class ReuseLibraryUtils {
 			deleteReuseLibraryFolder(library);
 		} catch (CoreException e) {
 			error(getDefault(), "Error during deleting reuse library folder", e);
-			showError("Cannot delete reuse library: " + getReuseElementName(library));
+			showError("Cannot delete reuse library: " + ReuseLibraryUtilsBasics.getReuseElementName(library));
 		}
 	}
 
@@ -676,7 +376,8 @@ public class ReuseLibraryUtils {
 		EObject correctLibraryElement = null;
 		EList<EObject> libraryElementList = sourceLibrary.getReuseElementList();
 		for (EObject libraryElement : libraryElementList) {
-			if (getReuseElementUUID(libraryElement).equals(getReuseElementUUID(element))) {
+			if (ReuseLibraryUtilsBasics.getFirstReuseElementUUID(libraryElement)
+					.equals(ReuseLibraryUtilsBasics.getReuseElementUUIDForLibrary(element, sourceLibrary))) {
 				correctLibraryElement = libraryElement;
 				break;
 			}
@@ -690,8 +391,8 @@ public class ReuseLibraryUtils {
 			saveReuseLibrary(sourceLibrary);
 		} catch (IOException | CoreException e) {
 			error(getDefault(), "Error during removing reuse element from reuse library", e);
-			showError("Cannot remove reuse element: " + getReuseElementName(element) + " from this reuse library: "
-					+ getReuseElementName(sourceLibrary));
+			showError("Cannot remove reuse element: " + ReuseLibraryUtilsBasics.getReuseElementName(element)
+					+ " from this reuse library: " + ReuseLibraryUtilsBasics.getReuseElementName(sourceLibrary));
 		}
 	}
 
@@ -703,7 +404,7 @@ public class ReuseLibraryUtils {
 	 * @param element The target reuse element that should be deleted
 	 */
 	public static void deleteReuseElementInLibraryFile(EObject element) {
-		ReuseLibrary sourceLibrary = getFirstSourceLibraryOfElement(element);
+		ReuseLibrary sourceLibrary = ReuseLibraryUtilsBasics.getFirstSourceLibraryOfElement(element);
 		if (sourceLibrary != null) {
 			deleteReuseElementInLibraryFile(element, sourceLibrary);
 		}
@@ -737,34 +438,37 @@ public class ReuseLibraryUtils {
 			// copy, because origin should still exist further for deletion
 			libraryForDeletion = copy(sourceLibrary);
 
-			setReuseElementName(sourceLibrary, newName);
+			ReuseLibraryUtilsBasics.setReuseElementName(sourceLibrary, newName);
 			for (EObject libraryElement : sourceLibrary.getReuseElementList()) {
 				// cast is safe: elements within the ReuseElementList are always IModelElement
 				// by design
-				List<ReuseElementSpec> specList = getAllReuseSpecs((IModelElement) libraryElement);
+				List<ReuseElementSpec> specList = ReuseLibraryUtilsBasics
+						.getAllReuseSpecs((IModelElement) libraryElement);
 				for (ReuseElementSpec reuseSpec : specList) {
 					reuseSpec.setSourceLibName(newName);
 				}
 			}
 
-			errorObject = "reuse library '" + getReuseElementName(sourceLibrary) + "'";
+			errorObject = "reuse library '" + ReuseLibraryUtilsBasics.getReuseElementName(sourceLibrary) + "'";
 			modifiedLibrary = true;
 		} else {
 			// the objects might not be the same anymore, which is why we need to identify
 			// the correct object via the reuse UUID
 			for (EObject libraryElement : sourceLibrary.getReuseElementList()) {
-				if (getReuseElementUUID(libraryElement).equals(getReuseElementUUID(element))) {
-					setReuseElementName(libraryElement, newName);
+				if (ReuseLibraryUtilsBasics.getFirstReuseElementUUID(libraryElement)
+						.equals(ReuseLibraryUtilsBasics.getReuseElementUUIDForLibrary(element, sourceLibrary))) {
+					ReuseLibraryUtilsBasics.setReuseElementName(libraryElement, newName);
 					// cast is safe: elements within the ReuseElementList are always IModelElement
 					// by design
-					List<ReuseElementSpec> specList = getAllReuseSpecs((IModelElement) libraryElement);
+					List<ReuseElementSpec> specList = ReuseLibraryUtilsBasics
+							.getAllReuseSpecs((IModelElement) libraryElement);
 					for (ReuseElementSpec reuseSpec : specList) {
 						reuseSpec.setElementName(newName);
 					}
-					setReuseElementLastUpdateNow(libraryElement);
+					ReuseLibraryUtilsBasics.setReuseElementLastUpdateNow(libraryElement);
 
-					errorObject = "reuse element '" + getReuseElementName(libraryElement) + "' in reuse library '"
-							+ getReuseElementName(sourceLibrary) + "'";
+					errorObject = "reuse element '" + ReuseLibraryUtilsBasics.getReuseElementName(libraryElement)
+							+ "' in reuse library '" + ReuseLibraryUtilsBasics.getReuseElementName(sourceLibrary) + "'";
 					modifiedLibrary = true;
 					break;
 				}
@@ -798,7 +502,7 @@ public class ReuseLibraryUtils {
 		if (element instanceof ReuseLibrary) {
 			updateReuseElementFileWithName(element, newName, null);
 		} else {
-			ReuseLibrary sourceLibrary = getFirstSourceLibraryOfElement(element);
+			ReuseLibrary sourceLibrary = ReuseLibraryUtilsBasics.getFirstSourceLibraryOfElement(element);
 			if (sourceLibrary != null) {
 				updateReuseElementFileWithName(element, newName, sourceLibrary);
 			}
@@ -822,21 +526,22 @@ public class ReuseLibraryUtils {
 		String errorObject = "";
 		if (element instanceof ReuseLibrary) {
 			sourceLibrary = (ReuseLibrary) element;
-			setReuseElementComment(sourceLibrary, newComment);
+			ReuseLibraryUtilsBasics.setReuseElementComment(sourceLibrary, newComment);
 
-			errorObject = "reuse library '" + getReuseElementName(sourceLibrary) + "'";
+			errorObject = "reuse library '" + ReuseLibraryUtilsBasics.getReuseElementName(sourceLibrary) + "'";
 			modifiedLibrary = true;
 		} else {
 			// the objects might not be the same anymore, which is why we need to identify
 			// the correct object via the reuse UUID
 			EList<EObject> libraryElementList = sourceLibrary.getReuseElementList();
 			for (EObject libraryElement : libraryElementList) {
-				if (getReuseElementUUID(libraryElement).equals(getReuseElementUUID(element))) {
-					setReuseElementComment(libraryElement, newComment);
-					setReuseElementLastUpdateNow(libraryElement);
+				if (ReuseLibraryUtilsBasics.getFirstReuseElementUUID(libraryElement)
+						.equals(ReuseLibraryUtilsBasics.getReuseElementUUIDForLibrary(element, sourceLibrary))) {
+					ReuseLibraryUtilsBasics.setReuseElementComment(libraryElement, newComment);
+					ReuseLibraryUtilsBasics.setReuseElementLastUpdateNow(libraryElement);
 
-					errorObject = "reuse element '" + getReuseElementName(libraryElement) + "' in reuse library '"
-							+ getReuseElementName(sourceLibrary) + "'";
+					errorObject = "reuse element '" + ReuseLibraryUtilsBasics.getReuseElementName(libraryElement)
+							+ "' in reuse library '" + ReuseLibraryUtilsBasics.getReuseElementName(sourceLibrary) + "'";
 					modifiedLibrary = true;
 					break;
 				}
@@ -867,10 +572,11 @@ public class ReuseLibraryUtils {
 		if (element instanceof ReuseLibrary) {
 			updateReuseElementFileWithComment(element, newComment, null);
 		} else {
-			ReuseLibrary sourceLibrary = getFirstSourceLibraryOfElement(element);
+			ReuseLibrary sourceLibrary = ReuseLibraryUtilsBasics.getFirstSourceLibraryOfElement(element);
 			if (sourceLibrary != null) {
 				updateReuseElementFileWithComment(element, newComment, sourceLibrary);
 			}
 		}
 	}
+
 }
diff --git a/org.fortiss.tooling.ext.variability.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.ext.variability.ui/META-INF/MANIFEST.MF
index 2e191f90806884f0490816da705a6e03fd386f15..0bad166a61ea37f7de89bdac881b908ee1057d0a 100644
--- a/org.fortiss.tooling.ext.variability.ui/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.ext.variability.ui/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Automatic-Module-Name: org.fortiss.tooling.ext.variability.ui
 Bundle-ManifestVersion: 2
 Bundle-Name: fortiss AF3 variability UI
 Bundle-SymbolicName: org.fortiss.tooling.ext.variability.ui;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-Activator: org.fortiss.tooling.ext.variability.ui.VariabilityUIActivator
 Require-Bundle: org.fortiss.tooling.ext.variability;visibility:=reexport,
  org.fortiss.tooling.base.ui;visibility:=reexport
diff --git a/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/properties/.ratings b/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/properties/.ratings
index 54597c2d7f87a89fd9f07de11ee4e318fdb48e21..122f4b1bdf10688d030bc3b5ee6d9217b8130119 100644
--- a/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/properties/.ratings
+++ b/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/properties/.ratings
@@ -1,3 +1,3 @@
 CrossFeatureConstraintPropertySectionBase.java 37e772fb3471f85320170d373cbe2f319c350655 GREEN
 FeaturePropertySectionBase.java 2ac0a6a56ea4755852fd14a9b5df81dff4a5dc7e GREEN
-HasPresenceConditionPropertySectionBase.java 1f3ed94e15529450b73c8c8772cef69b8e075260 GREEN
+HasPresenceConditionPropertySectionBase.java ef300f0d9294d76f5d80e45b8cc0d94c24586a24 GREEN
diff --git a/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/properties/HasPresenceConditionPropertySectionBase.java b/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/properties/HasPresenceConditionPropertySectionBase.java
index 1f3ed94e15529450b73c8c8772cef69b8e075260..ef300f0d9294d76f5d80e45b8cc0d94c24586a24 100644
--- a/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/properties/HasPresenceConditionPropertySectionBase.java
+++ b/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/properties/HasPresenceConditionPropertySectionBase.java
@@ -17,7 +17,6 @@
 package org.fortiss.tooling.ext.variability.ui.properties;
 
 import static org.eclipse.swt.SWT.NONE;
-import static org.fortiss.tooling.ext.variability.ui.util.VariabilityViewUtils.isVariabilityViewActive;
 import static org.fortiss.tooling.ext.variability.util.VariabilityUtils.getPresenceCondition;
 import static org.fortiss.tooling.ext.variability.util.VariabilityUtils.setPresenceCondition;
 import static org.fortiss.tooling.kernel.ui.util.WidgetsFactory.createTextWithUndo;
@@ -60,15 +59,13 @@ public class HasPresenceConditionPropertySectionBase extends PropertySectionBase
 	protected void setSectionInput(Object input) {
 		if(input instanceof IModelElement) {
 			this.inputElem = (IModelElement)input;
-			if(isVariabilityViewActive()) {
-				PresenceCondition pc = getPresenceCondition(inputElem);
-				if(pc != null) {
-					pcText.setText(pc.getStringRepresentation());
-				} else {
-					pcText.setText("");
-				}
-				createPcFieldAssist();
+			PresenceCondition pc = getPresenceCondition(inputElem);
+			if(pc != null) {
+				pcText.setText(pc.getStringRepresentation());
+			} else {
+				pcText.setText("");
 			}
+			createPcFieldAssist();
 		} else {
 			this.inputElem = null;
 		}
@@ -76,7 +73,7 @@ public class HasPresenceConditionPropertySectionBase extends PropertySectionBase
 
 	/** Creates and sets up the field assist. */
 	protected void createPcFieldAssist() {
-		if(pcText != null && inputElem != null && isVariabilityViewActive()) {
+		if(pcText != null && inputElem != null) {
 			if(pcFieldAssist != null) {
 				pcFieldAssist.setProposalProvider(new PresenceConditionProposalProvider(inputElem));
 			} else {
@@ -104,11 +101,9 @@ public class HasPresenceConditionPropertySectionBase extends PropertySectionBase
 			}
 		});
 
-		if(!isVariabilityViewActive()) {
-			pcLabel.setVisible(false);
-			pcText.setVisible(false);
-			pcText.setEnabled(false);
-		}
+		pcLabel.setVisible(false);
+		pcText.setVisible(false);
+		pcText.setEnabled(false);
 	}
 
 	/**
@@ -127,10 +122,6 @@ public class HasPresenceConditionPropertySectionBase extends PropertySectionBase
 	public void refresh() {
 		super.refresh();
 
-		if(!isVariabilityViewActive()) {
-			return;
-		}
-
 		if(inputElem != null) {
 			pcLabel.setVisible(true);
 			pcText.setVisible(true);
diff --git a/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/util/.ratings b/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/util/.ratings
index adead61bdc9c0229a1db7a54d7d02fbcb4d2f489..e9c176035709c22b1ddb18ed5e581aab3bd84b0b 100644
--- a/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/util/.ratings
+++ b/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/util/.ratings
@@ -1,4 +1,3 @@
-PresenceConditionProposalProvider.java 0429296a1742618d241a0b5f2e399198b0733651 GREEN
+PresenceConditionProposalProvider.java bd67b19e724cfa777611ec7783bd004407a7911c GREEN
 PresenceConditionToStringConverter.java 1854a6474cf37deebe8b8b7c5f28c5e45a541bf8 GREEN
 StringToPresenceConditionConverter.java 0d64415d229726a077a242c5c1f487f484df477c GREEN
-VariabilityViewUtils.java 5846115ef3e0cc828ac6d868c00800146bcfac1c GREEN
diff --git a/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/util/PresenceConditionProposalProvider.java b/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/util/PresenceConditionProposalProvider.java
index 0429296a1742618d241a0b5f2e399198b0733651..bd67b19e724cfa777611ec7783bd004407a7911c 100644
--- a/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/util/PresenceConditionProposalProvider.java
+++ b/org.fortiss.tooling.ext.variability.ui/src/org/fortiss/tooling/ext/variability/ui/util/PresenceConditionProposalProvider.java
@@ -18,6 +18,7 @@ package org.fortiss.tooling.ext.variability.ui.util;
 
 import static java.util.Arrays.asList;
 import static java.util.stream.Collectors.toList;
+import static org.fortiss.variability.util.VariabilityUtils.PRESENCE_CONDITIONS_KEYWORDS;
 import static org.fortiss.variability.util.VariabilityUtilsInternal.getAllElementsFromSameContainmentTree;
 
 import java.util.List;
@@ -61,7 +62,8 @@ public class PresenceConditionProposalProvider extends ProposalProviderBase {
 
 		List<String> stringLiterals = literals.stream().map(l -> l.getName()).collect(toList());
 
-		stringLiterals.addAll(asList("DEFAULT", "NOT", "AND", "OR"));
+		final String[] keywords = PRESENCE_CONDITIONS_KEYWORDS.split("\\|");
+		stringLiterals.addAll(asList(keywords));
 
 		List<String> proposals =
 				stringLiterals.stream().filter(n -> n.startsWith(currentWord)).collect(toList());
diff --git a/org.fortiss.tooling.ext.variability/META-INF/MANIFEST.MF b/org.fortiss.tooling.ext.variability/META-INF/MANIFEST.MF
index 95570fbc70580acecdd505f77ad336e162773742..819c53aebee567e857bf0d5b42a547f81cf0cb31 100644
--- a/org.fortiss.tooling.ext.variability/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.ext.variability/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.fortiss.tooling.ext.variability;singleton:=true
 Automatic-Module-Name: org.fortiss.tooling.ext.variability
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/.ratings b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/.ratings
index 821a95b239b160489dd5c19df83222fe51b4b5a7..b27a2a9301415db920429143ef28e2242da92c0b 100644
--- a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/.ratings
+++ b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/.ratings
@@ -1,3 +1,3 @@
-DependingElementProviderService.java 5c4547e63b0f2ff547e0c3a7253105466e0b94c1 GREEN
-IDependingElementProvider.java bd4b7ff7c0a25368fc86d7fb26ecaa8a5234c76b GREEN
-IDependingElementProviderService.java 9b59f524a513caf9f5a2b6d16d3523a643b7cc9e GREEN
+DependingElementProviderService.java a041f3b5ff00984304ea94e9333555192c990053 GREEN
+IDependingElementProvider.java 11b174e8a48f2152a0cc6066335e471cf288893c GREEN
+IDependingElementProviderService.java 5bbff0a28f64b01331a6a5424cdb2104c000b57d GREEN
diff --git a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/DependingElementProviderService.java b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/DependingElementProviderService.java
index 5c4547e63b0f2ff547e0c3a7253105466e0b94c1..a041f3b5ff00984304ea94e9333555192c990053 100644
--- a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/DependingElementProviderService.java
+++ b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/DependingElementProviderService.java
@@ -29,7 +29,7 @@ import org.fortiss.tooling.kernel.service.base.EObjectAwareServiceBase;
  * @author bayha
  */
 public class DependingElementProviderService
-		extends EObjectAwareServiceBase<IDependingElementProvider<? extends EObject>>
+		extends EObjectAwareServiceBase<IDependingElementProvider<EObject>>
 		implements IDependingElementProviderService {
 
 	/** Singleton instance. */
@@ -41,11 +41,11 @@ public class DependingElementProviderService
 	public List<EObject> getDependingElements(EObject obj) {
 		List<EObject> res = new ArrayList<EObject>();
 
-		List<IDependingElementProvider<? extends EObject>> registeredHandlers =
+		List<IDependingElementProvider<EObject>> registeredHandlers =
 				getRegisteredHandlers(obj.getClass());
 
 		if(registeredHandlers != null) {
-			for(IDependingElementProvider<?> p : registeredHandlers) {
+			for(IDependingElementProvider<EObject> p : registeredHandlers) {
 				res.addAll(p.getDependingElements(obj));
 			}
 		}
@@ -100,9 +100,10 @@ public class DependingElementProviderService
 	}
 
 	/** {@inheritDoc} */
+	@SuppressWarnings("unchecked")
 	@Override
 	public void registerDependingElementProvider(
 			IDependingElementProvider<? extends EObject> provider, Class<? extends EObject> cls) {
-		addHandler(cls, provider);
+		addHandler(cls, (IDependingElementProvider<EObject>)provider);
 	}
 }
diff --git a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/IDependingElementProvider.java b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/IDependingElementProvider.java
index bd4b7ff7c0a25368fc86d7fb26ecaa8a5234c76b..11b174e8a48f2152a0cc6066335e471cf288893c 100644
--- a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/IDependingElementProvider.java
+++ b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/IDependingElementProvider.java
@@ -21,19 +21,22 @@ import org.eclipse.emf.ecore.EObject;
 import org.fortiss.tooling.kernel.service.base.IEObjectAware;
 
 /**
- * Interface for DependingElementProviders that can be registered in the {@link IDependingElementProviderService}.
+ * Interface for DependingElementProviders that can be registered in the
+ * {@link IDependingElementProviderService}.
  * 
  * @author bayha
  *
- * @param <T>	The subclass of {@link EObject} for which this provider shall be invoked. 
+ * @param <T>
+ *            The subclass of {@link EObject} for which this provider shall be invoked.
  */
 public interface IDependingElementProvider<T extends EObject> extends IEObjectAware<T> {
-	
+
 	/**
-	 * Retrieves the {@link EObject}s which depend on the given {@link EObject}.  
+	 * Retrieves the {@link EObject}s which depend on the given {@link EObject}.
 	 * 
-	 * @param elem	The {@link EObject} to retrieve elements which depend on it.
-	 * @return		The {@link List} of {@link EObject} which depend on elem.
+	 * @param elem
+	 *            The {@link EObject} to retrieve elements which depend on it.
+	 * @return The {@link List} of {@link EObject} which depend on elem.
 	 */
-	public List<EObject> getDependingElements(EObject elem);
+	public List<EObject> getDependingElements(T elem);
 }
diff --git a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/IDependingElementProviderService.java b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/IDependingElementProviderService.java
index 9b59f524a513caf9f5a2b6d16d3523a643b7cc9e..5bbff0a28f64b01331a6a5424cdb2104c000b57d 100644
--- a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/IDependingElementProviderService.java
+++ b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/service/IDependingElementProviderService.java
@@ -17,9 +17,9 @@ package org.fortiss.tooling.ext.variability.service;
 
 import java.util.List;
 
-
 import org.eclipse.emf.ecore.EObject;
 import org.fortiss.tooling.kernel.introspection.IIntrospectiveKernelService;
+
 /**
  * Interface of the DependingElementProviderService which resolves semantic
  * and syntactic dependencies between model elements.
@@ -29,7 +29,8 @@ import org.fortiss.tooling.kernel.introspection.IIntrospectiveKernelService;
 public interface IDependingElementProviderService extends IIntrospectiveKernelService {
 
 	/** Name of the respective extension point. */
-	/* package */static final String EXTENSION_POINT_NAME = "org.fortiss.af3.variability.dependingElementProvider";
+	/* package */static final String EXTENSION_POINT_NAME =
+			"org.fortiss.af3.variability.dependingElementProvider";
 	/** Name of the respective configuration element. */
 	/* package */ static final String CONFIGURATION_ELEMENT_NAME = "dependingElementProvider";
 
@@ -41,16 +42,20 @@ public interface IDependingElementProviderService extends IIntrospectiveKernelSe
 	/**
 	 * Retrieves all depending elements for the given {@link EObject}.
 	 * 
-	 * @param obj	The {@link EObject} to retrieve the elements which depend on it.
-	 * @return		The {@link List} of {@link EObject} which depend on the obj.
+	 * @param obj
+	 *            The {@link EObject} to retrieve the elements which depend on it.
+	 * @return The {@link List} of {@link EObject} which depend on the obj.
 	 */
 	public List<EObject> getDependingElements(EObject obj);
-	
+
 	/**
-	 * Registers the given {@link IDependingElementProvider} in this service.  
+	 * Registers the given {@link IDependingElementProvider} in this service.
 	 * 
-	 * @param provider	The {@link IDependingElementProvider} to register.
-	 * @param cls		The subclass of {@link EObject} the given provider shall be used for.
+	 * @param provider
+	 *            The {@link IDependingElementProvider} to register.
+	 * @param cls
+	 *            The subclass of {@link EObject} the given provider shall be used for.
 	 */
-	public void registerDependingElementProvider(IDependingElementProvider<? extends EObject> provider, Class<? extends EObject> cls);
+	public void registerDependingElementProvider(
+			IDependingElementProvider<? extends EObject> provider, Class<? extends EObject> cls);
 }
diff --git a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/util/.ratings b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/util/.ratings
index 245d60342e3e558196f11170beb5a4ea9818b9d2..9c9ab41967b7edb28689dba6d223f265e8b93edb 100644
--- a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/util/.ratings
+++ b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/util/.ratings
@@ -1 +1 @@
-VariabilityUtils.java 673e84f21b6b3f99dcdc8b925a1d1b4fdc1d8bf9 YELLOW
+VariabilityUtils.java 9224ad053bb17a9102b7eba5974c7d0b64c04b86 YELLOW
diff --git a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/util/VariabilityUtils.java b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/util/VariabilityUtils.java
index 673e84f21b6b3f99dcdc8b925a1d1b4fdc1d8bf9..9224ad053bb17a9102b7eba5974c7d0b64c04b86 100644
--- a/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/util/VariabilityUtils.java
+++ b/org.fortiss.tooling.ext.variability/src/org/fortiss/tooling/ext/variability/util/VariabilityUtils.java
@@ -16,6 +16,7 @@
 package org.fortiss.tooling.ext.variability.util;
 
 import static org.fortiss.tooling.ext.variability.model.VariabilityModelElementFactory.createOptionalVariationPointSpecification;
+import static org.fortiss.tooling.kernel.utils.EcoreUtils.getFirstChildWithType;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickFirstInstanceOf;
 import static org.fortiss.variability.model.VariabilityModelElementFactory.createAndPC;
 
@@ -24,6 +25,7 @@ import org.fortiss.tooling.base.model.element.IModelElement;
 import org.fortiss.tooling.ext.variability.model.DeactivationSpecification;
 import org.fortiss.tooling.ext.variability.model.OptionalVariationPointSpecification;
 import org.fortiss.tooling.kernel.service.ICommandStackService;
+import org.fortiss.variability.model.features.AbstractFeatureModel;
 import org.fortiss.variability.model.presence.PresenceCondition;
 import org.fortiss.variability.model.presence.PresenceConditionTerm;
 import org.fortiss.variability.presence.compiler.PresenceConditionCompiler;
@@ -58,7 +60,32 @@ public class VariabilityUtils {
 	}
 
 	/**
-	 * Checks whether the given {@link EObject} contains a non-empty presence
+	 * Checks for the given {@link EObject} whether it can contain any variability.
+	 * 
+	 * Note, that currently this method checks for the existence of an {@link AbstractFeatureModel}
+	 * in the project, only.
+	 * 
+	 * @param element
+	 *            The {@link EObject} to check for possible variability.
+	 * @return 'true' if the given element can contain any variability.
+	 */
+	public static boolean canContainVariability(EObject element) {
+		if(element instanceof AbstractFeatureModel) {
+			return true;
+		}
+
+		// Find the root container (usually a FileProject)
+		EObject topLevelElem = element;
+		while(topLevelElem.eContainer() != null) {
+			topLevelElem = topLevelElem.eContainer();
+		}
+
+		// Check whether this root container contains any AbstractFeatureModel.
+		return getFirstChildWithType(topLevelElem, AbstractFeatureModel.class) != null;
+	}
+
+	/**
+	 * Checks whether the given {@link IModelElement} contains a non-empty presence
 	 * condition. I.e. whether it is actually really optional.
 	 * 
 	 * @param elem
@@ -154,9 +181,20 @@ public class VariabilityUtils {
 					() -> elem.addSpecification(finalSpec));
 		}
 
-		final OptionalVariationPointSpecification finalSpec = spec;
-		ICommandStackService.getInstance().runAsCommand(elem,
-				() -> finalSpec.setPresenceCondition(pc));
+		// Change model only if the new presence condition is different from the old one
+		PresenceCondition oldPc = spec.getPresenceCondition();
+
+		// If both pc are null, there is nothing to change
+		if(oldPc == null && pc == null) {
+			return true;
+		}
+		// Check whether the old and new are different (i.e., one being null or different value)
+		if(oldPc == null || pc == null ||
+				!oldPc.getStringRepresentation().equals(pc.getStringRepresentation())) {
+			final OptionalVariationPointSpecification finalSpec = spec;
+			ICommandStackService.getInstance().runAsCommand(elem,
+					() -> finalSpec.setPresenceCondition(pc));
+		}
 
 		return true;
 	}
diff --git a/org.fortiss.tooling.graphicsGL.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.graphicsGL.ui/META-INF/MANIFEST.MF
index 3a128ad12d0b547e8ead58e872effb3648d790fd..4f700d9472be2bd6d622c8a7d40e42f9011e782b 100644
--- a/org.fortiss.tooling.graphicsGL.ui/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.graphicsGL.ui/META-INF/MANIFEST.MF
@@ -2,10 +2,10 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: Tooling Graphics GL UI
 Bundle-SymbolicName: org.fortiss.tooling.graphicsGL.ui;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-Activator: org.fortiss.tooling.graphicsGL.ui.ToolingGraphicsGLUIActivator
-Require-Bundle: org.fortiss.tooling.graphicsGL;bundle-version="2.21.0";visibility:=reexport,
- org.fortiss.tooling.base.ui;bundle-version="2.21.0";visibility:=reexport
+Require-Bundle: org.fortiss.tooling.graphicsGL;bundle-version="2.23.0";visibility:=reexport,
+ org.fortiss.tooling.base.ui;bundle-version="2.23.0";visibility:=reexport
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Bundle-Vendor: fortiss GmbH
diff --git a/org.fortiss.tooling.graphicsGL/META-INF/MANIFEST.MF b/org.fortiss.tooling.graphicsGL/META-INF/MANIFEST.MF
index 0ec20603b3321c5464dd9363e00b239a79c5f972..a102f645f1b88e07f02540400a80a0cfadd483d4 100644
--- a/org.fortiss.tooling.graphicsGL/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.graphicsGL/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.fortiss.tooling.graphicsGL;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -23,5 +23,5 @@ Export-Package: org.fortiss.tooling.graphicsGL,
  org.fortiss.tooling.graphicsGL.model.scene.util,
  org.fortiss.tooling.graphicsGL.model.util,
  org.fortiss.tooling.graphicsGL.util
-Require-Bundle: org.fortiss.tooling.kernel;bundle-version="2.21.0";visibility:=reexport
+Require-Bundle: org.fortiss.tooling.kernel;bundle-version="2.23.0";visibility:=reexport
 Automatic-Module-Name: org.fortiss.tooling.graphicsGL
diff --git a/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF
index adb61d72a6e107e5b9e0bb82c3d66f542a4bb0da..3086817cfba584e585daa6e0f9aebc307de0b21d 100644
--- a/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: Tooling Kernel UI
 Bundle-SymbolicName: org.fortiss.tooling.kernel.ui;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-Activator: org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator
 Require-Bundle: org.fortiss.tooling.common.ui;visibility:=reexport,
  org.fortiss.tooling.kernel;visibility:=reexport,
@@ -10,7 +10,7 @@ Require-Bundle: org.fortiss.tooling.common.ui;visibility:=reexport,
  org.eclipse.emf.databinding;visibility:=reexport,
  org.eclipse.core.databinding.property;visibility:=reexport,
  com.google.guava;visibility:=reexport,
- org.fortiss.tooling.base;bundle-version="2.21.0"
+ org.fortiss.tooling.base;bundle-version="2.23.0"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Bundle-Vendor: fortiss GmbH
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings
index 9aba876bcbda93452aba2b4b01d2594d15294853..b76afd02c52eee68b89b4849bf72c4f5910a142e 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings
@@ -1,7 +1,7 @@
-IContextMenuContributor.java 0f09c76662c154cf52ddab61b417e82a42854162 GREEN
+IContextMenuContributor.java de86b87701450d4579047de3075eda8f878d23a9 GREEN
 IContextMenuMultiSelectionContributor.java 125b31dd38009bc2095b7e6bc860e946e39f58c4 GREEN
 IModelEditor.java 777df0a6be0fecb42315c228e5c1e7f68d5ec63f GREEN
-IModelEditorBinding.java 844865d93252b6c4a648c23ff28bb28fd42c17aa GREEN
+IModelEditorBinding.java 0eab668c7a7ad05c6cfc25412e7d38110dd0dc8f GREEN
 IModelElementHandler.java a1613b4ba01a497c8b04943e6dd7ca246a2d40f8 GREEN
 ITutorialStepUI.java b8aee2b95857484ab6ad9ecd55b5de9f0ea158e5 GREEN
 ITutorialUIProvider.java aa0ff5db4d7ba0953e34edeb99f3e8279567e18f GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IContextMenuContributor.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IContextMenuContributor.java
index 0f09c76662c154cf52ddab61b417e82a42854162..de86b87701450d4579047de3075eda8f878d23a9 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IContextMenuContributor.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IContextMenuContributor.java
@@ -48,4 +48,12 @@ public interface IContextMenuContributor {
 
 	/** Returns the section ID to be used for the contributed elements. */
 	String getMenuSectionID();
+
+	/**
+	 * Returns true if this context menu provider should be hidden in the navigator's simplified
+	 * non-expert view.
+	 */
+	default boolean hiddenInNonExpertView() {
+		return false;
+	}
 }
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IModelEditorBinding.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IModelEditorBinding.java
index 844865d93252b6c4a648c23ff28bb28fd42c17aa..0eab668c7a7ad05c6cfc25412e7d38110dd0dc8f 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IModelEditorBinding.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IModelEditorBinding.java
@@ -61,4 +61,10 @@ public interface IModelEditorBinding<T extends EObject> extends IEObjectAware<EO
 
 	/** Returns the priority of the editor. Higher values have lower priority. */
 	int getPriority();
+
+	/**
+	 * Returns {@code true} if the editor referenced by this editor binding should be hidden in the
+	 * navigator's simplified non-expert view.
+	 */
+	boolean hiddenInNonExpertView();
 }
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings
index 04977fcccd72ec3706c8c904e491d2bd6e4cb05c..6af84f3a108c11d00e2fef6f1001760e37a0f271 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings
@@ -7,7 +7,7 @@ EditorBase.java c8da67e34a7f052a71730e06b1963789f5c1b394 GREEN
 FXEditorBase.java c582034c952955de6b58b804290d0cfdf9a76c27 GREEN
 IListPropertySection.java 8bb00fe7959583e794ff9437b7a77404c9a9e70f GREEN
 LWFXEFEditorBase.java cf8133b9f0c25a62f8756ab77959e5294992d59c GREEN
-ModelEditorBindingBase.java b9b1a1c5a48a6e677d1f57ad55a6126d9703c4b5 GREEN
+ModelEditorBindingBase.java a71465afca5a56dfb8f14a34a48acf8dedae813d GREEN
 ModelElementHandlerBase.java 486ad59505e710062715f493c6ff6e49769f5550 GREEN
 MultiEObjectActionBase.java 9e237d8ea640c4194e4877af4a9cfce88698e543 GREEN
 NamedCommentedModelElementHandlerBase.java 681b98b50b362f01abb7a36f108f4f11b9e51829 GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/ModelEditorBindingBase.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/ModelEditorBindingBase.java
index b9b1a1c5a48a6e677d1f57ad55a6126d9703c4b5..a71465afca5a56dfb8f14a34a48acf8dedae813d 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/ModelEditorBindingBase.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/ModelEditorBindingBase.java
@@ -92,4 +92,10 @@ public abstract class ModelEditorBindingBase<T extends EObject>
 	public int getPriority() {
 		return 0;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean hiddenInNonExpertView() {
+		return false;
+	}
 }
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings
index f2010e47a139f7b23d51d54fe7eeac725cdc44cd..d9c3d05742cc133f0d46752e4a9b6cb5ecd0d917 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings
@@ -1,5 +1,5 @@
 ActionService.java e29126b5947c9fd2f1d82bb87001b9d0ead50c3b GREEN
-ContextMenuService.java 802b6d0ade78f91478cd8959cfb423b9963d43bf GREEN
+ContextMenuService.java 9021e4eeb5d7be5d73d87e5947564bdf17f07b9d GREEN
 MarkerService.java 0bfe2c67638db4e506ea5dc7680765f2a8d632e1 GREEN
 ModelEditorBindingService.java f304addb514cd2de443997e0b52cef7a3a9897bf GREEN
 ModelElementHandlerService.java 34adeef844bf98c69f1b9a7252f34d0a2b741b54 GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ContextMenuService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ContextMenuService.java
index 802b6d0ade78f91478cd8959cfb423b9963d43bf..9021e4eeb5d7be5d73d87e5947564bdf17f07b9d 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ContextMenuService.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ContextMenuService.java
@@ -42,6 +42,7 @@ import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider;
 import org.fortiss.tooling.kernel.ui.introspection.items.ContextMenuKISSDetailsItem;
 import org.fortiss.tooling.kernel.ui.service.IActionService;
 import org.fortiss.tooling.kernel.ui.service.IContextMenuService;
+import org.fortiss.tooling.kernel.ui.service.INavigatorService;
 import org.fortiss.tooling.kernel.ui.service.ITutorialUIService;
 import org.fortiss.tooling.kernel.utils.ExtensionPointUtils;
 import org.fortiss.tooling.kernel.utils.LoggingUtils;
@@ -188,6 +189,11 @@ public class ContextMenuService implements IContextMenuService, IIntrospectiveKe
 			ContextMenuContextProvider contextProvider) {
 		EObject selectionElem = contextProvider.getSelectedModelElement();
 		for(IContextMenuContributor contributor : contextMenuContributorList) {
+			if(!INavigatorService.getInstance().isExpertViewActive() &&
+					contributor.hiddenInNonExpertView()) {
+				continue;
+			}
+
 			String menuSectionID = contributor.getMenuSectionID();
 			if(menuSectionID == null) {
 				menuSectionID = IWorkbenchActionConstants.MB_ADDITIONS;
@@ -223,6 +229,11 @@ public class ContextMenuService implements IContextMenuService, IIntrospectiveKe
 			ContextMenuContextProvider contextProvider, List<EObject> selection) {
 		for(IContextMenuContributor contributor : contextMenuContributorList) {
 			if(contributor instanceof IContextMenuMultiSelectionContributor) {
+				if(!INavigatorService.getInstance().isExpertViewActive() &&
+						contributor.hiddenInNonExpertView()) {
+					continue;
+				}
+
 				IContextMenuMultiSelectionContributor multicontributor =
 						(IContextMenuMultiSelectionContributor)contributor;
 				String menuSectionID = contributor.getMenuSectionID();
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings
index a5b9092ac6298691322e8208ac515220c1338a0a..3f6accb197a408b230d9400f0a0267b839884c82 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings
@@ -1,5 +1,5 @@
 ActionBarContributor.java 18d9db3744c5381cca8b6823b5f7bc18183a1cfa GREEN
-ExtendableMultiPageEditor.java ea3f1d3b518eac66af458c0380b96d55d5c51b97 GREEN
+ExtendableMultiPageEditor.java b350451d237a288e35671ffe1ad9bd1a3656b750 GREEN
 IActionContributingEditor.java 4aa7496d67822de919a8cf0af0ddaafc61bf2919 GREEN
 ModelElementEditorInput.java e269eff5d992d375a646e54d048f1f0efc6144dd GREEN
 TutorialStepUIEditor.java 9eadc96c302b5131ff4cc3715777718fa06ec7e8 GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java
index ea3f1d3b518eac66af458c0380b96d55d5c51b97..b350451d237a288e35671ffe1ad9bd1a3656b750 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java
@@ -50,6 +50,7 @@ import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler;
 import org.fortiss.tooling.kernel.ui.extension.base.LWFXEFEditorBase;
 import org.fortiss.tooling.kernel.ui.listener.ExtendableMultiPageEditorPageChangeListener;
 import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService;
+import org.fortiss.tooling.kernel.ui.service.INavigatorService;
 import org.fortiss.tooling.kernel.ui.util.PropertiesConstantUtils;
 
 /**
@@ -189,7 +190,9 @@ public class ExtendableMultiPageEditor extends MultiPageEditorPart
 			try {
 				Class<? extends IEditorPart> editorClass =
 						editorBinding.getEditorClass(editedObject);
-				if(editorClass != null) {
+				boolean expertViewIsActive = INavigatorService.getInstance().isExpertViewActive();
+				if(editorClass != null &&
+						(expertViewIsActive || !editorBinding.hiddenInNonExpertView())) {
 					Class<? extends EObject> inputType = editedObject.getClass();
 					IEditorPart editorPart =
 							constructEditorPart(editorClass, inputType, editorBinding);
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings
index 328749d2e7f7483d42faa53116d33a582a598de7..8668fbe6087faf14c60302cebed8ae3fc3d04e5f 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings
@@ -1,7 +1,7 @@
 DoubleClick.java a94d27299814a93b0d8914050a5da7378a7eccd1 GREEN
 GenericNewMenu.java 7e0dd435cb5ca6d4b486235ec17eef3e5c7aa5f6 GREEN
 LinkWithEditorPartListener.java c5ab74424378e7b158a805c4dd14fc03c8abeded GREEN
-ModelElementsView.java 412cd549f6b3c764a0a842dd3b852563a5496201 GREEN
+ModelElementsView.java bc97ed1edbfa4473d23cbbb71d16f8eb0249bb73 GREEN
 NavigatorNewMenu.java a35e391960d1dacbe7f77982e53e1891e9382d5a GREEN
 NavigatorTreeContentComparator.java d9f1354cfdff78b104b28887d2397e5ca0e9755b GREEN
 NavigatorTreeContentProvider.java 8162138aab09b2cf833cf5f90ff6ab1fc3edc4d8 GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/ModelElementsView.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/ModelElementsView.java
index 412cd549f6b3c764a0a842dd3b852563a5496201..bc97ed1edbfa4473d23cbbb71d16f8eb0249bb73 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/ModelElementsView.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/ModelElementsView.java
@@ -35,10 +35,12 @@ import org.fortiss.tooling.kernel.extension.data.Prototype;
 import org.fortiss.tooling.kernel.extension.data.PrototypeCategory;
 import org.fortiss.tooling.kernel.internal.PrototypeService;
 import org.fortiss.tooling.kernel.service.IPrototypeService;
+import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler;
 import org.fortiss.tooling.kernel.ui.extension.base.EditorBase;
 import org.fortiss.tooling.kernel.ui.internal.editor.ExtendableMultiPageEditor;
 import org.fortiss.tooling.kernel.ui.listener.ExtendableMultiPageEditorPageChangeListener;
 import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
+import org.fortiss.tooling.kernel.ui.service.INavigatorService;
 
 import javafx.scene.Node;
 import javafx.scene.Scene;
@@ -175,13 +177,24 @@ public final class ModelElementsView extends FXViewPart {
 				return false;
 			}
 			if(supportedBaseClasses.contains(element)) {
-				if(filterValue == null || "".equals(filterValue)) {
-					return true;
-				}
 				if(element instanceof Prototype) {
+					boolean isExpertViewActive =
+							INavigatorService.getInstance().isExpertViewActive();
+
 					Prototype proto = (Prototype)element;
+					IModelElementHandlerService mhs = IModelElementHandlerService.getInstance();
+					IModelElementHandler<EObject> handler =
+							mhs.getModelElementHandler(proto.getPrototype());
+					if(!isExpertViewActive && handler.hiddenInNonExpertView()) {
+						return false;
+					}
+					if(filterValue == null || "".equals(filterValue)) {
+						return true;
+					}
 					return proto.getName().toLowerCase().contains(filterValue.toLowerCase());
 				}
+				throw new RuntimeException("Model Elements view: encountered unexpected type: " +
+						element.getClass().getSimpleName());
 			}
 			return false;
 		}
diff --git a/org.fortiss.tooling.kernel/META-INF/MANIFEST.MF b/org.fortiss.tooling.kernel/META-INF/MANIFEST.MF
index 1142bd071d3c3ee199b941319ad5f75749e9986f..cd96ea055bb80734ad84c2409acc85a00cc67506 100644
--- a/org.fortiss.tooling.kernel/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.kernel/META-INF/MANIFEST.MF
@@ -2,12 +2,12 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.fortiss.tooling.kernel;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.fortiss.tooling.kernel.ToolingKernelActivator
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
-Require-Bundle: org.fortiss.tooling.common;bundle-version="2.21.0";visibility:=reexport,
+Require-Bundle: org.fortiss.tooling.common;bundle-version="2.23.0";visibility:=reexport,
  org.eclipse.core.runtime,
  org.eclipse.emf.ecore;bundle-version="2.7.0";visibility:=reexport,
  org.eclipse.emf.transaction;bundle-version="1.4.0";visibility:=reexport,
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings
index db56108a5c5c5a052c804c19f3214e0ba9ed265f..7aa4e52a6aa40ac9dd4c34c91c4d3f42c7b7b57f 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings
@@ -1,6 +1,6 @@
 CompositionUtils.java 34c0a191bd0fb4176c94b4d61abb5c88a679d5e8 GREEN
 EMFResourceUtils.java 68e6712a52349548bf85346900b17aa65b5f0ea9 GREEN
-EcoreSerializerBase.java 0a0c2969d793d2e68094c55c8f7b0a662ef6e5d5 GREEN
+EcoreSerializerBase.java f906e6578ca512e0c83a822ebf6ad17ca5bd3b76 GREEN
 EcoreUtils.java a62460d445203b69ec6029479929da77e887866a GREEN
 ExtensionPointUtils.java 7ce63242b49eb9a7cd4eaadd223f5ebce1dfd75b GREEN
 HierarchicalNameComparator.java 6face1b673126701a0721af48ead2f9766c17d46 GREEN
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/EcoreSerializerBase.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/EcoreSerializerBase.java
index 0a0c2969d793d2e68094c55c8f7b0a662ef6e5d5..f906e6578ca512e0c83a822ebf6ad17ca5bd3b76 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/EcoreSerializerBase.java
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/EcoreSerializerBase.java
@@ -19,6 +19,7 @@ import static org.eclipse.emf.ecore.util.EcoreUtil.getIdentification;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.nio.charset.Charset;
 import java.util.HashMap;
 import java.util.Map;
@@ -288,10 +289,23 @@ public abstract class EcoreSerializerBase<R extends EObject> {
 
 		validate(rootElement);
 
+		saveResource(resource, null);
+	}
+
+	/**
+	 * Saves the given {@link Resource} with the options provided by {@link #getOptions()}. In case
+	 * the provided {@link OutputStream} is not {@code null}, the resource is saved to it.
+	 * Otherwise, it is saved to the URI as configured during the creation of the {@link Resource}.
+	 */
+	protected void saveResource(Resource resource, OutputStream ostream) throws IOException {
 		if(resource instanceof XMLResource) {
 			((XMLResource)resource).setEncoding(charset.name());
 		}
-		resource.save(getOptions());
+		if(ostream == null) {
+			resource.save(getOptions());
+		} else {
+			resource.save(ostream, getOptions());
+		}
 	}
 
 	/**
@@ -424,7 +438,7 @@ public abstract class EcoreSerializerBase<R extends EObject> {
 	 * 
 	 * @throws IOException
 	 */
-	private final ResourceSet createResourceSet() throws IOException {
+	protected final ResourceSet createResourceSet() throws IOException {
 		ResourceSet resourceSet = new ResourceSetImpl();
 		resourceSet.getPackageRegistry().put(eNsURI, ePackage);
 
diff --git a/org.fortiss.tooling.spiderchart.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.spiderchart.ui/META-INF/MANIFEST.MF
index fdf268d921832f9725f2603af9c227fee06ee7e3..1217ddd378c523a5b4a20f6fa3b7d3a3bc3acc01 100644
--- a/org.fortiss.tooling.spiderchart.ui/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.spiderchart.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: Spider Chart
 Bundle-SymbolicName: org.fortiss.tooling.spiderchart.ui;singleton:=true
-Bundle-Version: 2.21.0.qualifier
+Bundle-Version: 2.23.0.qualifier
 Bundle-Vendor: fortiss GmbH
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Bundle-Developer: Amit Kumar Mondal (admin@amitinside.com)
diff --git a/org.fortiss.variability/src/org/fortiss/variability/util/.ratings b/org.fortiss.variability/src/org/fortiss/variability/util/.ratings
index 37e306345cded0510bc80e64870a80b8dcaeb6af..ace737e5aa0600ff2ff8f155362635b09bf28358 100644
--- a/org.fortiss.variability/src/org/fortiss/variability/util/.ratings
+++ b/org.fortiss.variability/src/org/fortiss/variability/util/.ratings
@@ -1,4 +1,4 @@
 FeatureModelTransformationUtils.java b38702296dcb48ff311b382bb9c05d2590e2dfac GREEN
 Pair.java 2dfd7dc65f7b9ba09a120f1a6058d1e8e9556a37 GREEN
-VariabilityUtils.java 1d84b70a1f26ee7b9df697fdc96b8e226762cb5d GREEN
-VariabilityUtilsInternal.java dd40b9277b3d78e8c3f824ceb81684f467c26ab3 YELLOW
+VariabilityUtils.java 66a727bdb58715dc7b1bd0ce320bd647f374f7d6 GREEN
+VariabilityUtilsInternal.java 9c781a47513bb0c4ddcd13be1c27d62b70f25998 GREEN
diff --git a/org.fortiss.variability/src/org/fortiss/variability/util/VariabilityUtils.java b/org.fortiss.variability/src/org/fortiss/variability/util/VariabilityUtils.java
index 1d84b70a1f26ee7b9df697fdc96b8e226762cb5d..66a727bdb58715dc7b1bd0ce320bd647f374f7d6 100644
--- a/org.fortiss.variability/src/org/fortiss/variability/util/VariabilityUtils.java
+++ b/org.fortiss.variability/src/org/fortiss/variability/util/VariabilityUtils.java
@@ -17,7 +17,6 @@ package org.fortiss.variability.util;
 
 import static java.util.stream.Collectors.toList;
 import static org.fortiss.variability.model.VariabilityModelElementFactory.createFeatureConfigurationForFeature;
-import static org.fortiss.variability.util.VariabilityUtilsInternal.FEATURE_LITERAL_LEGAL_CHAR_REGEX;
 import static org.fortiss.variability.util.VariabilityUtilsInternal.getAllReferences;
 import static org.fortiss.variability.util.VariabilityUtilsInternal.getParentsWithType;
 
@@ -43,6 +42,17 @@ import org.fortiss.variability.model.presence.PresenceConditionTerm;
  * @author bayha
  */
 public class VariabilityUtils {
+
+	/**
+	 * Regex, describing all legal characters that might be in a feature literal
+	 * name.
+	 */
+	public final static String FEATURE_LITERAL_LEGAL_CHAR_REGEX =
+			"[a-zA-Z\\d\\$&\\[\\]_\\-\\+@/\\\\,\\.=]";
+
+	/** Regex, describing all keywords. */
+	public final static String PRESENCE_CONDITIONS_KEYWORDS = "OR|AND|NOT|DEFAULT";
+
 	/**
 	 * Renames the given literal reference and updates the StringReprtesentations of
 	 * the {@link PresenceCondition}s, that use it as a literal.
@@ -156,8 +166,11 @@ public class VariabilityUtils {
 	 * @return Whether the given name is compatible with the presence condition systax.
 	 */
 	public static boolean isNameLegalInPresenceCondition(String literalName) {
+		if(literalName.matches(PRESENCE_CONDITIONS_KEYWORDS)) {
+			return false;
+		}
+
 		return literalName.matches(FEATURE_LITERAL_LEGAL_CHAR_REGEX + "*");
-		// TODO (#3862): Check for keywords.
 	}
 
 	/**
diff --git a/org.fortiss.variability/src/org/fortiss/variability/util/VariabilityUtilsInternal.java b/org.fortiss.variability/src/org/fortiss/variability/util/VariabilityUtilsInternal.java
index 3523bec46dc15998d1573a96a7c20cd201a010b6..60efb90f7b7f6639e84a5c98d276489a85a98348 100644
--- a/org.fortiss.variability/src/org/fortiss/variability/util/VariabilityUtilsInternal.java
+++ b/org.fortiss.variability/src/org/fortiss/variability/util/VariabilityUtilsInternal.java
@@ -45,12 +45,6 @@ import org.fortiss.variability.model.presence.PresenceConditionTerm;
  * @author bayha
  */
 public class VariabilityUtilsInternal {
-	/**
-	 * Regex, describing all legal characters, that might be in a feature literal
-	 * name.
-	 */
-	public final static String FEATURE_LITERAL_LEGAL_CHAR_REGEX =
-			"[a-zA-Z\\d\\$&\\[\\]_\\-\\+@/\\\\,\\.=]";
 
 	/**
 	 * Retrieves all elements of type T from a containment tree. The 'context' is