diff --git a/bundles/org.eclipse.e4.tools.emf.ui/.classpath b/bundles/org.eclipse.e4.tools.emf.ui/.classpath
index 738c284..d3f10d8 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/.classpath
+++ b/bundles/org.eclipse.e4.tools.emf.ui/.classpath
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
 		<accessrules>
 			<accessrule kind="accessible" pattern="org/eclipse/e4/**"/>
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.e4.tools.emf.ui/.settings/org.eclipse.jdt.core.prefs
index 8f1b99f..7591ee5 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.e4.tools.emf.ui/.settings/org.eclipse.jdt.core.prefs
@@ -21,14 +21,17 @@
 org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
 org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
 org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
 org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
 org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -45,7 +48,7 @@
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -84,12 +87,14 @@
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
 org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
 org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=warning
 org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
 org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
 org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
@@ -112,6 +117,9 @@
 org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
 org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
 org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
@@ -132,7 +140,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
 org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,HIGH,LOW,LOW,LOW,LOW,LOW,NORMAL
 org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,PERF,MEM,POLISH,@generated NOT,@ADDED,APITODO
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.e4.tools.emf.ui/META-INF/MANIFEST.MF
index e4a3557..9efae60 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.e4.tools.emf.ui/META-INF/MANIFEST.MF
@@ -2,11 +2,11 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.e4.tools.emf.ui;singleton:=true
-Bundle-Version: 4.5.300.qualifier
+Bundle-Version: 4.6.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Require-Bundle: org.eclipse.core.runtime;bundle-version="3.9.0",
  org.eclipse.core.databinding;bundle-version="1.3.0",
  org.eclipse.core.databinding.property;bundle-version="1.2.100",
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/pom.xml b/bundles/org.eclipse.e4.tools.emf.ui/pom.xml
index e90ff8d..625b87e 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/pom.xml
+++ b/bundles/org.eclipse.e4.tools.emf.ui/pom.xml
@@ -21,7 +21,7 @@
 
   <groupId>eclipse.platform.ui.tools</groupId>
   <artifactId>org.eclipse.e4.tools.emf.ui</artifactId>
-  <version>4.5.300-SNAPSHOT</version>
+  <version>4.6.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
   <build>
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/Util.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/Util.java
index a2e533d..872a5e8 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/Util.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/Util.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2015 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -18,8 +18,6 @@
 import java.util.TreeSet;
 
 import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
@@ -398,34 +396,30 @@
 
 	public static final void addDecoration(Control control, Binding binding) {
 		final ControlDecoration dec = new ControlDecoration(control, SWT.BOTTOM);
-		binding.getValidationStatus().addValueChangeListener(new IValueChangeListener() {
+		binding.getValidationStatus().addValueChangeListener(event -> {
+			final IStatus s = (IStatus) event.getObservableValue().getValue();
+			if (s.isOK()) {
+				dec.setDescriptionText(null);
+				dec.setImage(null);
+			} else {
+				dec.setDescriptionText(s.getMessage());
 
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				final IStatus s = (IStatus) event.getObservableValue().getValue();
-				if (s.isOK()) {
-					dec.setDescriptionText(null);
-					dec.setImage(null);
-				} else {
-					dec.setDescriptionText(s.getMessage());
-
-					String fieldDecorationID = null;
-					switch (s.getSeverity()) {
-					case IStatus.INFO:
-						fieldDecorationID = FieldDecorationRegistry.DEC_INFORMATION;
-						break;
-					case IStatus.WARNING:
-						fieldDecorationID = FieldDecorationRegistry.DEC_WARNING;
-						break;
-					case IStatus.ERROR:
-					case IStatus.CANCEL:
-						fieldDecorationID = FieldDecorationRegistry.DEC_ERROR;
-						break;
-					}
-					final FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault()
-							.getFieldDecoration(fieldDecorationID);
-					dec.setImage(fieldDecoration == null ? null : fieldDecoration.getImage());
+				String fieldDecorationID = null;
+				switch (s.getSeverity()) {
+				case IStatus.INFO:
+					fieldDecorationID = FieldDecorationRegistry.DEC_INFORMATION;
+					break;
+				case IStatus.WARNING:
+					fieldDecorationID = FieldDecorationRegistry.DEC_WARNING;
+					break;
+				case IStatus.ERROR:
+				case IStatus.CANCEL:
+					fieldDecorationID = FieldDecorationRegistry.DEC_ERROR;
+					break;
 				}
+				final FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault()
+						.getFieldDecoration(fieldDecorationID);
+				dec.setImage(fieldDecoration == null ? null : fieldDecoration.getImage());
 			}
 		});
 	}
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/component/IdGenerator.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/component/IdGenerator.java
index 30753d9..109155c 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/component/IdGenerator.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/component/IdGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2014, 2015 TwelveTone LLC and others.
+ * Copyright (c) 2014, 2017 TwelveTone LLC and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,11 +17,8 @@
 
 import org.eclipse.core.databinding.observable.value.IObservableValue;
 import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.e4.tools.emf.ui.internal.common.component.tabs.empty.E;
 import org.eclipse.emf.databinding.edit.IEMFEditValueProperty;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.FocusAdapter;
 import org.eclipse.swt.widgets.Control;
 
@@ -84,40 +81,26 @@
 				}
 			});
 
-			control.addDisposeListener(new DisposeListener() {
-
-				@Override
-				public void widgetDisposed(DisposeEvent e) {
-					stopGenerating();
-				}
-			});
+			control.addDisposeListener(e -> stopGenerating());
 		}
 
 		observableValue2 = evpId.observe(master.getValue());
-		observableValue2.addValueChangeListener(listener2 = new IValueChangeListener() {
-
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (!ignore) {
-					stopGenerating();
-				}
+		observableValue2.addValueChangeListener(listener2 = event -> {
+			if (!ignore) {
+				stopGenerating();
 			}
 		});
 
 		observableValue = ebpLabel.observe(master.getValue());
-		observableValue.addValueChangeListener(listener = new IValueChangeListener() {
-
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				String labelValue = (String) ebpLabel.getValue(master.getValue());
-				if (labelValue == null) {
-					labelValue = ""; //$NON-NLS-1$
-				}
-				final String trimmedIdEnding = trimToLowercase(labelValue);
-				ignore = true;
-				evpId.setValue(master.getValue(), baseId + trimmedIdEnding);
-				ignore = false;
+		observableValue.addValueChangeListener(listener = event -> {
+			String labelValue = (String) ebpLabel.getValue(master.getValue());
+			if (labelValue == null) {
+				labelValue = ""; //$NON-NLS-1$
 			}
+			final String trimmedIdEnding = trimToLowercase(labelValue);
+			ignore = true;
+			evpId.setValue(master.getValue(), baseId + trimmedIdEnding);
+			ignore = false;
 		});
 
 	}
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ModelEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ModelEditor.java
index 783e877..4a92de5 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ModelEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ModelEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2015 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -33,12 +33,8 @@
 import org.eclipse.core.databinding.observable.IObservable;
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
 import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
 import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
 import org.eclipse.core.databinding.observable.set.WritableSet;
 import org.eclipse.core.databinding.property.list.IListProperty;
 import org.eclipse.core.resources.IProject;
@@ -194,8 +190,6 @@
 import org.eclipse.emf.edit.command.RemoveCommand;
 import org.eclipse.emf.edit.domain.EditingDomain;
 import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
@@ -208,12 +202,8 @@
 import org.eclipse.jface.resource.StringConverter;
 import org.eclipse.jface.viewers.AbstractTreeViewer;
 import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeExpansionEvent;
 import org.eclipse.jface.viewers.TreeViewer;
@@ -230,8 +220,6 @@
 import org.eclipse.swt.dnd.DragSourceEvent;
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.KeyAdapter;
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.events.KeyListener;
@@ -246,7 +234,6 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.TreeItem;
@@ -401,13 +388,7 @@
 				protected void updateResourceBundle() {
 					super.updateResourceBundle();
 					if (viewer != null) {
-						viewer.getControl().getDisplay().asyncExec(new Runnable() {
-
-							@Override
-							public void run() {
-								viewer.refresh();
-							}
-						});
+						viewer.getControl().getDisplay().asyncExec(() -> viewer.refresh());
 					}
 				}
 			};
@@ -418,13 +399,7 @@
 
 		// This is a workaround until Bug 437207 is merged.
 		// @PersistState will not be invoked.
-		composite.addDisposeListener(new DisposeListener() {
-
-			@Override
-			public void widgetDisposed(DisposeEvent arg0) {
-				persistState();
-			}
-		});
+		composite.addDisposeListener(arg0 -> persistState());
 	}
 
 	@PersistState
@@ -437,13 +412,9 @@
 	@PostConstruct
 	void postCreate(Composite composite) {
 		if (project == null) {
-			keyListener = new Listener() {
-
-				@Override
-				public void handleEvent(Event event) {
-					if ((event.stateMask & SWT.ALT) == SWT.ALT) {
-						findAndHighlight(context.get(Display.class).getFocusControl());
-					}
+			keyListener = event -> {
+				if ((event.stateMask & SWT.ALT) == SWT.ALT) {
+					findAndHighlight(context.get(Display.class).getFocusControl());
 				}
 			};
 			context.get(Display.class).addFilter(SWT.MouseUp, keyListener);
@@ -619,62 +590,49 @@
 				}
 			}
 		});
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				if (!event.getSelection().isEmpty()) {
-					final IStructuredSelection s = (IStructuredSelection) event.getSelection();
-					if (s.getFirstElement() instanceof EObject) {
-						final EObject obj = (EObject) s.getFirstElement();
-						final AbstractComponentEditor editor = getEditor(obj.eClass());
-						if (editor != null) {
-							currentEditor = editor;
-							sectionHeaderLabel.setText(editor.getLabel(obj));
-							iconLabel.setImage(editor.getImage(obj));
-							obsManager.runAndCollect(new Runnable() {
-
-								@Override
-								public void run() {
-									final Composite comp = editor.getEditor(contentContainer, s.getFirstElement());
-									comp.setBackgroundMode(SWT.INHERIT_DEFAULT);
-									layout.topControl = comp;
-									contentContainer.layout(true);
-								}
-							});
-						}
-					} else {
-						final VirtualEntry<?> entry = (VirtualEntry<?>) s.getFirstElement();
-						final AbstractComponentEditor editor = virtualEditors.get(entry.getId());
-						if (editor != null) {
-							currentEditor = editor;
-							sectionHeaderLabel.setText(editor.getLabel(entry));
-							iconLabel.setImage(editor.getImage(entry));
-							obsManager.runAndCollect(new Runnable() {
-
-								@Override
-								public void run() {
-									final Composite comp = editor.getEditor(contentContainer, s.getFirstElement());
-									comp.setBackgroundMode(SWT.INHERIT_DEFAULT);
-									layout.topControl = comp;
-									contentContainer.layout(true);
-								}
-
-							});
-						}
+		viewer.addSelectionChangedListener(event -> {
+			if (!event.getSelection().isEmpty()) {
+				final IStructuredSelection s = (IStructuredSelection) event.getSelection();
+				if (s.getFirstElement() instanceof EObject) {
+					final EObject obj = (EObject) s.getFirstElement();
+					final AbstractComponentEditor editor1 = getEditor(obj.eClass());
+					if (editor1 != null) {
+						currentEditor = editor1;
+						sectionHeaderLabel.setText(editor1.getLabel(obj));
+						iconLabel.setImage(editor1.getImage(obj));
+						obsManager.runAndCollect(() -> {
+							final Composite comp = editor1.getEditor(contentContainer, s.getFirstElement());
+							comp.setBackgroundMode(SWT.INHERIT_DEFAULT);
+							layout.topControl = comp;
+							contentContainer.layout(true);
+						});
 					}
-
-					// Rectangle r = scrolling.getClientArea();
-					// scrolling.setMinSize(contentContainer.computeSize(r.width,
-					// SWT.DEFAULT));
-					// scrolling.setOrigin(0, 0);
-					// scrolling.layout(true, true);
-
-					if (selectionService != null) {
-						selectionService.setSelection(s.getFirstElement());
+				} else {
+					final VirtualEntry<?> entry = (VirtualEntry<?>) s.getFirstElement();
+					final AbstractComponentEditor editor2 = virtualEditors.get(entry.getId());
+					if (editor2 != null) {
+						currentEditor = editor2;
+						sectionHeaderLabel.setText(editor2.getLabel(entry));
+						iconLabel.setImage(editor2.getImage(entry));
+						obsManager.runAndCollect(() -> {
+							final Composite comp = editor2.getEditor(contentContainer, s.getFirstElement());
+							comp.setBackgroundMode(SWT.INHERIT_DEFAULT);
+							layout.topControl = comp;
+							contentContainer.layout(true);
+						});
 					}
-
 				}
+
+				// Rectangle r = scrolling.getClientArea();
+				// scrolling.setMinSize(contentContainer.computeSize(r.width,
+				// SWT.DEFAULT));
+				// scrolling.setOrigin(0, 0);
+				// scrolling.layout(true, true);
+
+				if (selectionService != null) {
+					selectionService.setSelection(s.getFirstElement());
+				}
+
 			}
 		});
 
@@ -682,283 +640,279 @@
 
 		final MenuManager mgr = new MenuManager();
 		mgr.setRemoveAllWhenShown(true);
-		mgr.addMenuListener(new IMenuListener() {
+		mgr.addMenuListener(manager -> {
+			final IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
+			final List<?> listOfSelections = s.toList();
+			final int noSelected = listOfSelections.size();
 
-			@Override
-			public void menuAboutToShow(IMenuManager manager) {
-				final IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
-				final List<?> listOfSelections = s.toList();
-				final int noSelected = listOfSelections.size();
-
-				boolean addSeparator = false;
-				if (!s.isEmpty() && noSelected == 1) {
-					List<Action> actions;
-					if (s.getFirstElement() instanceof VirtualEntry<?>) {
-						actions = virtualEditors.get(((VirtualEntry<?>) s.getFirstElement()).getId())
-								.getActions(s.getFirstElement());
-						if (actions.size() > 0) {
-							final MenuManager addMenu = new MenuManager(messages.ModelEditor_AddChild);
-							for (final Action a : actions) {
-								addSeparator = true;
-								addMenu.add(a);
-							}
-							manager.add(addMenu);
-						}
-
-						actions = virtualEditors.get(((VirtualEntry<?>) s.getFirstElement()).getId())
-								.getActionsImport(s.getFirstElement());
-						if (actions.size() > 0) {
-							final MenuManager menu = new MenuManager(messages.ModelEditor_Import3x);
-							for (final Action a : actions) {
-								addSeparator = true;
-								menu.add(a);
-							}
-							manager.add(menu);
-						}
-
-						if (addSeparator) {
-							manager.add(new Separator());
-						}
-
-					} else {
-
-						final EObject o = (EObject) s.getFirstElement();
-						final AbstractComponentEditor editor = getEditor(o.eClass());
-
-						// Build Add Child menu
-						if (editor != null) {
-							actions = new ArrayList<>(editor.getActions(s.getFirstElement()));
-						} else {
-							actions = new ArrayList<>();
-						}
-
-						if (actions.size() > 0) {
-							final MenuManager addMenu = new MenuManager(messages.ModelEditor_AddChild);
-							for (final Action a : actions) {
-								addSeparator = true;
-								addMenu.add(a);
-							}
-							manager.add(addMenu);
-						}
-
-						// Build import menu
-						if (editor != null) {
-							actions = new ArrayList<>(editor.getActionsImport(s.getFirstElement()));
-						} else {
-							actions = new ArrayList<>();
-						}
-
-						if (actions.size() > 0) {
-							// TODO WIM - extract nls
-							final MenuManager menu = new MenuManager(messages.ModelEditor_Import3x);
-							for (final Action a : actions) {
-								addSeparator = true;
-								menu.add(a);
-							}
-							manager.add(menu);
-						}
-
-						if (o.eContainer() != null) {
+			boolean addSeparator = false;
+			if (!s.isEmpty() && noSelected == 1) {
+				List<Action> actions;
+				if (s.getFirstElement() instanceof VirtualEntry<?>) {
+					actions = virtualEditors.get(((VirtualEntry<?>) s.getFirstElement()).getId())
+							.getActions(s.getFirstElement());
+					if (actions.size() > 0) {
+						final MenuManager addMenu1 = new MenuManager(messages.ModelEditor_AddChild);
+						for (final Action a1 : actions) {
 							addSeparator = true;
-							manager.add(new Action(messages.ModelEditor_Delete, ImageDescriptor.createFromImage(
-									resourcePool.getImageUnchecked(ResourceProvider.IMG_Obj16_cross))) {
-								@Override
-								public void run() {
-									final Command cmd = DeleteCommand.create(modelProvider.getEditingDomain(), o);
-									if (cmd.canExecute()) {
-										modelProvider.getEditingDomain().getCommandStack().execute(cmd);
-									}
-								}
-							});
+							addMenu1.add(a1);
 						}
+						manager.add(addMenu1);
 					}
-				}
-				// multi selection
-				if (noSelected > 0) {
-					if (!isModelFragment() && modelExtractor != null) {
-						manager.add(new Action(messages.ModelEditor_ExtractFragment, ImageDescriptor
-								.createFromImage(resourcePool.getImageUnchecked(ResourceProvider.IMG_ModelFragments))) {
+
+					actions = virtualEditors.get(((VirtualEntry<?>) s.getFirstElement()).getId())
+							.getActionsImport(s.getFirstElement());
+					if (actions.size() > 0) {
+						final MenuManager menu1 = new MenuManager(messages.ModelEditor_Import3x);
+						for (final Action a2 : actions) {
+							addSeparator = true;
+							menu1.add(a2);
+						}
+						manager.add(menu1);
+					}
+
+					if (addSeparator) {
+						manager.add(new Separator());
+					}
+
+				} else {
+
+					final EObject o = (EObject) s.getFirstElement();
+					final AbstractComponentEditor editor = getEditor(o.eClass());
+
+					// Build Add Child menu
+					if (editor != null) {
+						actions = new ArrayList<>(editor.getActions(s.getFirstElement()));
+					} else {
+						actions = new ArrayList<>();
+					}
+
+					if (actions.size() > 0) {
+						final MenuManager addMenu2 = new MenuManager(messages.ModelEditor_AddChild);
+						for (final Action a3 : actions) {
+							addSeparator = true;
+							addMenu2.add(a3);
+						}
+						manager.add(addMenu2);
+					}
+
+					// Build import menu
+					if (editor != null) {
+						actions = new ArrayList<>(editor.getActionsImport(s.getFirstElement()));
+					} else {
+						actions = new ArrayList<>();
+					}
+
+					if (actions.size() > 0) {
+						// TODO WIM - extract nls
+						final MenuManager menu2 = new MenuManager(messages.ModelEditor_Import3x);
+						for (final Action a4 : actions) {
+							addSeparator = true;
+							menu2.add(a4);
+						}
+						manager.add(menu2);
+					}
+
+					if (o.eContainer() != null) {
+						addSeparator = true;
+						manager.add(new Action(messages.ModelEditor_Delete, ImageDescriptor
+								.createFromImage(resourcePool.getImageUnchecked(ResourceProvider.IMG_Obj16_cross))) {
 							@Override
 							public void run() {
-								final ArrayList<MApplicationElement> maes = new ArrayList<>();
-								for (final Object objSelect : listOfSelections) {
-									EObject container = null;
-									if (objSelect instanceof VirtualEntry<?>) {
+								final Command cmd = DeleteCommand.create(modelProvider.getEditingDomain(), o);
+								if (cmd.canExecute()) {
+									modelProvider.getEditingDomain().getCommandStack().execute(cmd);
+								}
+							}
+						});
+					}
+				}
+			}
+			// multi selection
+			if (noSelected > 0) {
+				if (!isModelFragment() && modelExtractor != null) {
+					manager.add(new Action(messages.ModelEditor_ExtractFragment, ImageDescriptor
+							.createFromImage(resourcePool.getImageUnchecked(ResourceProvider.IMG_ModelFragments))) {
+						@Override
+						public void run() {
+							final ArrayList<MApplicationElement> maes = new ArrayList<>();
+							for (final Object objSelect : listOfSelections) {
+								EObject container = null;
+								if (objSelect instanceof VirtualEntry<?>) {
 
-										final VirtualEntry<?> ve = (VirtualEntry<?>) objSelect;
-										container = (EObject) ve.getOriginalParent();
-										final IObservableList list = ve.getList();
-										final Iterator<?> iterator = list.iterator();
-										while (iterator.hasNext()) {
-											maes.add((MApplicationElement) iterator.next());
-										}
-
-									} else {
-										container = ((EObject) objSelect).eContainer();
-										final MApplicationElement objSelect2 = (MApplicationElement) objSelect;
-										if (!(objSelect2 instanceof MApplication)) {
-											maes.add(objSelect2);
-										} else {
-											// can't extract application
-											return;
-										}
-
+									final VirtualEntry<?> ve = (VirtualEntry<?>) objSelect;
+									container = (EObject) ve.getOriginalParent();
+									final IObservableList list = ve.getList();
+									final Iterator<?> iterator = list.iterator();
+									while (iterator.hasNext()) {
+										maes.add((MApplicationElement) iterator.next());
 									}
 
-									final String containerId = ((MApplicationElement) container).getElementId();
-									if (containerId == null || containerId.length() == 0) {
-										MessageDialog.openError(viewer.getControl().getShell(), null,
-												messages.ModelEditor_ExtractFragment_NoParentId);
-
+								} else {
+									container = ((EObject) objSelect).eContainer();
+									final MApplicationElement objSelect2 = (MApplicationElement) objSelect;
+									if (!(objSelect2 instanceof MApplication)) {
+										maes.add(objSelect2);
+									} else {
+										// can't extract application
 										return;
 									}
 
 								}
 
-								if (modelExtractor.extract(viewer.getControl().getShell(), project, maes)) {
-									final Command cmd = DeleteCommand.create(modelProvider.getEditingDomain(), maes);
-									if (cmd.canExecute()) {
-										modelProvider.getEditingDomain().getCommandStack().execute(cmd);
-									}
+								final String containerId = ((MApplicationElement) container).getElementId();
+								if (containerId == null || containerId.length() == 0) {
+									MessageDialog.openError(viewer.getControl().getShell(), null,
+											messages.ModelEditor_ExtractFragment_NoParentId);
+
+									return;
 								}
 
 							}
-						});
-					}
 
-				}
-
-				final IExtensionRegistry registry = RegistryFactory.getRegistry();
-				final IExtensionPoint extPoint = registry.getExtensionPoint("org.eclipse.e4.tools.emf.ui.scripting"); //$NON-NLS-1$
-				final IConfigurationElement[] elements = extPoint.getConfigurationElements();
-
-				if (elements.length > 0 && !s.isEmpty() && s.getFirstElement() instanceof MApplicationElement
-						&& noSelected == 1) {
-					if (addSeparator) {
-						manager.add(new Separator());
-					}
-
-					addSeparator = false;
-
-					final MenuManager scriptExecute = new MenuManager(messages.ModelEditor_Script);
-					manager.add(scriptExecute);
-					for (final IConfigurationElement e : elements) {
-						final IConfigurationElement le = e;
-						scriptExecute.add(new Action(e.getAttribute("label")) { //$NON-NLS-1$
-							@Override
-							public void run() {
-								try {
-									final MApplicationElement o = (MApplicationElement) s.getFirstElement();
-									final IScriptingSupport support = (IScriptingSupport) le
-											.createExecutableExtension("class"); //$NON-NLS-1$
-									IEclipseContext ctx = null;
-									if (project == null) {
-										if (o instanceof MContext) {
-											ctx = ((MContext) o).getContext();
-										} else {
-											ctx = ModelUtils.getContainingContext(o);
-										}
-									}
-
-									support.openEditor(viewer.getControl().getShell(), s.getFirstElement(), ctx);
-								} catch (final CoreException e) {
-									// TODO Auto-generated catch block
-									e.printStackTrace();
+							if (modelExtractor.extract(viewer.getControl().getShell(), project, maes)) {
+								final Command cmd = DeleteCommand.create(modelProvider.getEditingDomain(), maes);
+								if (cmd.canExecute()) {
+									modelProvider.getEditingDomain().getCommandStack().execute(cmd);
 								}
 							}
-						});
-					}
+
+						}
+					});
 				}
 
-				if (project != null) {
+			}
 
-					if (addSeparator) {
-						manager.add(new Separator());
-					}
+			final IExtensionRegistry registry = RegistryFactory.getRegistry();
+			final IExtensionPoint extPoint = registry.getExtensionPoint("org.eclipse.e4.tools.emf.ui.scripting"); //$NON-NLS-1$
+			final IConfigurationElement[] elements = extPoint.getConfigurationElements();
 
-					final Action nlsAction = new Action(messages.ModelEditor_ExternalizeStrings) {
+			if (elements.length > 0 && !s.isEmpty() && s.getFirstElement() instanceof MApplicationElement
+					&& noSelected == 1) {
+				if (addSeparator) {
+					manager.add(new Separator());
+				}
+
+				addSeparator = false;
+
+				final MenuManager scriptExecute = new MenuManager(messages.ModelEditor_Script);
+				manager.add(scriptExecute);
+				for (final IConfigurationElement e : elements) {
+					final IConfigurationElement le = e;
+					scriptExecute.add(new Action(e.getAttribute("label")) { //$NON-NLS-1$
 						@Override
 						public void run() {
-							final ExternalizeStringHandler h = ContextInjectionFactory
-									.make(ExternalizeStringHandler.class, context);
-							ContextInjectionFactory.invoke(h, Execute.class, context);
-						}
-					};
-
-					final Action extIdAction = new Action(messages.ModelEditor_ExportIds) {
-						@Override
-						public void run() {
-							final ExportIdsHandler h = ContextInjectionFactory.make(ExportIdsHandler.class, context);
-							ContextInjectionFactory.invoke(h, Execute.class, context);
-						}
-					};
-
-					manager.add(nlsAction);
-					manager.add(extIdAction);
-				} else {
-					if (addSeparator) {
-						manager.add(new Separator());
-					}
-
-					if (s.getFirstElement() instanceof MUIElement) {
-						final MUIElement el = (MUIElement) s.getFirstElement();
-						if (el.getWidget() instanceof Control) {
-							manager.add(new Action(messages.ModelEditor_ShowControl) {
-
-								@Override
-								public void run() {
-									ControlHighlighter.show((Control) el.getWidget());
+							try {
+								final MApplicationElement o = (MApplicationElement) s.getFirstElement();
+								final IScriptingSupport support = (IScriptingSupport) le
+										.createExecutableExtension("class"); //$NON-NLS-1$
+								IEclipseContext ctx = null;
+								if (project == null) {
+									if (o instanceof MContext) {
+										ctx = ((MContext) o).getContext();
+									} else {
+										ctx = ModelUtils.getContainingContext(o);
+									}
 								}
-							});
 
+								support.openEditor(viewer.getControl().getShell(), s.getFirstElement(), ctx);
+							} catch (final CoreException e) {
+								// TODO Auto-generated catch block
+								e.printStackTrace();
+							}
 						}
-					}
-
+					});
 				}
+			}
+
+			if (project != null) {
 
 				if (addSeparator) {
 					manager.add(new Separator());
 				}
 
-				final Action expandAction = new Action(messages.ModelEditor_ExpandSubtree) {
+				final Action nlsAction = new Action(messages.ModelEditor_ExternalizeStrings) {
 					@Override
 					public void run() {
-						if (!s.isEmpty()) {
-							if (viewer.getExpandedState(s.getFirstElement())) {
-								viewer.collapseToLevel(s.getFirstElement(), AbstractTreeViewer.ALL_LEVELS);
-							} else {
-								viewer.expandToLevel(s.getFirstElement(), AbstractTreeViewer.ALL_LEVELS);
-							}
-						}
+						final ExternalizeStringHandler h = ContextInjectionFactory.make(ExternalizeStringHandler.class,
+								context);
+						ContextInjectionFactory.invoke(h, Execute.class, context);
 					}
 				};
 
-				manager.add(expandAction);
+				final Action extIdAction = new Action(messages.ModelEditor_ExportIds) {
+					@Override
+					public void run() {
+						final ExportIdsHandler h = ContextInjectionFactory.make(ExportIdsHandler.class, context);
+						ContextInjectionFactory.invoke(h, Execute.class, context);
+					}
+				};
 
-				if (s.getFirstElement() instanceof EObject) {
+				manager.add(nlsAction);
+				manager.add(extIdAction);
+			} else {
+				if (addSeparator) {
 					manager.add(new Separator());
-					final EObject el = (EObject) s.getFirstElement();
-					final Action gotoXmiAction = new Action(messages.ModelEditor_goto_xmi) {
-						@Override
-						public void run() {
-							gotoEObject(TAB_XMI, el);
-						}
-					};
-					manager.add(gotoXmiAction);
+				}
 
-					if (listTab != null) {
-						if (EmfUtil.getAttribute(el, "elementId") != null) { //$NON-NLS-1$
-							final Action gotoListAction = new Action(messages.ModelEditor_goto_list) {
-								@Override
-								public void run() {
-									gotoEObject(TAB_LIST, el);
-								}
-							};
-							manager.add(gotoListAction);
+				if (s.getFirstElement() instanceof MUIElement) {
+					final MUIElement el1 = (MUIElement) s.getFirstElement();
+					if (el1.getWidget() instanceof Control) {
+						manager.add(new Action(messages.ModelEditor_ShowControl) {
+
+							@Override
+							public void run() {
+								ControlHighlighter.show((Control) el1.getWidget());
+							}
+						});
+
+					}
+				}
+
+			}
+
+			if (addSeparator) {
+				manager.add(new Separator());
+			}
+
+			final Action expandAction = new Action(messages.ModelEditor_ExpandSubtree) {
+				@Override
+				public void run() {
+					if (!s.isEmpty()) {
+						if (viewer.getExpandedState(s.getFirstElement())) {
+							viewer.collapseToLevel(s.getFirstElement(), AbstractTreeViewer.ALL_LEVELS);
+						} else {
+							viewer.expandToLevel(s.getFirstElement(), AbstractTreeViewer.ALL_LEVELS);
 						}
 					}
-
 				}
+			};
+
+			manager.add(expandAction);
+
+			if (s.getFirstElement() instanceof EObject) {
+				manager.add(new Separator());
+				final EObject el2 = (EObject) s.getFirstElement();
+				final Action gotoXmiAction = new Action(messages.ModelEditor_goto_xmi) {
+					@Override
+					public void run() {
+						gotoEObject(TAB_XMI, el2);
+					}
+				};
+				manager.add(gotoXmiAction);
+
+				if (listTab != null) {
+					if (EmfUtil.getAttribute(el2, "elementId") != null) { //$NON-NLS-1$
+						final Action gotoListAction = new Action(messages.ModelEditor_goto_list) {
+							@Override
+							public void run() {
+								gotoEObject(TAB_LIST, el2);
+							}
+						};
+						manager.add(gotoListAction);
+					}
+				}
+
 			}
 		});
 
@@ -983,24 +937,16 @@
 			@Override
 			public void treeExpanded(final TreeExpansionEvent event) {
 				if (mod1Down) {
-					viewer.getTree().getDisplay().asyncExec(new Runnable() {
-						@Override
-						public void run() {
-							viewer.expandToLevel(event.getElement(), AbstractTreeViewer.ALL_LEVELS);
-						}
-					});
+					viewer.getTree().getDisplay()
+					.asyncExec(() -> viewer.expandToLevel(event.getElement(), AbstractTreeViewer.ALL_LEVELS));
 				}
 			}
 
 			@Override
 			public void treeCollapsed(final TreeExpansionEvent event) {
 				if (mod1Down) {
-					viewer.getTree().getDisplay().asyncExec(new Runnable() {
-						@Override
-						public void run() {
-							viewer.collapseToLevel(event.getElement(), AbstractTreeViewer.ALL_LEVELS);
-						}
-					});
+					viewer.getTree().getDisplay()
+					.asyncExec(() -> viewer.collapseToLevel(event.getElement(), AbstractTreeViewer.ALL_LEVELS));
 				}
 			}
 		});
@@ -1126,56 +1072,42 @@
 
 		final WritableSet clearedSet = new WritableSet();
 
-		contentProvider.getKnownElements().addSetChangeListener(new ISetChangeListener() {
-
-			@Override
-			public void handleSetChange(SetChangeEvent event) {
-				for (final Object o : event.diff.getAdditions()) {
-					if (o instanceof EObject) {
-						clearedSet.add(o);
-					}
+		contentProvider.getKnownElements().addSetChangeListener(event -> {
+			for (final Object o1 : event.diff.getAdditions()) {
+				if (o1 instanceof EObject) {
+					clearedSet.add(o1);
 				}
+			}
 
-				for (final Object o : event.diff.getRemovals()) {
-					if (o instanceof EObject) {
-						clearedSet.remove(o);
-					}
+			for (final Object o2 : event.diff.getRemovals()) {
+				if (o2 instanceof EObject) {
+					clearedSet.remove(o2);
 				}
 			}
 		});
 
 		for (final FeaturePath p : labelFeaturePaths) {
 			final IObservableMap map = EMFProperties.value(p).observeDetail(clearedSet);
-			map.addMapChangeListener(new IMapChangeListener() {
-
-				@Override
-				public void handleMapChange(MapChangeEvent event) {
-					viewer.update(event.diff.getChangedKeys().toArray(), null);
-				}
-			});
+			map.addMapChangeListener(event -> viewer.update(event.diff.getChangedKeys().toArray(), null));
 		}
 
 		viewer.setInput(modelProvider.getRoot());
 		viewer.setAutoExpandLevel(2);
 		viewer.expandToLevel(viewer.getAutoExpandLevel());
-		viewer.addDoubleClickListener(new IDoubleClickListener() {
-
-			@Override
-			public void doubleClick(DoubleClickEvent event) {
-				final TreeViewer viewer = (TreeViewer) event.getViewer();
-				final IStructuredSelection thisSelection = (IStructuredSelection) event.getSelection();
-				final Object selectedNode = thisSelection.getFirstElement();
-				if (mod1Down) {
-					if (viewer.getExpandedState(selectedNode)) {
-						viewer.setExpandedState(selectedNode, false);
-					} else {
-						viewer.expandToLevel(selectedNode, AbstractTreeViewer.ALL_LEVELS);
-					}
+		viewer.addDoubleClickListener(event -> {
+			final TreeViewer viewer1 = (TreeViewer) event.getViewer();
+			final IStructuredSelection thisSelection = (IStructuredSelection) event.getSelection();
+			final Object selectedNode = thisSelection.getFirstElement();
+			if (mod1Down) {
+				if (viewer1.getExpandedState(selectedNode)) {
+					viewer1.setExpandedState(selectedNode, false);
 				} else {
-					viewer.setExpandedState(selectedNode, !viewer.getExpandedState(selectedNode));
+					viewer1.expandToLevel(selectedNode, AbstractTreeViewer.ALL_LEVELS);
 				}
-
+			} else {
+				viewer1.setExpandedState(selectedNode, !viewer1.getExpandedState(selectedNode));
 			}
+
 		});
 
 		// Effect of filtered tree implementation (bug 391086)
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/VirtualEntry.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/VirtualEntry.java
index 80636ef..39c8723 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/VirtualEntry.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/VirtualEntry.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,10 +12,10 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
 import org.eclipse.core.databinding.observable.Diffs;
 import org.eclipse.core.databinding.observable.list.IListChangeListener;
 import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
 import org.eclipse.core.databinding.observable.list.ListDiff;
 import org.eclipse.core.databinding.observable.list.WritableList;
 import org.eclipse.core.databinding.property.list.IListProperty;
@@ -36,15 +36,11 @@
 		final IObservableList origList = property.observe(originalParent);
 		list.addAll(cleanedList(origList));
 
-		final IListChangeListener listener = new IListChangeListener() {
-
-			@Override
-			public void handleListChange(ListChangeEvent event) {
-				if (!VirtualEntry.this.list.isDisposed()) {
-					List<Object> clean = cleanedList(event.getObservableList());
-					ListDiff diff = Diffs.computeListDiff(VirtualEntry.this.list, clean);
-					diff.applyTo(VirtualEntry.this.list);
-				}
+		final IListChangeListener listener = event -> {
+			if (!VirtualEntry.this.list.isDisposed()) {
+				List<Object> clean = cleanedList(event.getObservableList());
+				ListDiff diff = Diffs.computeListDiff(VirtualEntry.this.list, clean);
+				diff.applyTo(VirtualEntry.this.list);
 			}
 		};
 
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ControlFactory.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ControlFactory.java
index b27cdd3..828ccb0 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ControlFactory.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ControlFactory.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2014 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -19,17 +19,12 @@
 
 import org.eclipse.core.databinding.Binding;
 import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
 import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
 import org.eclipse.core.databinding.observable.map.IObservableMap;
 import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.databinding.validation.IValidator;
 import org.eclipse.core.databinding.validation.ValidationStatus;
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.e4.tools.emf.ui.common.Util;
 import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor;
@@ -80,10 +75,8 @@
 import org.eclipse.jface.viewers.ColumnLabelProvider;
 import org.eclipse.jface.viewers.ComboViewer;
 import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
@@ -93,12 +86,8 @@
 import org.eclipse.swt.dnd.TextTransfer;
 import org.eclipse.swt.events.KeyAdapter;
 import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -163,18 +152,14 @@
 
 		TextPasteHandler.createFor(t);
 
-		editor.getMaster().addValueChangeListener(new IValueChangeListener() {
-
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				final Object val = event.diff.getNewValue();
-				if (val != null && val instanceof EObject && !t.isDisposed()) {
-					final Resource res = ((EObject) val).eResource();
-					if (res instanceof E4XMIResource) {
-						final String v = ((E4XMIResource) res).getID((EObject) val);
-						if (v != null && v.trim().length() > 0) {
-							t.setText(v);
-						}
+		editor.getMaster().addValueChangeListener(event -> {
+			final Object val = event.diff.getNewValue();
+			if (val != null && val instanceof EObject && !t.isDisposed()) {
+				final Resource res = ((EObject) val).eResource();
+				if (res instanceof E4XMIResource) {
+					final String v = ((E4XMIResource) res).getID((EObject) val);
+					if (v != null && v.trim().length() > 0) {
+						t.setText(v);
 					}
 				}
 			}
@@ -355,13 +340,7 @@
 		final IEMFEditListProperty prop = EMFEditProperties.list(editor.getEditingDomain(), feature);
 		final IObservableList observableList = prop.observeDetail(editor.getMaster());
 		tableviewer.setInput(observableList);
-		observableList.addListChangeListener(new IListChangeListener() {
-
-			@Override
-			public void handleListChange(ListChangeEvent event) {
-				tableviewer.getTable().getColumn(0).pack();
-			}
-		});
+		observableList.addListChangeListener(event -> tableviewer.getTable().getColumn(0).pack());
 
 		return pickList;
 	}
@@ -415,25 +394,21 @@
 			final FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault().getFieldDecoration(
 					FieldDecorationRegistry.DEC_WARNING);
 			controlDecoration.setImage(fieldDecoration.getImage());
-			final IValidator iv = new IValidator() {
-
-				@Override
-				public IStatus validate(Object value) {
-					if (value == null) {
+			final IValidator iv = value -> {
+				if (value == null) {
+					controlDecoration.show();
+					return ValidationStatus.warning(warningText);
+				}
+				if (value instanceof String) {
+					final String text = (String) value;
+					if (text.trim().length() == 0) {
 						controlDecoration.show();
 						return ValidationStatus.warning(warningText);
 					}
-					if (value instanceof String) {
-						final String text = (String) value;
-						if (text.trim().length() == 0) {
-							controlDecoration.show();
-							return ValidationStatus.warning(warningText);
-						}
-					}
-
-					controlDecoration.hide();
-					return Status.OK_STATUS;
 				}
+
+				controlDecoration.hide();
+				return Status.OK_STATUS;
 			};
 			final UpdateValueStrategy acv = new UpdateValueStrategy().setAfterConvertValidator(iv);
 			context.bindValue(textProp.observeDelayed(200, t), modelProp.observeDetail(master), acv, acv);
@@ -532,15 +507,11 @@
 		final IObservableValue uiObs = vProp.observe(viewer);
 		final IObservableValue mObs = EMFEditProperties.value(editor.getEditingDomain(),
 				UiPackageImpl.Literals.ELEMENT_CONTAINER__SELECTED_ELEMENT).observeDetail(editor.getMaster());
-		editor.getMaster().addValueChangeListener(new IValueChangeListener() {
-
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (binding[0] != null) {
-					binding[0].dispose();
-				}
-
+		editor.getMaster().addValueChangeListener(event -> {
+			if (binding[0] != null) {
+				binding[0].dispose();
 			}
+
 		});
 
 		final IObservableList list = listProp.observeDetail(editor.getMaster());
@@ -574,13 +545,7 @@
 		});
 		viewer.setInput(list);
 
-		editor.getMaster().addValueChangeListener(new IValueChangeListener() {
-
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				binding[0] = context.bindValue(uiObs, mObs);
-			}
-		});
+		editor.getMaster().addValueChangeListener(event -> binding[0] = context.bindValue(uiObs, mObs));
 	}
 
 	public static void createBindingContextWiget(Composite parent, final Messages Messages,
@@ -657,13 +622,9 @@
 		final IEMFListProperty prop = EMFProperties.list(feature);
 		viewer.setInput(prop.observeDetail(editor.getMaster()));
 
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			@Override
-			public void selectionChanged(SelectionChangedEvent event) {
-				final String strSelected = (String) ((StructuredSelection) event.getSelection()).getFirstElement();
-				t.setText(strSelected != null ? strSelected : ""); //$NON-NLS-1$
-			}
+		viewer.addSelectionChangedListener(event -> {
+			final String strSelected = (String) ((StructuredSelection) event.getSelection()).getFirstElement();
+			t.setText(strSelected != null ? strSelected : ""); //$NON-NLS-1$
 		});
 
 		//
@@ -795,24 +756,17 @@
 	}
 
 	public static void attachFiltering(Text searchText, final TableViewer viewer, final PatternFilter filter) {
-		searchText.addModifyListener(new ModifyListener() {
-			@Override
-			public void modifyText(ModifyEvent e) {
-				filter.setPattern(((Text) e.widget).getText());
-				viewer.refresh();
-				if (viewer.getTable().getItemCount() > 0) {
-					final Object data = viewer.getTable().getItem(0).getData();
-					viewer.setSelection(new StructuredSelection(data));
-				}
+		searchText.addModifyListener(e -> {
+			filter.setPattern(((Text) e.widget).getText());
+			viewer.refresh();
+			if (viewer.getTable().getItemCount() > 0) {
+				final Object data = viewer.getTable().getItem(0).getData();
+				viewer.setSelection(new StructuredSelection(data));
 			}
 		});
-		searchText.addTraverseListener(new TraverseListener() {
-
-			@Override
-			public void keyTraversed(TraverseEvent e) {
-				if (e.keyCode == SWT.ARROW_DOWN && viewer.getTable().getItemCount() > 0) {
-					viewer.getControl().setFocus();
-				}
+		searchText.addTraverseListener(e -> {
+			if (e.keyCode == SWT.ARROW_DOWN && viewer.getTable().getItemCount() > 0) {
+				viewer.getControl().setFocus();
 			}
 		});
 	}
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/DirectMenuItemEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/DirectMenuItemEditor.java
index 37d7300..b3165b3 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/DirectMenuItemEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/DirectMenuItemEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,8 +17,6 @@
 import org.eclipse.core.databinding.UpdateValueStrategy;
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.databinding.observable.value.WritableValue;
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.tools.emf.ui.common.ContributionURIValidator;
@@ -43,8 +41,6 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Image;
@@ -138,21 +134,17 @@
 			final Text t = new Text(parent, SWT.BORDER);
 			TextPasteHandler.createFor(t);
 			t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			t.addModifyListener(new ModifyListener() {
-
-				@Override
-				public void modifyText(ModifyEvent e) {
-					if (lnk != null) {
-						lnk.setToolTipText(((Text) e.getSource()).getText());
-					}
+			t.addModifyListener(e -> {
+				if (lnk != null) {
+					lnk.setToolTipText(((Text) e.getSource()).getText());
 				}
 			});
 			final Binding binding = context.bindValue(
 					textProp.observeDelayed(200, t),
 					EMFEditProperties.value(getEditingDomain(),
 							ApplicationPackageImpl.Literals.CONTRIBUTION__CONTRIBUTION_URI).observeDetail(master),
-							new UpdateValueStrategy().setAfterConvertValidator(new ContributionURIValidator()),
-							new UpdateValueStrategy());
+					new UpdateValueStrategy().setAfterConvertValidator(new ContributionURIValidator()),
+					new UpdateValueStrategy());
 			Util.addDecoration(t, binding);
 
 			final Button b = new Button(parent, SWT.PUSH | SWT.FLAT);
@@ -179,17 +171,13 @@
 			list.add(0, ((MDirectMenuItem) element).getVisibleWhen());
 		}
 
-		UI_ELEMENT__VISIBLE_WHEN.observe(element).addValueChangeListener(new IValueChangeListener() {
+		UI_ELEMENT__VISIBLE_WHEN.observe(element).addValueChangeListener(event -> {
+			if (event.diff.getOldValue() != null) {
+				list.remove(event.diff.getOldValue());
+			}
 
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (event.diff.getOldValue() != null) {
-					list.remove(event.diff.getOldValue());
-				}
-
-				if (event.diff.getNewValue() != null) {
-					list.add(0, event.diff.getNewValue());
-				}
+			if (event.diff.getNewValue() != null) {
+				list.add(0, event.diff.getNewValue());
 			}
 		});
 
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/DirectToolItemEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/DirectToolItemEditor.java
index 871646f..c756625 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/DirectToolItemEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/DirectToolItemEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -16,8 +16,6 @@
 import org.eclipse.core.databinding.Binding;
 import org.eclipse.core.databinding.UpdateValueStrategy;
 import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.databinding.observable.value.WritableValue;
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.tools.emf.ui.common.ContributionURIValidator;
@@ -42,8 +40,6 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Image;
@@ -99,13 +95,9 @@
 		final Text t = new Text(parent, SWT.BORDER);
 		TextPasteHandler.createFor(t);
 		t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		t.addModifyListener(new ModifyListener() {
-
-			@Override
-			public void modifyText(ModifyEvent e) {
-				if (lnk != null) {
-					lnk.setToolTipText(((Text) e.getSource()).getText());
-				}
+		t.addModifyListener(e -> {
+			if (lnk != null) {
+				lnk.setToolTipText(((Text) e.getSource()).getText());
 			}
 		});
 		final Binding binding = context.bindValue(textProp.observeDelayed(200, t),
@@ -173,17 +165,13 @@
 			list.add(0, ((MDirectToolItem) element).getVisibleWhen());
 		}
 
-		UI_ELEMENT__VISIBLE_WHEN.observe(element).addValueChangeListener(new IValueChangeListener() {
+		UI_ELEMENT__VISIBLE_WHEN.observe(element).addValueChangeListener(event -> {
+			if (event.diff.getOldValue() != null) {
+				list.remove(event.diff.getOldValue());
+			}
 
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (event.diff.getOldValue() != null) {
-					list.remove(event.diff.getOldValue());
-				}
-
-				if (event.diff.getNewValue() != null) {
-					list.add(0, event.diff.getNewValue());
-				}
+			if (event.diff.getNewValue() != null) {
+				list.add(0, event.diff.getNewValue());
 			}
 		});
 
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledMenuItemEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledMenuItemEditor.java
index 9c65ccf..328c4dc 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledMenuItemEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledMenuItemEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -15,8 +15,6 @@
 import org.eclipse.core.databinding.UpdateValueStrategy;
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.databinding.observable.value.WritableValue;
 import org.eclipse.e4.tools.emf.ui.common.CommandToStringConverter;
 import org.eclipse.e4.tools.emf.ui.common.IModelResource;
@@ -119,17 +117,13 @@
 			list.add(0, ((MHandledMenuItem) element).getVisibleWhen());
 		}
 
-		UI_ELEMENT__VISIBLE_WHEN.observe(element).addValueChangeListener(new IValueChangeListener() {
+		UI_ELEMENT__VISIBLE_WHEN.observe(element).addValueChangeListener(event -> {
+			if (event.diff.getOldValue() != null) {
+				list.remove(event.diff.getOldValue());
+			}
 
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (event.diff.getOldValue() != null) {
-					list.remove(event.diff.getOldValue());
-				}
-
-				if (event.diff.getNewValue() != null) {
-					list.add(0, event.diff.getNewValue());
-				}
+			if (event.diff.getNewValue() != null) {
+				list.add(0, event.diff.getNewValue());
 			}
 		});
 
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledToolItemEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledToolItemEditor.java
index 2287f6c..e56940c 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledToolItemEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/HandledToolItemEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -14,8 +14,6 @@
 
 import org.eclipse.core.databinding.UpdateValueStrategy;
 import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.databinding.observable.value.WritableValue;
 import org.eclipse.e4.tools.emf.ui.common.CommandToStringConverter;
 import org.eclipse.e4.tools.emf.ui.common.IModelResource;
@@ -118,17 +116,13 @@
 			list.add(0, ((MHandledToolItem) element).getVisibleWhen());
 		}
 
-		UI_ELEMENT__VISIBLE_WHEN.observe(element).addValueChangeListener(new IValueChangeListener() {
+		UI_ELEMENT__VISIBLE_WHEN.observe(element).addValueChangeListener(event -> {
+			if (event.diff.getOldValue() != null) {
+				list.remove(event.diff.getOldValue());
+			}
 
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (event.diff.getOldValue() != null) {
-					list.remove(event.diff.getOldValue());
-				}
-
-				if (event.diff.getNewValue() != null) {
-					list.add(0, event.diff.getNewValue());
-				}
+			if (event.diff.getNewValue() != null) {
+				list.add(0, event.diff.getNewValue());
 			}
 		});
 
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuEditor.java
index f6bb192..27962f0 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * f * Copyright (c) 2010, 2014 BestSolution.at and others.
+ * f * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -21,13 +21,9 @@
 import javax.inject.Inject;
 
 import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
 import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
 import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
 import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.databinding.observable.value.WritableValue;
 import org.eclipse.core.databinding.property.list.IListProperty;
 import org.eclipse.core.resources.IProject;
@@ -402,48 +398,38 @@
 			list.add(0, ((MUIElement) element).getVisibleWhen());
 		}
 
-		UI_ELEMENT__VISIBLE_WHEN.observe(element).addValueChangeListener(new IValueChangeListener() {
+		UI_ELEMENT__VISIBLE_WHEN.observe(element).addValueChangeListener(event -> {
+			if (event.diff.getOldValue() != null) {
+				list.remove(event.diff.getOldValue());
+			}
 
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (event.diff.getOldValue() != null) {
-					list.remove(event.diff.getOldValue());
-				}
-
-				if (event.diff.getNewValue() != null) {
-					list.add(0, event.diff.getNewValue());
-				}
+			if (event.diff.getNewValue() != null) {
+				list.add(0, event.diff.getNewValue());
 			}
 		});
 
 		final IObservableList l = ELEMENT_CONTAINER__CHILDREN.observe(element);
-		l.addListChangeListener(new IListChangeListener() {
+		l.addListChangeListener(event -> event.diff.accept(new ListDiffVisitor() {
 
 			@Override
-			public void handleListChange(ListChangeEvent event) {
-				event.diff.accept(new ListDiffVisitor() {
-
-					@Override
-					public void handleRemove(int index, Object element) {
-						list.remove(element);
-					}
-
-					@Override
-					public void handleMove(int oldIndex, int newIndex, Object element) {
-						if (list.get(0) instanceof MExpression) {
-							oldIndex += 1;
-							newIndex += 1;
-						}
-						list.move(oldIndex, newIndex);
-					}
-
-					@Override
-					public void handleAdd(int index, Object element) {
-						list.add(element);
-					}
-				});
+			public void handleRemove(int index, Object element) {
+				list.remove(element);
 			}
-		});
+
+			@Override
+			public void handleMove(int oldIndex, int newIndex, Object element) {
+				if (list.get(0) instanceof MExpression) {
+					oldIndex += 1;
+					newIndex += 1;
+				}
+				list.move(oldIndex, newIndex);
+			}
+
+			@Override
+			public void handleAdd(int index, Object element) {
+				list.add(element);
+			}
+		}));
 		list.addAll(l);
 
 		return list;
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartDescriptorEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartDescriptorEditor.java
index e18e317..7e1114f 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartDescriptorEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartDescriptorEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,8 +17,6 @@
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.list.WritableList;
 import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.databinding.property.list.IListProperty;
 import org.eclipse.core.databinding.property.value.IValueProperty;
 import org.eclipse.core.resources.IProject;
@@ -445,23 +443,19 @@
 			list.add(0, window.getToolbar());
 		}
 
-		PART__TOOLBAR.observe(element).addValueChangeListener(new IValueChangeListener() {
-
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (event.diff.getOldValue() != null) {
-					list.remove(event.diff.getOldValue());
-					if (getMaster().getValue() == element && !createRemoveToolBar.isDisposed()) {
-						createRemoveToolBar.setSelection(false);
-					}
-
+		PART__TOOLBAR.observe(element).addValueChangeListener(event -> {
+			if (event.diff.getOldValue() != null) {
+				list.remove(event.diff.getOldValue());
+				if (getMaster().getValue() == element && !createRemoveToolBar.isDisposed()) {
+					createRemoveToolBar.setSelection(false);
 				}
 
-				if (event.diff.getNewValue() != null) {
-					list.add(0, event.diff.getNewValue());
-					if (getMaster().getValue() == element && !createRemoveToolBar.isDisposed()) {
-						createRemoveToolBar.setSelection(true);
-					}
+			}
+
+			if (event.diff.getNewValue() != null) {
+				list.add(0, event.diff.getNewValue());
+				if (getMaster().getValue() == element && !createRemoveToolBar.isDisposed()) {
+					createRemoveToolBar.setSelection(true);
 				}
 			}
 		});
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartEditor.java
index b29a35a..719768c 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2014 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -19,8 +19,6 @@
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.list.WritableList;
 import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.databinding.property.list.IListProperty;
 import org.eclipse.core.databinding.property.value.IValueProperty;
 import org.eclipse.core.resources.IProject;
@@ -62,8 +60,6 @@
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabItem;
 import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Image;
@@ -250,14 +246,10 @@
 			final Text t = new Text(parent, SWT.BORDER);
 			TextPasteHandler.createFor(t);
 			t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			t.addModifyListener(new ModifyListener() {
-
-				@Override
-				public void modifyText(ModifyEvent e) {
-					// lnk might be disposed if else branch above taken
-					if (lnk != null) {
-						lnk.setToolTipText(((Text) e.getSource()).getText());
-					}
+			t.addModifyListener(e -> {
+				// lnk might be disposed if else branch above taken
+				if (lnk != null) {
+					lnk.setToolTipText(((Text) e.getSource()).getText());
 				}
 			});
 			final Binding binding = context.bindValue(
@@ -433,23 +425,19 @@
 			list.add(0, window.getToolbar());
 		}
 
-		PART__TOOLBAR.observe(element).addValueChangeListener(new IValueChangeListener() {
-
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (event.diff.getOldValue() != null) {
-					list.remove(event.diff.getOldValue());
-					if (getMaster().getValue() == element && !createRemoveToolBar.isDisposed()) {
-						createRemoveToolBar.setSelection(false);
-					}
-
+		PART__TOOLBAR.observe(element).addValueChangeListener(event -> {
+			if (event.diff.getOldValue() != null) {
+				list.remove(event.diff.getOldValue());
+				if (getMaster().getValue() == element && !createRemoveToolBar.isDisposed()) {
+					createRemoveToolBar.setSelection(false);
 				}
 
-				if (event.diff.getNewValue() != null) {
-					list.add(0, event.diff.getNewValue());
-					if (getMaster().getValue() == element && !createRemoveToolBar.isDisposed()) {
-						createRemoveToolBar.setSelection(true);
-					}
+			}
+
+			if (event.diff.getNewValue() != null) {
+				list.add(0, event.diff.getNewValue());
+				if (getMaster().getValue() == element && !createRemoveToolBar.isDisposed()) {
+					createRemoveToolBar.setSelection(true);
 				}
 			}
 		});
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ToolItemEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ToolItemEditor.java
index 0fc349a..7adfc75 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ToolItemEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ToolItemEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2014 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -23,8 +23,6 @@
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.list.WritableList;
 import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.databinding.observable.value.WritableValue;
 import org.eclipse.core.databinding.property.value.IValueProperty;
 import org.eclipse.core.resources.IProject;
@@ -367,22 +365,18 @@
 			list.add(0, item.getMenu());
 		}
 
-		TOOL_ITEM__MENU.observe(element).addValueChangeListener(new IValueChangeListener() {
-
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (event.diff.getOldValue() != null) {
-					list.remove(event.diff.getOldValue());
-					if (getMaster().getValue() == element && !createRemoveMenu.isDisposed()) {
-						createRemoveMenu.setSelection(false);
-					}
+		TOOL_ITEM__MENU.observe(element).addValueChangeListener(event -> {
+			if (event.diff.getOldValue() != null) {
+				list.remove(event.diff.getOldValue());
+				if (getMaster().getValue() == element && !createRemoveMenu.isDisposed()) {
+					createRemoveMenu.setSelection(false);
 				}
+			}
 
-				if (event.diff.getNewValue() != null) {
-					list.add(0, event.diff.getNewValue());
-					if (getMaster().getValue() == element && !createRemoveMenu.isDisposed()) {
-						createRemoveMenu.setSelection(true);
-					}
+			if (event.diff.getNewValue() != null) {
+				list.add(0, event.diff.getNewValue());
+				if (getMaster().getValue() == element && !createRemoveMenu.isDisposed()) {
+					createRemoveMenu.setSelection(true);
 				}
 			}
 		});
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/WindowEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/WindowEditor.java
index c4bc295..f0e777f 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/WindowEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/WindowEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2014 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -21,8 +21,6 @@
 
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.databinding.observable.value.WritableValue;
 import org.eclipse.core.databinding.property.list.IListProperty;
 import org.eclipse.core.databinding.property.value.IValueProperty;
@@ -422,22 +420,18 @@
 			list.add(0, window.getMainMenu());
 		}
 
-		WINDOW__MAIN_MENU.observe(element).addValueChangeListener(new IValueChangeListener() {
-
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (event.diff.getOldValue() != null) {
-					list.remove(event.diff.getOldValue());
-					if (getMaster().getValue() == element && !createRemoveMainMenu.isDisposed()) {
-						createRemoveMainMenu.setSelection(false);
-					}
+		WINDOW__MAIN_MENU.observe(element).addValueChangeListener(event -> {
+			if (event.diff.getOldValue() != null) {
+				list.remove(event.diff.getOldValue());
+				if (getMaster().getValue() == element && !createRemoveMainMenu.isDisposed()) {
+					createRemoveMainMenu.setSelection(false);
 				}
+			}
 
-				if (event.diff.getNewValue() != null) {
-					list.add(0, event.diff.getNewValue());
-					if (getMaster().getValue() == element && !createRemoveMainMenu.isDisposed()) {
-						createRemoveMainMenu.setSelection(true);
-					}
+			if (event.diff.getNewValue() != null) {
+				list.add(0, event.diff.getNewValue());
+				if (getMaster().getValue() == element && !createRemoveMainMenu.isDisposed()) {
+					createRemoveMainMenu.setSelection(true);
 				}
 			}
 		});
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/AbstractIconDialogWithHardcodedScope.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/AbstractIconDialogWithHardcodedScope.java
index 28bebe9..5e014d0 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/AbstractIconDialogWithHardcodedScope.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/AbstractIconDialogWithHardcodedScope.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -24,6 +24,7 @@
 import java.util.Properties;
 import java.util.Timer;
 import java.util.TimerTask;
+
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.list.WritableList;
 import org.eclipse.core.resources.IFile;
@@ -167,23 +168,12 @@
 
 				Image img = icons.get(file);
 				if (img == null) {
-					InputStream in = null;
-					try {
-						in = file.getContents();
+					try (InputStream in = file.getContents()) {
 						img = new Image(cell.getControl().getDisplay(), in);
 						icons.put(file, img);
-					} catch (CoreException e) {
+					} catch (CoreException | IOException e) {
 						// TODO Auto-generated catch block
 						e.printStackTrace();
-					} finally {
-						if (in != null) {
-							try {
-								in.close();
-							} catch (IOException e) {
-								// TODO Auto-generated catch block
-								e.printStackTrace();
-							}
-						}
 					}
 				}
 
@@ -274,10 +264,7 @@
 		IFile f = project.getFile("/META-INF/MANIFEST.MF"); //$NON-NLS-1$
 
 		if (f != null && f.exists()) {
-			BufferedReader r = null;
-			try {
-				InputStream s = f.getContents();
-				r = new BufferedReader(new InputStreamReader(s));
+			try (InputStream s = f.getContents(); BufferedReader r = new BufferedReader(new InputStreamReader(s));) {
 				String line;
 				while ((line = r.readLine()) != null) {
 					if (line.startsWith("Bundle-SymbolicName:")) { //$NON-NLS-1$
@@ -295,15 +282,6 @@
 			} catch (IOException e) {
 				// TODO Auto-generated catch block
 				e.printStackTrace();
-			} finally {
-				if (r != null) {
-					try {
-						r.close();
-					} catch (IOException e) {
-						// TODO Auto-generated catch block
-						e.printStackTrace();
-					}
-				}
 			}
 		}
 		return null;
@@ -375,9 +353,7 @@
 					// Only search target bundle if specified
 					String bundle = (String) context.get("bundle"); //$NON-NLS-1$
 					if (E.notEmpty(bundle)) {
-						InputStream inputStream = null;
-						try {
-							inputStream = iFile.getContents();
+						try (InputStream inputStream = iFile.getContents();) {
 							Properties props = new Properties();
 							props.load(inputStream);
 							String name = props.getProperty("Bundle-SymbolicName"); //$NON-NLS-1$
@@ -388,11 +364,6 @@
 						} catch (IOException e) {
 							// TODO Auto-generated catch block
 							e.printStackTrace();
-						} finally {
-							try {
-								inputStream.close();
-							} catch (Exception ex) {
-							}
 						}
 					}
 					project.accept(new IResourceVisitor() {
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/AbstractIconDialogWithScopeAndFilter.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/AbstractIconDialogWithScopeAndFilter.java
index 1aa3053..85409e3 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/AbstractIconDialogWithScopeAndFilter.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/AbstractIconDialogWithScopeAndFilter.java
@@ -1,6 +1,6 @@
 /*******************************************************************************
  *
- * Copyright (c) 2010 BestSolution.at and others.
+ * Copyright (c) 2010, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -12,7 +12,6 @@
  ******************************************************************************/
 package org.eclipse.e4.tools.emf.ui.internal.common.component.dialogs;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -176,23 +175,12 @@
 
 				Image img = icons.get(file);
 				if (img == null) {
-					InputStream in = null;
-					try {
-						in = file.getContents();
+					try (InputStream in = file.getContents()) {
 						img = new Image(cell.getControl().getDisplay(), in);
 						icons.put(file, img);
 					} catch (final Exception e) {
 						// e.printStackTrace();
 						return;
-					} finally {
-						if (in != null) {
-							try {
-								in.close();
-							} catch (final IOException e) {
-								// TODO Auto-generated catch block
-								// e.printStackTrace();
-							}
-						}
 					}
 				}
 
@@ -219,7 +207,7 @@
 					icons.put(file, img);
 				}
 				final int width = AbstractIconDialogWithScopeAndFilter.this.getViewer().getTable().getColumn(0)
-					.getWidth();
+						.getWidth();
 				if (img.getImageData().width > width) {
 					AbstractIconDialogWithScopeAndFilter.this.getViewer().getTable().getColumn(0)
 					.setWidth(img.getImageData().width);
@@ -435,7 +423,7 @@
 								if (matcherGif.match(path) || matcherPng.match(path) || matcherJpg.match(path)) {
 									if (E.notEmpty(filter.getPackages())) {
 										if (!filter.getPackages().contains(
-											resource.getProjectRelativePath().removeLastSegments(1).toOSString())) {
+												resource.getProjectRelativePath().removeLastSegments(1).toOSString())) {
 											return false;
 										}
 									}
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/FilteredContributionDialog.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/FilteredContributionDialog.java
index c0ba9dd..48d3530 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/FilteredContributionDialog.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/dialogs/FilteredContributionDialog.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2014 TwelveTone LLC and others.
+ * Copyright (c) 2014, 2017 TwelveTone LLC and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -1033,15 +1033,12 @@
 
 	public BundleModel loadBundleModel(IProject currentProject) throws CoreException {
 		final Document document = new Document();
-		final Scanner scanner = new Scanner(PDEProject.getManifest(currentProject).getContents());
-		try {
+		try (final Scanner scanner = new Scanner(PDEProject.getManifest(currentProject).getContents())) {
 			final String content = scanner.useDelimiter("\\Z").next(); //$NON-NLS-1$
 			document.set(content);
 			final BundleModel model = new BundleModel(document, false);
 			model.load();
 			return model;
-		} finally {
-			scanner.close();
 		}
 	}
 
@@ -1088,10 +1085,8 @@
 		final IFile f = project.getFile("/META-INF/MANIFEST.MF"); //$NON-NLS-1$
 
 		if (f != null && f.exists()) {
-			BufferedReader r = null;
-			try {
-				final InputStream s = f.getContents();
-				r = new BufferedReader(new InputStreamReader(s));
+			try (final InputStream s = f.getContents();
+					BufferedReader r = new BufferedReader(new InputStreamReader(s));) {
 				String line;
 				while ((line = r.readLine()) != null) {
 					if (line.startsWith("Bundle-SymbolicName:")) { //$NON-NLS-1$
@@ -1107,13 +1102,6 @@
 				e.printStackTrace();
 			} catch (final IOException e) {
 				e.printStackTrace();
-			} finally {
-				if (r != null) {
-					try {
-						r.close();
-					} catch (final IOException e) {
-					}
-				}
 			}
 		}
 		return null;
@@ -1129,10 +1117,9 @@
 		final File f = new File(new File(rootDirectory), "/META-INF/MANIFEST.MF"); //$NON-NLS-1$
 
 		if (f.exists()) {
-			BufferedReader r = null;
-			try {
-				final InputStream s = new FileInputStream(f);
-				r = new BufferedReader(new InputStreamReader(s));
+			try (final InputStream s = new FileInputStream(f);
+					BufferedReader r = new BufferedReader(new InputStreamReader(s))) {
+
 				String line;
 				while ((line = r.readLine()) != null) {
 					if (line.startsWith("Bundle-SymbolicName:")) { //$NON-NLS-1$
@@ -1146,13 +1133,6 @@
 				}
 			} catch (final IOException e) {
 				e.printStackTrace();
-			} finally {
-				if (r != null) {
-					try {
-						r.close();
-					} catch (final IOException e) {
-					}
-				}
 			}
 		}
 		return null;
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/ObjectViewer.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/ObjectViewer.java
index 87691d6..ad08b95 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/ObjectViewer.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/ObjectViewer.java
@@ -4,8 +4,6 @@
 import java.util.Collections;
 
 import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtensionPoint;
@@ -22,8 +20,6 @@
 import org.eclipse.emf.databinding.IEMFValueProperty;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.viewers.ColumnViewer;
 import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
@@ -45,23 +41,19 @@
 
 public class ObjectViewer {
 	public TreeViewer createViewer(Composite parent, EStructuralFeature feature, final IObservableValue master,
-		IResourcePool resourcePool, final Messages messages) {
+			IResourcePool resourcePool, final Messages messages) {
 		final TreeViewer viewer = new TreeViewer(parent);
 		viewer.setContentProvider(new ContentProviderImpl());
 		viewer.setLabelProvider(new LabelProviderImpl(resourcePool));
 		viewer.setComparator(new ViewerComparatorImpl());
 		final IEMFValueProperty property = EMFProperties.value(feature);
 		final IObservableValue value = property.observeDetail(master);
-		value.addValueChangeListener(new IValueChangeListener() {
-
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (event.diff.getNewValue() != null) {
-					viewer.setInput(Collections.singleton(new JavaObject(event.diff.getNewValue())));
-					viewer.expandToLevel(2);
-				} else {
-					viewer.setInput(Collections.emptyList());
-				}
+		value.addValueChangeListener(event -> {
+			if (event.diff.getNewValue() != null) {
+				viewer.setInput(Collections.singleton(new JavaObject(event.diff.getNewValue())));
+				viewer.expandToLevel(2);
+			} else {
+				viewer.setInput(Collections.emptyList());
 			}
 		});
 
@@ -72,45 +64,40 @@
 		if (elements.length > 0) {
 			final MenuManager mgr = new MenuManager();
 			mgr.setRemoveAllWhenShown(true);
-			mgr.addMenuListener(new IMenuListener() {
+			mgr.addMenuListener(manager -> {
+				if (viewer.getSelection().isEmpty()) {
+					return;
+				}
 
-				@Override
-				public void menuAboutToShow(IMenuManager manager) {
-					if (viewer.getSelection().isEmpty()) {
-						return;
-					}
-
-					final MenuManager scriptExecute = new MenuManager(messages.ObjectViewer_Script);
-					mgr.add(scriptExecute);
-					for (final IConfigurationElement e : elements) {
-						final IConfigurationElement le = e;
-						scriptExecute.add(new Action(e.getAttribute("label")) { //$NON-NLS-1$
-							@Override
-							public void run() {
-								try {
-									final IScriptingSupport support = (IScriptingSupport) le
+				final MenuManager scriptExecute = new MenuManager(messages.ObjectViewer_Script);
+				mgr.add(scriptExecute);
+				for (final IConfigurationElement e : elements) {
+					final IConfigurationElement le = e;
+					scriptExecute.add(new Action(e.getAttribute("label")) { //$NON-NLS-1$
+						@Override
+						public void run() {
+							try {
+								final IScriptingSupport support = (IScriptingSupport) le
 										.createExecutableExtension("class"); //$NON-NLS-1$
-									final Object o = ((IStructuredSelection) viewer.getSelection())
-										.getFirstElement();
-									Object mainObject = null;
-									if (o instanceof JavaObject) {
-										mainObject = ((JavaObject) o).getInstance();
-									} else if (o instanceof JavaAttribute) {
-										mainObject = ((JavaAttribute) o).getFieldValue();
-									}
-
-									if (mainObject != null) {
-										final MApplicationElement value = (MApplicationElement) master.getValue();
-										support.openEditor(viewer.getControl().getShell(), mainObject,
-											ModelUtils.getContainingContext(value));
-									}
-								} catch (final CoreException e) {
-									// TODO Auto-generated catch block
-									e.printStackTrace();
+								final Object o = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
+								Object mainObject = null;
+								if (o instanceof JavaObject) {
+									mainObject = ((JavaObject) o).getInstance();
+								} else if (o instanceof JavaAttribute) {
+									mainObject = ((JavaAttribute) o).getFieldValue();
 								}
+
+								if (mainObject != null) {
+									final MApplicationElement value = (MApplicationElement) master.getValue();
+									support.openEditor(viewer.getControl().getShell(), mainObject,
+											ModelUtils.getContainingContext(value));
+								}
+							} catch (final CoreException e) {
+								// TODO Auto-generated catch block
+								e.printStackTrace();
 							}
-						});
-					}
+						}
+					});
 				}
 			});
 
@@ -126,7 +113,7 @@
 		private final Messages messages;
 
 		protected TooltipSupportImpl(ColumnViewer viewer, int style, boolean manualActivation,
-			IResourcePool resourcePool, Messages messages) {
+				IResourcePool resourcePool, Messages messages) {
 			super(viewer, style, manualActivation);
 			this.resourcePool = resourcePool;
 			this.messages = messages;
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ExportIdsHandler.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ExportIdsHandler.java
index c9be474..f78c698 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ExportIdsHandler.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ExportIdsHandler.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2014 MEDEVIT, FHV and others.
+ * Copyright (c) 2014, 2017 MEDEVIT, FHV and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -259,16 +259,16 @@
 					IResource resource = unit.getResource();
 					IFile file = (IFile) resource;
 
-					ByteArrayInputStream stream = new ByteArrayInputStream(content.toString().getBytes());
-					if (file.exists()) {
-						file.delete(true, new NullProgressMonitor());
+					try (ByteArrayInputStream stream = new ByteArrayInputStream(content.toString().getBytes())) {
+						if (file.exists()) {
+							file.delete(true, new NullProgressMonitor());
+						}
+
+						createParent(file.getParent());
+						// NPE
+						file.create(stream, IResource.KEEP_HISTORY, new NullProgressMonitor());
+
 					}
-
-					createParent(file.getParent());
-					// NPE
-					file.create(stream, IResource.KEEP_HISTORY, new NullProgressMonitor());
-
-					stream.close();
 					super.okPressed();
 				} catch (CoreException e) {
 					e.printStackTrace();
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ExternalizeStringHandler.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ExternalizeStringHandler.java
index ae86a80..d1c28b2 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ExternalizeStringHandler.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ExternalizeStringHandler.java
@@ -6,7 +6,9 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
+
 import javax.inject.Named;
+
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
@@ -226,16 +228,15 @@
 						b.append(e.key + " = " + e.value + System.getProperty("line.separator")); //$NON-NLS-1$//$NON-NLS-2$
 					}
 
-					ByteArrayInputStream stream = new ByteArrayInputStream(b.toString().getBytes());
-					if (f.exists()) {
-						f.appendContents(stream, IResource.KEEP_HISTORY, new NullProgressMonitor());
-					} else {
-						createParent(f.getParent());
-						f.create(stream, IResource.KEEP_HISTORY, new NullProgressMonitor());
+					try (ByteArrayInputStream stream = new ByteArrayInputStream(b.toString().getBytes())) {
+						if (f.exists()) {
+							f.appendContents(stream, IResource.KEEP_HISTORY, new NullProgressMonitor());
+						} else {
+							createParent(f.getParent());
+							f.create(stream, IResource.KEEP_HISTORY, new NullProgressMonitor());
+						}
 					}
 
-					stream.close();
-
 					for (Object o : els) {
 						Entry e = (Entry) o;
 						Command cmd = SetCommand.create(resource.getEditingDomain(), e.object, e.feature, "%" + e.key); //$NON-NLS-1$
@@ -280,9 +281,9 @@
 				IFile f = getBasePropertyFile();
 				if (f.exists()) {
 
-					InputStream in = f.getContents();
-					prop.load(in);
-					in.close();
+					try (InputStream in = f.getContents()) {
+						prop.load(in);
+					}
 				}
 			} catch (CoreException e) {
 				// TODO Auto-generated catch block
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ProjectOSGiTranslationProvider.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ProjectOSGiTranslationProvider.java
index 1eb8d31..7c6a7e5 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ProjectOSGiTranslationProvider.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/properties/ProjectOSGiTranslationProvider.java
@@ -213,18 +213,18 @@
 	 * @see IFile#getContents()
 	 */
 	public static String extractBasenameFromManifest(IFile file) throws CoreException, IOException {
-		final InputStream in = file.getContents();
-		final BufferedReader r = new BufferedReader(new InputStreamReader(in));
-		String line;
 		String newValue = Constants.BUNDLE_LOCALIZATION_DEFAULT_BASENAME;
-		while ((line = r.readLine()) != null) {
-			if (line.startsWith(Constants.BUNDLE_LOCALIZATION)) {
-				newValue = line.substring(Constants.BUNDLE_LOCALIZATION.length() + 1).trim();
-				break;
+		try (final InputStream in = file.getContents();
+				final BufferedReader r = new BufferedReader(new InputStreamReader(in))) {
+			String line;
+			while ((line = r.readLine()) != null) {
+				if (line.startsWith(Constants.BUNDLE_LOCALIZATION)) {
+					newValue = line.substring(Constants.BUNDLE_LOCALIZATION.length() + 1).trim();
+					break;
+				}
 			}
-		}
 
-		r.close();
+		}
 		return newValue;
 	}
 
@@ -233,7 +233,7 @@
 	 */
 	protected void updateResourceBundle() {
 		setResourceBundle(ResourceBundleHelper.getEquinoxResourceBundle(basename, locale,
-			new ProjectResourceBundleControl(true), new ProjectResourceBundleControl(false)));
+				new ProjectResourceBundleControl(true), new ProjectResourceBundleControl(false)));
 	}
 
 	/**
@@ -262,7 +262,7 @@
 
 		@Override
 		public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader,
-			boolean reload) throws IllegalAccessException, InstantiationException, IOException {
+				boolean reload) throws IllegalAccessException, InstantiationException, IOException {
 
 			final String bundleName = toBundleName(baseName, locale);
 			ResourceBundle bundle = null;
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/resourcelocator/TargetPlatformContributionCollector.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/resourcelocator/TargetPlatformContributionCollector.java
index feeeecb..2ce2f38 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/resourcelocator/TargetPlatformContributionCollector.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/resourcelocator/TargetPlatformContributionCollector.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2014 TwelveTone LLC and others.
+ * Copyright (c) 2014, 2017 TwelveTone LLC and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -139,7 +139,7 @@
 							break;
 						}
 						monitor.subTask(Messages.TargetPlatformContributionCollector_Searching
-							+ " " + e.installLocation); //$NON-NLS-1$
+								+ " " + e.installLocation); //$NON-NLS-1$
 					}
 
 					if (E.notEmpty(filter.getBundles())) {
@@ -298,7 +298,7 @@
 					final IPluginModelBase[] models = TargetPlatformHelper.getPDEState().getTargetModels();
 					final int total = projects.length + models.length;
 					monitor.beginTask(Messages.TargetPlatformContributionCollector_updatingTargetPlatformCache
-						+ cacheName + ")", total); //$NON-NLS-1$
+							+ cacheName + ")", total); //$NON-NLS-1$
 
 					for (final IProject pj : projects) {
 						if (monitor.isCanceled()) {
@@ -309,7 +309,7 @@
 						monitor.worked(1);
 						TargetPlatformContributionCollector.this
 						.visit(monitor, FilteredContributionDialog.getBundle(rootDirectory), rootDirectory,
-							new File(rootDirectory));
+								new File(rootDirectory));
 					}
 
 					// load target platform bundles
@@ -428,7 +428,7 @@
 						@Override
 						protected void createButtonsForButtonBar(Composite parent) {
 							final Button button = createButton(parent, 101,
-								Messages.TargetPlatformContributionCollector_RunInBackground, false);
+									Messages.TargetPlatformContributionCollector_RunInBackground, false);
 							// TODO JA
 							button.addSelectionListener(new SelectionAdapter() {
 								@Override
@@ -457,8 +457,8 @@
 							InterruptedException {
 								monitor
 								.beginTask(
-									Messages.TargetPlatformContributionCollector_WaitingForTargetPlatformIndexingToComplete,
-									IProgressMonitor.UNKNOWN);
+										Messages.TargetPlatformContributionCollector_WaitingForTargetPlatformIndexingToComplete,
+										IProgressMonitor.UNKNOWN);
 								while (job.getState() == Job.RUNNING && !runInBackground) {
 									Thread.sleep(100);
 								}
@@ -487,10 +487,8 @@
 		final File f = new File(file, "META-INF/MANIFEST.MF"); //$NON-NLS-1$
 
 		if (f.exists() && f.isFile()) {
-			BufferedReader r = null;
-			try {
-				final InputStream s = new FileInputStream(f);
-				r = new BufferedReader(new InputStreamReader(s));
+			try (final InputStream s = new FileInputStream(f);
+					BufferedReader r = new BufferedReader(new InputStreamReader(s))) {
 				String line;
 				while ((line = r.readLine()) != null) {
 					if (line.startsWith("Bundle-SymbolicName:")) { //$NON-NLS-1$
@@ -504,13 +502,6 @@
 				}
 			} catch (final IOException e) {
 				e.printStackTrace();
-			} finally {
-				if (r != null) {
-					try {
-						r.close();
-					} catch (final IOException e) {
-					}
-				}
 			}
 		}
 		return null;
@@ -554,7 +545,7 @@
 						e.path = ""; //$NON-NLS-1$
 					}
 					e.relativePath = Path
-						.fromOSString(file.getAbsolutePath().replace(e.installLocation, "")).makeRelative().toOSString(); //$NON-NLS-1$
+							.fromOSString(file.getAbsolutePath().replace(e.installLocation, "")).makeRelative().toOSString(); //$NON-NLS-1$
 
 					e.bundleSymName = bundleName;
 					// TODO we need project to strip source paths.
@@ -599,10 +590,10 @@
 			outputDirectories.put(installLocation, ret);
 			try {
 				final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
-					.parse(new File(installLocation + File.separator + ".classpath")); //$NON-NLS-1$
+						.parse(new File(installLocation + File.separator + ".classpath")); //$NON-NLS-1$
 				final XPath xp = XPathFactory.newInstance().newXPath();
 				final NodeList list = (NodeList) xp.evaluate(
-					"//classpathentry[@kind='output']/@path", doc, XPathConstants.NODESET); //$NON-NLS-1$
+						"//classpathentry[@kind='output']/@path", doc, XPathConstants.NODESET); //$NON-NLS-1$
 				for (int i = 0; i < list.getLength(); i++) {
 					final String value = list.item(i).getNodeValue();
 					ret.add(value);
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/uistructure/UIViewer.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/uistructure/UIViewer.java
index 902d64b..f15b5c9 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/uistructure/UIViewer.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/uistructure/UIViewer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2011 BestSolution.at and others.
+ * Copyright (c) 2011, 2017 BestSolution.at and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,9 +11,8 @@
 package org.eclipse.e4.tools.emf.ui.internal.common.uistructure;
 
 import java.util.Collections;
+
 import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtensionPoint;
@@ -29,8 +28,6 @@
 import org.eclipse.emf.databinding.IEMFValueProperty;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
@@ -44,61 +41,54 @@
 		viewer.setLabelProvider(new WidgetLabelProvider(resourcePool));
 		IEMFValueProperty property = EMFProperties.value(feature);
 		IObservableValue value = property.observeDetail(master);
-		value.addValueChangeListener(new IValueChangeListener() {
-
-			@Override
-			public void handleValueChange(ValueChangeEvent event) {
-				if (event.diff.getNewValue() != null) {
-					viewer.setInput(Collections.singleton(event.diff.getNewValue()));
-					viewer.expandToLevel(2);
-				} else {
-					viewer.setInput(Collections.emptyList());
-				}
+		value.addValueChangeListener(event -> {
+			if (event.diff.getNewValue() != null) {
+				viewer.setInput(Collections.singleton(event.diff.getNewValue()));
+				viewer.expandToLevel(2);
+			} else {
+				viewer.setInput(Collections.emptyList());
 			}
 		});
 
 		final MenuManager mgr = new MenuManager();
 		mgr.setRemoveAllWhenShown(true);
-		mgr.addMenuListener(new IMenuListener() {
+		mgr.addMenuListener(manager -> {
+			final Object o = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
+			if (o instanceof Control) {
+				manager.add(new Action(messages.ModelEditor_ShowControl) {
+					@Override
+					public void run() {
+						ControlHighlighter.show((Control) o);
+					}
+				});
+			}
 
-			@Override
-			public void menuAboutToShow(IMenuManager manager) {
-				final Object o = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
-				if (o instanceof Control) {
-					manager.add(new Action(messages.ModelEditor_ShowControl) {
+			IExtensionRegistry registry = RegistryFactory.getRegistry();
+			IExtensionPoint extPoint = registry.getExtensionPoint("org.eclipse.e4.tools.emf.ui.scripting"); //$NON-NLS-1$
+			final IConfigurationElement[] elements = extPoint.getConfigurationElements();
+
+			final IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
+
+			if (elements.length > 0 && !s.isEmpty()) {
+				MenuManager scriptExecute = new MenuManager(messages.ModelEditor_Script);
+				manager.add(scriptExecute);
+				for (IConfigurationElement e : elements) {
+					final IConfigurationElement le = e;
+					scriptExecute.add(new Action(e.getAttribute("label")) { //$NON-NLS-1$
 						@Override
 						public void run() {
-							ControlHighlighter.show((Control) o);
+							try {
+								MApplicationElement o = (MApplicationElement) master.getValue();
+								IScriptingSupport support = (IScriptingSupport) le.createExecutableExtension("class"); //$NON-NLS-1$
+								support.openEditor(viewer.getControl().getShell(), s.getFirstElement(),
+										ModelUtils.getContainingContext(o));
+							} catch (CoreException e) {
+								// TODO Auto-generated catch block
+								e.printStackTrace();
+							}
 						}
 					});
 				}
-
-				IExtensionRegistry registry = RegistryFactory.getRegistry();
-				IExtensionPoint extPoint = registry.getExtensionPoint("org.eclipse.e4.tools.emf.ui.scripting"); //$NON-NLS-1$
-				final IConfigurationElement[] elements = extPoint.getConfigurationElements();
-
-				final IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
-
-				if (elements.length > 0 && !s.isEmpty()) {
-					MenuManager scriptExecute = new MenuManager(messages.ModelEditor_Script);
-					manager.add(scriptExecute);
-					for (IConfigurationElement e : elements) {
-						final IConfigurationElement le = e;
-						scriptExecute.add(new Action(e.getAttribute("label")) { //$NON-NLS-1$
-							@Override
-							public void run() {
-								try {
-									MApplicationElement o = (MApplicationElement) master.getValue();
-									IScriptingSupport support = (IScriptingSupport) le.createExecutableExtension("class"); //$NON-NLS-1$
-									support.openEditor(viewer.getControl().getShell(), s.getFirstElement(), ModelUtils.getContainingContext(o));
-								} catch (CoreException e) {
-									// TODO Auto-generated catch block
-									e.printStackTrace();
-								}
-							}
-						});
-					}
-				}
 			}
 		});
 
