diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractPartSelectionTracker.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractPartSelectionTracker.java
deleted file mode 100644
index 70fec67..0000000
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractPartSelectionTracker.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.INullSelectionListener;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Provides per-part selection tracking for the selection service.
- */
-public abstract class AbstractPartSelectionTracker {
-    /**
-     * List of selection listeners for this tracker
-     */
-	private ListenerList<ISelectionListener> fListeners = new ListenerList<>();
-
-    /**
-     * List of post selection listeners for this tracker
-     */
-	private ListenerList<ISelectionListener> postListeners = new ListenerList<>();
-
-    /**
-     * The id of the part this tracls
-     */
-    private String fPartId;
-
-    /**
-     * Constructs a part selection tracker for the part with the given id.
-     *
-     * @param id part identifier
-     */
-    public AbstractPartSelectionTracker(String partId) {
-        setPartId(partId);
-    }
-
-    /**
-     * Adds a selection listener to this tracker
-     *
-     * @param listener the listener to add
-     */
-    public void addSelectionListener(ISelectionListener listener) {
-        fListeners.add(listener);
-    }
-
-    /**
-     * Adds a post selection listener to this tracker
-     *
-     * @param listener the listener to add
-     */
-    public void addPostSelectionListener(ISelectionListener listener) {
-        postListeners.add(listener);
-    }
-
-    /**
-     * Returns the selection from the part being tracked,
-     * or <code>null</code> if the part is closed or has no selection.
-     */
-    public abstract ISelection getSelection();
-
-    /**
-     * Removes a selection listener from this tracker.
-     *
-     * @param listener the listener to remove
-     */
-    public void removeSelectionListener(ISelectionListener listener) {
-        fListeners.remove(listener);
-    }
-
-    /**
-     * Removes a post selection listener from this tracker.
-     *
-     * @param listener the listener to remove
-     */
-    public void removePostSelectionListener(ISelectionListener listener) {
-        postListeners.remove(listener);
-    }
-
-    /**
-     * Disposes this selection tracker.  This removes all listeners currently registered.
-     */
-    public void dispose() {
-        synchronized (fListeners) {
-			for (Object listener : fListeners.getListeners()) {
-                fListeners.remove(listener);
-                postListeners.remove(listener);
-            }
-        }
-    }
-
-    /**
-     * Fires a selection event to the listeners.
-     *
-     * @param part the part or <code>null</code> if no active part
-     * @param sel the selection or <code>null</code> if no active selection
-     * @param listeners the list of listeners to notify
-     */
-    protected void fireSelection(final IWorkbenchPart part, final ISelection sel) {
-		for (final ISelectionListener l : fListeners) {
-            if ((part != null && sel != null)
-                    || l instanceof INullSelectionListener) {
-                SafeRunner.run(new SafeRunnable() {
-                    @Override
-					public void run() {
-                        l.selectionChanged(part, sel);
-                    }
-                });
-            }
-        }
-    }
-
-    /**
-     * Fires a post selection event to the listeners.
-     *
-     * @param part the part or <code>null</code> if no active part
-     * @param sel the selection or <code>null</code> if no active selection
-     * @param listeners the list of listeners to notify
-     */
-    protected void firePostSelection(final IWorkbenchPart part,
-            final ISelection sel) {
-		for (final ISelectionListener l : postListeners) {
-            if ((part != null && sel != null)
-                    || l instanceof INullSelectionListener) {
-                SafeRunner.run(new SafeRunnable() {
-                    @Override
-					public void run() {
-                        l.selectionChanged(part, sel);
-                    }
-                });
-            }
-        }
-    }
-
-    /**
-     * Sets the id of the part that this tracks.
-     *
-     * @param id view identifier
-     */
-    private void setPartId(String partId) {
-        fPartId = partId;
-    }
-
-    /**
-     * Returns the id of the part that this tracks.
-     *
-     * @return part identifier
-     */
-    protected String getPartId() {
-        return fPartId;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractSelectionService.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractSelectionService.java
deleted file mode 100644
index 26dab98..0000000
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/AbstractSelectionService.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal;
-
-import java.util.Hashtable;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.ui.INullSelectionListener;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.ISelectionService;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Abstract selection service.
- */
-public abstract class AbstractSelectionService implements ISelectionService {
-
-    /**
-     * The list of selection listeners (not per-part).
-     */
-	private ListenerList<ISelectionListener> listeners = new ListenerList<>();
-
-    /**
-     * The list of post selection listeners (not per-part).
-     */
-	private ListenerList<ISelectionListener> postListeners = new ListenerList<>();
-
-    /**
-     * The currently active part.
-     */
-    private IWorkbenchPart activePart;
-
-    /**
-     * The active part's selection provider, remembered in case the part
-     * replaces its selection provider after we hooked a listener.
-     */
-    private ISelectionProvider activeProvider;
-
-    /**
-     * Map from part id (String) to per-part tracker (AbstractPartSelectionTracker).
-     */
-    private Hashtable perPartTrackers;
-
-    /**
-     * The JFace selection listener to hook on the active part's selection provider.
-     */
-    private ISelectionChangedListener selListener = event -> fireSelection(activePart, event.getSelection());
-
-    /**
-     * The JFace post selection listener to hook on the active part's selection provider.
-     */
-    private ISelectionChangedListener postSelListener = event -> firePostSelection(activePart, event.getSelection());
-
-    /**
-     * Creates a new SelectionService.
-     */
-    protected AbstractSelectionService() {
-    }
-
-    @Override
-	public void addSelectionListener(ISelectionListener l) {
-        listeners.add(l);
-    }
-
-    @Override
-	public void addSelectionListener(String partId, ISelectionListener listener) {
-        getPerPartTracker(partId).addSelectionListener(listener);
-    }
-
-    @Override
-	public void addPostSelectionListener(ISelectionListener l) {
-        postListeners.add(l);
-    }
-
-    @Override
-	public void addPostSelectionListener(String partId,
-            ISelectionListener listener) {
-        getPerPartTracker(partId).addPostSelectionListener(listener);
-    }
-
-    @Override
-	public void removeSelectionListener(ISelectionListener l) {
-        listeners.remove(l);
-    }
-
-    @Override
-	public void removePostSelectionListener(String partId,
-            ISelectionListener listener) {
-        getPerPartTracker(partId).removePostSelectionListener(listener);
-    }
-
-    @Override
-	public void removePostSelectionListener(ISelectionListener l) {
-        postListeners.remove(l);
-    }
-
-    @Override
-	public void removeSelectionListener(String partId,
-            ISelectionListener listener) {
-        getPerPartTracker(partId).removeSelectionListener(listener);
-    }
-
-    /**
-     * Fires a selection event to the given listeners.
-     *
-     * @param part the part or <code>null</code> if no active part
-     * @param sel the selection or <code>null</code> if no active selection
-     */
-    protected void fireSelection(final IWorkbenchPart part, final ISelection sel) {
-		for (final ISelectionListener l : listeners) {
-			if ((part != null && sel != null) || l instanceof INullSelectionListener) {
-                try {
-                    l.selectionChanged(part, sel);
-                } catch (Exception e) {
-                    WorkbenchPlugin.log(e);
-                }
-            }
-        }
-    }
-
-    /**
-     * Fires a selection event to the given listeners.
-     *
-     * @param part the part or <code>null</code> if no active part
-     * @param sel the selection or <code>null</code> if no active selection
-     */
-    protected void firePostSelection(final IWorkbenchPart part,
-            final ISelection sel) {
-		for (final ISelectionListener l : postListeners) {
-			if ((part != null && sel != null) || l instanceof INullSelectionListener) {
-                try {
-                    l.selectionChanged(part, sel);
-                } catch (Exception e) {
-                    WorkbenchPlugin.log(e);
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the per-part selection tracker for the given part id.
-     *
-     * @param partId part identifier
-     * @return per-part selection tracker
-     */
-    protected AbstractPartSelectionTracker getPerPartTracker(String partId) {
-        if (perPartTrackers == null) {
-            perPartTrackers = new Hashtable(4);
-        }
-        AbstractPartSelectionTracker tracker = (AbstractPartSelectionTracker) perPartTrackers
-                .get(partId);
-        if (tracker == null) {
-            tracker = createPartTracker(partId);
-            perPartTrackers.put(partId, tracker);
-        }
-        return tracker;
-    }
-
-    /**
-     * Creates a new per-part selection tracker for the given part id.
-     *
-     * @param partId part identifier
-     * @return per-part selection tracker
-     */
-    protected abstract AbstractPartSelectionTracker createPartTracker(
-            String partId);
-
-    /**
-     * Returns the selection.
-     */
-    @Override
-	public ISelection getSelection() {
-        if (activeProvider != null) {
-			return activeProvider.getSelection();
-		}
-		return null;
-    }
-
-    @Override
-	public ISelection getSelection(String partId) {
-        return getPerPartTracker(partId).getSelection();
-    }
-
-    /**
-     * Sets the current-active part (or null if none)
-     *
-     * @since 3.1
-     *
-     * @param newPart the new active part (or null if none)
-     */
-    public void setActivePart(IWorkbenchPart newPart) {
-        // Optimize.
-        if (newPart == activePart) {
-			return;
-		}
-
-        ISelectionProvider selectionProvider = null;
-
-        if (newPart != null) {
-            selectionProvider = newPart.getSite().getSelectionProvider();
-
-            if (selectionProvider == null) {
-                newPart = null;
-            }
-        }
-
-        if (newPart == activePart) {
-			return;
-		}
-
-        if (activePart != null) {
-            if (activeProvider != null) {
-                activeProvider.removeSelectionChangedListener(selListener);
-                if (activeProvider instanceof IPostSelectionProvider) {
-					((IPostSelectionProvider) activeProvider)
-                            .removePostSelectionChangedListener(postSelListener);
-				} else {
-					activeProvider
-                            .removeSelectionChangedListener(postSelListener);
-				}
-                activeProvider = null;
-            }
-            activePart = null;
-        }
-
-        activePart = newPart;
-
-        if (newPart != null) {
-            activeProvider = selectionProvider;
-            // Fire an event if there's an active provider
-            activeProvider.addSelectionChangedListener(selListener);
-            ISelection sel = activeProvider.getSelection();
-            fireSelection(newPart, sel);
-            if (activeProvider instanceof IPostSelectionProvider) {
-				((IPostSelectionProvider) activeProvider)
-                        .addPostSelectionChangedListener(postSelListener);
-			} else {
-				activeProvider.addSelectionChangedListener(postSelListener);
-			}
-            firePostSelection(newPart, sel);
-        } else {
-            fireSelection(null, null);
-            firePostSelection(null, null);
-        }
-    }
-
-//    /**
-//     * Notifies the listener that a part has been activated.
-//     */
-//    public void partActivated(IWorkbenchPart newPart) {
-//        // Optimize.
-//        if (newPart == activePart)
-//            return;
-//
-//        // Unhook selection from the old part.
-//        reset();
-//
-//        // Update active part.
-//        activePart = newPart;
-//
-//        // Hook selection on the new part.
-//        if (activePart != null) {
-//            activeProvider = activePart.getSite().getSelectionProvider();
-//            if (activeProvider != null) {
-//                // Fire an event if there's an active provider
-//                activeProvider.addSelectionChangedListener(selListener);
-//                ISelection sel = activeProvider.getSelection();
-//                fireSelection(newPart, sel);
-//                if (activeProvider instanceof IPostSelectionProvider)
-//                    ((IPostSelectionProvider) activeProvider)
-//                            .addPostSelectionChangedListener(postSelListener);
-//                else
-//                    activeProvider.addSelectionChangedListener(postSelListener);
-//                firePostSelection(newPart, sel);
-//            } else {
-//                //Reset active part. activeProvider may not be null next time this method is called.
-//                activePart = null;
-//            }
-//        }
-//        // No need to fire an event if no active provider, since this was done in reset()
-//    }
-//
-//    /**
-//     * Notifies the listener that a part has been brought to the front.
-//     */
-//    public void partBroughtToTop(IWorkbenchPart newPart) {
-//        // do nothing, the active part has not changed,
-//        // so the selection is unaffected
-//    }
-//
-//    /**
-//     * Notifies the listener that a part has been closed
-//     */
-//    public void partClosed(IWorkbenchPart part) {
-//        // Unhook selection from the part.
-//        if (part == activePart) {
-//            reset();
-//        }
-//    }
-//
-//    /**
-//     * Notifies the listener that a part has been deactivated.
-//     */
-//    public void partDeactivated(IWorkbenchPart part) {
-//        // Unhook selection from the part.
-//        if (part == activePart) {
-//            reset();
-//        }
-//    }
-//
-//    /**
-//     * Notifies the listener that a part has been opened.
-//     */
-//    public void partOpened(IWorkbenchPart part) {
-//        // Wait for activation.
-//    }
-//
-//    /**
-//     * Notifies the listener that a part has been opened.
-//     */
-//    public void partInputChanged(IWorkbenchPart part) {
-//        // 36501 - only process if part is active
-//        if (activePart == part) {
-//            reset();
-//            partActivated(part);
-//        }
-//    }
-//
-//    /**
-//     * Resets the service.  The active part and selection provider are
-//     * dereferenced.
-//     */
-//    public void reset() {
-//        if (activePart != null) {
-//            fireSelection(null, null);
-//            firePostSelection(null, null);
-//            if (activeProvider != null) {
-//                activeProvider.removeSelectionChangedListener(selListener);
-//                if (activeProvider instanceof IPostSelectionProvider)
-//                    ((IPostSelectionProvider) activeProvider)
-//                            .removePostSelectionChangedListener(postSelListener);
-//                else
-//                    activeProvider
-//                            .removeSelectionChangedListener(postSelListener);
-//                activeProvider = null;
-//            }
-//            activePart = null;
-//        }
-//    }
-
-}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PagePartSelectionTracker.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PagePartSelectionTracker.java
index 15c9fec..bb29902 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PagePartSelectionTracker.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PagePartSelectionTracker.java
@@ -13,19 +13,8 @@
  *******************************************************************************/
 package org.eclipse.ui.internal;
 
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveListener2;
 import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
 
 /**
  * Provides debug view selection management/notification for
@@ -34,95 +23,7 @@
  * and still provides selection notification/information even
  * when the debug view is not the active part.
  */
-public class PagePartSelectionTracker extends AbstractPartSelectionTracker
-        implements IPartListener, IPerspectiveListener2, ISelectionChangedListener {
-
-    /**
-     * The workbench page for which this is tracking selection.
-     */
-    private IWorkbenchPage fPage;
-
-    /**
-     * The part in this tracker's page, or <code>null</code> if one is not open.
-     */
-    private IWorkbenchPart fPart;
-
-    private ISelectionChangedListener selectionListener = event -> fireSelection(getPart(), event.getSelection());
-
-    private ISelectionChangedListener postSelectionListener = event -> firePostSelection(getPart(), event.getSelection());
-
-    public PagePartSelectionTracker(IWorkbenchPage page, String partId) {
-        super(partId);
-        setPage(page);
-        page.addPartListener(this);
-        page.getWorkbenchWindow().addPerspectiveListener(this);
-        String secondaryId = null;
-        int indexOfColon;
-        if ((indexOfColon = partId.indexOf(':')) != -1) {
-        	secondaryId = partId.substring(indexOfColon + 1);
-        	partId = partId.substring(0, indexOfColon);
-        }
-		IViewReference part = page.findViewReference(partId, secondaryId);
-        if (part != null && part.getView(false) != null) {
-            setPart(part.getView(false), false);
-        }
-    }
-
-    /**
-     * Disposes this selection provider - removes all listeners
-     * currently registered.
-     */
-    @Override
-	public void dispose() {
-    	IWorkbenchPage page = getPage();
-    	page.getWorkbenchWindow().removePerspectiveListener(this);
-    	page.removePartListener(this);
-        setPart(null, false);
-        setPage(null);
-        super.dispose();
-    }
-
-    /*
-     * @see IPartListener#partActivated(IWorkbenchPart)
-     */
-    @Override
-	public void partActivated(IWorkbenchPart part) {
-    }
-
-    /*
-     * @see IPartListener#partBroughtToTop(IWorkbenchPart)
-     */
-    @Override
-	public void partBroughtToTop(IWorkbenchPart part) {
-    }
-
-    /**
-     * @see IPartListener#partClosed(IWorkbenchPart)
-     */
-    @Override
-	public void partClosed(IWorkbenchPart part) {
-        if (getPartId(part).equals(getPartId())) {
-            setPart(null, true);
-        }
-    }
-
-    /*
-     * @see IPartListener#partDeactivated(IWorkbenchPart)
-     */
-    @Override
-	public void partDeactivated(IWorkbenchPart part) {
-    }
-
-    /**
-     * @see IPartListener#partOpened(IWorkbenchPart)
-     */
-    @Override
-	public void partOpened(IWorkbenchPart part) {
-        if (getPartId(part).equals(getPartId())) {
-            setPart(part, true);
-        }
-    }
-
+public class PagePartSelectionTracker {
     /**
      * Returns the id for the given part, taking into account
      * multi-view instances which may have a secondary id.
@@ -140,139 +41,4 @@
         }
         return id;
     }
-
-    /**
-     * The selection has changed in the part being tracked.
-     * Forward it to the listeners.
-     *
-     * @see ISelectionChangedListener#selectionChanged
-     */
-    @Override
-	public void selectionChanged(SelectionChangedEvent event) {
-        fireSelection(getPart(), event.getSelection());
-    }
-
-    /**
-     * Sets the page this selection provider works for
-     *
-     * @param page workbench page
-     */
-    private void setPage(IWorkbenchPage page) {
-        fPage = page;
-    }
-
-    /**
-     * Returns the page this selection provider works for
-     *
-     * @return workbench page
-     */
-    protected IWorkbenchPage getPage() {
-        return fPage;
-    }
-
-    /**
-     * Returns the part this is tracking,
-     * or <code>null</code> if it is not open
-     *
-     * @return part., or <code>null</code>
-     */
-    protected IWorkbenchPart getPart() {
-        return fPart;
-    }
-
-    /*
-     * @see AbstractPartSelectionTracker#getSelection()
-     */
-    @Override
-	public ISelection getSelection() {
-        IWorkbenchPart part = getPart();
-        if (part != null) {
-            ISelectionProvider sp = part.getSite().getSelectionProvider();
-            if (sp != null) {
-                return sp.getSelection();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @see AbstractDebugSelectionProvider#getSelectionProvider()
-     */
-    protected ISelectionProvider getSelectionProvider() {
-        IWorkbenchPart part = getPart();
-        if (part != null) {
-            return part.getSite().getSelectionProvider();
-        }
-        return null;
-    }
-
-    /**
-     * Sets the part for this selection tracker.
-     *
-     * @param part the part
-     * @param notify whether to send notification that the selection has changed.
-     */
-    private void setPart(IWorkbenchPart part, boolean notify) {
-        if (fPart != null) {
-            // remove myself as a listener from the existing part
-            ISelectionProvider sp = fPart.getSite().getSelectionProvider();
-            if (sp != null) {
-                sp.removeSelectionChangedListener(selectionListener);
-                if (sp instanceof IPostSelectionProvider) {
-					((IPostSelectionProvider) sp)
-                            .removePostSelectionChangedListener(postSelectionListener);
-				} else {
-					sp.removeSelectionChangedListener(postSelectionListener);
-				}
-            }
-        }
-        fPart = part;
-        ISelection sel = null;
-        if (part != null) {
-            ISelectionProvider sp = part.getSite().getSelectionProvider();
-            if (sp != null) {
-                sp.addSelectionChangedListener(selectionListener);
-                if (sp instanceof IPostSelectionProvider) {
-					((IPostSelectionProvider) sp)
-                            .addPostSelectionChangedListener(postSelectionListener);
-				} else {
-					sp.addSelectionChangedListener(postSelectionListener);
-				}
-                if (notify) {
-                    // get the selection to send below
-                    sel = sp.getSelection();
-                }
-            }
-        }
-        if (notify) {
-            fireSelection(part, sel);
-            firePostSelection(part, sel);
-        }
-    }
-
-	@Override
-	public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
-		// nothing to do
-	}
-
-	@Override
-	public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
-		// nothing to do
-	}
-
-	@Override
-	public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective,
-			IWorkbenchPartReference partRef, String changeId) {
-		if (partRef == null)
-			return;
-		IWorkbenchPart part = partRef.getPart(false);
-		if (part == null)
-			return;
-		if (IWorkbenchPage.CHANGE_VIEW_SHOW.equals(changeId)) {
-			if (getPart() != null) // quick check first, plus avoids double setting
-				return;
-	        if (getPartId(part).equals(getPartId()))
-	            setPart(part, true);
-		}
-	}
 }
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PageSelectionService.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PageSelectionService.java
deleted file mode 100644
index 0a8ddc9..0000000
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PageSelectionService.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2014 IBM Corporation and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal;
-
-import org.eclipse.ui.IWorkbenchPage;
-
-/**
- * The selection service for a page.
- */
-/* package */
-class PageSelectionService extends AbstractSelectionService {
-
-    private IWorkbenchPage page;
-
-    /**
-     * Creates a new selection service for a specific workbench page.
-     */
-    public PageSelectionService(IWorkbenchPage page) {
-        setPage(page);
-    }
-
-    /**
-     * Sets the page.
-     */
-    private void setPage(IWorkbenchPage page) {
-        this.page = page;
-    }
-
-    /**
-     * Returns the page.
-     */
-    protected IWorkbenchPage getPage() {
-        return page;
-    }
-
-    /*
-     * @see AbstractSelectionService#createPartTracker(String)
-     */
-    @Override
-	protected AbstractPartSelectionTracker createPartTracker(String partId) {
-        return new PagePartSelectionTracker(getPage(), partId);
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WindowPartSelectionTracker.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WindowPartSelectionTracker.java
deleted file mode 100644
index 14f21b9..0000000
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WindowPartSelectionTracker.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2015 IBM Corporation and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.INullSelectionListener;
-import org.eclipse.ui.IPageListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * Provides part selection tracking for a part with a specific id
- * in all pages of a specific workbench window. This tracker shields
- * clients from a part opening and closing, and still provides selection
- * notification/information even when the part is not active.
- */
-public class WindowPartSelectionTracker extends AbstractPartSelectionTracker
-        implements IPageListener {
-    /**
-     * The window this selection tracker is working in
-     */
-    private IWorkbenchWindow fWindow;
-
-    /**
-     * Part selection listener.
-     */
-    private final INullSelectionListener selListener = (part, selection) -> fireSelection(part, selection);
-
-    /**
-     * Part post selection listener
-     */
-    private final INullSelectionListener postSelListener = (part, selection) -> firePostSelection(part, selection);
-
-    /**
-     * Constructs a new selection tracker for the given window and part id.
-     *
-     * @param window workbench window
-     * @param partId part identifier
-     */
-    public WindowPartSelectionTracker(IWorkbenchWindow window, String partId) {
-        super(partId);
-        setWindow(window);
-        window.addPageListener(this);
-		for (IWorkbenchPage page : window.getPages()) {
-            pageOpened(page);
-        }
-    }
-
-    /*
-     * @see IPageListener#pageActivated(IWorkbenchPage)
-     */
-    @Override
-	public void pageActivated(IWorkbenchPage page) {
-    }
-
-    /*
-     * @see IPageListener#pageClosed(IWorkbenchPage)
-     */
-    @Override
-	public void pageClosed(IWorkbenchPage page) {
-        page.removeSelectionListener(getPartId(), selListener);
-        page.removePostSelectionListener(getPartId(), postSelListener);
-    }
-
-    /*
-     * @see IPageListener#pageOpened(IWorkbenchPage)
-     */
-    @Override
-	public void pageOpened(IWorkbenchPage page) {
-        page.addSelectionListener(getPartId(), selListener);
-        page.addPostSelectionListener(getPartId(), postSelListener);
-    }
-
-    /**
-     * Sets the window this tracker is working in.
-     *
-     * @param window workbench window
-     */
-    private void setWindow(IWorkbenchWindow window) {
-        fWindow = window;
-    }
-
-    /**
-     * Returns the window this tracker is working in.
-     *
-     * @return workbench window
-     */
-    protected IWorkbenchWindow getWindow() {
-        return fWindow;
-    }
-
-    /**
-     * @see AbstractPartSelectionTracker#dispose()
-     */
-    @Override
-	public void dispose() {
-        super.dispose();
-        fWindow = null;
-    }
-
-    /*
-     * @see AbstractPartSelectionTracker#getSelection()
-     */
-    @Override
-	public ISelection getSelection() {
-        IWorkbenchPage page = getWindow().getActivePage();
-        if (page != null) {
-            return page.getSelection(getPartId());
-        }
-        return null;
-    }
-}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WindowSelectionService.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WindowSelectionService.java
deleted file mode 100644
index 02504d1..0000000
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WindowSelectionService.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2014 IBM Corporation and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal;
-
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * The selection service for a window.
- */
-/* package */
-class WindowSelectionService extends AbstractSelectionService {
-
-    /**
-     * The window.
-     */
-    private IWorkbenchWindow window;
-
-    /**
-     * Creates a new selection service for the given window.
-     */
-    public WindowSelectionService(IWorkbenchWindow window) {
-        setWindow(window);
-    }
-
-    /**
-     * Sets the window.
-     */
-    private void setWindow(IWorkbenchWindow window) {
-        this.window = window;
-    }
-
-    /**
-     * Returns the window.
-     */
-    protected IWorkbenchWindow getWindow() {
-        return window;
-    }
-
-    /*
-     * @see AbstractSelectionService#createPartTracker(String)
-     */
-    @Override
-	protected AbstractPartSelectionTracker createPartTracker(String partId) {
-        return new WindowPartSelectionTracker(getWindow(), partId);
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchSupportFactory.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchSupportFactory.java
index 623bb87..0472b8f 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchSupportFactory.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchSupportFactory.java
@@ -78,10 +78,6 @@
 		}
 
 		if (ISelectionService.class.equals(serviceInterface)) {
-			if (parent instanceof WindowSelectionService && window != null
-					&& window.getActivePage() != null) {
-				return new SlaveSelectionService(window.getActivePage());
-			}
 			return new SlaveSelectionService((ISelectionService) parent);
 		}
 
