diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefCompositePartRenderer.java b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefCompositePartRenderer.java
index 08fb20b..5a6ed1e 100644
--- a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefCompositePartRenderer.java
+++ b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefCompositePartRenderer.java
@@ -33,6 +33,7 @@
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.eclipse.e4.ui.model.application.ui.MUIElement;
 import org.eclipse.e4.ui.model.application.ui.basic.MCompositePart;
 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainerElement;
@@ -45,6 +46,7 @@
 import org.eclipse.fx.ui.workbench.renderers.base.widget.WCompositePart;
 import org.eclipse.fx.ui.workbench.renderers.base.widget.WLayoutedWidget;
 import org.eclipse.fx.ui.workbench.renderers.base.widget.WMenu;
+import org.eclipse.fx.ui.workbench.renderers.base.widget.WSash;
 import org.eclipse.fx.ui.workbench.renderers.base.widget.WToolBar;
 import org.eclipse.fx.ui.workbench.renderers.fx.DefPartRenderer.HandleGroup;
 import org.eclipse.fx.ui.workbench.renderers.fx.widget.WLayoutedWidgetImpl;
@@ -221,7 +223,7 @@
 
 	static class WFixedSashImpl extends AbstractCompositePartImpl<GridLayoutPane> {
 		private StackPane overlayContainer;
-		
+
 		@Override
 		public void setDialog(Object dialogNode) {
 			@NonNull
@@ -242,13 +244,13 @@
 						this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());
 					});
 				}
-				
+
 				this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());
 				this.overlayContainer.getChildren().setAll((Node)dialogNode);
 				((Pane) staticLayoutNode).getChildren().add(this.overlayContainer);
 			}
 		}
-		
+
 		private static @NonNull GridData toGridData(Map<String, String> dataMap) {
 			GridData gd = new GridData();
 			if (dataMap.containsKey(WCompositePart.FIXED_LAYOUT_WIDTH)) {
@@ -297,7 +299,7 @@
 			MPartSashContainerElement domElement2 = widget.getDomElement();
 			if( domElement2 != null ) {
 				GridData gd = toGridData(domElement2.getPersistedState());
-				GridLayoutPane.setConstraint(n, gd);				
+				GridLayoutPane.setConstraint(n, gd);
 			}
 			p.getChildren().add(n);
 		}
@@ -314,11 +316,11 @@
 
 			for (WLayoutedWidget<MPartSashContainerElement> w : list) {
 				Node n = (Node) w.getStaticLayoutNode();
-				
+
 				MPartSashContainerElement element = w.getDomElement();
 				if( element != null ) {
 					GridData gd = toGridData(element.getPersistedState());
-					GridLayoutPane.setConstraint(n, gd);					
+					GridLayoutPane.setConstraint(n, gd);
 				}
 				nodeList.add(n);
 			}
@@ -338,11 +340,11 @@
 
 			for (WLayoutedWidget<MPartSashContainerElement> w : list) {
 				Node n = (Node) w.getStaticLayoutNode();
-				
+
 				MPartSashContainerElement element = w.getDomElement();
 				if( element != null ) {
 					GridData gd = toGridData(element.getPersistedState());
-					GridLayoutPane.setConstraint(n, gd);					
+					GridLayoutPane.setConstraint(n, gd);
 				}
 				nodeList.add(n);
 			}
@@ -370,14 +372,14 @@
 			p.setMarginHeight(0);
 			p.setHorizontalSpacing(0);
 			p.setVerticalSpacing(0);
-			p.setNumColumns(0); 
+			p.setNumColumns(0);
 			return p;
 		}
 
 		@Override
 		public void updateLayout() {
 			// TODO Auto-generated method stub
-			
+
 		}
 	}
 
@@ -385,7 +387,7 @@
 		private List<WLayoutedWidget<MPartSashContainerElement>> items = new ArrayList<WLayoutedWidget<MPartSashContainerElement>>();
 
 		private StackPane overlayContainer;
-		
+
 		@Override
 		public void setDialog(Object dialogNode) {
 			@NonNull
@@ -406,13 +408,13 @@
 						this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());
 					});
 				}
-				
+
 				this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());
 				this.overlayContainer.getChildren().setAll((Node)dialogNode);
 				((Pane) staticLayoutNode).getChildren().add(this.overlayContainer);
 			}
 		}
-		
+
 		ChangeListener<Number> listener = new ChangeListener<Number>() {
 			boolean queueing;
 
@@ -432,7 +434,7 @@
 				}
 			}
 		};
-		
+
 		@Override
 		public void updateLayout() {
 			updateDividers();
@@ -443,12 +445,12 @@
 			MCompositePart domElement = getDomElement();
 			if( domElement != null ) {
 				BaseRenderer<?, ?> r = (BaseRenderer<?, ?>) domElement.getRenderer();
-				r.syncUIModifications(domElement, this::doRecalcWeight);	
+				r.syncUIModifications(domElement, this::doRecalcWeight);
 			} else {
 				this.logger.error("The domain object should not be null at this point"); //$NON-NLS-1$
 			}
 		}
-		
+
 		void doRecalcWeight() {
 			if (this.state != WidgetState.CREATED) {
 				return;
@@ -465,13 +467,13 @@
 			for (double d : getWidget().getDividerPositions()) {
 				MPartSashContainerElement element = this.items.get(idx++).getDomElement();
 				if( element != null ) {
-					element.setContainerData((d - prev) * 10 + ""); //$NON-NLS-1$	
+					element.setContainerData((d - prev) * 10 + ""); //$NON-NLS-1$
 				}
 				prev = d;
 			}
 			MPartSashContainerElement element = this.items.get(this.items.size() - 1).getDomElement();
 			if( element != null ) {
-				element.setContainerData((1.0 - prev) * 10 + ""); //$NON-NLS-1$	
+				element.setContainerData((1.0 - prev) * 10 + ""); //$NON-NLS-1$
 			}
 		}
 
@@ -513,9 +515,17 @@
 			getWidget().setOrientation(horizontal ? Orientation.HORIZONTAL : Orientation.VERTICAL);
 		}
 
+		private static void setResizableWithParent(WLayoutedWidget widget) {
+			MUIElement domElement = widget.getDomElement();
+			if( domElement != null ) {
+				SplitPane.setResizableWithParent((Node)widget.getStaticLayoutNode(), ! domElement.getTags().contains(WSash.TAG_NO_AUTO_RESIZE));
+			}
+		}
+
 		@Override
 		public void addItem(WLayoutedWidget<MPartSashContainerElement> widget) {
 			SplitPane p = getWidget();
+			setResizableWithParent(widget);
 			p.getItems().add((Node) widget.getStaticLayoutNode());
 			this.items.add(widget);
 			updateDividers();
@@ -526,6 +536,7 @@
 			SplitPane p = getWidget();
 			List<Node> l = new ArrayList<Node>();
 			for (WLayoutedWidget<MPartSashContainerElement> i : list) {
+				setResizableWithParent(i);
 				l.add((Node) i.getStaticLayoutNode());
 			}
 			p.getItems().addAll(index, l);
@@ -538,6 +549,7 @@
 			SplitPane p = getWidget();
 			List<Node> l = new ArrayList<Node>();
 			for (WLayoutedWidget<MPartSashContainerElement> i : list) {
+				setResizableWithParent(i);
 				l.add((Node) i.getStaticLayoutNode());
 			}
 			p.getItems().addAll(l);
