diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/components/NestedProjectsComposite.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/components/NestedProjectsComposite.java
index f126c76..d47d7bb 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/components/NestedProjectsComposite.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/components/NestedProjectsComposite.java
@@ -50,7 +50,6 @@
 import org.eclipse.jface.viewers.ViewerComparator;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
@@ -312,53 +311,37 @@
     Button selectAllBtn = new Button(selectionActionComposite, SWT.NONE);
     selectAllBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
     selectAllBtn.setText(Messages.UpdateDepenciesDialog_selectAll);
-    selectAllBtn.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        for(IProject project : projects) {
-          setSubtreeChecked(project, true);
-        }
-        updateSelectedProjects();
+    selectAllBtn.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      for(IProject project : projects) {
+        setSubtreeChecked(project, true);
       }
-    });
+      updateSelectedProjects();
+    }));
 
     if(showOutOfDateUI) {
       addOutOfDateBtn = new Button(selectionActionComposite, SWT.NONE);
       addOutOfDateBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
       addOutOfDateBtn.setText(Messages.NestedProjectsComposite_Add_OutOfDate);
-      addOutOfDateBtn.addSelectionListener(new SelectionAdapter() {
-        public void widgetSelected(SelectionEvent e) {
-          includeOutOfDateProjects();
-        }
-      });
+      addOutOfDateBtn.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> includeOutOfDateProjects()));
     }
 
     Button deselectAllBtn = new Button(selectionActionComposite, SWT.NONE);
     deselectAllBtn.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
     deselectAllBtn.setText(Messages.UpdateDepenciesDialog_deselectAll);
-    deselectAllBtn.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        codebaseViewer.setCheckedElements(new Object[0]);
-        updateSelectedProjects();
-      }
-    });
+    deselectAllBtn.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      codebaseViewer.setCheckedElements(new Object[0]);
+      updateSelectedProjects();
+    }));
 
     Button expandAllBtn = new Button(selectionActionComposite, SWT.NONE);
     expandAllBtn.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1));
     expandAllBtn.setText(Messages.UpdateDepenciesDialog_expandAll);
-    expandAllBtn.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        codebaseViewer.expandAll();
-      }
-    });
+    expandAllBtn.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> codebaseViewer.expandAll()));
 
     Button collapseAllBtn = new Button(selectionActionComposite, SWT.NONE);
     collapseAllBtn.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1));
     collapseAllBtn.setText(Messages.UpdateDepenciesDialog_collapseAll);
-    collapseAllBtn.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        codebaseViewer.collapseAll();
-      }
-    });
+    collapseAllBtn.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> codebaseViewer.collapseAll()));
   }
 
   String getElePath(Object element) {
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/components/WorkingSetGroup.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/components/WorkingSetGroup.java
index 9efa217..75f9af4 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/components/WorkingSetGroup.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/components/WorkingSetGroup.java
@@ -34,8 +34,7 @@
 import org.eclipse.jface.viewers.ViewerComparator;
 import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Button;
@@ -168,17 +167,15 @@
     newWorkingSetButton.setData("name", "configureButton"); //$NON-NLS-1$ //$NON-NLS-2$
     newWorkingSetButton.setText(Messages.WorkingSetGroup_btnMore);
     newWorkingSetButton.setEnabled(false);
-    newWorkingSetButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(final SelectionEvent e) {
-        IWorkingSetManager workingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
-        IWorkingSetSelectionDialog dialog = workingSetManager.createWorkingSetSelectionDialog(shell, true,
-            WORKING_SET_IDS.toArray(new String[0]));
-        if(dialog.open() == Window.OK) {
-          IWorkingSet[] workingSets = dialog.getSelection();
-          selectWorkingSets(Arrays.asList(workingSets));
-        }
+    newWorkingSetButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      IWorkingSetManager workingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
+      IWorkingSetSelectionDialog dialog = workingSetManager.createWorkingSetSelectionDialog(shell, true,
+          WORKING_SET_IDS.toArray(new String[0]));
+      if(dialog.open() == Window.OK) {
+        IWorkingSet[] workingSets = dialog.getSelection();
+        selectWorkingSets(Arrays.asList(workingSets));
       }
-    });
+    }));
 
     if(selectWorkingSets(workingSets)) {
       addToWorkingSetButton.setSelection(true);
@@ -187,19 +184,17 @@
       newWorkingSetButton.setEnabled(true);
     }
 
-    addToWorkingSetButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        boolean addToWorkingingSet = addToWorkingSetButton.getSelection();
-        workingsetLabel.setEnabled(addToWorkingingSet);
-        workingsetComboViewer.getCombo().setEnabled(addToWorkingingSet);
-        newWorkingSetButton.setEnabled(addToWorkingingSet);
-        if(addToWorkingingSet) {
-          updateConfiguration();
-        } else {
-          workingSets.clear();
-        }
+    addToWorkingSetButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      boolean addToWorkingingSet = addToWorkingSetButton.getSelection();
+      workingsetLabel.setEnabled(addToWorkingingSet);
+      workingsetComboViewer.getCombo().setEnabled(addToWorkingingSet);
+      newWorkingSetButton.setEnabled(addToWorkingingSet);
+      if(addToWorkingingSet) {
+        updateConfiguration();
+      } else {
+        workingSets.clear();
       }
-    });
+    }));
 
     workingsetComboViewer.addSelectionChangedListener(event -> updateConfiguration());
   }
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/dialogs/AssignWorkingSetDialog.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/dialogs/AssignWorkingSetDialog.java
index 2eb18f0..4bc53f8 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/dialogs/AssignWorkingSetDialog.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/dialogs/AssignWorkingSetDialog.java
@@ -21,8 +21,7 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.dialogs.TitleAreaDialog;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -79,22 +78,14 @@
     final Button btnFilterAssignedProjects = new Button(filtersComposite, SWT.CHECK);
     btnFilterAssignedProjects.setText(Messages.AssignWorkingSetDialog_btnFilterAssignedProjects_text);
     btnFilterAssignedProjects.setSelection(true);
-    btnFilterAssignedProjects.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        selectedProjects.refresh();
-      }
-    });
+    btnFilterAssignedProjects
+        .addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> selectedProjects.refresh()));
 
     final Button btnFilterClosedProjects = new Button(filtersComposite, SWT.CHECK);
     btnFilterClosedProjects.setText(Messages.AssignWorkingSetDialog_btnFilterClosedProjects_text);
     btnFilterClosedProjects.setSelection(true);
-    btnFilterClosedProjects.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        selectedProjects.refresh();
-      }
-    });
+    btnFilterClosedProjects
+        .addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> selectedProjects.refresh()));
 
     this.selectedProjects = new NestedProjectsComposite(composite, SWT.NONE, initialSelection, false) {
       @Override
@@ -136,12 +127,10 @@
     Button btnAssign = new Button(workingSetComposite, SWT.NONE);
     btnAssign.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
     btnAssign.setText(Messages.AssignWorkingSetDialog_btnAssign_text);
-    btnAssign.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        assignWorkingSets();
-        selectedProjects.reset();
-      }
-    });
+    btnAssign.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      assignWorkingSets();
+      selectedProjects.reset();
+    }));
 
     return area;
   }
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LifecycleMappingPreferencePage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LifecycleMappingPreferencePage.java
index ee0d243..62441ea 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LifecycleMappingPreferencePage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LifecycleMappingPreferencePage.java
@@ -23,8 +23,7 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.jface.preference.PreferencePage;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
@@ -98,29 +97,23 @@
     new Label(composite, SWT.WRAP).setText(Messages.LifecycleMappingPreferencePage_WorkspaceMappingsDescription);
     Button editLifecyclesButton = new Button(composite, SWT.PUSH);
     editLifecyclesButton.setText(Messages.LifecycleMappingPreferencePage_WorkspaceMappingsOpen);
-    editLifecyclesButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        try {
-          IWorkbench workbench = PlatformUI.getWorkbench();
-          IWorkbenchPage workbenchPage = workbench.getActiveWorkbenchWindow().getActivePage();
-          IEditorDescriptor desc = workbench.getEditorRegistry().getDefaultEditor(
-              LifecycleMappingFactory.LIFECYCLE_MAPPING_METADATA_SOURCE_NAME);
-          IEditorInput input = new FileStoreEditorInput(EFS.getLocalFileSystem().fromLocalFile(
-              new File(mappingFilePath)));
-          IDE.openEditor(workbenchPage, input, desc.getId());
-        } catch(PartInitException ex) {
-          log.error(ex.getMessage(), ex);
-        }
+    editLifecyclesButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      try {
+        IWorkbench workbench = PlatformUI.getWorkbench();
+        IWorkbenchPage workbenchPage = workbench.getActiveWorkbenchWindow().getActivePage();
+        IEditorDescriptor desc = workbench.getEditorRegistry()
+            .getDefaultEditor(LifecycleMappingFactory.LIFECYCLE_MAPPING_METADATA_SOURCE_NAME);
+        IEditorInput input = new FileStoreEditorInput(
+            EFS.getLocalFileSystem().fromLocalFile(new File(mappingFilePath)));
+        IDE.openEditor(workbenchPage, input, desc.getId());
+      } catch(PartInitException ex) {
+        log.error(ex.getMessage(), ex);
       }
-    });
+    }));
 
     Button refreshLifecyclesButton = new Button(composite, SWT.NONE);
-    refreshLifecyclesButton.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        LifecycleMappingFactory.getWorkspaceMetadata(true);
-      }
-    });
+    refreshLifecyclesButton.addSelectionListener(
+        SelectionListener.widgetSelectedAdapter(e -> LifecycleMappingFactory.getWorkspaceMetadata(true)));
     refreshLifecyclesButton.setText(Messages.LifecycleMappingPreferencePage_btnRefreshLifecycles_text);
 
     new Label(composite, SWT.NONE).setText(Messages.LifecycleMappingPreferencePage_ChangeLocation);
@@ -131,19 +124,17 @@
 
     Button newFileButton = new Button(composite, SWT.PUSH);
     newFileButton.setText(Messages.LifecycleMappingPreferencePage_Browse);
-    newFileButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        FileDialog dialog = new FileDialog(LifecycleMappingPreferencePage.this.getShell(), SWT.NONE);
+    newFileButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      FileDialog dialog = new FileDialog(LifecycleMappingPreferencePage.this.getShell(), SWT.NONE);
 
-        dialog.setText(Messages.LifecycleMappingPreferencePage_ChooseNewLocation);
-        dialog.setFilterExtensions(new String[] {"*.xml", "*.*"}); //$NON-NLS-1$ //$NON-NLS-2$
-        String res = dialog.open();
-        if(res == null) {
-          return;
-        }
-        mappingFileTextBox.setText(dialog.getFilterPath() + "/" + dialog.getFileName()); //$NON-NLS-1$
+      dialog.setText(Messages.LifecycleMappingPreferencePage_ChooseNewLocation);
+      dialog.setFilterExtensions(new String[] {"*.xml", "*.*"}); //$NON-NLS-1$ //$NON-NLS-2$
+      String res = dialog.open();
+      if(res == null) {
+        return;
       }
-    });
+      mappingFileTextBox.setText(dialog.getFilterPath() + "/" + dialog.getFileName()); //$NON-NLS-1$
+    }));
 
     return composite;
   }
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LifecycleMappingsViewer.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LifecycleMappingsViewer.java
index dd7f937..30178a8 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LifecycleMappingsViewer.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LifecycleMappingsViewer.java
@@ -44,8 +44,7 @@
 import org.eclipse.swt.dnd.Clipboard;
 import org.eclipse.swt.dnd.TextTransfer;
 import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -143,13 +142,10 @@
     btnShowPhases.setText(Messages.LifecycleMappingPropertyPage_showLIfecyclePhases);
 
     final Button btnShowIgnored = new Button(optionsComposit, SWT.CHECK);
-    btnShowIgnored.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        showIgnoredExecutions = btnShowIgnored.getSelection();
-        updateMappingsTreeViewer();
-      }
-    });
+    btnShowIgnored.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      showIgnoredExecutions = btnShowIgnored.getSelection();
+      updateMappingsTreeViewer();
+    }));
     btnShowIgnored.setSelection(showIgnoredExecutions);
     btnShowIgnored.setText(Messages.LifecycleMappingPropertyPage_mntmShowIgnoredExecutions_text);
     final Action actExpandAll = new Action(Messages.LifecycleMappingPropertyPage_mntmExpandAll_text,
@@ -180,15 +176,12 @@
     toolBarManager.add(actCollapseAll);
     toolBarManager.update(true);
 
-    btnShowPhases.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        showPhases = btnShowPhases.getSelection();
-        actExpandAll.setEnabled(showPhases);
-        actCollapseAll.setEnabled(showPhases);
-        updateMappingsTreeViewer();
-      }
-    });
+    btnShowPhases.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      showPhases = btnShowPhases.getSelection();
+      actExpandAll.setEnabled(showPhases);
+      actCollapseAll.setEnabled(showPhases);
+      updateMappingsTreeViewer();
+    }));
 
     mappingsTreeViewer = new TreeViewer(container, SWT.BORDER);
     Tree tree = mappingsTreeViewer.getTree();
@@ -309,12 +302,7 @@
     actionsComposite.setLayout(new RowLayout(SWT.HORIZONTAL));
 
     Button btnCopyToClipboard = new Button(actionsComposite, SWT.NONE);
-    btnCopyToClipboard.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        copyToClipboard();
-      }
-    });
+    btnCopyToClipboard.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> copyToClipboard()));
     btnCopyToClipboard.setText(Messages.LifecycleMappingPropertyPage_copyToClipboard);
 
     mappingsTreeViewer.setInput(phases);
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LocalArchetypeCatalogDialog.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LocalArchetypeCatalogDialog.java
index 79eabaa..2ff53e7 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LocalArchetypeCatalogDialog.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/LocalArchetypeCatalogDialog.java
@@ -27,8 +27,7 @@
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -119,17 +118,15 @@
 
     Button browseButton = new Button(composite, SWT.NONE);
     browseButton.setText(Messages.LocalArchetypeCatalogDialog_btnBrowse);
-    browseButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        FileDialog dialog = new FileDialog(getShell());
-        dialog.setText(Messages.LocalArchetypeCatalogDialog_dialog_title);
-        String location = dialog.open();
-        if(location != null) {
-          catalogLocationCombo.setText(location);
-          update();
-        }
+    browseButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      FileDialog dialog = new FileDialog(getShell());
+      dialog.setText(Messages.LocalArchetypeCatalogDialog_dialog_title);
+      String location = dialog.open();
+      if(location != null) {
+        catalogLocationCombo.setText(location);
+        update();
       }
-    });
+    }));
     setButtonLayoutData(browseButton);
 
     Label catalogDescriptionLabel = new Label(composite, SWT.NONE);
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/MavenArchetypesPreferencePage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/MavenArchetypesPreferencePage.java
index 6a931a0..ec42a77 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/MavenArchetypesPreferencePage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/MavenArchetypesPreferencePage.java
@@ -36,8 +36,7 @@
 import org.eclipse.jface.window.Window;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
@@ -136,20 +135,18 @@
     GridData gd_addRemoveOrLink = new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1);
     addRemoveOrLink.setLayoutData(gd_addRemoveOrLink);
     addRemoveOrLink.setText(Messages.MavenArchetypesPreferencePage_link);
-    addRemoveOrLink.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        try {
-          URL url = new URL(
-              "http://maven.apache.org/plugins/maven-archetype-plugin/specification/archetype-catalog.html"); //$NON-NLS-1$
-          IWebBrowser browser = PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser();
-          browser.openURL(url);
-        } catch(MalformedURLException ex) {
-          log.error("Malformed URL", ex); //$NON-NLS-1$
-        } catch(PartInitException ex) {
-          log.error(ex.getMessage(), ex);
-        }
+    addRemoveOrLink.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      try {
+        URL url = new URL(
+            "http://maven.apache.org/plugins/maven-archetype-plugin/specification/archetype-catalog.html"); //$NON-NLS-1$
+        IWebBrowser browser = PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser();
+        browser.openURL(url);
+      } catch(MalformedURLException ex) {
+        log.error("Malformed URL", ex); //$NON-NLS-1$
+      } catch(PartInitException ex) {
+        log.error(ex.getMessage(), ex);
       }
-    });
+    }));
 
     archetypesViewer = CheckboxTableViewer.newCheckList(composite, SWT.BORDER | SWT.FULL_SELECTION);
 
@@ -184,87 +181,71 @@
     Button enableAllBtn = new Button(composite, SWT.NONE);
     enableAllBtn.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     enableAllBtn.setText(Messages.MavenArchetypesPreferencePage_btnEnableAll);
-    enableAllBtn.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        toggleRepositories(true);
-      }
-    });
+    enableAllBtn.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> toggleRepositories(true)));
 
     Button disableAllBtn = new Button(composite, SWT.NONE);
     disableAllBtn.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     disableAllBtn.setText(Messages.MavenArchetypesPreferencePage_btnDisableAll);
-    disableAllBtn.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        toggleRepositories(false);
-      }
-    });
+    disableAllBtn.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> toggleRepositories(false)));
 
     Button addLocalButton = new Button(composite, SWT.NONE);
     addLocalButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     addLocalButton.setText(Messages.MavenArchetypesPreferencePage_btnAddLocal);
-    addLocalButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        LocalArchetypeCatalogDialog dialog = new LocalArchetypeCatalogDialog(getShell(), null);
-        if(dialog.open() == Window.OK) {
-          addCatalogFactory(dialog.getArchetypeCatalogFactory());
-        }
+    addLocalButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      LocalArchetypeCatalogDialog dialog = new LocalArchetypeCatalogDialog(getShell(), null);
+      if(dialog.open() == Window.OK) {
+        addCatalogFactory(dialog.getArchetypeCatalogFactory());
       }
-    });
+    }));
 
     Button addRemoteButton = new Button(composite, SWT.NONE);
     addRemoteButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     addRemoteButton.setText(Messages.MavenArchetypesPreferencePage_btnAddRemote);
-    addRemoteButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        RemoteArchetypeCatalogDialog dialog = new RemoteArchetypeCatalogDialog(getShell(), null);
-        if(dialog.open() == Window.OK) {
-          addCatalogFactory(dialog.getArchetypeCatalogFactory());
-        }
+    addRemoteButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      RemoteArchetypeCatalogDialog dialog = new RemoteArchetypeCatalogDialog(getShell(), null);
+      if(dialog.open() == Window.OK) {
+        addCatalogFactory(dialog.getArchetypeCatalogFactory());
       }
-    });
+    }));
 
     final Button editButton = new Button(composite, SWT.NONE);
     editButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     editButton.setEnabled(false);
     editButton.setText(Messages.MavenArchetypesPreferencePage_btnEdit);
-    editButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        ArchetypeCatalogFactory factory = getSelectedArchetypeCatalogFactory();
-        ArchetypeCatalogFactory newFactory = null;
-        if(factory instanceof LocalCatalogFactory) {
-          LocalArchetypeCatalogDialog dialog = new LocalArchetypeCatalogDialog(getShell(), factory);
-          if(dialog.open() == Window.OK) {
-            newFactory = dialog.getArchetypeCatalogFactory();
-          }
-        } else if(factory instanceof RemoteCatalogFactory) {
-          RemoteArchetypeCatalogDialog dialog = new RemoteArchetypeCatalogDialog(getShell(), factory);
-          if(dialog.open() == Window.OK) {
-            newFactory = dialog.getArchetypeCatalogFactory();
-          }
+    editButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      ArchetypeCatalogFactory factory = getSelectedArchetypeCatalogFactory();
+      ArchetypeCatalogFactory newFactory = null;
+      if(factory instanceof LocalCatalogFactory) {
+        LocalArchetypeCatalogDialog dialog = new LocalArchetypeCatalogDialog(getShell(), factory);
+        if(dialog.open() == Window.OK) {
+          newFactory = dialog.getArchetypeCatalogFactory();
         }
-        if(newFactory != null) {
-          int n = archetypeCatalogs.indexOf(factory);
-          if(n > -1) {
-            archetypeCatalogs.set(n, newFactory);
-            archetypesViewer.setInput(archetypeCatalogs);
-            archetypesViewer.setSelection(new StructuredSelection(newFactory), true);
-          }
+      } else if(factory instanceof RemoteCatalogFactory) {
+        RemoteArchetypeCatalogDialog dialog = new RemoteArchetypeCatalogDialog(getShell(), factory);
+        if(dialog.open() == Window.OK) {
+          newFactory = dialog.getArchetypeCatalogFactory();
         }
       }
-    });
+      if(newFactory != null) {
+        int n = archetypeCatalogs.indexOf(factory);
+        if(n > -1) {
+          archetypeCatalogs.set(n, newFactory);
+          archetypesViewer.setInput(archetypeCatalogs);
+          archetypesViewer.setSelection(new StructuredSelection(newFactory), true);
+        }
+      }
+    }));
 
     final Button removeButton = new Button(composite, SWT.NONE);
     removeButton.setEnabled(false);
     removeButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, true));
     removeButton.setText(Messages.MavenArchetypesPreferencePage_btnRemove);
-    removeButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        ArchetypeCatalogFactory factory = getSelectedArchetypeCatalogFactory();
-        archetypeCatalogs.remove(factory);
-        archetypesViewer.setInput(archetypeCatalogs);
-        archetypesViewer.setSelection(null, true);
-      }
-    });
+    removeButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      ArchetypeCatalogFactory factory = getSelectedArchetypeCatalogFactory();
+      archetypeCatalogs.remove(factory);
+      archetypesViewer.setInput(archetypeCatalogs);
+      archetypesViewer.setSelection(null, true);
+    }));
 
     archetypesViewer.addSelectionChangedListener(event -> {
       if(archetypesViewer.getSelection() instanceof IStructuredSelection) {
@@ -279,7 +260,7 @@
       archetypesViewer.refresh(event.getElement(), true);
     });
 
-    archetypeCatalogs = new ArrayList<ArchetypeCatalogFactory>(archetypeManager.getArchetypeCatalogs());
+    archetypeCatalogs = new ArrayList<>(archetypeManager.getArchetypeCatalogs());
     archetypesViewer.setInput(archetypeCatalogs);
     archetypeCatalogs.forEach(a -> archetypesViewer.setChecked(a, a.isEnabled()));
     archetypesViewer.refresh(); // should listen on property changes instead?
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/MavenSettingsPreferencePage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/MavenSettingsPreferencePage.java
index d5ca75d..68febda 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/MavenSettingsPreferencePage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/MavenSettingsPreferencePage.java
@@ -36,8 +36,7 @@
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -203,39 +202,33 @@
     globalSettingsLink.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
     globalSettingsLink.setText(Messages.MavenSettingsPreferencePage_globalSettingslink2);
     globalSettingsLink.setToolTipText(Messages.MavenSettingsPreferencePage_globalSettingslink_tooltip);
-    globalSettingsLink.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
+    globalSettingsLink.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
         String globalSettings = getGlobalSettings();
         if(globalSettings != null) {
           openEditor(globalSettings);
         }
       }
-    });
+      ));
 
     globalSettingsText = new Text(composite, SWT.BORDER);
     globalSettingsText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
 
     Button globalSettingsBrowseButton = new Button(composite, SWT.NONE);
     globalSettingsBrowseButton.setText(Messages.MavenSettingsPreferencePage_globalSettingsBrowseButton_text);
-    globalSettingsBrowseButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        browseSettingsAction(globalSettingsText);
-      }
-    });
+    globalSettingsBrowseButton
+        .addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> browseSettingsAction(globalSettingsText)));
 
     userSettingsLink = new Link(composite, SWT.NONE);
     userSettingsLink.setText(Messages.MavenSettingsPreferencePage_userSettingslink2);
     userSettingsLink.setToolTipText(Messages.MavenSettingsPreferencePage_userSettingslink_tooltip);
     userSettingsLink.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-    userSettingsLink.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        String userSettings = getUserSettings();
-        if(userSettings == null) {
-          userSettings = SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE.getAbsolutePath();
-        }
-        openEditor(userSettings);
+    userSettingsLink.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      String userSettings = getUserSettings();
+      if(userSettings == null) {
+        userSettings = SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE.getAbsolutePath();
       }
-    });
+      openEditor(userSettings);
+    }));
     userSettingsText = new Text(composite, SWT.BORDER);
     userSettingsText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
     userSettingsText.setMessage(SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE.getAbsolutePath());
@@ -243,20 +236,13 @@
     Button userSettingsBrowseButton = new Button(composite, SWT.NONE);
     userSettingsBrowseButton.setLayoutData(new GridData(SWT.FILL, SWT.RIGHT, false, false, 1, 1));
     userSettingsBrowseButton.setText(Messages.MavenSettingsPreferencePage_userSettingsBrowseButton_text);
-    userSettingsBrowseButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        browseSettingsAction(userSettingsText);
-      }
-    });
+    userSettingsBrowseButton
+        .addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> browseSettingsAction(userSettingsText)));
 
     Button updateSettings = new Button(composite, SWT.NONE);
     updateSettings.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
     updateSettings.setText(Messages.MavenSettingsPreferencePage_btnUpdate);
-    updateSettings.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        updateSettings(true);
-      }
-    });
+    updateSettings.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> updateSettings(true)));
     Label localRepositoryLabel = new Label(composite, SWT.NONE);
     GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1);
     gd.verticalIndent = 25;
@@ -270,18 +256,15 @@
     Button reindexButton = new Button(composite, SWT.NONE);
     reindexButton.setLayoutData(new GridData(SWT.FILL, SWT.RIGHT, false, false, 1, 1));
     reindexButton.setText(Messages.preferencesReindexButton);
-    reindexButton.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        new WorkspaceJob(Messages.MavenSettingsPreferencePage_job_indexing) {
-          public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
-            IndexManager indexManager = MavenPlugin.getIndexManager();
-            indexManager.getWorkspaceIndex().updateIndex(true, monitor);
-            return Status.OK_STATUS;
-          }
-        }.schedule();
-      }
-    });
+    reindexButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      new WorkspaceJob(Messages.MavenSettingsPreferencePage_job_indexing) {
+        public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
+          IndexManager indexManager = MavenPlugin.getIndexManager();
+          indexManager.getWorkspaceIndex().updateIndex(true, monitor);
+          return Status.OK_STATUS;
+        }
+      }.schedule();
+    }));
 
     ModifyListener settingsModifyListener = modifyevent -> {
       updateLocalRepository();
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/RemoteArchetypeCatalogDialog.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/RemoteArchetypeCatalogDialog.java
index d076159..eedfbe8 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/RemoteArchetypeCatalogDialog.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/RemoteArchetypeCatalogDialog.java
@@ -30,8 +30,7 @@
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -165,47 +164,44 @@
     }
 
     verifyButton = createButton(composite, VERIFY_ID, Messages.RemoteArchetypeCatalogDialog_btnVerify, false);
-    verifyButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        verifyButton.setEnabled(false);
-        String url = catalogUrlCombo.getText();
-        final RemoteCatalogFactory factory = new RemoteCatalogFactory(url, null, true);
+    verifyButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      verifyButton.setEnabled(false);
+      String url = catalogUrlCombo.getText();
+      final RemoteCatalogFactory factory = new RemoteCatalogFactory(url, null, true);
 
-        new Job(Messages.RemoteArchetypeCatalogDialog_job_download) {
-          protected IStatus run(IProgressMonitor monitor) {
-            IStatus status = Status.OK_STATUS;
-            ArchetypeCatalog catalog = null;
-            try {
-              catalog = factory.getArchetypeCatalog();
-            } finally {
-              final IStatus s = status;
-              final List<Archetype> archetypes = ((catalog == null) ? Collections.emptyList()
-                  : catalog.getArchetypes());
-              Shell shell = getShell();
-              if(shell == null) {
-                return status;
-              }
-              shell.getDisplay().asyncExec(() -> {
-                if(verifyButton.isDisposed()) {
-                  return;
-                }
-                verifyButton.setEnabled(true);
-                if(!s.isOK()) {
-                  setErrorMessage(NLS.bind(Messages.RemoteArchetypeCatalogDialog_error_read, s.getMessage()));
-                  getButton(IDialogConstants.OK_ID).setEnabled(false);
-                } else if(archetypes.size() == 0) {
-                  setMessage(Messages.RemoteArchetypeCatalogDialog_error_empty, IStatus.WARNING);
-                } else {
-                  setMessage(NLS.bind(Messages.RemoteArchetypeCatalogDialog_message_found, archetypes.size()),
-                      IStatus.INFO);
-                }
-              });
+      new Job(Messages.RemoteArchetypeCatalogDialog_job_download) {
+        protected IStatus run(IProgressMonitor monitor) {
+          IStatus status = Status.OK_STATUS;
+          ArchetypeCatalog catalog = null;
+          try {
+            catalog = factory.getArchetypeCatalog();
+          } finally {
+            final IStatus s = status;
+            final List<Archetype> archetypes = ((catalog == null) ? Collections.emptyList() : catalog.getArchetypes());
+            Shell shell = getShell();
+            if(shell == null) {
+              return status;
             }
-            return Status.OK_STATUS;
+            shell.getDisplay().asyncExec(() -> {
+              if(verifyButton.isDisposed()) {
+                return;
+              }
+              verifyButton.setEnabled(true);
+              if(!s.isOK()) {
+                setErrorMessage(NLS.bind(Messages.RemoteArchetypeCatalogDialog_error_read, s.getMessage()));
+                getButton(IDialogConstants.OK_ID).setEnabled(false);
+              } else if(archetypes.size() == 0) {
+                setMessage(Messages.RemoteArchetypeCatalogDialog_error_empty, IStatus.WARNING);
+              } else {
+                setMessage(NLS.bind(Messages.RemoteArchetypeCatalogDialog_message_found, archetypes.size()),
+                    IStatus.INFO);
+              }
+            });
           }
-        }.schedule();
-      }
-    });
+          return Status.OK_STATUS;
+        }
+      }.schedule();
+    }));
 
     Label filler = new Label(composite, SWT.NONE);
     filler.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationWizardPage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationWizardPage.java
index 656f213..8c97d9e 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationWizardPage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationWizardPage.java
@@ -30,8 +30,7 @@
 import org.eclipse.jface.window.Window;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -163,12 +162,7 @@
     composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
 
     btnExternal = new Button(composite, SWT.RADIO);
-    btnExternal.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        changeRuntimeTypeAction();
-      }
-    });
+    btnExternal.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> changeRuntimeTypeAction()));
     btnExternal.setText(Messages.MavenInstallationWizardPage_btnExternal_text_1);
 
     btnWorkspace = new Button(composite, SWT.RADIO);
@@ -182,12 +176,7 @@
     location.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
 
     btnDirectory = new Button(container, SWT.NONE);
-    btnDirectory.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        selectLocationAction();
-      }
-    });
+    btnDirectory.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> selectLocationAction()));
     btnDirectory.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
     btnDirectory.setText(Messages.ExternalInstallPage_btnDirectory_text);
 
@@ -211,52 +200,27 @@
     treeLibraries.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 5));
 
     btnAddProject = new Button(container, SWT.NONE);
-    btnAddProject.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        addProjectExtensionAction();
-      }
-    });
+    btnAddProject.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> addProjectExtensionAction()));
     btnAddProject.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
     btnAddProject.setText(Messages.ExternalInstallPage_btnAddProject_text);
 
     btnRemove = new Button(container, SWT.NONE);
-    btnRemove.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        removeExtensionAction();
-      }
-    });
+    btnRemove.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> removeExtensionAction()));
     btnRemove.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
     btnRemove.setText(Messages.ExternalInstallPage_btnRemove_text);
 
     btnUp = new Button(container, SWT.NONE);
-    btnUp.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        moveExtensionAction(-1);
-      }
-    });
+    btnUp.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> moveExtensionAction(-1)));
     btnUp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
     btnUp.setText(Messages.ExternalInstallPage_btnUp_text);
 
     btnDown = new Button(container, SWT.NONE);
-    btnDown.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        moveExtensionAction(1);
-      }
-    });
+    btnDown.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> moveExtensionAction(1)));
     btnDown.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
     btnDown.setText(Messages.ExternalInstallPage_btnDown_text);
 
     Button btnRestoreDefault = new Button(container, SWT.NONE);
-    btnRestoreDefault.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        resetExtensionsAction();
-      }
-    });
+    btnRestoreDefault.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> resetExtensionsAction()));
     btnRestoreDefault.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1));
     btnRestoreDefault.setText(Messages.ExternalInstallPage_btnRestoreDefault_text);
 
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationsPreferencePage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationsPreferencePage.java
index 59812d4..15f0555 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationsPreferencePage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationsPreferencePage.java
@@ -28,8 +28,7 @@
 import org.eclipse.jface.window.Window;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
@@ -207,50 +206,44 @@
     Button addButton = new Button(composite, SWT.NONE);
     addButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     addButton.setText(Messages.MavenInstallationsPreferencePage_btnAdd);
-    addButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        MavenInstallationWizard wizard = new MavenInstallationWizard(getForbiddenNames(null));
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        if(dialog.open() == Window.OK) {
-          runtimes.add(wizard.getResult());
-          refreshRuntimesViewer();
-        }
+    addButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      MavenInstallationWizard wizard = new MavenInstallationWizard(getForbiddenNames(null));
+      WizardDialog dialog = new WizardDialog(getShell(), wizard);
+      if(dialog.open() == Window.OK) {
+        runtimes.add(wizard.getResult());
+        refreshRuntimesViewer();
       }
-    });
+    }));
 
     final Button editButton = new Button(composite, SWT.NONE);
     editButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     editButton.setEnabled(false);
     editButton.setText(Messages.MavenInstallationsPreferencePage_btnEdit);
-    editButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        AbstractMavenRuntime runtime = getSelectedMavenRuntime();
-        MavenInstallationWizard wizard = new MavenInstallationWizard(runtime, getForbiddenNames(runtime));
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        if(dialog.open() == Window.OK) {
-          AbstractMavenRuntime updatedRuntime = wizard.getResult();
-          for(int i = 0; i < runtimes.size(); i++ ) {
-            if(runtime == runtimes.get(i)) {
-              runtimes.set(i, updatedRuntime);
-              break;
-            }
+    editButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      AbstractMavenRuntime runtime = getSelectedMavenRuntime();
+      MavenInstallationWizard wizard = new MavenInstallationWizard(runtime, getForbiddenNames(runtime));
+      WizardDialog dialog = new WizardDialog(getShell(), wizard);
+      if(dialog.open() == Window.OK) {
+        AbstractMavenRuntime updatedRuntime = wizard.getResult();
+        for(int i = 0; i < runtimes.size(); i++ ) {
+          if(runtime == runtimes.get(i)) {
+            runtimes.set(i, updatedRuntime);
+            break;
           }
-          refreshRuntimesViewer();
         }
+        refreshRuntimesViewer();
       }
-    });
+    }));
 
     final Button removeButton = new Button(composite, SWT.NONE);
     removeButton.setEnabled(false);
     removeButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     removeButton.setText(Messages.MavenInstallationsPreferencePage_btnRemove);
-    removeButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        AbstractMavenRuntime runtime = getSelectedMavenRuntime();
-        runtimes.remove(runtime);
-        refreshRuntimesViewer();
-      }
-    });
+    removeButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      AbstractMavenRuntime runtime = getSelectedMavenRuntime();
+      runtimes.remove(runtime);
+      refreshRuntimesViewer();
+    }));
 
     runtimesViewer.addSelectionChangedListener(event -> {
       if(runtimesViewer.getSelection() instanceof IStructuredSelection) {
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/LifecycleMappingPage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/LifecycleMappingPage.java
index 82cae48..6eb7235 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/LifecycleMappingPage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/LifecycleMappingPage.java
@@ -51,8 +51,7 @@
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.FontMetrics;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.graphics.Image;
@@ -493,33 +492,25 @@
     errorCountLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
 
     Button btnNewButton_1 = new Button(composite, SWT.NONE);
-    btnNewButton_1.addSelectionListener(new SelectionAdapter() {
-      @Override
-      @SuppressWarnings("synthetic-access")
-      public void widgetSelected(SelectionEvent e) {
-        mappingConfiguration.clearSelectedProposals();
-        ignore.clear();
-        ignoreAtDefinition.clear();
-        ignoreWorkspace.clear();
-        treeViewer.refresh();
-        getWizard().getContainer().updateButtons(); // needed to enable/disable Finish button
-        updateErrorCount();
-      }
-    });
+    btnNewButton_1.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      mappingConfiguration.clearSelectedProposals();
+      ignore.clear();
+      ignoreAtDefinition.clear();
+      ignoreWorkspace.clear();
+      treeViewer.refresh();
+      getWizard().getContainer().updateButtons(); // needed to enable/disable Finish button
+      updateErrorCount();
+    }));
     btnNewButton_1.setText(Messages.LifecycleMappingPage_deselectAllButton);
 
     autoSelectButton = new Button(composite, SWT.NONE);
-    autoSelectButton.addSelectionListener(new SelectionAdapter() {
-      @Override
-      @SuppressWarnings("synthetic-access")
-      public void widgetSelected(SelectionEvent e) {
-        resetDetails();
-        ignore.clear();
-        ignoreAtDefinition.clear();
-        ignoreWorkspace.clear();
-        discoverProposals();
-      }
-    });
+    autoSelectButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      resetDetails();
+      ignore.clear();
+      ignoreAtDefinition.clear();
+      ignoreWorkspace.clear();
+      discoverProposals();
+    }));
     autoSelectButton.setText(Messages.LifecycleMappingPage_autoSelectButton);
 
     // Provide a reasonable height for the details box 
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenDependenciesWizardPage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenDependenciesWizardPage.java
index fba8293..b0bd58c 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenDependenciesWizardPage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenDependenciesWizardPage.java
@@ -27,8 +27,7 @@
 import org.eclipse.jface.window.Window;
 import org.eclipse.jface.wizard.IWizardContainer;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -122,47 +121,40 @@
     addDependencyButton.setLayoutData(gd_addDependencyButton);
     addDependencyButton.setText(Messages.wizardProjectPageDependenciesAdd);
 
-    addDependencyButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        MavenRepositorySearchDialog dialog = MavenRepositorySearchDialog
-            .createSearchDependencyDialog(
-                getShell(), //
-                org.eclipse.m2e.core.ui.internal.Messages.MavenDependenciesWizardPage_searchDialog_title, null, null,
-                false);
-        if(dialog.open() == Window.OK) {
-          Object result = dialog.getFirstResult();
-          if(result instanceof IndexedArtifactFile) {
-            Dependency dependency = ((IndexedArtifactFile) result).getDependency();
-            dependency.setScope(dialog.getSelectedScope());
-            dependencyViewer.add(dependency);
+    addDependencyButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      MavenRepositorySearchDialog dialog = MavenRepositorySearchDialog.createSearchDependencyDialog(getShell(), //
+          org.eclipse.m2e.core.ui.internal.Messages.MavenDependenciesWizardPage_searchDialog_title, null, null, false);
+      if(dialog.open() == Window.OK) {
+        Object result = dialog.getFirstResult();
+        if(result instanceof IndexedArtifactFile) {
+          Dependency dependency = ((IndexedArtifactFile) result).getDependency();
+          dependency.setScope(dialog.getSelectedScope());
+          dependencyViewer.add(dependency);
+          notifyListeners();
+        } else if(result instanceof IndexedArtifact) {
+          // If we have an ArtifactInfo, we add the first FileInfo it contains
+          // which corresponds to the latest version of the artifact.
+          Set<IndexedArtifactFile> files = ((IndexedArtifact) result).getFiles();
+          if(files != null && !files.isEmpty()) {
+            dependencyViewer.add(files.iterator().next().getDependency());
             notifyListeners();
-          } else if(result instanceof IndexedArtifact) {
-            // If we have an ArtifactInfo, we add the first FileInfo it contains
-            // which corresponds to the latest version of the artifact.
-            Set<IndexedArtifactFile> files = ((IndexedArtifact) result).getFiles();
-            if(files != null && !files.isEmpty()) {
-              dependencyViewer.add(files.iterator().next().getDependency());
-              notifyListeners();
-            }
           }
         }
       }
-    });
+    }));
 
     final Button removeDependencyButton = new Button(composite, SWT.PUSH);
     removeDependencyButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, true));
     removeDependencyButton.setText(Messages.wizardProjectPageDependenciesRemove);
     removeDependencyButton.setEnabled(false);
 
-    removeDependencyButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        IStructuredSelection selection = (IStructuredSelection) dependencyViewer.getSelection();
-        if(selection != null) {
-          dependencyViewer.remove(selection.toArray());
-          notifyListeners();
-        }
+    removeDependencyButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      IStructuredSelection selection = (IStructuredSelection) dependencyViewer.getSelection();
+      if(selection != null) {
+        dependencyViewer.remove(selection.toArray());
+        notifyListeners();
       }
-    });
+    }));
 
     dependencyViewer.addSelectionChangedListener(event -> {
       IStructuredSelection selection = (IStructuredSelection) event.getSelection();
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenImportWizardPage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenImportWizardPage.java
index ab5d06a..4cdea81 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenImportWizardPage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenImportWizardPage.java
@@ -55,6 +55,7 @@
 import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -160,25 +161,23 @@
       final Button browseButton = new Button(composite, SWT.NONE);
       browseButton.setText(Messages.wizardImportPageBrowse);
       browseButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
-      browseButton.addSelectionListener(new SelectionAdapter() {
-        public void widgetSelected(SelectionEvent e) {
-          DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.NONE);
-          dialog.setText(Messages.wizardImportPageSelectRootFolder);
-          String path = rootDirectoryCombo.getText();
-          if(path.length() == 0) {
-            path = ResourcesPlugin.getWorkspace().getRoot().getLocation().toPortableString();
-          }
-          dialog.setFilterPath(path);
+      browseButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+        DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.NONE);
+        dialog.setText(Messages.wizardImportPageSelectRootFolder);
+        String path = rootDirectoryCombo.getText();
+        if(path.length() == 0) {
+          path = ResourcesPlugin.getWorkspace().getRoot().getLocation().toPortableString();
+        }
+        dialog.setFilterPath(path);
 
-          String result = dialog.open();
-          if(result != null) {
-            rootDirectoryCombo.setText(result);
-            if(rootDirectoryChanged()) {
-              scanProjects();
-            }
+        String result = dialog.open();
+        if(result != null) {
+          rootDirectoryCombo.setText(result);
+          if(rootDirectoryChanged()) {
+            scanProjects();
           }
         }
-      });
+      }));
 
       rootDirectoryCombo.addListener(SWT.Traverse, e -> {
         if(e.keyCode == SWT.CR && rootDirectoryChanged()) {
@@ -300,90 +299,61 @@
     projectTree.setMenu(menu);
 
     MenuItem mntmSelectTree = new MenuItem(menu, SWT.NONE);
-    mntmSelectTree.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        setProjectSubtreeChecked(true);
-      }
-    });
+    mntmSelectTree.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> setProjectSubtreeChecked(true)));
     mntmSelectTree.setText(Messages.MavenImportWizardPage_mntmSelectTree_text);
 
     MenuItem mntmDeselectTree = new MenuItem(menu, SWT.NONE);
-    mntmDeselectTree.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        setProjectSubtreeChecked(false);
-      }
-    });
+    mntmDeselectTree
+        .addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> setProjectSubtreeChecked(false)));
     mntmDeselectTree.setText(Messages.MavenImportWizardPage_mntmDeselectTree_text);
 
     final Button selectAllButton = new Button(composite, SWT.NONE);
     selectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     selectAllButton.setText(Messages.wizardImportPageSelectAll);
-    selectAllButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        projectTreeViewer.expandAll();
-        setAllChecked(true);
-        // projectTreeViewer.setSubtreeChecked(projectTreeViewer.getInput(), true);
-        validate();
-      }
-    });
+    selectAllButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      projectTreeViewer.expandAll();
+      setAllChecked(true);
+      // projectTreeViewer.setSubtreeChecked(projectTreeViewer.getInput(), true);
+      validate();
+    }));
 
     final Button deselectAllButton = new Button(composite, SWT.NONE);
     deselectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     deselectAllButton.setText(Messages.wizardImportPageDeselectAll);
-    deselectAllButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        setAllChecked(false);
-        // projectTreeViewer.setSubtreeChecked(projectTreeViewer.getInput(), false);
-        setPageComplete(false);
-      }
-    });
+    deselectAllButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      setAllChecked(false);
+      // projectTreeViewer.setSubtreeChecked(projectTreeViewer.getInput(), false);
+      setPageComplete(false);
+    }));
 
     btnSelectTree = new Button(composite, SWT.NONE);
     btnSelectTree.setEnabled(false);
-    btnSelectTree.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        setProjectSubtreeChecked(true);
-      }
-    });
+    btnSelectTree.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> setProjectSubtreeChecked(true)));
     btnSelectTree.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
     btnSelectTree.setText(Messages.MavenImportWizardPage_btnSelectTree_text);
 
     btnDeselectTree = new Button(composite, SWT.NONE);
     btnDeselectTree.setEnabled(false);
-    btnDeselectTree.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        setProjectSubtreeChecked(false);
-      }
-    });
+    btnDeselectTree.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> setProjectSubtreeChecked(false)));
     btnDeselectTree.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
     btnDeselectTree.setText(Messages.MavenImportWizardPage_btnDeselectTree_text);
 
     final Button refreshButton = new Button(composite, SWT.NONE);
     refreshButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, true));
     refreshButton.setText(Messages.wizardImportPageRefresh);
-    refreshButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        scanProjects();
-      }
-    });
+    refreshButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> scanProjects()));
 
     createWorkingSet = new Button(composite, SWT.CHECK);
     createWorkingSet.setText(Messages.MavenImportWizardPage_createWorkingSet);
     createWorkingSet.setSelection(true);
     createWorkingSet.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
-    createWorkingSet.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        boolean enabled = createWorkingSet.getSelection();
-        workingSetName.setEnabled(enabled);
-        if(enabled) {
-          workingSetName.setFocus();
-        }
+    createWorkingSet.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      boolean enabled = createWorkingSet.getSelection();
+      workingSetName.setEnabled(enabled);
+      if(enabled) {
+        workingSetName.setFocus();
       }
-    });
+    }));
 
     workingSetName = new Combo(composite, SWT.BORDER);
     GridData gd_workingSet = new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1);
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenInstallFileArtifactWizardPage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenInstallFileArtifactWizardPage.java
index 2a55c8a..dcf1f95 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenInstallFileArtifactWizardPage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenInstallFileArtifactWizardPage.java
@@ -24,8 +24,7 @@
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -104,17 +103,15 @@
     artifactFileNameButton.setLayoutData(new GridData());
     artifactFileNameButton.setData("name", "externalPomFileButton"); //$NON-NLS-1$ //$NON-NLS-2$
     artifactFileNameButton.setText(Messages.MavenInstallFileArtifactWizardPage_btnFilename);
-    artifactFileNameButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        FileDialog fileDialog = new FileDialog(artifactFileNameButton.getShell());
-        fileDialog.setText(Messages.MavenInstallFileArtifactWizardPage_file_title);
-        fileDialog.setFileName(artifactFileNameText.getText());
-        String name = fileDialog.open();
-        if(name != null) {
-          updateFileName(name);
-        }
+    artifactFileNameButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      FileDialog fileDialog = new FileDialog(artifactFileNameButton.getShell());
+      fileDialog.setText(Messages.MavenInstallFileArtifactWizardPage_file_title);
+      fileDialog.setFileName(artifactFileNameText.getText());
+      String name = fileDialog.open();
+      if(name != null) {
+        updateFileName(name);
       }
-    });
+    }));
 
     Label pomFileNameLabel = new Label(container, SWT.NONE);
     pomFileNameLabel.setText(Messages.MavenInstallFileArtifactWizardPage_lblPom);
@@ -131,17 +128,15 @@
     pomFileNameButton.setLayoutData(new GridData());
     pomFileNameButton.setData("name", "externalPomFileButton"); //$NON-NLS-1$ //$NON-NLS-2$
     pomFileNameButton.setText(Messages.MavenInstallFileArtifactWizardPage_btnPom);
-    pomFileNameButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        FileDialog fileDialog = new FileDialog(pomFileNameButton.getShell());
-        fileDialog.setText(Messages.MavenInstallFileArtifactWizardPage_file_title);
-        fileDialog.setFileName(pomFileNameText.getText());
-        String res = fileDialog.open();
-        if(res != null) {
-          updatePOMFileName(res);
-        }
+    pomFileNameButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      FileDialog fileDialog = new FileDialog(pomFileNameButton.getShell());
+      fileDialog.setText(Messages.MavenInstallFileArtifactWizardPage_file_title);
+      fileDialog.setFileName(pomFileNameText.getText());
+      String res = fileDialog.open();
+      if(res != null) {
+        updatePOMFileName(res);
       }
-    });
+    }));
 
     new Label(container, SWT.NONE);
 
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenLocationComponent.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenLocationComponent.java
index 9940f4d..006c768 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenLocationComponent.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenLocationComponent.java
@@ -19,8 +19,7 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -86,8 +85,7 @@
     inWorkspaceButton = new Button(locationGroup, SWT.RADIO);
     inWorkspaceButton.setText(Messages.locationComponentInWorkspace);
     inWorkspaceButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
-    inWorkspaceButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
+    inWorkspaceButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
         boolean isEnabled = !inWorkspaceButton.getSelection();
         locationLabel.setEnabled(isEnabled);
         locationCombo.setEnabled(isEnabled);
@@ -96,7 +94,7 @@
           modifyingListener.modifyText(null);
         }
       }
-    });
+      ));
 
     // second radio button
     inExternalLocationButton = new Button(locationGroup, SWT.RADIO);
@@ -119,23 +117,21 @@
     gridData = new GridData(SWT.FILL, SWT.DEFAULT, false, false);
     locationBrowseButton.setLayoutData(gridData);
 
-    locationBrowseButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        DirectoryDialog dialog = new DirectoryDialog(getShell());
-        dialog.setText(Messages.locationComponentSelectLocation);
+    locationBrowseButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      DirectoryDialog dialog = new DirectoryDialog(getShell());
+      dialog.setText(Messages.locationComponentSelectLocation);
 
-        String path = locationCombo.getText();
-        if(path.length() == 0) {
-          path = ResourcesPlugin.getWorkspace().getRoot().getLocation().toPortableString();
-        }
-        dialog.setFilterPath(path);
-
-        String selectedDir = dialog.open();
-        if(selectedDir != null) {
-          locationCombo.setText(selectedDir.trim());
-        }
+      String path = locationCombo.getText();
+      if(path.length() == 0) {
+        path = ResourcesPlugin.getWorkspace().getRoot().getLocation().toPortableString();
       }
-    });
+      dialog.setFilterPath(path);
+
+      String selectedDir = dialog.open();
+      if(selectedDir != null) {
+        locationCombo.setText(selectedDir.trim());
+      }
+    }));
 
     inWorkspaceButton.setSelection(true);
 
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenModuleWizard.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenModuleWizard.java
index 32278ff..afea068 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenModuleWizard.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenModuleWizard.java
@@ -41,8 +41,7 @@
 import org.eclipse.core.runtime.jobs.JobChangeAdapter;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.INewWizard;
@@ -118,13 +117,11 @@
 
     parametersPage.setArtifactIdEnabled(false);
 
-    parentPage.addArchetypeSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        boolean isArchetype = !parentPage.isSimpleProject();
-        archetypePage.setUsed(isArchetype);
-        parametersPage.setUsed(isArchetype);
-      }
-    });
+    parentPage.addArchetypeSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      boolean isArchetype = !parentPage.isSimpleProject();
+      archetypePage.setUsed(isArchetype);
+      parametersPage.setUsed(isArchetype);
+    }));
 
     parentPage.addModuleNameListener(e -> {
       parametersPage.setProjectName(parentPage.getModuleName());
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenModuleWizardParentPage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenModuleWizardParentPage.java
index ff0d6eb..e1f92b9 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenModuleWizardParentPage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenModuleWizardParentPage.java
@@ -30,8 +30,6 @@
 import org.eclipse.jface.wizard.IWizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -104,11 +102,7 @@
     simpleProject.setText(Messages.wizardProjectPageProjectSimpleProject);
     simpleProject.setData("name", "simpleProjectButton"); //$NON-NLS-1$ //$NON-NLS-2$
     simpleProject.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 3, 1));
-    simpleProject.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        validate();
-      }
-    });
+    simpleProject.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> validate()));
 
     Label nameLabel = new Label(container, SWT.NONE);
     GridData gd_nameLabel = new GridData();
@@ -132,15 +126,13 @@
 
     Button browseButton = new Button(container, SWT.NONE);
     browseButton.setText(Messages.wizardModulePageParentBrowse);
-    browseButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        MavenProjectSelectionDialog dialog = new MavenProjectSelectionDialog(getShell());
-        if(dialog.open() == Window.OK) {
-          setParent(dialog.getFirstResult());
-          validate();
-        }
+    browseButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      MavenProjectSelectionDialog dialog = new MavenProjectSelectionDialog(getShell());
+      if(dialog.open() == Window.OK) {
+        setParent(dialog.getFirstResult());
+        validate();
       }
-    });
+    }));
 
     this.workingSetGroup = new WorkingSetGroup(container, workingSets, getShell());
 
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenParentComponent.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenParentComponent.java
index 2ce6f36..f02e050 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenParentComponent.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenParentComponent.java
@@ -15,8 +15,6 @@
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -122,11 +120,7 @@
       parentClearButton = new Button(buttonPanel, SWT.NONE);
       parentClearButton.setText(Messages.wizardProjectPageArtifactParentClear);
       parentClearButton.setData("name", "parentClearButton"); //$NON-NLS-1$ //$NON-NLS-2$
-      parentClearButton.addSelectionListener(new SelectionAdapter() {
-        public void widgetSelected(SelectionEvent e) {
-          setValues("", "", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        }
-      });
+      parentClearButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> setValues("", "", "")));
     }
   }
 
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizard.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizard.java
index 95e9279..b15ab12 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizard.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizard.java
@@ -31,8 +31,7 @@
 import org.eclipse.jface.wizard.IWizardPage;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
@@ -105,11 +104,7 @@
         simpleProject = new Button(container, SWT.CHECK);
         simpleProject.setText(Messages.wizardProjectPageProjectSimpleProject);
         simpleProject.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 3, 1));
-        simpleProject.addSelectionListener(new SelectionAdapter() {
-          public void widgetSelected(SelectionEvent e) {
-            validate();
-          }
-        });
+        simpleProject.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> validate()));
 
         Label label = new Label(container, SWT.NONE);
         GridData labelData = new GridData(SWT.FILL, SWT.TOP, false, false, 3, 1);
@@ -138,15 +133,13 @@
   public void createPageControls(Composite pageContainer) {
     super.createPageControls(pageContainer);
 
-    simpleProject.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        boolean isSimpleproject = simpleProject.getSelection();
-        archetypePage.setUsed(!isSimpleproject);
-        parametersPage.setUsed(!isSimpleproject);
-        artifactPage.setUsed(isSimpleproject);
-        getContainer().updateButtons();
-      }
-    });
+    simpleProject.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      boolean isSimpleproject = simpleProject.getSelection();
+      archetypePage.setUsed(!isSimpleproject);
+      parametersPage.setUsed(!isSimpleproject);
+      artifactPage.setUsed(isSimpleproject);
+      getContainer().updateButtons();
+    }));
 
     archetypePage.addArchetypeSelectionListener(selectionchangedevent -> {
       parametersPage.setArchetype(archetypePage.getArchetype());
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArchetypePage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArchetypePage.java
index 663854d..99cfefd 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArchetypePage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArchetypePage.java
@@ -58,7 +58,6 @@
 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.SelectionListener;
 import org.eclipse.swt.graphics.Image;
@@ -284,38 +283,36 @@
     Button configureButton = new Button(catalogsComposite, SWT.NONE);
     configureButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
     configureButton.setText(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypePage_btnConfigure);
-    configureButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
+    configureButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
 
-        Collection<ArchetypeCatalogFactory> oldCatalogs = archetypeManager.getActiveArchetypeCatalogs();
+      Collection<ArchetypeCatalogFactory> oldCatalogs = archetypeManager.getActiveArchetypeCatalogs();
 
-        PreferencesUtil.createPreferenceDialogOn(getShell(),
-            "org.eclipse.m2e.core.preferences.MavenArchetypesPreferencePage", null, null).open(); //$NON-NLS-1$
+      PreferencesUtil.createPreferenceDialogOn(getShell(),
+          "org.eclipse.m2e.core.preferences.MavenArchetypesPreferencePage", null, null).open(); //$NON-NLS-1$
 
-        Collection<ArchetypeCatalogFactory> newCatalogs = archetypeManager.getActiveArchetypeCatalogs();
+      Collection<ArchetypeCatalogFactory> newCatalogs = archetypeManager.getActiveArchetypeCatalogs();
 
-        //Deselect removed catalog if needed
-        if(catalogFactory != null && !newCatalogs.contains(catalogFactory)) {
-          catalogFactory = null;
-        }
-
-        //Select 1st new catalog
-        ArchetypeCatalogFactory selectedCatalog = catalogFactory;
-        for(ArchetypeCatalogFactory newCatalog : newCatalogs) {
-          if(!oldCatalogs.contains(newCatalog)) {
-            selectedCatalog = newCatalog;
-            break;
-          }
-        }
-
-        ArrayList allCatalogs = new ArrayList(newCatalogs);
-        allCatalogs.add(0, ALL_CATALOGS);
-        catalogsComboViewer.setInput(allCatalogs);
-        catalogsComboViewer
-            .setSelection(new StructuredSelection(selectedCatalog == null ? ALL_CATALOGS : selectedCatalog));
-
+      //Deselect removed catalog if needed
+      if(catalogFactory != null && !newCatalogs.contains(catalogFactory)) {
+        catalogFactory = null;
       }
-    });
+
+      //Select 1st new catalog
+      ArchetypeCatalogFactory selectedCatalog = catalogFactory;
+      for(ArchetypeCatalogFactory newCatalog : newCatalogs) {
+        if(!oldCatalogs.contains(newCatalog)) {
+          selectedCatalog = newCatalog;
+          break;
+        }
+      }
+
+      ArrayList allCatalogs1 = new ArrayList(newCatalogs);
+      allCatalogs1.add(0, ALL_CATALOGS);
+      catalogsComboViewer.setInput(allCatalogs1);
+      catalogsComboViewer
+          .setSelection(new StructuredSelection(selectedCatalog == null ? ALL_CATALOGS : selectedCatalog));
+
+    }));
 
     Label filterLabel = new Label(parent, SWT.NONE);
     filterLabel.setLayoutData(new GridData());
@@ -346,11 +343,9 @@
     clearToolItem.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_ELCL_REMOVE));
     clearToolItem
         .setDisabledImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_ELCL_REMOVE_DISABLED));
-    clearToolItem.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        filterText.setText(""); //$NON-NLS-1$
-      }
-    });
+        clearToolItem.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+          filterText.setText(""); //$NON-NLS-1$
+        }));
 
     filterText.addModifyListener(e -> clearToolItem.setEnabled(filterText.getText().length() > 0));
 
@@ -505,19 +500,17 @@
     buttonData.horizontalIndent = 35;
     addArchetypeButton.setLayoutData(buttonData);
 
-    addArchetypeButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        CustomArchetypeDialog dialog = new CustomArchetypeDialog(getShell(),
-            org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypePage_add_title);
-        if(dialog.open() == Window.OK) {
-          String archetypeGroupId = dialog.getArchetypeGroupId();
-          String archetypeArtifactId = dialog.getArchetypeArtifactId();
-          String archetypeVersion = dialog.getArchetypeVersion();
-          String repositoryUrl = dialog.getRepositoryUrl();
-          downloadArchetype(archetypeGroupId, archetypeArtifactId, archetypeVersion, repositoryUrl);
-        }
+    addArchetypeButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      CustomArchetypeDialog dialog = new CustomArchetypeDialog(getShell(),
+          org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypePage_add_title);
+      if(dialog.open() == Window.OK) {
+        String archetypeGroupId = dialog.getArchetypeGroupId();
+        String archetypeArtifactId = dialog.getArchetypeArtifactId();
+        String archetypeVersion = dialog.getArchetypeVersion();
+        String repositoryUrl = dialog.getRepositoryUrl();
+        downloadArchetype(archetypeGroupId, archetypeArtifactId, archetypeVersion, repositoryUrl);
       }
-    });
+    }));
   }
 
   protected IWizardContainer getContainer() {
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArchetypeParametersPage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArchetypeParametersPage.java
index fa08577..9d217fc 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArchetypeParametersPage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArchetypeParametersPage.java
@@ -40,8 +40,7 @@
 import org.eclipse.jface.wizard.IWizardPage;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -252,32 +251,26 @@
     Button addButton = new Button(composite, SWT.NONE);
     addButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     addButton.setText(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypeParametersPage_btnAdd);
-    addButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        TableItem item = addTableItem("?", "?"); //$NON-NLS-1$ //$NON-NLS-2$
-        propertiesTable.setFocus();
-        propertiesViewer.editElement(item, KEY_INDEX);
-        propertiesViewer.setSelection(new StructuredSelection(item.getData()));
-      }
-    });
+    addButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      TableItem item = addTableItem("?", "?"); //$NON-NLS-1$ //$NON-NLS-2$
+      propertiesTable.setFocus();
+      propertiesViewer.editElement(item, KEY_INDEX);
+      propertiesViewer.setSelection(new StructuredSelection(item.getData()));
+    }));
 
     removeButton = new Button(composite, SWT.NONE);
     removeButton.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
     removeButton.setText(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArchetypeParametersPage_btnRemove);
     removeButton.setEnabled(propertiesTable.getSelectionCount() > 0);
-    removeButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        propertiesTable.remove(propertiesTable.getSelectionIndices());
-        removeButton.setEnabled(propertiesTable.getSelectionCount() > 0);
-        validate();
-      }
-    });
+    removeButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      propertiesTable.remove(propertiesTable.getSelectionIndices());
+      removeButton.setEnabled(propertiesTable.getSelectionCount() > 0);
+      validate();
+    }));
 
-    propertiesTable.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        removeButton.setEnabled(propertiesTable.getSelectionCount() > 0);
-      }
-    });
+    propertiesTable.addSelectionListener(
+        SelectionListener.widgetSelectedAdapter(e -> removeButton.setEnabled(propertiesTable.getSelectionCount() > 0)
+      ));
   }
 
   /**
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArtifactPage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArtifactPage.java
index 7d0c1dd..32c771c 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArtifactPage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardArtifactPage.java
@@ -20,8 +20,7 @@
 import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
@@ -143,20 +142,18 @@
     parentComponent.setWidthGroup(widthGroup);
 
     parentComponent.addModifyListener(modifyingListener);
-    parentComponent.addBrowseButtonListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        MavenRepositorySearchDialog dialog = MavenRepositorySearchDialog.createSearchParentDialog(getShell(),
-            org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArtifactPage_searchDialog_title, null, null);
+    parentComponent.addBrowseButtonListener(SelectionListener.widgetSelectedAdapter(e -> {
+      MavenRepositorySearchDialog dialog = MavenRepositorySearchDialog.createSearchParentDialog(getShell(),
+          org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardArtifactPage_searchDialog_title, null, null);
 
-        if(dialog.open() == Window.OK) {
-          IndexedArtifactFile indexedArtifactFile = (IndexedArtifactFile) dialog.getFirstResult();
-          if(indexedArtifactFile != null) {
-            parentComponent.setValues(indexedArtifactFile.group, indexedArtifactFile.artifact,
-                indexedArtifactFile.version);
-          }
+      if(dialog.open() == Window.OK) {
+        IndexedArtifactFile indexedArtifactFile = (IndexedArtifactFile) dialog.getFirstResult();
+        if(indexedArtifactFile != null) {
+          parentComponent.setValues(indexedArtifactFile.group, indexedArtifactFile.artifact,
+              indexedArtifactFile.version);
         }
       }
-    });
+    }));
 
     createAdvancedSettings(container, new GridData(SWT.FILL, SWT.TOP, false, false, 2, 1));
     resolverConfigurationComponent.setModifyListener(e -> validate());
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardLocationPage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardLocationPage.java
index 6b292a9..e5fd6e2 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardLocationPage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/MavenProjectWizardLocationPage.java
@@ -22,8 +22,7 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -104,13 +103,11 @@
     useDefaultWorkspaceLocationButton.setLayoutData(useDefaultWorkspaceLocationButtonData);
     useDefaultWorkspaceLocationButton
         .setText(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardLocationPage_btnUserDefault);
-    useDefaultWorkspaceLocationButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        boolean inWorkspace = isInWorkspace();
-        locationLabel.setEnabled(!inWorkspace);
-        locationCombo.setEnabled(!inWorkspace);
-      }
-    });
+        useDefaultWorkspaceLocationButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+          boolean inWorkspace = isInWorkspace();
+          locationLabel.setEnabled(!inWorkspace);
+          locationCombo.setEnabled(!inWorkspace);
+        }));
     useDefaultWorkspaceLocationButton.setSelection(true);
 
     locationLabel = new Label(container, SWT.NONE);
@@ -131,25 +128,23 @@
     GridData locationBrowseButtonData = new GridData(SWT.FILL, SWT.CENTER, false, false);
     locationBrowseButton.setLayoutData(locationBrowseButtonData);
     locationBrowseButton.setText(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardLocationPage_btnLocation);
-    locationBrowseButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        DirectoryDialog dialog = new DirectoryDialog(getShell());
-        dialog.setText(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardLocationPage_dialog_location);
+    locationBrowseButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      DirectoryDialog dialog = new DirectoryDialog(getShell());
+      dialog.setText(org.eclipse.m2e.core.ui.internal.Messages.MavenProjectWizardLocationPage_dialog_location);
 
-        String path = locationCombo.getText();
-        if(path.length() == 0) {
-          path = ResourcesPlugin.getWorkspace().getRoot().getLocation().toPortableString();
-        }
-        dialog.setFilterPath(path);
-
-        String selectedDir = dialog.open();
-        if(selectedDir != null) {
-          locationCombo.setText(selectedDir);
-          useDefaultWorkspaceLocationButton.setSelection(false);
-          validate();
-        }
+      String path = locationCombo.getText();
+      if(path.length() == 0) {
+        path = ResourcesPlugin.getWorkspace().getRoot().getLocation().toPortableString();
       }
-    });
+      dialog.setFilterPath(path);
+
+      String selectedDir = dialog.open();
+      if(selectedDir != null) {
+        locationCombo.setText(selectedDir);
+        useDefaultWorkspaceLocationButton.setSelection(false);
+        validate();
+      }
+    }));
 
     this.workingSetGroup = new WorkingSetGroup(container, workingSets, getShell());
 
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/ResolverConfigurationComponent.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/ResolverConfigurationComponent.java
index 8ef56bc..92c6abe 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/ResolverConfigurationComponent.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/wizards/ResolverConfigurationComponent.java
@@ -15,8 +15,7 @@
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -90,11 +89,8 @@
     resolveWorkspaceProjects = new Button(advancedComposite, SWT.CHECK);
     resolveWorkspaceProjects.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
     resolveWorkspaceProjects.setText(Messages.resolverConfigurationResolveWorkspaceProjects);
-    resolveWorkspaceProjects.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        resolverConfiguration.setResolveWorkspaceProjects(resolveWorkspaceProjects.getSelection());
-      }
-    });
+    resolveWorkspaceProjects.addSelectionListener(SelectionListener.widgetSelectedAdapter(
+        e -> resolverConfiguration.setResolveWorkspaceProjects(resolveWorkspaceProjects.getSelection())));
 
     Label profilesLabel = new Label(advancedComposite, SWT.NONE);
     profilesLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
diff --git a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/preferences/DiscoveryPreferencePage.java b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/preferences/DiscoveryPreferencePage.java
index 10dd0dc..b2cb3f6 100644
--- a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/preferences/DiscoveryPreferencePage.java
+++ b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/preferences/DiscoveryPreferencePage.java
@@ -15,8 +15,7 @@
 
 import org.eclipse.jface.preference.PreferencePage;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -58,12 +57,8 @@
     catalogUrl.setText(MavenDiscovery.PATH);
 
     Button btnOpenCatalog = new Button(composite, SWT.NONE);
-    btnOpenCatalog.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        MavenDiscovery.launchWizard(workbench.getModalDialogShellProvider().getShell());
-      }
-    });
+    btnOpenCatalog.addSelectionListener(SelectionListener
+        .widgetSelectedAdapter(e -> MavenDiscovery.launchWizard(workbench.getModalDialogShellProvider().getShell())));
     btnOpenCatalog.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
     btnOpenCatalog.setSize(92, 29);
     btnOpenCatalog.setText(Messages.DiscoveryPreferencePage_openCatalog);
diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/MarkerHoverControl.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/MarkerHoverControl.java
index 00b2f1f..28b5b04 100644
--- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/MarkerHoverControl.java
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/MarkerHoverControl.java
@@ -43,10 +43,8 @@
 import org.eclipse.swt.custom.StyledText;
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MouseEvent;
 import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.Image;
@@ -249,13 +247,10 @@
           //in some cases (managed version comes from imported dependencies) we don't have the location and have nowhere to jump)
           if(PomHyperlinkDetector.canCreateHyperLink(man)) {
             Link link = createHyperlink(comp);
-            link.addSelectionListener(new SelectionAdapter() {
-              @Override
-              public void widgetSelected(SelectionEvent e) {
-                dispose();
-                PomHyperlinkDetector.createHyperlink(man).open();
-              }
-            });
+            link.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+              dispose();
+              PomHyperlinkDetector.createHyperlink(man).open();
+            }));
           }
 
         }
@@ -264,13 +259,10 @@
           Composite tooltipComposite = createTooltipComposite(composite, PomTextHover.getLabelForRegion(expr));
           if(PomHyperlinkDetector.canCreateHyperLink(expr)) {
             Link link = createHyperlink(tooltipComposite);
-            link.addSelectionListener(new SelectionAdapter() {
-              @Override
-              public void widgetSelected(SelectionEvent e) {
-                dispose();
-                PomHyperlinkDetector.createHyperlink(expr).open();
-              }
-            });
+            link.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+              dispose();
+              PomHyperlinkDetector.createHyperlink(expr).open();
+            }));
           }
         }
         if(region.getRegions().indexOf(reg) < region.getRegions().size() - 1) {
@@ -396,13 +388,10 @@
       data2.horizontalIndent = 18;
       link.setLayoutData(data2);
       link.setText(Messages.MarkerHoverControl_openParentDefinition);
-      link.addSelectionListener(new SelectionAdapter() {
-        @Override
-        public void widgetSelected(SelectionEvent e) {
-          PomHyperlinkDetector.createHyperlink(annotation).open();
-          dispose();
-        }
-      });
+      link.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+        PomHyperlinkDetector.createHyperlink(annotation).open();
+        dispose();
+      }));
     }
 
   }
@@ -502,20 +491,11 @@
     if(image != null) {
       proposalImage.setImage(image);
 
-      proposalImage.addMouseListener(new MouseListener() {
-
-        public void mouseDoubleClick(MouseEvent e) {
+      proposalImage.addMouseListener(MouseListener.mouseUpAdapter(e -> {
+        if(e.button == 1) {
+          apply(proposal, mark, region.textViewer, region.textOffset);
         }
-
-        public void mouseDown(MouseEvent e) {
-        }
-
-        public void mouseUp(MouseEvent e) {
-          if(e.button == 1) {
-            apply(proposal, mark, region.textViewer, region.textOffset);
-          }
-        }
-      });
+      }));
     }
 
     Link proposalLink = new Link(parent, SWT.WRAP);
@@ -528,11 +508,8 @@
     }
     proposalLink.setText("<a>" + linkText + "</a>"); //$NON-NLS-1$ //$NON-NLS-2$
     proposalLink.setLayoutData(layoutData);
-    proposalLink.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        apply(proposal, mark, region.textViewer, region.textOffset);
-      }
-    });
+    proposalLink.addSelectionListener(
+        SelectionListener.widgetSelectedAdapter(e -> apply(proposal, mark, region.textViewer, region.textOffset)));
     return proposalLink;
   }
 
diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/dialogs/SelectSPDXLicenseDialog.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/dialogs/SelectSPDXLicenseDialog.java
index d09d26b..e620415 100644
--- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/dialogs/SelectSPDXLicenseDialog.java
+++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/dialogs/SelectSPDXLicenseDialog.java
@@ -29,8 +29,7 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.MouseAdapter;
 import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
@@ -93,18 +92,15 @@
         handleDoubleClick();
       }
     });
-    licensesTable.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        ISelection selection = licensesViewer.getSelection();
-        if(selection instanceof IStructuredSelection && !selection.isEmpty()) {
-          license = (SPDXLicense) ((IStructuredSelection) selection).getFirstElement();
-        } else {
-          license = null;
-        }
-        updateStatus();
+    licensesTable.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      ISelection selection = licensesViewer.getSelection();
+      if(selection instanceof IStructuredSelection && !selection.isEmpty()) {
+        license = (SPDXLicense) ((IStructuredSelection) selection).getFirstElement();
+      } else {
+        license = null;
       }
-    });
+      updateStatus();
+    }));
     GridData gd_licensesTable = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
     gd_licensesTable.heightHint = 400;
     licensesTable.setLayoutData(gd_licensesTable);
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/DependenciesComposite.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/DependenciesComposite.java
index 7d1859f..731aeed 100644
--- a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/DependenciesComposite.java
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/DependenciesComposite.java
@@ -63,8 +63,6 @@
 import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -195,102 +193,95 @@
     dependenciesEditor.setCellLabelProvider(new DelegatingStyledCellLabelProvider(dependencyLabelProvider));
     dependenciesEditor.setContentProvider(dependenciesContentProvider);
 
-    dependenciesEditor.setRemoveButtonListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        final List<Object> dependencyList = dependenciesEditor.getSelection();
-        try {
-          editorPage.performEditOperation(document -> {
-            Element deps = findChild(document.getDocumentElement(), DEPENDENCIES);
-            if(deps == null) {
-              //TODO log
-              return;
-            }
-            for(Object dependency : dependencyList) {
-              if(dependency instanceof Dependency) {
-                Element dep = findChild(deps, DEPENDENCY, childEquals(GROUP_ID, ((Dependency) dependency).groupId),
-                    childEquals(ARTIFACT_ID, ((Dependency) dependency).artifactId));
-                removeChild(deps, dep);
-              }
-            }
-            removeIfNoChildElement(deps);
-          }, log, "error removing dependencies");
-        } finally {
-          setDependenciesInput();
-        }
-      }
-    });
-
-    dependenciesEditor.setPropertiesListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        Object selection = dependenciesEditor.getSelection().get(0);
-        if(selection instanceof Dependency) {
-          Dependency dependency = (Dependency) selection;
-          EditDependencyDialog d = new EditDependencyDialog(getShell(), false, editorPage.getProject(),
-              editorPage.getPomEditor().getMavenProject());
-          d.setDependency(toApacheDependency(dependency));
-          if(d.open() == Window.OK) {
-            try {
-              editorPage.performEditOperation(d.getEditOperation(), log, "Error updating dependency");
-            } finally {
-              setDependenciesInput();
-              dependenciesEditor.setSelection(Collections.singletonList((Object) dependency));
+    dependenciesEditor.setRemoveButtonListener(SelectionListener.widgetSelectedAdapter(e -> {
+      final List<Object> dependencyList = dependenciesEditor.getSelection();
+      try {
+        editorPage.performEditOperation(document -> {
+          Element deps = findChild(document.getDocumentElement(), DEPENDENCIES);
+          if(deps == null) {
+            //TODO log
+            return;
+          }
+          for(Object dependency : dependencyList) {
+            if(dependency instanceof Dependency) {
+              Element dep = findChild(deps, DEPENDENCY, childEquals(GROUP_ID, ((Dependency) dependency).groupId),
+                  childEquals(ARTIFACT_ID, ((Dependency) dependency).artifactId));
+              removeChild(deps, dep);
             }
           }
-        } else if(selection instanceof org.apache.maven.model.Dependency) {
-          /*
-           * TODO: Support editing or displaying of inherited/managed dependencies.
-           */
-        }
+          removeIfNoChildElement(deps);
+        }, log, "error removing dependencies");
+      } finally {
+        setDependenciesInput();
       }
+    }));
 
-    });
+    dependenciesEditor.setPropertiesListener(SelectionListener.widgetSelectedAdapter(e -> {
+      Object selection = dependenciesEditor.getSelection().get(0);
+      if(selection instanceof Dependency) {
+        Dependency dependency = (Dependency) selection;
+        EditDependencyDialog d = new EditDependencyDialog(getShell(), false, editorPage.getProject(),
+            editorPage.getPomEditor().getMavenProject());
+        d.setDependency(toApacheDependency(dependency));
+        if(d.open() == Window.OK) {
+          try {
+            editorPage.performEditOperation(d.getEditOperation(), log, "Error updating dependency");
+          } finally {
+            setDependenciesInput();
+            dependenciesEditor.setSelection(Collections.singletonList((Object) dependency));
+          }
+        }
+      } else if(selection instanceof org.apache.maven.model.Dependency) {
+        /*
+         * TODO: Support editing or displaying of inherited/managed dependencies.
+         */
+      }
+    }
+
+    ));
 
     dependenciesSection.setClient(dependenciesEditor);
     toolkit.adapt(dependenciesEditor);
     toolkit.paintBordersFor(dependenciesEditor);
 
-    dependenciesEditor.setManageButtonListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        try {
-          openManageDependenciesDialog();
-        } catch(InvocationTargetException e1) {
-          MavenEditorPlugin.getDefault().getLog()
-              .log(new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, "Error: ", e1)); //$NON-NLS-1$
-        } catch(InterruptedException e1) {
-          MavenEditorPlugin.getDefault().getLog()
-              .log(new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, "Error: ", e1)); //$NON-NLS-1$
-        }
+    dependenciesEditor.setManageButtonListener(SelectionListener.widgetSelectedAdapter(e -> {
+      try {
+        openManageDependenciesDialog();
+      } catch(InvocationTargetException e1) {
+        MavenEditorPlugin.getDefault().getLog()
+            .log(new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, "Error: ", e1)); //$NON-NLS-1$
+      } catch(InterruptedException e1) {
+        MavenEditorPlugin.getDefault().getLog()
+            .log(new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, "Error: ", e1)); //$NON-NLS-1$
       }
-    });
+    }));
 
-    dependenciesEditor.setAddButtonListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        final MavenRepositorySearchDialog addDepDialog = MavenRepositorySearchDialog.createSearchDependencyDialog(
-            getShell(), Messages.DependenciesComposite_action_selectDependency,
-            editorPage.getPomEditor().getMavenProject(), editorPage.getProject(), false);
+    dependenciesEditor.setAddButtonListener(SelectionListener.widgetSelectedAdapter(e -> {
+      final MavenRepositorySearchDialog addDepDialog = MavenRepositorySearchDialog.createSearchDependencyDialog(
+          getShell(), Messages.DependenciesComposite_action_selectDependency,
+          editorPage.getPomEditor().getMavenProject(), editorPage.getProject(), false);
 
-        if(addDepDialog.open() == Window.OK) {
-          final IndexedArtifactFile dep = (IndexedArtifactFile) addDepDialog.getFirstResult();
-          final String selectedScope = addDepDialog.getSelectedScope();
-          try {
-            editorPage.performEditOperation(document -> {
-              Element depsEl = getChild(document.getDocumentElement(), DEPENDENCIES);
-              PomHelper.addOrUpdateDependency(depsEl, dep.group, dep.artifact,
-                  isManaged(dep.group, dep.artifact, dep.version) ? null : dep.version, dep.type, selectedScope,
-                  dep.classifier);
-            }, log, "errror adding dependency");
-          } finally {
-            setDependenciesInput();
-            List<Dependency> deps = getDependencies();
-            if(deps.size() > 0) {
-              dependenciesEditor.setSelection(Collections.<Object> singletonList(deps.get(deps.size() - 1)));
-            }
+      if(addDepDialog.open() == Window.OK) {
+        final IndexedArtifactFile dep = (IndexedArtifactFile) addDepDialog.getFirstResult();
+        final String selectedScope = addDepDialog.getSelectedScope();
+        try {
+          editorPage.performEditOperation(document -> {
+            Element depsEl = getChild(document.getDocumentElement(), DEPENDENCIES);
+            PomHelper.addOrUpdateDependency(depsEl, dep.group, dep.artifact,
+                isManaged(dep.group, dep.artifact, dep.version) ? null : dep.version, dep.type, selectedScope,
+                dep.classifier);
+          }, log, "errror adding dependency");
+        } finally {
+          setDependenciesInput();
+          List<Dependency> deps = getDependencies();
+          if(deps.size() > 0) {
+            dependenciesEditor.setSelection(Collections.<Object> singletonList(deps.get(deps.size() - 1)));
           }
         }
       }
+    }
 
-    });
+    ));
 
     ToolBarManager modulesToolBarManager = new ToolBarManager(SWT.FLAT);
 
@@ -401,48 +392,44 @@
     dependencyManagementEditor.setLabelProvider(dependencyManagementLabelProvider);
     dependencyManagementSection.setClient(dependencyManagementEditor);
 
-    dependencyManagementEditor.setRemoveButtonListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        final List<Dependency> dependencyList = dependencyManagementEditor.getSelection();
+    dependencyManagementEditor.setRemoveButtonListener(SelectionListener.widgetSelectedAdapter(e -> {
+      final List<Dependency> dependencyList = dependencyManagementEditor.getSelection();
+      try {
+        editorPage.performEditOperation(document -> {
+          Element deps = findChild(findChild(document.getDocumentElement(), DEPENDENCY_MANAGEMENT), DEPENDENCIES);
+          if(deps == null) {
+            //TODO log
+            return;
+          }
+          for(Dependency dependency : dependencyList) {
+            Element dep = findChild(deps, DEPENDENCY, childEquals(GROUP_ID, dependency.groupId),
+                childEquals(ARTIFACT_ID, dependency.artifactId));
+            removeChild(deps, dep);
+          }
+          removeIfNoChildElement(deps);
+        }, log, "error removing managed dependencies");
+      } finally {
+        setDependencyManagementInput();
+        dependenciesEditor.refresh();
+      }
+    }));
+
+    dependencyManagementEditor.setPropertiesListener(SelectionListener.widgetSelectedAdapter(e -> {
+      Dependency dependency = dependencyManagementEditor.getSelection().get(0);
+      EditDependencyDialog d = new EditDependencyDialog(getShell(), true, editorPage.getProject(),
+          editorPage.getPomEditor().getMavenProject());
+      d.setDependency(toApacheDependency(dependency));
+      if(d.open() == Window.OK) {
         try {
-          editorPage.performEditOperation(document -> {
-            Element deps = findChild(findChild(document.getDocumentElement(), DEPENDENCY_MANAGEMENT), DEPENDENCIES);
-            if(deps == null) {
-              //TODO log
-              return;
-            }
-            for(Dependency dependency : dependencyList) {
-              Element dep = findChild(deps, DEPENDENCY, childEquals(GROUP_ID, dependency.groupId),
-                  childEquals(ARTIFACT_ID, dependency.artifactId));
-              removeChild(deps, dep);
-            }
-            removeIfNoChildElement(deps);
-          }, log, "error removing managed dependencies");
+          editorPage.performEditOperation(d.getEditOperation(), log, "Error updating dependency");
         } finally {
           setDependencyManagementInput();
+          dependencyManagementEditor.setSelection(Collections.singletonList(dependency));
+          //refresh this one to update decorations..
           dependenciesEditor.refresh();
         }
       }
-    });
-
-    dependencyManagementEditor.setPropertiesListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        Dependency dependency = dependencyManagementEditor.getSelection().get(0);
-        EditDependencyDialog d = new EditDependencyDialog(getShell(), true, editorPage.getProject(),
-            editorPage.getPomEditor().getMavenProject());
-        d.setDependency(toApacheDependency(dependency));
-        if(d.open() == Window.OK) {
-          try {
-            editorPage.performEditOperation(d.getEditOperation(), log, "Error updating dependency");
-          } finally {
-            setDependencyManagementInput();
-            dependencyManagementEditor.setSelection(Collections.singletonList(dependency));
-            //refresh this one to update decorations..
-            dependenciesEditor.refresh();
-          }
-        }
-      }
-    });
+    }));
 
     dependencyManagementEditor.addSelectionListener(event -> {
       List<Dependency> selection = dependencyManagementEditor.getSelection();
@@ -455,34 +442,32 @@
     toolkit.adapt(dependencyManagementEditor);
     toolkit.paintBordersFor(dependencyManagementEditor);
 
-    dependencyManagementEditor.setAddButtonListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        final MavenRepositorySearchDialog addDepDialog = MavenRepositorySearchDialog.createSearchDependencyDialog(
-            getShell(), Messages.DependenciesComposite_action_selectDependency,
-            editorPage.getPomEditor().getMavenProject(), editorPage.getProject(), true);
-        if(addDepDialog.open() == Window.OK) {
-          final IndexedArtifactFile dep = (IndexedArtifactFile) addDepDialog.getFirstResult();
-          final String selectedScope = addDepDialog.getSelectedScope();
-          try {
-            editorPage.performEditOperation(document -> {
-              Element depsEl = getChild(document.getDocumentElement(), DEPENDENCY_MANAGEMENT, DEPENDENCIES);
-              PomHelper.addOrUpdateDependency(depsEl, dep.group, dep.artifact, dep.version, dep.type, selectedScope,
-                  dep.classifier);
-            }, log, "errror adding dependency");
-          } finally {
-            setDependencyManagementInput();
-            List<Dependency> dlist = getManagedDependencies();
-            if(dlist.size() > 0) {
-              dependencyManagementEditor
-                  .setSelection(Collections.<Dependency> singletonList(dlist.get(dlist.size() - 1)));
-            }
-            //refresh this one to update decorations..
-            dependenciesEditor.refresh();
+    dependencyManagementEditor.setAddButtonListener(SelectionListener.widgetSelectedAdapter(e -> {
+      final MavenRepositorySearchDialog addDepDialog = MavenRepositorySearchDialog.createSearchDependencyDialog(
+          getShell(), Messages.DependenciesComposite_action_selectDependency,
+          editorPage.getPomEditor().getMavenProject(), editorPage.getProject(), true);
+      if(addDepDialog.open() == Window.OK) {
+        final IndexedArtifactFile dep = (IndexedArtifactFile) addDepDialog.getFirstResult();
+        final String selectedScope = addDepDialog.getSelectedScope();
+        try {
+          editorPage.performEditOperation(document -> {
+            Element depsEl = getChild(document.getDocumentElement(), DEPENDENCY_MANAGEMENT, DEPENDENCIES);
+            PomHelper.addOrUpdateDependency(depsEl, dep.group, dep.artifact, dep.version, dep.type, selectedScope,
+                dep.classifier);
+          }, log, "errror adding dependency");
+        } finally {
+          setDependencyManagementInput();
+          List<Dependency> dlist = getManagedDependencies();
+          if(dlist.size() > 0) {
+            dependencyManagementEditor
+                .setSelection(Collections.<Dependency> singletonList(dlist.get(dlist.size() - 1)));
           }
-
+          //refresh this one to update decorations..
+          dependenciesEditor.refresh();
         }
+
       }
-    });
+    }));
 
     ToolBarManager modulesToolBarManager = new ToolBarManager(SWT.FLAT);
 
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/ListEditorComposite.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/ListEditorComposite.java
index 1c709a3..64a21ae 100644
--- a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/ListEditorComposite.java
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/ListEditorComposite.java
@@ -35,8 +35,7 @@
 import org.eclipse.jface.viewers.TableViewerEditor;
 import org.eclipse.jface.viewers.TextCellEditor;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -91,15 +90,14 @@
     column = new TableViewerColumn(viewer, SWT.LEFT);
     //mkleint: TODO this is sort of suboptimal, as the horizontal scrollbar gets never shown and we hide information
     // if the viewable are is not enough. No idea what to replace it with just yet.
-    table.addControlListener(new ControlAdapter() {
-      public void controlResized(ControlEvent e) {
-        column.getColumn().setWidth(table.getClientArea().width);
-      }
-    });
+    table.addControlListener(ControlListener.controlResizedAdapter(e -> {
+      column.getColumn().setWidth(table.getClientArea().width);
+    }));
 
     createButtons(includeSearch);
 
     int vSpan = buttons.size();
+
     GridData viewerData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, vSpan);
     viewerData.widthHint = 100;
     viewerData.heightHint = includeSearch ? 125 : 50;
@@ -107,7 +105,9 @@
     table.setLayoutData(viewerData);
     viewer.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.TRUE);
 
-    viewer.addSelectionChangedListener(event -> viewerSelectionChanged());
+    viewer.addSelectionChangedListener(event ->
+
+    viewerSelectionChanged());
 
     toolkit.paintBordersFor(this);
   }
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/dialogs/MavenModuleSelectionDialog.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/dialogs/MavenModuleSelectionDialog.java
index 5bb53c9..fdcc52c 100644
--- a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/dialogs/MavenModuleSelectionDialog.java
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/dialogs/MavenModuleSelectionDialog.java
@@ -9,8 +9,7 @@
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Button;
@@ -42,29 +41,22 @@
 
     final TreeViewer viewer = getViewer();
     viewer.setLabelProvider(new ProjectLabelProvider());
-    viewer.getTree().addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        if(e.detail == SWT.CHECK) {
-          TreeItem item = (TreeItem) e.item;
-          Object data = item.getData();
-          if(item.getChecked() && data instanceof IResource && knownModules.contains(((IResource) data).getLocation())) {
-            item.setChecked(false);
-          }
+    viewer.getTree().addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      if(e.detail == SWT.CHECK) {
+        TreeItem item = (TreeItem) e.item;
+        Object data = item.getData();
+        if(item.getChecked() && data instanceof IResource && knownModules.contains(((IResource) data).getLocation())) {
+          item.setChecked(false);
         }
       }
-    });
+    }));
     viewer.getTree().setFocus();
 
     final Button checkbox = new Button((Composite) control, SWT.CHECK);
     checkbox.setSelection(false);
     checkbox.setText(Messages.OverviewPage_updateModulePoms);
-    checkbox.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        pomUpdateRequired = checkbox.getSelection();
-      }
-    });
+    checkbox.addSelectionListener(
+        SelectionListener.widgetSelectedAdapter(e -> pomUpdateRequired = checkbox.getSelection()));
 
     return control;
   }
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/DependenciesPage.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/DependenciesPage.java
index f4c8158..b3d5ecb 100644
--- a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/DependenciesPage.java
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/DependenciesPage.java
@@ -17,8 +17,7 @@
 import org.eclipse.jface.action.IToolBarManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Link;
@@ -73,11 +72,8 @@
     Link link = new Link(managedForm.getForm().getBody(), SWT.NONE);
     toolkit.adapt(link, true, true);
     link.setText(Messages.DependenciesPage_exclusions_link);
-    link.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        pomEditor.setActivePage(IMavenConstants.PLUGIN_ID + ".pom.dependencyTree"); //$NON-NLS-1$
-      }
-    });
+    link.addSelectionListener(SelectionListener
+        .widgetSelectedAdapter(e -> pomEditor.setActivePage(IMavenConstants.PLUGIN_ID + ".pom.dependencyTree")));
 
     searchControl = new SearchControl(Messages.DependenciesPage_find, managedForm);
 
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditorPage.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditorPage.java
index 2d63e3c..11415ac 100644
--- a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditorPage.java
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/MavenPomEditorPage.java
@@ -58,8 +58,7 @@
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.MouseEvent;
 import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
@@ -432,11 +431,8 @@
     decoration.setImage(fieldDecoration.getImage());
     decoration.setShowHover(true);
     decoration.hide(); //hide and wait for the value to be set.
-    decoration.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        decoration.showHoverText(decoration.getDescriptionText());
-      }
-    });
+    decoration.addSelectionListener(
+        SelectionListener.widgetSelectedAdapter(e -> decoration.showHoverText(decoration.getDescriptionText())));
     ModifyListener listener = e -> {
       String text = control instanceof Text ? ((Text) control).getText() : ((CCombo) control).getText();
       if(text.indexOf("${") != -1 && text.indexOf("}") != -1) {
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/OverviewPage.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/OverviewPage.java
index a721a7c..9b39c11 100644
--- a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/OverviewPage.java
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/OverviewPage.java
@@ -83,8 +83,7 @@
 import org.eclipse.swt.dnd.DropTargetEvent;
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -608,82 +607,75 @@
       }.schedule();
     });
 
-    modulesEditor.setAddButtonListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        final Set<Object> moduleContainers = new HashSet<Object>();
-        final List<String> modules = new ArrayList<String>();
-        try {
-          performOnDOMDocument(new OperationTuple(getPomEditor().getDocument(), document -> {
-            Element modsEl = findChild(document.getDocumentElement(), MODULES);
-            for(Element el : findChilds(modsEl, MODULE)) {
-              String m = getTextValue(el);
-              if(m != null) {
-                modules.add(m);
+    modulesEditor.setAddButtonListener(SelectionListener.widgetSelectedAdapter(e -> {
+      final Set<Object> moduleContainers = new HashSet<Object>();
+      final List<String> modules = new ArrayList<String>();
+      try {
+        performOnDOMDocument(new OperationTuple(getPomEditor().getDocument(), document -> {
+          Element modsEl = findChild(document.getDocumentElement(), MODULES);
+          for(Element el : findChilds(modsEl, MODULE)) {
+            String m = getTextValue(el);
+            if(m != null) {
+              modules.add(m);
+            }
+          }
+        }, true));
+      } catch(Exception e1) {
+        LOG.error("Cannot load modules", e1);
+      }
+
+      for(String module : modules) {
+        IMavenProjectFacade facade = findModuleProject(module);
+        if(facade != null) {
+          moduleContainers.add(facade.getProject().getLocation());
+        }
+        IFile file = findModuleFile(module);
+        if(file != null) {
+          moduleContainers.add(file.getParent().getLocation());
+        }
+      }
+      moduleContainers.add(getProject().getLocation());
+
+      MavenModuleSelectionDialog dialog = new MavenModuleSelectionDialog(getSite().getShell(), moduleContainers);
+
+      if(dialog.open() == Window.OK) {
+        addSelectedModules(dialog.getResult(), dialog.isPomUpdateRequired());
+      }
+    }));
+
+    modulesEditor.setCreateButtonListener(SelectionListener.widgetSelectedAdapter(e -> {
+      IEditorInput editorInput = OverviewPage.this.pomEditor.getEditorInput();
+      if(editorInput instanceof FileEditorInput) {
+        MavenModuleWizard wizard = new MavenModuleWizard(true);
+        wizard.init(PlatformUI.getWorkbench(), new StructuredSelection(((FileEditorInput) editorInput).getFile()));
+        WizardDialog dialog = new WizardDialog(Display.getCurrent().getActiveShell(), wizard);
+        int res = dialog.open();
+        if(res == Window.OK) {
+          createNewModule(wizard.getModuleName());
+        }
+      }
+    }));
+
+    modulesEditor.setRemoveButtonListener(SelectionListener.widgetSelectedAdapter(e -> {
+      try {
+        performEditOperation(document -> {
+          Element root = document.getDocumentElement();
+          Element modules = findChild(root, MODULES);
+          if(modules != null) {
+            for(String module : modulesEditor.getSelection()) {
+              Element modEl = findChild(modules, MODULE, textEquals(module));
+              if(modEl != null) {
+                modules.removeChild(modEl);
               }
             }
-          }, true));
-        } catch(Exception e1) {
-          LOG.error("Cannot load modules", e1);
-        }
-
-        for(String module : modules) {
-          IMavenProjectFacade facade = findModuleProject(module);
-          if(facade != null) {
-            moduleContainers.add(facade.getProject().getLocation());
+            //now remove the <modules> element itself when there are no more elements left
+            removeIfNoChildElement(modules);
           }
-          IFile file = findModuleFile(module);
-          if(file != null) {
-            moduleContainers.add(file.getParent().getLocation());
-          }
-        }
-        moduleContainers.add(getProject().getLocation());
-
-        MavenModuleSelectionDialog dialog = new MavenModuleSelectionDialog(getSite().getShell(), moduleContainers);
-
-        if(dialog.open() == Window.OK) {
-          addSelectedModules(dialog.getResult(), dialog.isPomUpdateRequired());
-        }
+        }, LOG, "error removing module entry");
+      } finally {
+        loadThis(RELOAD_MODULES);
       }
-    });
-
-    modulesEditor.setCreateButtonListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        IEditorInput editorInput = OverviewPage.this.pomEditor.getEditorInput();
-        if(editorInput instanceof FileEditorInput) {
-          MavenModuleWizard wizard = new MavenModuleWizard(true);
-          wizard.init(PlatformUI.getWorkbench(), new StructuredSelection(((FileEditorInput) editorInput).getFile()));
-          WizardDialog dialog = new WizardDialog(Display.getCurrent().getActiveShell(), wizard);
-          int res = dialog.open();
-          if(res == Window.OK) {
-            createNewModule(wizard.getModuleName());
-          }
-        }
-      }
-    });
-
-    modulesEditor.setRemoveButtonListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        try {
-          performEditOperation(document -> {
-            Element root = document.getDocumentElement();
-            Element modules = findChild(root, MODULES);
-            if(modules != null) {
-              for(String module : modulesEditor.getSelection()) {
-                Element modEl = findChild(modules, MODULE, textEquals(module));
-                if(modEl != null) {
-                  modules.removeChild(modEl);
-                }
-              }
-              //now remove the <modules> element itself when there are no more elements left
-              removeIfNoChildElement(modules);
-            }
-          }, LOG, "error removing module entry");
-        } finally {
-          loadThis(RELOAD_MODULES);
-        }
-      }
-    });
+    }));
 
     modulesEditor.setCellModifier(new ICellModifier() {
       public boolean canModify(Object element, String property) {
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/PropertiesSection.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/PropertiesSection.java
index 12dc3b2..f8fd06d 100644
--- a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/PropertiesSection.java
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/PropertiesSection.java
@@ -37,8 +37,7 @@
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.events.VerifyListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
@@ -131,16 +130,9 @@
     propertiesEditor.setContentProvider(new ListEditorContentProvider<PropertyElement>());
     propertiesEditor.setLabelProvider(new PropertyPairLabelProvider());
 
-    propertiesEditor.setCreateButtonListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        createNewProperty();
-      }
-    });
-    propertiesEditor.setRemoveButtonListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        deleteProperties(propertiesEditor.getSelection());
-      }
-    });
+    propertiesEditor.setCreateButtonListener(SelectionListener.widgetSelectedAdapter(e -> createNewProperty()));
+    propertiesEditor.setRemoveButtonListener(
+        SelectionListener.widgetSelectedAdapter(e -> deleteProperties(propertiesEditor.getSelection())));
     propertiesEditor.setDoubleClickListener(event -> editProperty(propertiesEditor.getSelection()));
 
     toolkit.paintBordersFor(propertiesEditor);
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/SearchControl.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/SearchControl.java
index a235fe8..73fdb7d 100644
--- a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/SearchControl.java
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/pom/SearchControl.java
@@ -15,8 +15,7 @@
 
 import org.eclipse.jface.action.ControlContribution;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
@@ -90,11 +89,7 @@
     clearToolItem.setEnabled(false);
     clearToolItem.setImage(MavenEditorImages.IMG_CLEAR);
     clearToolItem.setDisabledImage(MavenEditorImages.IMG_CLEAR_DISABLED);
-    clearToolItem.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        searchText.setText(""); //$NON-NLS-1$
-      }
-    });
+    clearToolItem.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> searchText.setText("")));
 
     searchText.addModifyListener(e -> clearToolItem.setEnabled(searchText.getText().length() > 0));
 
diff --git a/org.eclipse.m2e.jdt.ui/src/org/eclipse/m2e/jdt/ui/internal/MavenClasspathContainerPage.java b/org.eclipse.m2e.jdt.ui/src/org/eclipse/m2e/jdt/ui/internal/MavenClasspathContainerPage.java
index 62c5888..1f95818 100644
--- a/org.eclipse.m2e.jdt.ui/src/org/eclipse/m2e/jdt/ui/internal/MavenClasspathContainerPage.java
+++ b/org.eclipse.m2e.jdt.ui/src/org/eclipse/m2e/jdt/ui/internal/MavenClasspathContainerPage.java
@@ -19,8 +19,7 @@
 import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
@@ -28,7 +27,6 @@
 import org.eclipse.ui.dialogs.PreferencesUtil;
 
 import org.eclipse.m2e.core.internal.IMavenConstants;
-import org.eclipse.m2e.jdt.ui.internal.Messages;
 
 
 /**
@@ -36,8 +34,8 @@
  * 
  * @author Eugene Kuleshov
  */
-public class MavenClasspathContainerPage extends WizardPage implements IClasspathContainerPage,
-    IClasspathContainerPageExtension {
+public class MavenClasspathContainerPage extends WizardPage
+    implements IClasspathContainerPage, IClasspathContainerPageExtension {
 
   IJavaProject javaProject;
 
@@ -75,15 +73,13 @@
     Link link = new Link(composite, SWT.NONE);
     link.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
     link.setText(Messages.MavenClasspathContainerPage_link);
-    link.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        // IWorkbenchPreferenceContainer container= (IWorkbenchPreferenceContainer) getContainer();
-        // container.openPage(MavenProjectPreferencePage.ID, javaProject.getProject());
+    link.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      // IWorkbenchPreferenceContainer container= (IWorkbenchPreferenceContainer) getContainer();
+      // container.openPage(MavenProjectPreferencePage.ID, javaProject.getProject());
 
-        PreferencesUtil.createPropertyDialogOn(getShell(), javaProject.getProject(), //
-            IMavenConstants.PREFERENCE_PAGE_ID, new String[] {IMavenConstants.PREFERENCE_PAGE_ID}, null).open();
-      }
-    });
+      PreferencesUtil.createPropertyDialogOn(getShell(), javaProject.getProject(), //
+          IMavenConstants.PREFERENCE_PAGE_ID, new String[] {IMavenConstants.PREFERENCE_PAGE_ID}, null).open();
+    }));
   }
 
   public boolean finish() {
diff --git a/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenLaunchMainTab.java b/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenLaunchMainTab.java
index 1a9ce5c..cf56c89 100644
--- a/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenLaunchMainTab.java
+++ b/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenLaunchMainTab.java
@@ -349,11 +349,7 @@
     final Button addPropButton = new Button(mainComposite, SWT.NONE);
     addPropButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     addPropButton.setText(Messages.launchPropAddButton); //$NON-NLS-1$
-    addPropButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        addProperty();
-      }
-    });
+    addPropButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> addProperty()));
     editPropButton = new Button(mainComposite, SWT.NONE);
     editPropButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     editPropButton.setText(Messages.launchPropEditButton); //$NON-NLS-1$
@@ -371,14 +367,12 @@
     removePropButton = new Button(mainComposite, SWT.NONE);
     removePropButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
     removePropButton.setText(Messages.launchPropRemoveButton); //$NON-NLS-1$
-    removePropButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        if(propsTable.getSelectionCount() > 0) {
-          propsTable.remove(propsTable.getSelectionIndices());
-          entriesChanged();
-        }
+    removePropButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      if(propsTable.getSelectionCount() > 0) {
+        propsTable.remove(propsTable.getSelectionIndices());
+        entriesChanged();
       }
-    });
+    }));
     removePropButton.setEnabled(false);
 
     Label mavenRuntimeLabel = new Label(mainComposite, SWT.NONE);
@@ -432,17 +426,15 @@
         variablesButton.setFont(comp.getFont());
         variablesButton.setText(Messages.launchPropertyDialogBrowseVariables); //$NON-NLS-1$;
 
-        variablesButton.addSelectionListener(new SelectionAdapter() {
-          public void widgetSelected(SelectionEvent se) {
-            StringVariableSelectionDialog variablesDialog = new StringVariableSelectionDialog(getShell());
-            if(variablesDialog.open() == IDialogConstants.OK_ID) {
-              String variable = variablesDialog.getVariableExpression();
-              if(variable != null) {
-                valueText.insert(variable.trim());
-              }
+        variablesButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+          StringVariableSelectionDialog variablesDialog = new StringVariableSelectionDialog(getShell());
+          if(variablesDialog.open() == IDialogConstants.OK_ID) {
+            String variable = variablesDialog.getVariableExpression();
+            if(variable != null) {
+              valueText.insert(variable.trim());
             }
           }
-        });
+        }));
 
         return comp;
       }
diff --git a/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenRuntimeSelector.java b/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenRuntimeSelector.java
index 13d664d..4573533 100644
--- a/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenRuntimeSelector.java
+++ b/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenRuntimeSelector.java
@@ -29,8 +29,7 @@
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -131,15 +130,13 @@
     configureRuntimesButton = new Button(this, SWT.NONE);
     configureRuntimesButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
     configureRuntimesButton.setText(org.eclipse.m2e.internal.launch.Messages.MavenLaunchMainTab_btnConfigure);
-    configureRuntimesButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(mainComposite.getShell(),
-            "org.eclipse.m2e.core.preferences.MavenInstallationsPreferencePage", null, null); //$NON-NLS-1$
-        if(dialog.open() == Window.OK) {
-          setInput();
-        }
+    configureRuntimesButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(mainComposite.getShell(),
+          "org.eclipse.m2e.core.preferences.MavenInstallationsPreferencePage", null, null); //$NON-NLS-1$
+      if(dialog.open() == Window.OK) {
+        setInput();
       }
-    });
+    }));
   }
 
   protected String getType(AbstractMavenRuntime runtime) {
diff --git a/org.eclipse.m2e.refactoring/src/org/eclipse/m2e/refactoring/rename/MavenRenameWizardPage.java b/org.eclipse.m2e.refactoring/src/org/eclipse/m2e/refactoring/rename/MavenRenameWizardPage.java
index 5f9f6ad..3a91aad 100644
--- a/org.eclipse.m2e.refactoring/src/org/eclipse/m2e/refactoring/rename/MavenRenameWizardPage.java
+++ b/org.eclipse.m2e.refactoring/src/org/eclipse/m2e/refactoring/rename/MavenRenameWizardPage.java
@@ -17,8 +17,7 @@
 import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -135,13 +134,10 @@
     renameCheckbox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
     renameCheckbox.setData("name", "rename"); //$NON-NLS-1$ //$NON-NLS-2$
     renameCheckbox.setEnabled(false);
-    renameCheckbox.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        renamed = renameCheckbox.getSelection();
-        getWizard().getContainer().updateButtons();
-      }
-    });
+    renameCheckbox.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      renamed = renameCheckbox.getSelection();
+      getWizard().getContainer().updateButtons();
+    }));
 
     ModifyListener listener = e -> {
       newGroupId = groupIdText.getText();
diff --git a/org.eclipse.m2e.scm/src/org/eclipse/m2e/scm/internal/wizards/MavenCheckoutLocationPage.java b/org.eclipse.m2e.scm/src/org/eclipse/m2e/scm/internal/wizards/MavenCheckoutLocationPage.java
index 185f5ec..be65eb1 100644
--- a/org.eclipse.m2e.scm/src/org/eclipse/m2e/scm/internal/wizards/MavenCheckoutLocationPage.java
+++ b/org.eclipse.m2e.scm/src/org/eclipse/m2e/scm/internal/wizards/MavenCheckoutLocationPage.java
@@ -27,7 +27,6 @@
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
@@ -95,11 +94,7 @@
     composite.setLayout(gridLayout);
     setControl(composite);
 
-    SelectionAdapter selectionAdapter = new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        updatePage();
-      }
-    };
+    SelectionListener selectionAdapter = SelectionListener.widgetSelectedAdapter(e -> updatePage());
 
     if(scmUrls == null || scmUrls.length < 2) {
       Label urlLabel = new Label(composite, SWT.NONE);
@@ -174,24 +169,22 @@
     gd_revisionBrowseButton.verticalIndent = 3;
     revisionBrowseButton.setLayoutData(gd_revisionBrowseButton);
     revisionBrowseButton.setText(Messages.MavenCheckoutLocationPage_btnRevSelect);
-    revisionBrowseButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        String url = scmParentUrl;
-        if(url == null) {
-          return;
-        }
-
-        String scmType = scmTypeCombo.getText();
-
-        ScmHandlerUi handlerUi = ScmHandlerFactory.getHandlerUiByType(scmType);
-        String revision = handlerUi.selectRevision(getShell(), scmUrls[0], revisionText.getText());
-        if(revision != null) {
-          revisionText.setText(revision);
-          headRevisionButton.setSelection(false);
-          updatePage();
-        }
+    revisionBrowseButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+      String url = scmParentUrl;
+      if(url == null) {
+        return;
       }
-    });
+
+      String scmType = scmTypeCombo.getText();
+
+      ScmHandlerUi handlerUi = ScmHandlerFactory.getHandlerUiByType(scmType);
+      String revision = handlerUi.selectRevision(getShell(), scmUrls[0], revisionText.getText());
+      if(revision != null) {
+        revisionText.setText(revision);
+        headRevisionButton.setSelection(false);
+        updatePage();
+      }
+    }));
 
     checkoutAllProjectsButton = new Button(composite, SWT.CHECK);
     GridData checkoutAllProjectsData = new GridData(SWT.LEFT, SWT.TOP, true, false, 5, 1);
@@ -199,11 +192,7 @@
     checkoutAllProjectsButton.setLayoutData(checkoutAllProjectsData);
     checkoutAllProjectsButton.setText(Messages.MavenCheckoutLocationPage_btnCheckout);
     checkoutAllProjectsButton.setSelection(true);
-    checkoutAllProjectsButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        updatePage();
-      }
-    });
+    checkoutAllProjectsButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> updatePage()));
 
     GridData advancedSettingsData = new GridData(SWT.FILL, SWT.TOP, true, false, 5, 1);
     advancedSettingsData.verticalIndent = 10;
@@ -215,23 +204,21 @@
     }
 
     if(scmUrls == null || scmUrls.length < 2) {
-      scmUrlBrowseButton.addSelectionListener(new SelectionAdapter() {
-        public void widgetSelected(SelectionEvent e) {
-          ScmHandlerUi handlerUi = ScmHandlerFactory.getHandlerUiByType(scmType);
-          // XXX should use null if there is no scmUrl selected
-          ScmUrl currentUrl = scmUrls == null || scmUrls.length == 0 ? new ScmUrl("scm:" + scmType + ":") : scmUrls[0]; //$NON-NLS-1$ //$NON-NLS-2$
-          ScmUrl scmUrl = handlerUi.selectUrl(getShell(), currentUrl);
-          if(scmUrl != null) {
-            scmUrlCombo.setText(scmUrl.getProviderUrl());
-            if(scmUrls == null) {
-              scmUrls = new ScmUrl[1];
-            }
-            scmUrls[0] = scmUrl;
-            scmParentUrl = scmUrl.getUrl();
-            updatePage();
+      scmUrlBrowseButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+        ScmHandlerUi handlerUi = ScmHandlerFactory.getHandlerUiByType(scmType);
+        // XXX should use null if there is no scmUrl selected
+        ScmUrl currentUrl = scmUrls == null || scmUrls.length == 0 ? new ScmUrl("scm:" + scmType + ":") : scmUrls[0]; //$NON-NLS-1$ //$NON-NLS-2$
+        ScmUrl scmUrl = handlerUi.selectUrl(getShell(), currentUrl);
+        if(scmUrl != null) {
+          scmUrlCombo.setText(scmUrl.getProviderUrl());
+          if(scmUrls == null) {
+            scmUrls = new ScmUrl[1];
           }
+          scmUrls[0] = scmUrl;
+          scmParentUrl = scmUrl.getUrl();
+          updatePage();
         }
-      });
+      }));
 
       scmUrlCombo.addModifyListener(e -> {
         final String url = scmUrlCombo.getText().trim();
diff --git a/org.eclipse.m2e.sourcelookup.ui/src/org/eclipse/m2e/sourcelookup/ui/internal/SourceLookupInfoDialog.java b/org.eclipse.m2e.sourcelookup.ui/src/org/eclipse/m2e/sourcelookup/ui/internal/SourceLookupInfoDialog.java
index b8e1809..1cfda63 100644
--- a/org.eclipse.m2e.sourcelookup.ui/src/org/eclipse/m2e/sourcelookup/ui/internal/SourceLookupInfoDialog.java
+++ b/org.eclipse.m2e.sourcelookup.ui/src/org/eclipse/m2e/sourcelookup/ui/internal/SourceLookupInfoDialog.java
@@ -33,8 +33,7 @@
 import org.eclipse.swt.dnd.Clipboard;
 import org.eclipse.swt.dnd.TextTransfer;
 import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -120,26 +119,19 @@
     actionsComposite.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
 
     Button btnCopy = new Button(actionsComposite, SWT.NONE);
-    btnCopy.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        copyToClipboard();
-      }
-    });
+    btnCopy.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> copyToClipboard()
+    ));
     btnCopy.setToolTipText("Copy to clipboard");
     btnCopy.setText("Copy");
 
     Button btnRefresh = new Button(actionsComposite, SWT.NONE);
-    btnRefresh.addSelectionListener(new SelectionAdapter() {
-      @Override
-      public void widgetSelected(SelectionEvent e) {
-        try {
-          sourceLookup.getSourceContainer(debugElement, true, monitor);
-        } catch (CoreException e1) {
-          showError(e1);
-        }
-      }
-    });
+  	btnRefresh.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+  		try {
+  			sourceLookup.getSourceContainer(debugElement, true, monitor);
+  		} catch (CoreException e1) {
+  			showError(e1);
+  		}
+  	}));
     btnRefresh.setToolTipText("Force rediscovery of source lookup information for this code location.");
     btnRefresh.setText("Refresh");
 
