diff --git a/org.eclipse.search/.settings/.api_filters b/org.eclipse.search/.settings/.api_filters
index 89f4b44..7b25d24 100644
--- a/org.eclipse.search/.settings/.api_filters
+++ b/org.eclipse.search/.settings/.api_filters
@@ -16,12 +16,4 @@
             </message_arguments>
         </filter>
     </resource>
-    <resource path="search/org/eclipse/search/internal/ui/SearchResultViewer.java" type="org.eclipse.search.internal.ui.SearchResultViewer">
-        <filter id="571473929">
-            <message_arguments>
-                <message_argument value="TableViewer"/>
-                <message_argument value="SearchResultViewer"/>
-            </message_arguments>
-        </filter>
-    </resource>
 </component>
diff --git a/org.eclipse.search/plugin.xml b/org.eclipse.search/plugin.xml
index 786ede2..14a0121 100644
--- a/org.eclipse.search/plugin.xml
+++ b/org.eclipse.search/plugin.xml
@@ -375,14 +375,6 @@
 	     </specification>
 	</extension>
 	
-	<extension point="org.eclipse.core.runtime.adapters">
-		<factory 
-			class="org.eclipse.search.internal.ui.SearchResultViewEntryAdapterFactory" 
-			adaptableType="org.eclipse.search.ui.ISearchResultViewEntry">
-				<adapter type="org.eclipse.core.resources.IResource"/>
-				<adapter type="org.eclipse.core.resources.IMarker"/>
-		</factory>
-	</extension>
  <extension
        point="org.eclipse.core.runtime.preferences">
     <initializer class="org.eclipse.search.internal.ui.SearchPreferenceInitializer"/>
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/GotoMarkerAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/GotoMarkerAction.java
deleted file mode 100644
index 813d561..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/GotoMarkerAction.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 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.search.internal.ui;
-
-import org.eclipse.jface.action.Action;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class GotoMarkerAction extends Action {
-
-	private SearchResultViewer fViewer;
-
-	public GotoMarkerAction(SearchResultViewer viewer) {
-		super(SearchMessages.SearchResultView_gotoMarker_text);
-		SearchPluginImages.setImageDescriptors(this, SearchPluginImages.T_LCL, SearchPluginImages.IMG_LCL_SEARCH_GOTO);
-		setToolTipText(SearchMessages.SearchResultView_gotoMarker_tooltip);
-		fViewer= viewer;
-	}
-
-	@Override
-	public void run() {
-		fViewer.showResult();
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveAllResultsAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveAllResultsAction.java
deleted file mode 100644
index c8144f7..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveAllResultsAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 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.search.internal.ui;
-
-import org.eclipse.jface.action.Action;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class RemoveAllResultsAction extends Action {
-
-	public RemoveAllResultsAction() {
-		super(SearchMessages.SearchResultView_removeAllResults_text);
-		SearchPluginImages.setImageDescriptors(this, SearchPluginImages.T_LCL, SearchPluginImages.IMG_LCL_SEARCH_REM_ALL);
-		setToolTipText(SearchMessages.SearchResultView_removeAllResults_tooltip);
-	}
-
-	@Override
-	public void run() {
-		SearchManager.getDefault().removeAllResults();
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveAllSearchesAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveAllSearchesAction.java
deleted file mode 100644
index f25f1e7..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveAllSearchesAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 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.search.internal.ui;
-
-import org.eclipse.jface.action.Action;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class RemoveAllSearchesAction extends Action {
-
-	public RemoveAllSearchesAction() {
-		super(SearchMessages.SearchResultView_removeAllSearches_text);
-		SearchPluginImages.setImageDescriptors(this, SearchPluginImages.T_LCL, SearchPluginImages.IMG_LCL_SEARCH_REM_ALL);
-		setToolTipText(SearchMessages.SearchResultView_removeAllSearches_tooltip);
-	}
-
-	@Override
-	public void run() {
-		SearchManager.getDefault().removeAllSearches();
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveMatchAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveMatchAction.java
deleted file mode 100644
index e9ffee5..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveMatchAction.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 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.search.internal.ui;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.core.resources.IMarker;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-import org.eclipse.search.internal.ui.util.ExceptionHandler;
-import org.eclipse.search.ui.ISearchResultViewEntry;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class RemoveMatchAction extends Action {
-
-	private ISelectionProvider fSelectionProvider;
-
-	public RemoveMatchAction(ISelectionProvider provider) {
-		super(SearchMessages.SearchResultView_removeMatch_text);
-		setToolTipText(SearchMessages.SearchResultView_removeMatch_tooltip);
-		fSelectionProvider= provider;
-	}
-
-	@Override
-	public void run() {
-		IMarker[] markers= getMarkers(fSelectionProvider.getSelection());
-		if (markers != null)
-			try {
-				SearchPlugin.getWorkspace().deleteMarkers(markers);
-			} catch (CoreException ex) {
-				ExceptionHandler.handle(ex, SearchMessages.Search_Error_deleteMarkers_title, SearchMessages.Search_Error_deleteMarkers_message);
-			}
-	}
-
-	private IMarker[] getMarkers(ISelection s) {
-		if (! (s instanceof IStructuredSelection) || s.isEmpty())
-			return null;
-
-		IStructuredSelection selection= (IStructuredSelection)s;
-		int size= selection.size();
-		if (size != 1)
-			return null;
-		if (selection.getFirstElement() instanceof ISearchResultViewEntry) {
-			IMarker marker= ((ISearchResultViewEntry)selection.getFirstElement()).getSelectedMarker();
-			if (marker != null)
-				return new IMarker[] {marker};
-		}
-		return null;
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/RemovePotentialMatchesAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/RemovePotentialMatchesAction.java
deleted file mode 100644
index 2089ea7..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/RemovePotentialMatchesAction.java
+++ /dev/null
@@ -1,125 +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.search.internal.ui;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.core.resources.IMarker;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-import org.eclipse.ui.IWorkbenchSite;
-
-import org.eclipse.search.internal.ui.util.ExceptionHandler;
-import org.eclipse.search.ui.SearchUI;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class RemovePotentialMatchesAction extends Action {
-
-	private IWorkbenchSite fSite;
-
-	public RemovePotentialMatchesAction(IWorkbenchSite site) {
-		fSite= site;
-
-		if (usePluralLabel()) {
-			setText(SearchMessages.RemovePotentialMatchesAction_removePotentialMatches_text);
-			setToolTipText(SearchMessages.RemovePotentialMatchesAction_removePotentialMatches_tooltip);
-		}
-		else {
-			setText(SearchMessages.RemovePotentialMatchesAction_removePotentialMatch_text);
-			setToolTipText(SearchMessages.RemovePotentialMatchesAction_removePotentialMatch_tooltip);
-		}
-	}
-
-	@Override
-	public void run() {
-		IMarker[] markers= getMarkers();
-		if (markers != null)
-			try {
-				SearchPlugin.getWorkspace().deleteMarkers(markers);
-			} catch (CoreException ex) {
-				ExceptionHandler.handle(ex, SearchMessages.Search_Error_deleteMarkers_title, SearchMessages.Search_Error_deleteMarkers_message);
-			}
-		else {
-			String title= SearchMessages.RemovePotentialMatchesAction_dialog_title;
-			String message= SearchMessages.RemovePotentialMatchesAction_dialog_message;
-			MessageDialog.openInformation(fSite.getShell(), title, message);
-		}
-
-		// action only makes sense once
-		setEnabled(false);
-	}
-
-	private IMarker[] getMarkers() {
-
-		ISelection s= fSite.getSelectionProvider().getSelection();
-		if (! (s instanceof IStructuredSelection))
-			return null;
-		IStructuredSelection selection= (IStructuredSelection)s;
-
-		int size= selection.size();
-		if (size <= 0)
-			return null;
-
-		ArrayList<IMarker> markers= new ArrayList<>(size * 3);
-		Iterator<?> iter= selection.iterator();
-		while (iter.hasNext()) {
-			SearchResultViewEntry entry= (SearchResultViewEntry)iter.next();
-			Iterator<IMarker> entryIter= entry.getMarkers().iterator();
-			while (entryIter.hasNext()) {
-				IMarker marker= entryIter.next();
-				if (marker.getAttribute(SearchUI.POTENTIAL_MATCH, false))
-					markers.add(marker);
-			}
-		}
-		return markers.toArray(new IMarker[markers.size()]);
-	}
-
-	private boolean usePluralLabel() {
-		ISelection s= fSite.getSelectionProvider().getSelection();
-
-		if (! (s instanceof IStructuredSelection) || s.isEmpty())
-			return false;
-
-		IStructuredSelection selection= (IStructuredSelection)s;
-		int size= selection.size();
-		if (size <= 0)
-			return false;
-
-		int markerCount= 0;
-		Iterator<?> iter= selection.iterator();
-		while (iter.hasNext()) {
-			SearchResultViewEntry entry= (SearchResultViewEntry)iter.next();
-			Iterator<IMarker> entryIter= entry.getMarkers().iterator();
-			while (entryIter.hasNext()) {
-				IMarker marker= entryIter.next();
-				if (marker.getAttribute(SearchUI.POTENTIAL_MATCH, false)) {
-					markerCount++;
-				}
-				if (markerCount > 1)
-					return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveResultAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveResultAction.java
deleted file mode 100644
index 6677d5d..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/RemoveResultAction.java
+++ /dev/null
@@ -1,101 +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.search.internal.ui;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.swt.custom.BusyIndicator;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.core.resources.IMarker;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-import org.eclipse.search.internal.ui.util.ExceptionHandler;
-import org.eclipse.search.ui.ISearchResultViewEntry;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class RemoveResultAction extends Action {
-
-	private ISelectionProvider fSelectionProvider;
-
-	public RemoveResultAction(ISelectionProvider provider, boolean stringsDependOnMatchCount) {
-		fSelectionProvider= provider;
-		if (!stringsDependOnMatchCount || usePluralLabel()) {
-			setText(SearchMessages.SearchResultView_removeEntries_text);
-			setToolTipText(SearchMessages.SearchResultView_removeEntries_tooltip);
-		}
-		else {
-			setText(SearchMessages.SearchResultView_removeEntry_text);
-			setToolTipText(SearchMessages.SearchResultView_removeEntry_tooltip);
-		}
-		SearchPluginImages.setImageDescriptors(this, SearchPluginImages.T_LCL, SearchPluginImages.IMG_LCL_SEARCH_REM);
-	}
-
-	@Override
-	public void run() {
-		final IMarker[] markers= getMarkers(fSelectionProvider.getSelection());
-		if (markers != null) {
-			BusyIndicator.showWhile(SearchPlugin.getActiveWorkbenchShell().getDisplay(), () -> {
-				try {
-					SearchPlugin.getWorkspace().deleteMarkers(markers);
-				} catch (CoreException ex) {
-					ExceptionHandler.handle(ex, SearchMessages.Search_Error_deleteMarkers_title, SearchMessages.Search_Error_deleteMarkers_message);
-				}
-			});
-		}
-	}
-
-	private IMarker[] getMarkers(ISelection s) {
-		if (! (s instanceof IStructuredSelection) || s.isEmpty())
-			return null;
-
-		IStructuredSelection selection= (IStructuredSelection)s;
-		int size= selection.size();
-		if (size <= 0)
-			return null;
-		ArrayList<IMarker> markers= new ArrayList<>(size * 3);
-		int markerCount= 0;
-		Iterator<?> iter= selection.iterator();
-		while (iter.hasNext()) {
-			SearchResultViewEntry entry= (SearchResultViewEntry)iter.next();
-			markerCount += entry.getMatchCount();
-			markers.addAll(entry.getMarkers());
-		}
-		return markers.toArray(new IMarker[markerCount]);
-	}
-
-	private boolean usePluralLabel() {
-		ISelection s= fSelectionProvider.getSelection();
-		if (s == null || s.isEmpty() || !(s instanceof IStructuredSelection))
-			return false;
-		IStructuredSelection selection= (IStructuredSelection)s;
-
-		if (selection.size() != 1)
-			return true;
-
-		Object firstElement= selection.getFirstElement();
-		if (firstElement instanceof ISearchResultViewEntry)
-			return ((ISearchResultViewEntry)firstElement).getMatchCount() > 1;
-		return false;
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/ResourceToItemsMapper.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/ResourceToItemsMapper.java
deleted file mode 100644
index 3c5605b..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/ResourceToItemsMapper.java
+++ /dev/null
@@ -1,175 +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.search.internal.ui;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Stack;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Item;
-
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.jface.viewers.ContentViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-
-import org.eclipse.search.ui.ISearchResultViewEntry;
-
-/**
- * Helper class for updating error markers and other decorators that work on resources.
- * Items are mapped to their element's underlying resource.
- * Method <code>resourceChanged</code> updates all items that are affected from the changed
- * elements.
- * @deprecated old search
- */
-@Deprecated
-class ResourceToItemsMapper {
-
-	private static final int NUMBER_LIST_REUSE= 10;
-
-	/** map from IResource to {@code Item | List<Item>} **/
-	private HashMap<IResource, Object> fResourceToItem;
-	private Stack<List<Item>> fReuseLists;
-
-	private ContentViewer fContentViewer;
-
-	public ResourceToItemsMapper(ContentViewer viewer) {
-		fResourceToItem= new HashMap<>();
-		fReuseLists= new Stack<>();
-
-		fContentViewer= viewer;
-	}
-
-	/**
-	 * Must be called from the UI thread.
-	 * @param changedResource changed resources
-	 */
-	@SuppressWarnings("unchecked")
-	public void resourceChanged(IResource changedResource) {
-		Object obj= fResourceToItem.get(changedResource);
-		if (obj == null) {
-			// not mapped
-		} else if (obj instanceof Item) {
-			updateItem((Item) obj);
-		} else { // List of Items
-			for (Item element : (List<Item>) obj) {
-				updateItem(element);
-			}
-		}
-	}
-
-	private void updateItem(Item item) {
-		if (!item.isDisposed()) { // defensive code
-			ILabelProvider lprovider= (ILabelProvider) fContentViewer.getLabelProvider();
-
-			Object data= item.getData();
-
-			String oldText= item.getText();
-			String text= lprovider.getText(data);
-			if (text != null && !text.equals(oldText)) {
-				item.setText(text);
-			}
-
-			Image oldImage= item.getImage();
-			Image image= lprovider.getImage(data);
-			if (image != null && !image.equals(oldImage)) {
-				item.setImage(image);
-			}
-		}
-	}
-
-	/**
-	 * Adds a new item to the map.
-	 * @param element Element to map
-	 * @param item The item used for the element
-	 */
-	public void addToMap(Object element, Item item) {
-		IResource resource= ((ISearchResultViewEntry)element).getResource();
-		if (resource != null) {
-			Object existingMapping= fResourceToItem.get(resource);
-			if (existingMapping == null) {
-				fResourceToItem.put(resource, item);
-			} else if (existingMapping instanceof Item) {
-				if (existingMapping != item) {
-					List<Item> list= getNewList();
-					list.add((Item) existingMapping);
-					list.add(item);
-					fResourceToItem.put(resource, list);
-				}
-			} else { // List
-				@SuppressWarnings("unchecked")
-				List<Item> list= (List<Item>) existingMapping;
-				if (!list.contains(item)) {
-					list.add(item);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes an element from the map.
-	 * @param element element to remove
-	 * @param item The item used for the element
-	 */
-	@SuppressWarnings("unlikely-arg-type")
-	public void removeFromMap(Object element, Item item) {
-		IResource resource= ((ISearchResultViewEntry)element).getResource();
-		if (resource != null) {
-			Object existingMapping= fResourceToItem.get(resource);
-			if (existingMapping == null) {
-				return;
-			} else if (existingMapping instanceof Item) {
-				fResourceToItem.remove(resource);
-			} else { // List
-				@SuppressWarnings("unchecked")
-				List<Item> list= (List<Item>) existingMapping;
-				list.remove(item);
-				if (list.isEmpty()) {
-					fResourceToItem.remove(list);
-					releaseList(list);
-				}
-			}
-		}
-	}
-
-	private List<Item> getNewList() {
-		if (!fReuseLists.isEmpty()) {
-			return fReuseLists.pop();
-		}
-		return new ArrayList<>(2);
-	}
-
-	private void releaseList(List<Item> list) {
-		if (fReuseLists.size() < NUMBER_LIST_REUSE) {
-			fReuseLists.push(list);
-		}
-	}
-
-	/**
-	 * Clears the map.
-	 */
-	public void clearMap() {
-		fResourceToItem.clear();
-	}
-
-	/**
-	 * Tests if the map is empty
-	 * @return returns if the map is empty
-	 */
-	public boolean isEmpty() {
-		return fResourceToItem.isEmpty();
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/Search.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/Search.java
deleted file mode 100644
index 434a0fc..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/Search.java
+++ /dev/null
@@ -1,214 +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.search.internal.ui;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.core.runtime.Assert;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-
-import org.eclipse.search.internal.ui.util.ExceptionHandler;
-import org.eclipse.search.ui.IActionGroupFactory;
-import org.eclipse.search.ui.IContextMenuContributor;
-import org.eclipse.search.ui.IGroupByKeyComputer;
-import org.eclipse.search.ui.ISearchResultViewEntry;
-/**
- * @deprecated old search
- */
-@Deprecated
-public class Search extends Object {
-	private String fPageId;
-	private String fSingularLabel;
-	private String fPluralLabelPattern;
-	private ImageDescriptor fImageDescriptor;
-	private ILabelProvider fLabelProvider;
-	private ISelection fSelection;
-	private ArrayList<SearchResultViewEntry> fResults;
-	private IAction fGotoMarkerAction;
-	private IContextMenuContributor fContextMenuContributor;
-	private IActionGroupFactory fActionGroupFactory;
-	private IGroupByKeyComputer	fGroupByKeyComputer;
-	private IRunnableWithProgress fOperation;
-
-
-	public Search(String pageId, String singularLabel, String pluralLabelPattern, ILabelProvider labelProvider, ImageDescriptor imageDescriptor, IAction gotoMarkerAction, IActionGroupFactory groupFactory, IGroupByKeyComputer groupByKeyComputer, IRunnableWithProgress operation) {
-		fPageId= pageId;
-		fSingularLabel= singularLabel;
-		fPluralLabelPattern= pluralLabelPattern;
-		fImageDescriptor= imageDescriptor;
-		fLabelProvider= labelProvider;
-		fGotoMarkerAction= gotoMarkerAction;
-		fActionGroupFactory= groupFactory;
-		fGroupByKeyComputer= groupByKeyComputer;
-		fOperation= operation;
-
-		if (fPluralLabelPattern == null)
-			fPluralLabelPattern= ""; //$NON-NLS-1$
-	}
-
-	public Search(String pageId, String singularLabel, String pluralLabelPattern, ILabelProvider labelProvider, ImageDescriptor imageDescriptor, IAction gotoMarkerAction, IContextMenuContributor contextMenuContributor, IGroupByKeyComputer groupByKeyComputer, IRunnableWithProgress operation) {
-		fPageId= pageId;
-		fSingularLabel= singularLabel;
-		fPluralLabelPattern= pluralLabelPattern;
-		fImageDescriptor= imageDescriptor;
-		fLabelProvider= labelProvider;
-		fGotoMarkerAction= gotoMarkerAction;
-		fContextMenuContributor= contextMenuContributor;
-		fGroupByKeyComputer= groupByKeyComputer;
-		fOperation= operation;
-
-		if (fPluralLabelPattern == null)
-			fPluralLabelPattern= ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the full description of the search.
-	 * The description set by the client where
-	 * {0} will be replaced by the match count.
-	 * @return the full description
-	 */
-	String getFullDescription() {
-		if (fSingularLabel != null && getItemCount() == 1)
-			return fSingularLabel;
-
-		// try to replace "{0}" with the match count
-		int i= fPluralLabelPattern.lastIndexOf("{0}"); //$NON-NLS-1$
-		if (i < 0)
-			return fPluralLabelPattern;
-		return fPluralLabelPattern.substring(0, i) + getItemCount()+ fPluralLabelPattern.substring(Math.min(i + 3, fPluralLabelPattern.length()));
-	}
-
-	/**
-	 * Returns a short description of the search.
-	 * Cuts off after 30 characters and adds ...
-	 * The description set by the client where
-	 * {0} will be replaced by the match count.
-	 * @return the short description
-	 */
-	String getShortDescription() {
-		String text= getFullDescription();
-		int separatorPos= text.indexOf(" - "); //$NON-NLS-1$
-		if (separatorPos < 1)
-			return text.substring(0, Math.min(50, text.length())) + "..."; // use first 50 characters //$NON-NLS-1$
-		if (separatorPos < 30)
-			return text;	// don't cut
-		if (text.charAt(0) == '"')
-			return text.substring(0, Math.min(30, text.length())) + "...\" - " + text.substring(Math.min(separatorPos + 3, text.length())); //$NON-NLS-1$
-		return text.substring(0, Math.min(30, text.length())) + "... - " + text.substring(Math.min(separatorPos + 3, text.length())); //$NON-NLS-1$
-	}
-	/**
-	 * Image used when search is displayed in a list
-	 * @return the image descriptor
-	 */
-	ImageDescriptor getImageDescriptor() {
-		return fImageDescriptor;
-	}
-
-	int getItemCount() {
-		int count= 0;
-		Iterator<SearchResultViewEntry> iter= getResults().iterator();
-		while (iter.hasNext())
-			count += ((ISearchResultViewEntry)iter.next()).getMatchCount();
-		return count;
-	}
-
-	List<SearchResultViewEntry> getResults() {
-		if (fResults == null)
-			return new ArrayList<>();
-		return fResults;
-	}
-
-	ILabelProvider getLabelProvider() {
-		return fLabelProvider;
-	}
-
-	void searchAgain() {
-		if (fOperation == null)
-			return;
-		Shell shell= SearchPlugin.getActiveWorkbenchShell();
-		boolean isAutoBuilding= SearchPlugin.setAutoBuilding(false);
-		try {
-			new ProgressMonitorDialog(shell).run(true, true, fOperation);
-		} catch (InvocationTargetException ex) {
-			ExceptionHandler.handle(ex, shell, SearchMessages.Search_Error_search_title, SearchMessages.Search_Error_search_message);
-		} catch(InterruptedException e) {
-		} finally {
-			SearchPlugin.setAutoBuilding(isAutoBuilding);
-		}
-	}
-
-	boolean isSameSearch(Search search) {
-		return search != null && search.getOperation() == fOperation && fOperation != null;
-	}
-
-	void backupMarkers() {
-		Iterator<SearchResultViewEntry> iter= getResults().iterator();
-		while (iter.hasNext()) {
-			iter.next().backupMarkers();
-		}
-	}
-
-	String getPageId() {
-		return fPageId;
-	}
-
-	IGroupByKeyComputer getGroupByKeyComputer() {
-		return fGroupByKeyComputer;
-	}
-
-	public IRunnableWithProgress getOperation() {
-		return fOperation;
-	}
-
-	IAction getGotoMarkerAction() {
-		return fGotoMarkerAction;
-	}
-
-	IContextMenuContributor getContextMenuContributor() {
-		return fContextMenuContributor;
-	}
-
-	IActionGroupFactory getActionGroupFactory() {
-		return fActionGroupFactory;
-	}
-
-	public void removeResults() {
-		fResults= null;
-	}
-
-	void setResults(ArrayList<SearchResultViewEntry> results) {
-		Assert.isNotNull(results);
-		fResults= results;
-	}
-
-	ISelection getSelection() {
-		return fSelection;
-	}
-
-	void setSelection(ISelection selection) {
-		fSelection= selection;
-	}
-}
-
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchAgainAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchAgainAction.java
deleted file mode 100644
index 5264218..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchAgainAction.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 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.search.internal.ui;
-
-import org.eclipse.jface.action.Action;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class SearchAgainAction extends Action {
-
-	public SearchAgainAction() {
-		super(SearchMessages.SearchResultView_searchAgain_text);
-		setToolTipText(SearchMessages.SearchResultView_searchAgain_tooltip);
-	}
-
-	@Override
-	public void run() {
-		Search selected= SearchManager.getDefault().getCurrentSearch();
-		if (selected != null)
-			selected.searchAgain();
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchDropDownAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchDropDownAction.java
deleted file mode 100644
index 6401687..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchDropDownAction.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 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.search.internal.ui;
-
-import java.util.Iterator;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IMenuCreator;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class SearchDropDownAction extends Action implements IMenuCreator {
-
-
-	public static final int RESULTS_IN_DROP_DOWN= 10;
-
-	private Menu fMenu;
-
-	public SearchDropDownAction() {
-		setText(SearchMessages.SearchResultView_previousSearches_text);
-		setToolTipText(SearchMessages.SearchResultView_previousSearches_tooltip);
-		SearchPluginImages.setImageDescriptors(this, SearchPluginImages.T_LCL, SearchPluginImages.IMG_LCL_SEARCH_HISTORY);
-		setMenuCreator(this);
-	}
-
-	@Override
-	public void dispose() {
-		if (fMenu != null)  {
-			fMenu.dispose();
-			fMenu= null;
-		}
-	}
-
-	@Override
-	public Menu getMenu(Menu parent) {
-		return null;
-	}
-
-	@Override
-	public Menu getMenu(Control parent) {
-		if (fMenu != null)
-			fMenu.dispose();
-
-		fMenu= new Menu(parent);
-		boolean checkedOne= false;
-		Iterator<Search> iter= SearchManager.getDefault().getPreviousSearches().iterator();
-		Search selected= SearchManager.getDefault().getCurrentSearch();
-		int i= 0;
-		while (iter.hasNext() && i++ < RESULTS_IN_DROP_DOWN) {
-			Search search= iter.next();
-			ShowSearchAction action= new ShowSearchAction(search);
-			action.setChecked(search.equals(selected));
-			if (search.equals(selected))
-				checkedOne= true;
-			addActionToMenu(fMenu, action);
-		}
-		new MenuItem(fMenu, SWT.SEPARATOR);
-		if (iter.hasNext()) {
-			Action others= new ShowSearchesAction();
-			others.setChecked(!checkedOne);
-			addActionToMenu(fMenu, others);
-		}
-		addActionToMenu(fMenu, new RemoveAllSearchesAction());
-		return fMenu;
-	}
-
-	protected void addActionToMenu(Menu parent, Action action) {
-		ActionContributionItem item= new ActionContributionItem(action);
-		item.fill(parent, -1);
-	}
-
-	@Override
-	public void run() {
-			new ShowSearchesAction().run(true);
-	}
-
-	/**
-	 * Get's rid of the menu, because the menu hangs on to
-	 * the searches, etc.
-	 */
-	void clear() {
-		dispose();
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchManager.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchManager.java
deleted file mode 100644
index e5744ce..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchManager.java
+++ /dev/null
@@ -1,501 +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.search.internal.ui;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.viewers.Viewer;
-
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-import org.eclipse.search.internal.ui.util.ExceptionHandler;
-import org.eclipse.search.ui.IGroupByKeyComputer;
-import org.eclipse.search.ui.SearchUI;
-
-
-/**
- * Manage search results
- * 	@deprecated old search
- */
-@Deprecated
-public class SearchManager implements IResourceChangeListener {
-
-	static SearchManager fgDefault;
-
-	Search fCurrentSearch= null;
-
-	private SearchManager() {
-		SearchPlugin.getWorkspace().addResourceChangeListener(this);
-	}
-
-	private HashSet<SearchResultViewer> fListeners= new HashSet<>();
-	private LinkedList<Search> fPreviousSearches= new LinkedList<>();
-	private boolean fIsRemoveAll= false;
-
-	public static synchronized SearchManager getDefault() {
-		if (fgDefault == null)
-			fgDefault= new SearchManager();
-		return fgDefault;
-	}
-
-	public void dispose() {
-		SearchPlugin.getWorkspace().removeResourceChangeListener(this);
-	}
-
-	/**
-	 * Returns the list with previous searches (ISearch).
-	 * @return previous searches
-	 */
-	LinkedList<Search> getPreviousSearches() {
-		return fPreviousSearches;
-	}
-	/**
-	 * Returns the list with current (last) results
-	 * @return the current results
-	 */
-	ArrayList<SearchResultViewEntry> getCurrentResults() {
-		if (fCurrentSearch == null)
-			return new ArrayList<>(0);
-		return (ArrayList<SearchResultViewEntry>)fCurrentSearch.getResults();
-	}
-
-	public Search getCurrentSearch() {
-		return fCurrentSearch;
-	}
-
-	void removeAllSearches() {
-		SearchPlugin.getWorkspace().removeResourceChangeListener(this);
-		WorkspaceModifyOperation op= new WorkspaceModifyOperation(null) {
-			@Override
-			protected void execute(IProgressMonitor monitor) throws CoreException {
-				monitor.beginTask(SearchMessages.SearchManager_updating, 100);
-				SearchPlugin.getWorkspace().getRoot().deleteMarkers(SearchUI.SEARCH_MARKER, true, IResource.DEPTH_INFINITE);
-				monitor.worked(100);
-				monitor.done();
-			}
-		};
-		boolean isAutoBuilding= SearchPlugin.setAutoBuilding(false);
-		try {
-			ProgressMonitorDialog dialog= new ProgressMonitorDialog(getShell());
-			dialog.run(true, true, op);
-		} catch (InvocationTargetException ex) {
-			ExceptionHandler.handle(ex, SearchMessages.Search_Error_deleteMarkers_title, SearchMessages.Search_Error_deleteMarkers_message);
-		} catch (InterruptedException e) {
-			// Do nothing. Operation has been canceled.
-		} finally {
-			SearchPlugin.getWorkspace().addResourceChangeListener(this);
-			SearchPlugin.setAutoBuilding(isAutoBuilding);
-		}
-
-		// clear searches
-		fPreviousSearches= new LinkedList<>();
-		fCurrentSearch= null;
-
-		// update viewers
-		Iterator<SearchResultViewer> iter= fListeners.iterator();
-		while (iter.hasNext()) {
-			SearchResultViewer viewer= iter.next();
-			handleAllSearchesRemoved(viewer);
-		}
-	}
-
-	private void handleAllSearchesRemoved(SearchResultViewer viewer) {
-		viewer.handleAllSearchesRemoved();
-	}
-
-	void setCurrentSearch(final Search search) {
-		if (fCurrentSearch == search)
-			return;
-
-		SearchPlugin.getWorkspace().removeResourceChangeListener(this);
-		WorkspaceModifyOperation op= new WorkspaceModifyOperation(null) {
-			@Override
-			protected void execute(IProgressMonitor monitor) throws CoreException {
-				internalSetCurrentSearch(search, monitor);
-			}
-		};
-		boolean isAutoBuilding= SearchPlugin.setAutoBuilding(false);
-		try {
-			ProgressMonitorDialog dialog= new ProgressMonitorDialog(getShell());
-			dialog.run(true, true, op);
-		} catch (InvocationTargetException ex) {
-			ExceptionHandler.handle(ex, SearchMessages.Search_Error_switchSearch_title, SearchMessages.Search_Error_switchSearch_message);
-		} catch (InterruptedException e) {
-			// Do nothing. Operation has been canceled.
-		} finally {
-			SearchPlugin.setAutoBuilding(isAutoBuilding);
-		}
-
-		getPreviousSearches().remove(search);
-		getPreviousSearches().addFirst(search);
-	}
-
-	void internalSetCurrentSearch(final Search search, IProgressMonitor monitor) {
-		if (fCurrentSearch != null)
-			fCurrentSearch.backupMarkers();
-
-		final Search previousSearch= fCurrentSearch;
-		fCurrentSearch= search;
-		monitor.beginTask(SearchMessages.SearchManager_updating, getCurrentResults().size() + 20);
-
-		// remove current search markers
-		try {
-			SearchPlugin.getWorkspace().getRoot().deleteMarkers(SearchUI.SEARCH_MARKER, true, IResource.DEPTH_INFINITE);
-		} catch (CoreException ex) {
-			ExceptionHandler.handle(ex, SearchMessages.Search_Error_deleteMarkers_title, SearchMessages.Search_Error_deleteMarkers_message);
-		}
-		monitor.worked(10);
-
-		// add search markers
-		Iterator<SearchResultViewEntry> iter= getCurrentResults().iterator();
-		ArrayList<SearchResultViewEntry> emptyEntries= new ArrayList<>(10);
-		boolean filesChanged= false;
-		boolean filesDeleted= false;
-		IGroupByKeyComputer groupByKeyComputer= getCurrentSearch().getGroupByKeyComputer();
-		while (iter.hasNext()) {
-			monitor.worked(1);
-			SearchResultViewEntry entry= iter.next();
-			Iterator<Map<String, Object>> attrPerMarkerIter= entry.getAttributesPerMarker().iterator();
-			entry.clearMarkerList();
-			if (entry.getResource() == null || !entry.getResource().exists()) {
-				emptyEntries.add(entry);
-				filesDeleted= true;
-				continue;
-			}
-			while (attrPerMarkerIter.hasNext()) {
-				IMarker newMarker= null;
-				try {
-					newMarker= entry.getResource().createMarker(entry.getMarkerType());
-				} catch (CoreException ex) {
-					ExceptionHandler.handle(ex, SearchMessages.Search_Error_createMarker_title, SearchMessages.Search_Error_createMarker_message);
-					continue;
-				}
-				try {
-					newMarker.setAttributes(attrPerMarkerIter.next());
-					if (groupByKeyComputer !=null && groupByKeyComputer.computeGroupByKey(newMarker) == null) {
-						filesDeleted= true;
-						newMarker.delete();
-						continue;
-					}
-				} catch (CoreException ex) {
-					ExceptionHandler.handle(ex, SearchMessages.Search_Error_markerAttributeAccess_title, SearchMessages.Search_Error_markerAttributeAccess_message);
-				}
-				entry.add(newMarker);
-			}
-			if (entry.getMatchCount() == 0)
-				emptyEntries.add(entry);
-			else if (!filesChanged && entry.getResource().getModificationStamp() != entry.getModificationStamp())
-				filesChanged= true;
-		}
-		getCurrentResults().removeAll(emptyEntries);
-		monitor.worked(10);
-
-		String warningMessage= null;
-		Display display= getDisplay();
-
-		if (filesChanged)
-			warningMessage= SearchMessages.SearchManager_resourceChanged;
-		if (filesDeleted) {
-			if (warningMessage == null)
-				warningMessage= ""; //$NON-NLS-1$
-			else
-				warningMessage += "\n";			 //$NON-NLS-1$
-			warningMessage += SearchMessages.SearchManager_resourceDeleted;
-		}
-		if (warningMessage != null) {
-			if (display != null && !display.isDisposed()) {
-				final String warningTitle= SearchMessages.SearchManager_resourceChangedWarning;
-				final String warningMsg= warningMessage;
-				display.syncExec(() -> MessageDialog.openWarning(getShell(), warningTitle, warningMsg));
-			}
-		}
-
-		// update viewers
-		Iterator<SearchResultViewer> iter2= fListeners.iterator();
-		if (display != null && !display.isDisposed()) {
-			final Viewer visibleViewer= ((SearchResultView)SearchUI.getSearchResultView()).getViewer();
-			while (iter2.hasNext()) {
-				final SearchResultViewer viewer= iter2.next();
-				display.syncExec(() -> {
-					if (previousSearch != null && viewer == visibleViewer)
-						previousSearch.setSelection(viewer.getSelection());
-					viewer.setInput(null);
-					viewer.setPageId(search.getPageId());
-					viewer.setGotoMarkerAction(search.getGotoMarkerAction());
-					viewer.setContextMenuTarget(search.getContextMenuContributor());
-					viewer.setActionGroupFactory(null);
-					viewer.setInput(getCurrentResults());
-					viewer.setActionGroupFactory(search.getActionGroupFactory());
-					viewer.setSelection(fCurrentSearch.getSelection(), true);
-				});
-			}
-		}
-		monitor.done();
-	}
-
-	/**
-	 * Returns the number of matches
-	 * @return the number of matches
-	 */
-	int getCurrentItemCount() {
-		if (fCurrentSearch != null)
-			return fCurrentSearch.getItemCount();
-		return 0;
-	}
-
-	void removeAllResults() {
-		fIsRemoveAll= true;
-		try {
-			SearchPlugin.getWorkspace().getRoot().deleteMarkers(SearchUI.SEARCH_MARKER, true, IResource.DEPTH_INFINITE);
-		} catch (CoreException ex) {
-			ExceptionHandler.handle(ex, SearchMessages.Search_Error_deleteMarkers_title, SearchMessages.Search_Error_deleteMarkers_message);
-			fIsRemoveAll= false;
-		}
-	}
-
-	void addNewSearch(final Search newSearch) {
-
-		SearchPlugin.getWorkspace().removeResourceChangeListener(this);
-
-		// Clear the viewers
-		Iterator<SearchResultViewer> iter= fListeners.iterator();
-		Display display= getDisplay();
-		if (display != null && !display.isDisposed()) {
-			final Viewer visibleViewer= ((SearchResultView)SearchUI.getSearchResultView()).getViewer();
-			while (iter.hasNext()) {
-				final SearchResultViewer viewer= iter.next();
-				display.syncExec(() -> {
-					if (fCurrentSearch != null && viewer == visibleViewer)
-						fCurrentSearch.setSelection(viewer.getSelection());
-					setNewSearch(viewer, newSearch);
-				});
-			}
-		}
-
-		if (fCurrentSearch != null) {
-			if (fCurrentSearch.isSameSearch(newSearch))
-				getPreviousSearches().remove(fCurrentSearch);
-			else
-				fCurrentSearch.backupMarkers();
-		}
-		fCurrentSearch= newSearch;
-		getPreviousSearches().addFirst(fCurrentSearch);
-
-		// Remove the markers
-		try {
-			SearchPlugin.getWorkspace().getRoot().deleteMarkers(SearchUI.SEARCH_MARKER, true, IResource.DEPTH_INFINITE);
-		} catch (CoreException ex) {
-			ExceptionHandler.handle(ex, SearchMessages.Search_Error_deleteMarkers_title, SearchMessages.Search_Error_deleteMarkers_message);
-		}
-	}
-
-	void searchFinished(ArrayList<SearchResultViewEntry> results) {
-		Assert.isNotNull(results);
-		getCurrentSearch().setResults(results);
-
-		Display display= getDisplay();
-		if (display == null || display.isDisposed())
-			return;
-
-		if (Thread.currentThread() == display.getThread())
-			handleNewSearchResult();
-		else {
-			display.syncExec(this::handleNewSearchResult);
-		}
-		SearchPlugin.getWorkspace().addResourceChangeListener(this);
-	}
-
-	//--- Change event handling -------------------------------------------------
-
-	void addSearchChangeListener(SearchResultViewer viewer) {
-		fListeners.add(viewer);
-	}
-
-	void removeSearchChangeListener(SearchResultViewer viewer) {
-		Assert.isNotNull(viewer);
-		fListeners.remove(viewer);
-	}
-
-	private final void handleSearchMarkersChanged(IMarkerDelta[] markerDeltas) {
-		if (fIsRemoveAll) {
-			handleRemoveAll();
-			fIsRemoveAll= false;
-			return;
-		}
-
-		Iterator<SearchResultViewer> iter= fListeners.iterator();
-		while (iter.hasNext())
-			iter.next().getControl().setRedraw(false);
-
-		for (IMarkerDelta markerDelta : markerDeltas) {
-			handleSearchMarkerChanged(markerDelta);
-		}
-
-		iter= fListeners.iterator();
-		while (iter.hasNext())
-			iter.next().getControl().setRedraw(true);
-
-	}
-
-	private void handleSearchMarkerChanged(IMarkerDelta markerDelta) {
-		int kind= markerDelta.getKind();
-		// don't listen for adds will be done by ISearchResultView.addMatch(...)
-		if (((kind & IResourceDelta.REMOVED) != 0))
-			handleRemoveMatch(markerDelta.getMarker());
-		else if ((kind & IResourceDelta.CHANGED) != 0)
-			handleUpdateMatch(markerDelta.getMarker());
-	}
-
-	private void handleRemoveAll() {
-		if (fCurrentSearch != null)
-			fCurrentSearch.removeResults();
-		Iterator<SearchResultViewer> iter= fListeners.iterator();
-		while (iter.hasNext())
-			iter.next().handleRemoveAll();
-	}
-
-	private void handleNewSearchResult() {
-		Iterator<SearchResultViewer> iter= fListeners.iterator();
-		while (iter.hasNext()) {
-			SearchResultViewer viewer= iter.next();
-			viewer.setInput(getCurrentResults());
-		}
-	}
-
-	private void setNewSearch(SearchResultViewer viewer, Search search) {
-		viewer.setInput(null);
-		viewer.clearTitle();
-		viewer.setPageId(search.getPageId());
-		viewer.setGotoMarkerAction(search.getGotoMarkerAction());
-		viewer.setContextMenuTarget(search.getContextMenuContributor());
-		viewer.setActionGroupFactory(search.getActionGroupFactory());
-	}
-
-	private void handleRemoveMatch(IMarker marker) {
-		SearchResultViewEntry entry= findEntry(marker);
-		if (entry != null) {
-			entry.remove(marker);
-			if (entry.getMatchCount() == 0) {
-				getCurrentResults().remove(entry);
-				Iterator<SearchResultViewer> iter= fListeners.iterator();
-				while (iter.hasNext())
-					iter.next().handleRemoveMatch(entry);
-			}
-			else {
-				Iterator<SearchResultViewer> iter= fListeners.iterator();
-				while (iter.hasNext())
-					iter.next().handleUpdateMatch(entry, true);
-			}
-		}
-	}
-
-	private void handleUpdateMatch(IMarker marker) {
-		SearchResultViewEntry entry= findEntry(marker);
-		if (entry != null) {
-			Iterator<SearchResultViewer> iter= fListeners.iterator();
-			while (iter.hasNext())
-				iter.next().handleUpdateMatch(entry, false);
-		}
-	}
-
-	private SearchResultViewEntry findEntry(IMarker marker) {
-		Iterator<SearchResultViewEntry> entries= getCurrentResults().iterator();
-		while (entries.hasNext()) {
-			SearchResultViewEntry entry= entries.next();
-			if (entry.contains(marker))
-				return entry;
-		}
-		return null;
-	}
-
-	/**
-	 * Received a resource event. Since the delta could be created in a
-	 * separate thread this methods post the event into the viewer's
-	 * display thread.
-	 * @param event the event
-	 */
-	@Override
-	public final void resourceChanged(final IResourceChangeEvent event) {
-		if (event == null)
-			return;
-
-		final IMarkerDelta[] markerDeltas= event.findMarkerDeltas(SearchUI.SEARCH_MARKER, true);
-		if (markerDeltas == null || markerDeltas.length < 1)
-			return;
-
-		Display display= getDisplay();
-		if (display == null || display.isDisposed())
-			return;
-
-		Runnable runnable= () -> {
-			if (getCurrentSearch() != null) {
-				handleSearchMarkersChanged(markerDeltas);
-				// update title and actions
-				Iterator<SearchResultViewer> iter= fListeners.iterator();
-				while (iter.hasNext()) {
-					SearchResultViewer viewer= iter.next();
-					viewer.enableActions();
-					viewer.updateTitle();
-				}
-			}
-		};
-		display.syncExec(runnable);
-	}
-	/**
-	 * Find and return a valid display
-	 * @return the display
-	 */
-	private Display getDisplay() {
-		Iterator<SearchResultViewer> iter= fListeners.iterator();
-		while (iter.hasNext()) {
-			Control control= ((Viewer)iter.next()).getControl();
-			if (control != null && !control.isDisposed()) {
-				Display display= control.getDisplay();
-				if (display != null && !display.isDisposed())
-					return display;
-			}
-		}
-		return null;
-	}
-	/**
-	 * Find and return a valid shell
-	 * @return the shell
-	 */
-	private Shell getShell() {
-		return SearchPlugin.getActiveWorkbenchShell();
-	}
-}
-
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPlugin.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPlugin.java
index 022ad03..5d28ef4 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPlugin.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchPlugin.java
@@ -208,21 +208,11 @@
 	@Override
 	public void stop(BundleContext context) throws Exception {
 		InternalSearchUI.shutdown();
-		disposeOldSearchManager();
 		super.stop(context);
 		fgSearchPlugin= null;
 	}
 
 	/**
-	 * @deprecated old search
-	 */
-	@Deprecated
-	private void disposeOldSearchManager() {
-		if (SearchManager.fgDefault != null)
-			SearchManager.fgDefault.dispose();
-	}
-
-	/**
 	 * @return Returns all search pages contributed to the workbench.
 	 */
 	public List<SearchPageDescriptor> getSearchPageDescriptors() {
@@ -249,32 +239,6 @@
 	}
 
 	/**
-	 * @return Returns the help context ID for the Search view
-	 * as provided by the current search page extension.
-	 *
-	 * @since 3.0
-	 * @deprecated old search
-	 */
-	@Deprecated
-	public String getSearchViewHelpContextId() {
-		Search currentSearch= SearchManager.getDefault().getCurrentSearch();
-		if (currentSearch != null) {
-			String pageId= currentSearch.getPageId();
-			Iterator<SearchPageDescriptor> iter= getSearchPageDescriptors().iterator();
-			while (iter.hasNext()) {
-				SearchPageDescriptor desc= iter.next();
-				if (desc.getId().equals(pageId)) {
-					String helpId= desc.getSearchViewHelpContextId();
-					if (helpId == null)
-						return ISearchHelpContextIds.SEARCH_VIEW;
-					return desc.getSearchViewHelpContextId();
-				}
-			}
-		}
-		return ISearchHelpContextIds.SEARCH_VIEW;
-	}
-
-	/**
 	 * Creates all necessary search page nodes.
 	 * @param elements the configuration elements
 	 * @return the created SearchPageDescriptor
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultLabelProvider.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultLabelProvider.java
deleted file mode 100644
index 6ac45c4..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultLabelProvider.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 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.search.internal.ui;
-
-import org.eclipse.swt.graphics.Image;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.LabelProvider;
-
-import org.eclipse.ui.PlatformUI;
-
-import org.eclipse.search.ui.ISearchResultViewEntry;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class SearchResultLabelProvider extends LabelProvider {
-
-	private static final String MATCHES_POSTFIX= " " + SearchMessages.SearchResultView_matches + ")";  //$NON-NLS-1$ //$NON-NLS-2$
-
-	private ILabelProvider fLabelProvider;
-
-
-	SearchResultLabelProvider(ILabelProvider provider) {
-		fLabelProvider= provider;
-	}
-
-	@Override
-	public String getText(Object element) {
-		StringBuilder buf= new StringBuilder(getLabelProvider().getText(element));
-		int count= ((ISearchResultViewEntry)element).getMatchCount();
-		if (count > 1) {
-			buf.append(" ("); //$NON-NLS-1$
-			buf.append(count);
-			buf.append(MATCHES_POSTFIX);
-		}
-		return buf.toString();
-	}
-
-	@Override
-	public Image getImage(Object element) {
-		return fLabelProvider.getImage(element);
-	}
-
-	// Don't dispose since label providers are reused.
-	@Override
-	public void dispose() {
-	}
-
-	ILabelProvider getLabelProvider() {
-		return fLabelProvider;
-	}
-
-	@Override
-	public void addListener(ILabelProviderListener listener) {
-		super.addListener(listener);
-		fLabelProvider.addListener(listener);
-		PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator().addListener(listener);
-	}
-
-	@Override
-	public boolean isLabelProperty(Object element, String property) {
-		return fLabelProvider.isLabelProperty(element, property);
-	}
-
-	@Override
-	public void removeListener(ILabelProviderListener listener) {
-		super.removeListener(listener);
-		fLabelProvider.removeListener(listener);
-		PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator().removeListener(listener);
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultView.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultView.java
deleted file mode 100644
index 0628784..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultView.java
+++ /dev/null
@@ -1,341 +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
- *     Michael Fraenkel (fraenkel@us.ibm.com) - contributed a fix for:
- *       o New search view sets incorrect title
- *         (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=60966)
- *******************************************************************************/
-package org.eclipse.search.internal.ui;
-
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-
-import org.eclipse.core.runtime.Assert;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.part.CellEditorActionHandler;
-import org.eclipse.ui.part.ViewPart;
-
-import org.eclipse.search.ui.IActionGroupFactory;
-import org.eclipse.search.ui.IContextMenuContributor;
-import org.eclipse.search.ui.IGroupByKeyComputer;
-import org.eclipse.search.ui.ISearchResultView;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-public class SearchResultView extends ViewPart implements ISearchResultView {
-
-
-	private static Map<String, ILabelProvider> fgLabelProviders= new HashMap<>(5);
-
-	private SearchResultViewer fViewer;
-	private Map<Object, SearchResultViewEntry> fResponse;
-	private IMemento fMemento;
-	private IPropertyChangeListener fPropertyChangeListener;
-	private CellEditorActionHandler fCellEditorActionHandler;
-	private SelectAllAction fSelectAllAction;
-
-	/*
-	 * Implements method from IViewPart.
-	 */
-	@Override
-	public void init(IViewSite site, IMemento memento) throws PartInitException {
-		super.init(site, memento);
-		fMemento= memento;
-	}
-
-	/*
-	 * Implements method from IViewPart.
-	 */
-	@Override
-	public void saveState(IMemento memento) {
-		if (fViewer == null) {
-			// part has not been created
-			if (fMemento != null) //Keep the old state;
-				memento.putMemento(fMemento);
-			return;
-		}
-		fViewer.saveState(memento);
-	}
-
-	/**
-	 * Creates the search list inner viewer.
-	 * @param parent the parent
-	 */
-	@Override
-	public void createPartControl(Composite parent) {
-		Assert.isTrue(fViewer == null);
-		fViewer= new SearchResultViewer(this, parent);
-		if (fMemento != null)
-			fViewer.restoreState(fMemento);
-		fMemento= null;
-		SearchManager.getDefault().addSearchChangeListener(fViewer);
-		fViewer.init();
-
-		// Add selectAll action handlers.
-		fCellEditorActionHandler = new CellEditorActionHandler(getViewSite().getActionBars());
-		fSelectAllAction= new SelectAllAction();
-		fSelectAllAction.setViewer(fViewer);
-		fCellEditorActionHandler.setSelectAllAction(fSelectAllAction);
-
-		fillActionBars(getViewSite().getActionBars());
-
-		fPropertyChangeListener= event -> {
-			if (SearchPreferencePage.POTENTIAL_MATCH_FG_COLOR.equals(event.getProperty()) || SearchPreferencePage.EMPHASIZE_POTENTIAL_MATCHES.equals(event.getProperty()))
-				if (fViewer != null)
-					fViewer.updatedPotentialMatchFgColor();
-		};
-
-		SearchPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(fPropertyChangeListener);
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(fViewer.getControl(), SearchPlugin.getDefault().getSearchViewHelpContextId());
-	}
-
-	/**
-	 * Returns the search result viewer.
-	 * @return the search result viewer.
-	 */
-	public SearchResultViewer getViewer() {
-		return fViewer;
-	}
-
-	//---- IWorkbenchPart ------------------------------------------------------
-
-
-	@Override
-	public void setFocus() {
-		fViewer.getControl().setFocus();
-	}
-
-	@Override
-	public void dispose() {
-		if (fViewer != null) {
-			SearchManager.getDefault().removeSearchChangeListener(fViewer);
-			fViewer= null;
-		}
-		if (fPropertyChangeListener != null)
-			SearchPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(fPropertyChangeListener);
-		if (fCellEditorActionHandler != null) {
-			fCellEditorActionHandler.dispose();
-			fCellEditorActionHandler= null;
-		}
-		super.dispose();
-	}
-
-	@Override
-	protected void setContentDescription(String title) {
-		super.setContentDescription(title);
-	}
-
-	@Override
-	protected void setTitleToolTip(String text) {
-		super.setTitleToolTip(text);
-	}
-
-	//---- Adding Action to Toolbar -------------------------------------------
-
-	private void fillActionBars(IActionBars actionBars) {
-		IToolBarManager toolBar= actionBars.getToolBarManager();
-		fillToolBar(toolBar);
-		actionBars.updateActionBars();
-
-		// Add selectAll action handlers.
-		actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), fSelectAllAction);
-	}
-
-	private void fillToolBar(IToolBarManager tbm) {
-		fViewer.fillToolBar(tbm);
-	}
-
-	ILabelProvider getLabelProvider(String pageId) {
-		if (pageId != null)
-			return fgLabelProviders.get(pageId);
-		return null;
-	}
-
-	@Override
-	public ILabelProvider getLabelProvider() {
-		if (fViewer == null)
-			return null;
-		IBaseLabelProvider labelProvider= fViewer.getLabelProvider();
-		if (labelProvider == null)
-			return null;
-
-		return ((SearchResultLabelProvider)labelProvider).getLabelProvider();
-	}
-
-	private void setGotoMarkerAction(final IAction gotoMarkerAction) {
-		// Make sure we are doing it in the right thread.
-		getDisplay().syncExec(() -> getViewer().setGotoMarkerAction(gotoMarkerAction));
-	}
-
-
-	Display getDisplay() {
-		return fViewer.getControl().getDisplay();
-	}
-
-
-	//---- ISearchResultView --------------------------------------------------
-
-
-	/*
-	 * Implements method from ISearchResultView
-	 */
-	@Override
-	public ISelection getSelection() {
-		return fViewer.getSelection();
-	}
-
-	/*
-	 * Implements method from ISearchResultView
-	 */
-	@Override
-	public void searchStarted(
-				IActionGroupFactory		groupFactory,
-				String					singularLabel,
-				String					pluralLabelPattern,
-				ImageDescriptor			imageDescriptor,
-				String					pageId,
-				ILabelProvider			labelProvider,
-				IAction					gotoAction,
-				IGroupByKeyComputer		groupByKeyComputer,
-				IRunnableWithProgress	operation) {
-
-
-		Assert.isNotNull(pageId);
-		Assert.isNotNull(pluralLabelPattern);
-		Assert.isNotNull(gotoAction);
-
-		fResponse= new HashMap<>(500);
-		setGotoMarkerAction(gotoAction);
-
-		ILabelProvider oldLabelProvider= fgLabelProviders.get(pageId);
-		if (oldLabelProvider != null)
-			oldLabelProvider.dispose();
-		fgLabelProviders.put(pageId, labelProvider);
-
-		SearchManager.getDefault().addNewSearch(
-			new Search(
-				pageId,
-				singularLabel,
-				pluralLabelPattern,
-				null,
-				imageDescriptor,
-				fViewer.getGotoMarkerAction(),
-				groupFactory,
-				groupByKeyComputer,
-				operation));
-	}
-
-	@Override
-	public void searchStarted(
-				String					pageId,
-				String					label,
-				ImageDescriptor			imageDescriptor,
-				IContextMenuContributor contributor,
-				ILabelProvider			labelProvider,
-				IAction					gotoAction,
-				IGroupByKeyComputer		groupByKeyComputer,
-				IRunnableWithProgress	operation) {
-
-		searchStarted(pageId, null, label, imageDescriptor, contributor, labelProvider, gotoAction, groupByKeyComputer, operation);
-	}
-
-	/*
-	 * Implements method from ISearchResultView
-	 * @deprecated	As of build > 20020514
-	 */
-	@Override
-	public void searchStarted(
-				String					pageId,
-				String					singularLabel,
-				String					pluralLabelPattern,
-				ImageDescriptor			imageDescriptor,
-				IContextMenuContributor contributor,
-				ILabelProvider			labelProvider,
-				IAction					gotoAction,
-				IGroupByKeyComputer		groupByKeyComputer,
-				IRunnableWithProgress	operation) {
-
-
-		Assert.isNotNull(pageId);
-		Assert.isNotNull(pluralLabelPattern);
-		Assert.isNotNull(gotoAction);
-
-		fResponse= new HashMap<>(500);
-		setGotoMarkerAction(gotoAction);
-
-		ILabelProvider oldLabelProvider= fgLabelProviders.get(pageId);
-		if (oldLabelProvider != null)
-			oldLabelProvider.dispose();
-		fgLabelProviders.put(pageId, labelProvider);
-
-		SearchManager.getDefault().addNewSearch(
-			new Search(
-				pageId,
-				singularLabel,
-				pluralLabelPattern,
-				null,
-				imageDescriptor,
-				fViewer.getGotoMarkerAction(),
-				contributor,
-				groupByKeyComputer,
-				operation));
-	}
-
-	/*
-	 * Implements method from ISearchResultView
-	 */
-	@Override
-	public void addMatch(String description, Object groupByKey, IResource resource, IMarker marker) {
-		SearchResultViewEntry entry= fResponse.get(groupByKey);
-		if (entry == null) {
-			entry= new SearchResultViewEntry(groupByKey, resource);
-			fResponse.put(groupByKey, entry);
-		}
-		entry.add(marker);
-	}
-
-
-	/*
-	 * Implements method from ISearchResultView
-	 */
-	@Override
-	public void searchFinished() {
-		SearchManager.getDefault().searchFinished(new ArrayList<>(fResponse.values()));
-		fResponse= null;
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewEntry.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewEntry.java
deleted file mode 100644
index 02fd436..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewEntry.java
+++ /dev/null
@@ -1,211 +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.search.internal.ui;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.PlatformObject;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.search.ui.ISearchResultViewEntry;
-import org.eclipse.search.ui.SearchUI;
-
-/**
- * Represents an entry in the search result view
- * @deprecated old search
- */
-@Deprecated
-public class SearchResultViewEntry extends PlatformObject implements ISearchResultViewEntry {
-
-	private Object fGroupByKey= null;
-	private IResource fResource= null;
-	private IMarker fMarker= null;
-	private ArrayList<IMarker> fMarkers= null;
-	private ArrayList<Map<String, Object>> fAttributes;
-	private int fSelectedMarkerIndex;
-	private long fModificationStamp= IResource.NULL_STAMP;
-	private String fMarkerType;
-
-	public SearchResultViewEntry(Object groupByKey, IResource resource) {
-		fGroupByKey= groupByKey;
-		fResource= resource;
-		if (fResource != null)
-			fModificationStamp= fResource.getModificationStamp();
-	}
-
-	//---- Accessors ------------------------------------------------
-	@Override
-	public Object getGroupByKey() {
-		return fGroupByKey;
-	}
-
-	void setGroupByKey(Object groupByKey) {
-		fGroupByKey= groupByKey;
-	}
-
-	@Override
-	public IResource getResource() {
-		return fResource;
-	}
-
-	@Override
-	public int getMatchCount() {
-		if (fMarkers != null)
-			return fMarkers.size();
-		if (fMarkers == null && fMarker != null)
-			return 1;
-		return 0;
-	}
-
-	boolean isPotentialMatch() {
-		if (fMarker != null)
-			return fMarker.getAttribute(SearchUI.POTENTIAL_MATCH, false);
-		return false;
-	}
-
-	List<Map<String, Object>> getAttributesPerMarker() {
-		if (fAttributes == null)
-			return new ArrayList<>(0);
-		return fAttributes;
-	}
-
-	public long getModificationStamp() {
-		return fModificationStamp;
-	}
-
-	void clearMarkerList() {
-		fMarker= null;
-		if (fMarkers != null)
-			fMarkers.clear();
-	}
-
-	void add(IMarker marker) {
-		if (marker != null && fMarkerType == null) {
-			try {
-				fMarkerType= marker.getType();
-			} catch (CoreException ex) {
-				// will default to org.eclipse.search.searchmarker
-			}
-		}
-
-		if (fMarker == null) {
-			fMarker= marker;
-			if (fMarkers != null)
-				fMarkers.add(marker);
-			return;
-		}
-		if (fMarkers == null) {
-			fMarkers= new ArrayList<>(10);
-			addByStartpos(fMarkers, fMarker);
-		}
-		addByStartpos(fMarkers, marker);
-	}
-
-	void setSelectedMarkerIndex(int index) {
-		fSelectedMarkerIndex= index;
-	}
-
-	@Override
-	public IMarker getSelectedMarker() {
-		fSelectedMarkerIndex= Math.min(fSelectedMarkerIndex, getMatchCount() - 1);
-		if (fMarkers == null && fMarker == null)
-			return null;
-		if (fMarkers != null && fSelectedMarkerIndex >= 0)
-			return fMarkers.get(fSelectedMarkerIndex);
-		return fMarker;
-	}
-
-	public List<IMarker> getMarkers() {
-		if (fMarkers == null && fMarker == null)
-			return new ArrayList<>(0);
-		else if (fMarkers == null && fMarker != null) {
-			List<IMarker> markers= new ArrayList<>(1);
-			markers.add(fMarker);
-			return markers;
-		}
-		return fMarkers;
-	}
-
-	String getMarkerType() {
-		if (fMarkerType == null)
-			return SearchUI.SEARCH_MARKER;
-		return fMarkerType;
-	}
-
-	boolean contains(IMarker marker) {
-		if (fMarkers == null && fMarker == null)
-			return false;
-		if (fMarkers == null)
-			return fMarker.equals(marker);
-		return fMarkers.contains(marker);
-	}
-
-	void remove(IMarker marker) {
-		if (marker == null)
-			return;
-
-		if (fMarkers == null) {
-			if (fMarker != null && fMarker.equals(marker))
-				fMarker= null;
-		}
-		else {
-			fMarkers.remove(marker);
-			if (fMarkers.size() == 1) {
-				fMarker= fMarkers.get(0);
-				fMarkers= null;
-			}
-		}
-	}
-
-	void backupMarkers() {
-		if (fResource != null)
-			fModificationStamp= fResource.getModificationStamp();
-		List<IMarker> markers= getMarkers();
-		fAttributes= new ArrayList<>(markers.size());
-		Iterator<IMarker> iter= markers.iterator();
-		while (iter.hasNext()) {
-			IMarker marker= iter.next();
-			Map<String, Object> attributes= null;
-			try {
-				attributes= marker.getAttributes();
-			} catch (CoreException ex) {
-				// don't backup corrupt marker
-				continue;
-			}
-			fAttributes.add(attributes);
-		}
-	}
-
-	private void addByStartpos(ArrayList<IMarker> markers, IMarker marker) {
-		int startPos= marker.getAttribute(IMarker.CHAR_START, -1);
-		int i= 0;
-		int markerCount= markers.size();
-		while (i < markerCount && startPos >= markers.get(i).getAttribute(IMarker.CHAR_START, -1))
-			i++;
-		markers.add(i, marker);
-		if (i == 0)
-			fMarker= marker;
-	}
-
-	@Override
-	public <T> T getAdapter(Class<T> adapter) {
-		return super.getAdapter(adapter);
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewEntryAdapterFactory.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewEntryAdapterFactory.java
deleted file mode 100644
index f82258e..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewEntryAdapterFactory.java
+++ /dev/null
@@ -1,65 +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.search.internal.ui;
-
-
-import org.eclipse.core.runtime.IAdapterFactory;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.search.ui.ISearchResultViewEntry;
-
-/**
- * Implements basic UI support for Java elements.
- * Implements handle to persistent support for Java elements.
- * @deprecated old search
- */
-@Deprecated
-public class SearchResultViewEntryAdapterFactory implements IAdapterFactory {
-
-	private static Class<?>[] PROPERTIES= new Class[] {
-		IResource.class, IMarker.class,
-	};
-
-
-	@Override
-	public Class<?>[] getAdapterList() {
-		return PROPERTIES;
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public <T> T getAdapter(Object element, Class<T> key) {
-
-		ISearchResultViewEntry entry= (ISearchResultViewEntry) element;
-
-		if (IMarker.class.equals(key)) {
-			return (T) entry.getSelectedMarker();
-		}
-		if (IResource.class.equals(key)) {
-			IResource resource= entry.getResource();
-			/*
-			 * This is a trick to filter out dummy markers that
-			 * have been attached to a project because there is no
-			 * corresponding resource in the workspace.
-			 */
-			int type= resource.getType();
-			if (type != IResource.PROJECT && type != IResource.ROOT)
-				return (T) resource;
-		}
-		return null;
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewer.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewer.java
deleted file mode 100644
index f28beb8..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SearchResultViewer.java
+++ /dev/null
@@ -1,717 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2021 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
- *     Michael Fraenkel (fraenkel@us.ibm.com) - contributed a fix for:
- *       o New search view sets incorrect title
- *         (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=60966)
- *******************************************************************************/
-package org.eclipse.search.internal.ui;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Widget;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.ActionGroup;
-
-import org.eclipse.search.internal.ui.util.FileLabelProvider;
-import org.eclipse.search.ui.IActionGroupFactory;
-import org.eclipse.search.ui.IContextMenuConstants;
-import org.eclipse.search.ui.IContextMenuContributor;
-import org.eclipse.search.ui.ISearchResultViewEntry;
-import org.eclipse.search.ui.SearchUI;
-
-/**
- * A special viewer to present search results. The viewer implements an
- * optimized adding and removing strategy. Furthermore it manages
- * contributions for search result types. For example the viewer's context
- * menu differs if the search result has been generated by a text or
- * a java search.
- * @deprecated old search
- */
-@Deprecated
-public class SearchResultViewer extends TableViewer {
-
-	private SearchResultView fOuterPart;
-	private ShowNextResultAction fShowNextResultAction;
-	private ShowPreviousResultAction fShowPreviousResultAction;
-	private GotoMarkerAction fGotoMarkerActionProxy;
-	private SearchAgainAction fSearchAgainAction;
-	private RemoveResultAction fRemoveSelectedMatchesAction;
-	private RemoveAllResultsAction fRemoveAllResultsAction;
-	private SortDropDownAction fSortDropDownAction;
-	private SearchDropDownAction fSearchDropDownAction;
-	private CopyToClipboardAction fCopyToClipboardAction;
-	private int fMarkerToShow;
-	private boolean fHandleSelectionChangedEvents= true;
-	private ISelection fLastSelection;
-	private boolean fCurrentMatchRemoved= false;
-	private Color fPotentialMatchFgColor;
-	private ActionGroup fActionGroup;
-	private IContextMenuContributor fContextMenuContributor;
-	private IAction fGotoMarkerAction;
-
-	private ResourceToItemsMapper fResourceToItemsMapper;
-	private String fCurrentPageId= null;
-
-	public SearchResultViewer(SearchResultView outerPart, Composite parent) {
-		super(new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
-
-		fResourceToItemsMapper= new ResourceToItemsMapper(this);
-
-		fOuterPart= outerPart;
-		Assert.isNotNull(fOuterPart);
-
-		if (SearchPreferencePage.arePotentialMatchesEmphasized())
-			fPotentialMatchFgColor= new Color(SearchPlugin.getActiveWorkbenchShell().getDisplay(), SearchPreferencePage.getPotentialMatchForegroundColor());
-
-		setUseHashlookup(true);
-		setContentProvider(ArrayContentProvider.getInstance());
-
-		ILabelProvider labelProvider= new SearchResultLabelProvider(new FileLabelProvider(FileLabelProvider.SHOW_LABEL));
-		setLabelProvider(labelProvider);
-
-		Search currentSearch= SearchManager.getDefault().getCurrentSearch();
-		boolean hasSearch= currentSearch != null;
-		boolean hasSearchOperation= currentSearch != null && currentSearch.getOperation() != null;
-
-		fShowNextResultAction= new ShowNextResultAction(this);
-		fShowNextResultAction.setEnabled(false);
-		fShowPreviousResultAction= new ShowPreviousResultAction(this);
-		fShowPreviousResultAction.setEnabled(false);
-		fGotoMarkerActionProxy= new GotoMarkerAction(this);
-		fGotoMarkerActionProxy.setEnabled(false);
-		fRemoveSelectedMatchesAction= new RemoveResultAction(this, false);
-		fRemoveSelectedMatchesAction.setEnabled(false);
-		fRemoveAllResultsAction= new RemoveAllResultsAction();
-		fRemoveAllResultsAction.setEnabled(false);
-		fSearchAgainAction= new SearchAgainAction();
-		fSearchAgainAction.setEnabled(hasSearchOperation);
-		fSortDropDownAction = new SortDropDownAction(this);
-		fSortDropDownAction.setEnabled(getItemCount() > 0);
-		fSearchDropDownAction= new SearchDropDownAction();
-		fSearchDropDownAction.setEnabled(hasSearch);
-		fCopyToClipboardAction= new CopyToClipboardAction(this);
-
-		addSelectionChangedListener(
-			event -> {
-				if (fLastSelection == null || !fLastSelection.equals(event.getSelection())) {
-					fLastSelection= event.getSelection();
-					handleSelectionChanged();
-				}
-			}
-		);
-
-		addOpenListener(event -> showResult());
-
-		MenuManager menuMgr= new MenuManager("#PopUp"); //$NON-NLS-1$
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(
-			mgr -> {
-				SearchPlugin.createStandardGroups(mgr);
-				fillContextMenu(mgr);
-			});
-		Menu menu= menuMgr.createContextMenu(getTable());
-		getTable().setMenu(menu);
-
-		// Register menu
-		fOuterPart.getSite().registerContextMenu(menuMgr, this);
-
-		IActionBars actionBars= fOuterPart.getViewSite().getActionBars();
-		if (actionBars != null) {
-			actionBars.setGlobalActionHandler(ActionFactory.NEXT.getId(), fShowNextResultAction);
-			actionBars.setGlobalActionHandler(ActionFactory.PREVIOUS.getId(), fShowPreviousResultAction);
-		}
-
-		fOuterPart.getSite().setSelectionProvider(this);
-	}
-
-	void init() {
-		Search search= SearchManager.getDefault().getCurrentSearch();
-		if (search != null) {
-			setGotoMarkerAction(search.getGotoMarkerAction());
-			setContextMenuTarget(search.getContextMenuContributor());
-			setActionGroupFactory(null);
-			setActionGroupFactory(search.getActionGroupFactory());
-			setPageId(search.getPageId());
-			setInput(search.getResults());
-		}
-	}
-
-	@Override
-	protected void doUpdateItem(Widget item, Object element, boolean fullMap) {
-		super.doUpdateItem(item, element, fullMap);
-		if (((SearchResultViewEntry)element).isPotentialMatch()) {
-			TableItem ti = (TableItem) item;
-			ti.setForeground(fPotentialMatchFgColor);
-		}
-	}
-
-	private void handleSelectionChanged() {
-		int selectionCount= getSelectedEntriesCount();
-		boolean hasSingleSelection= selectionCount == 1;
-		boolean hasElements= getItemCount() > 0;
-		fShowNextResultAction.setEnabled(hasSingleSelection || (hasElements && selectionCount == 0));
-		fShowPreviousResultAction.setEnabled(hasSingleSelection || (hasElements && selectionCount == 0));
-		fGotoMarkerActionProxy.setEnabled(hasSingleSelection);
-		fRemoveSelectedMatchesAction.setEnabled(selectionCount > 0);
-
-		if (fHandleSelectionChangedEvents) {
-			fMarkerToShow= -1;
-			fCurrentMatchRemoved= false;
-		} else
-			fHandleSelectionChangedEvents= true;
-
-		updateStatusLine();
-	}
-
-	void updateStatusLine() {
-		boolean hasSingleSelection= getSelectedEntriesCount() == 1;
-		String location= ""; //$NON-NLS-1$
-		if (hasSingleSelection) {
-			ISearchResultViewEntry entry= (ISearchResultViewEntry)getTable().getItem(getTable().getSelectionIndex()).getData();
-			IPath path= entry.getResource().getFullPath();
-			if (path != null)
-				location= path.makeRelative().toString();
-		}
-		setStatusLineMessage(location);
-	}
-
-	void enableActions() {
-		/*
-		 * Note: The check before each set operation reduces flickering
-		 */
-		boolean state= getItemCount() > 0;
-		if (state != fShowNextResultAction.isEnabled())
-			fShowNextResultAction.setEnabled(state);
-		if (state != fShowPreviousResultAction.isEnabled())
-			fShowPreviousResultAction.setEnabled(state);
-		if (state != fSortDropDownAction.isEnabled())
-			fSortDropDownAction.setEnabled(state);
-		if (state != fRemoveAllResultsAction.isEnabled())
-			fRemoveAllResultsAction.setEnabled(state);
-
-		Search currentSearch= SearchManager.getDefault().getCurrentSearch();
-		state= currentSearch != null;
-		boolean operationState= currentSearch != null && currentSearch.getOperation() != null;
-		if (state != fSearchDropDownAction.isEnabled())
-			fSearchDropDownAction.setEnabled(state);
-		if (operationState != fSearchAgainAction.isEnabled())
-			fSearchAgainAction.setEnabled(operationState);
-
-		state= !getSelection().isEmpty();
-		if (state != fGotoMarkerActionProxy.isEnabled())
-			fGotoMarkerActionProxy.setEnabled(state);
-		if (state != fRemoveSelectedMatchesAction.isEnabled())
-			fRemoveSelectedMatchesAction.setEnabled(state);
-	}
-
-
-	@Override
-	protected void inputChanged(Object input, Object oldInput) {
-		fLastSelection= null;
-		getTable().removeAll();
-		super.inputChanged(input, oldInput);
-		fMarkerToShow= -1;
-		fCurrentMatchRemoved= false;
-		updateTitle();
-		enableActions();
-		if (getItemCount() > 0)
-			selectResult(0);
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), SearchPlugin.getDefault().getSearchViewHelpContextId());
-	}
-
-	protected int getSelectedEntriesCount() {
-		ISelection s= getSelection();
-		if (s == null || s.isEmpty() || !(s instanceof IStructuredSelection))
-			return 0;
-		IStructuredSelection selection= (IStructuredSelection)s;
-		return selection.size();
-	}
-
-	//--- Contribution management -----------------------------------------------
-
-
-	protected boolean enableRemoveMatchMenuItem() {
-		if (getSelectedEntriesCount() != 1)
-			return false;
-		Table table= getTable();
-		int index= table.getSelectionIndex();
-		SearchResultViewEntry entry= null;
-		if (index > -1)
-			entry= (SearchResultViewEntry)table.getItem(index).getData();
-		return (entry != null && entry.getMatchCount() > 1);
-
-	}
-
-	void fillContextMenu(IMenuManager menu) {
-		ISelection selection= getSelection();
-
-		if (fActionGroup != null) {
-			ActionContext context= new ActionContext(selection);
-			context.setInput(getInput());
-			fActionGroup.setContext(context);
-			fActionGroup.fillContextMenu(menu);
-			fActionGroup.setContext(null);
-		}
-
-		if (fContextMenuContributor != null)
-			fContextMenuContributor.fill(menu, this);
-
-		if (!selection.isEmpty()) {
-			menu.appendToGroup(IContextMenuConstants.GROUP_REORGANIZE, fCopyToClipboardAction);
-			menu.appendToGroup(IContextMenuConstants.GROUP_GOTO, fGotoMarkerActionProxy);
-			if (enableRemoveMatchMenuItem())
-				menu.appendToGroup(IContextMenuConstants.GROUP_REMOVE_MATCHES, new RemoveMatchAction(this));
-			menu.appendToGroup(IContextMenuConstants.GROUP_REMOVE_MATCHES, new RemoveResultAction(this, true));
-
-			if (isPotentialMatchSelected())
-				menu.appendToGroup(IContextMenuConstants.GROUP_REMOVE_MATCHES, new RemovePotentialMatchesAction(fOuterPart.getViewSite()));
-		}
-
-		// If we have elements
-		if (getItemCount() > 0)
-			menu.appendToGroup(IContextMenuConstants.GROUP_REMOVE_MATCHES, new RemoveAllResultsAction());
-
-		menu.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, fSearchAgainAction);
-		if (getItemCount() > 0) {
-			fSortDropDownAction= fSortDropDownAction.renew();
-			if (fSortDropDownAction.getSorterCount() > 1)
-				menu.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, fSortDropDownAction);
-		}
-	}
-
-	private boolean isPotentialMatchSelected() {
-		if (getSelectedEntriesCount() == 0)
-			return false;
-
-		Iterator<?> iter= Collections.emptyList().iterator();
-		ISelection selection= getSelection();
-		if (selection instanceof IStructuredSelection)
-			iter= ((IStructuredSelection)selection).iterator();
-
-		while (iter.hasNext()) {
-			Object entry= iter.next();
-			if (entry instanceof ISearchResultViewEntry) {
-				IMarker marker= ((ISearchResultViewEntry)entry).getSelectedMarker();
-				if (marker != null && marker.getAttribute(SearchUI.POTENTIAL_MATCH, false))
-					return true;
-			}
-		}
-
-		return false;
-	}
-
-	IAction getGotoMarkerAction() {
-		// null as return value is covered (no action will take place)
-		return fGotoMarkerAction;
-	}
-
-	void setGotoMarkerAction(IAction gotoMarkerAction) {
-		fGotoMarkerAction= gotoMarkerAction;
-	}
-
-
-	void setContextMenuTarget(IContextMenuContributor contributor) {
-		fContextMenuContributor= contributor;
-	}
-
-	void setActionGroupFactory(IActionGroupFactory groupFactory) {
-		IActionBars actionBars= fOuterPart.getViewSite().getActionBars();
-		if (fActionGroup != null) {
-			fActionGroup.dispose();
-			fActionGroup= null;
-		}
-
-		if (groupFactory != null) {
-			fActionGroup= groupFactory.createActionGroup(fOuterPart);
-			if (actionBars != null)
-				fActionGroup.fillActionBars(actionBars);
-		}
-		if (actionBars != null)
-			actionBars.updateActionBars();
-	}
-
-	void setPageId(String pageId) {
-		if (fCurrentPageId != null && fCurrentPageId.equals(pageId))
-			return;
-
-		fCurrentPageId= pageId;
-		ILabelProvider labelProvider= fOuterPart.getLabelProvider(pageId);
-		if (labelProvider != null)
-			internalSetLabelProvider(labelProvider);
-		fSortDropDownAction.setPageId(pageId);
-	}
-
-	void fillToolBar(IToolBarManager tbm) {
-		tbm.add(fShowNextResultAction);
-		tbm.add(fShowPreviousResultAction);
-//		tbm.add(fGotoMarkerAction); see bug 15275
-		tbm.add(fRemoveSelectedMatchesAction);
-		tbm.add(fRemoveAllResultsAction);
-		tbm.add(new Separator());
-		tbm.add(new OpenSearchDialogAction());
-		tbm.add(fSearchDropDownAction);
-
-		// need to hook F5 to table
-		getTable().addKeyListener(new KeyAdapter() {
-			@Override
-			public void keyReleased(KeyEvent e) {
-				if (e.keyCode == SWT.F5) {
-					fSearchAgainAction.run();
-					return;	// performance
-				}
-				if (e.character == SWT.DEL) {
-					new RemoveResultAction(SearchResultViewer.this, true).run();
-					return; // performance
-				}
-			}
-		});
-	}
-
-	int getItemCount() {
-		return SearchManager.getDefault().getCurrentItemCount();
-	}
-
-	void internalSetLabelProvider(ILabelProvider provider) {
-		setLabelProvider(new SearchResultLabelProvider(provider));
-	}
-
-	/**
-	 * Makes the first marker of the current result entry
-	 * visible in an editor. If no result
-	 * is visible, this method does nothing.
-	 */
-	public void showResult() {
-		Table table= getTable();
-		if (!canDoShowResult(table))
-			return;
-
-
-		int index= table.getSelectionIndex();
-		if (index < 0)
-			return;
-		SearchResultViewEntry entry= (SearchResultViewEntry)getTable().getItem(index).getData();
-
-
-		fMarkerToShow= 0;
-		fCurrentMatchRemoved= false;
-		entry.setSelectedMarkerIndex(0);
-		openCurrentSelection();
-	}
-
-
-	/**
-	 * Makes the next result (marker) visible in an editor. If no result
-	 * is visible, this method makes the first result visible.
-	 */
-	public void showNextResult() {
-		Table table= getTable();
-		if (!canDoShowResult(table))
-			return;
-
-		int index= table.getSelectionIndex();
-		SearchResultViewEntry entry= null;
-		if (index > -1)
-			entry= (SearchResultViewEntry)table.getItem(index).getData();
-
-		if (fCurrentMatchRemoved)
-			fCurrentMatchRemoved= false;
-		else
-			fMarkerToShow++;
-		if (entry == null || fMarkerToShow >= entry.getMatchCount()) {
-			// move selection
-			if (index == -1) {
-				index= 0;
-			} else {
-				index++;
-				if (index >= table.getItemCount())
-					index= 0;
-			}
-			fMarkerToShow= 0;
-			entry= (SearchResultViewEntry)getTable().getItem(index).getData();
-			selectResult(index);
-		}
-		entry.setSelectedMarkerIndex(fMarkerToShow);
-		openCurrentSelection();
-		updateStatusLine();
-	}
-
-
-	/**
-	 * Makes the previous result (marker) visible. If there isn't any
-	 * visible result, this method makes the last result visible.
-	 */
-	public void showPreviousResult() {
-		fCurrentMatchRemoved= false;
-		Table table= getTable();
-		if (!canDoShowResult(table))
-			return;
-
-		int index= table.getSelectionIndex();
-		SearchResultViewEntry entry;
-
-
-		fMarkerToShow--;
-		if (fMarkerToShow >= 0)
-			entry= (SearchResultViewEntry)getTable().getItem(getTable().getSelectionIndex()).getData();
-		else {
-			// move selection
-			int count= table.getItemCount();
-			if (index == -1) {
-				index= count - 1;
-			} else {
-				index--;
-				if (index < 0)
-					index= count - 1;
-			}
-			entry= (SearchResultViewEntry)getTable().getItem(index).getData();
-			fMarkerToShow= entry.getMatchCount() - 1;
-			selectResult(index);
-		}
-		entry.setSelectedMarkerIndex(fMarkerToShow);
-		openCurrentSelection();
-		updateStatusLine();
-	}
-
-	private boolean canDoShowResult(Table table) {
-		if (table == null || getItemCount() == 0)
-			return false;
-		return true;
-	}
-
-	private void selectResult(int index) {
-		fHandleSelectionChangedEvents= false;
-		Object element= getElementAt(index);
-		if (element != null)
-			setSelection(new StructuredSelection(getElementAt(index)), true);
-		else
-			setSelection(StructuredSelection.EMPTY);
-	}
-
-	private void openCurrentSelection() {
-		IAction action= getGotoMarkerAction();
-		if (action != null)
-			action.run();
-	}
-
-	/**
-	 * Updates the foreground color for potential matches.
-	 */
-	void updatedPotentialMatchFgColor() {
-		fPotentialMatchFgColor= null;
-		if (SearchPreferencePage.arePotentialMatchesEmphasized())
-			fPotentialMatchFgColor= new Color(SearchPlugin.getActiveWorkbenchShell().getDisplay(), SearchPreferencePage.getPotentialMatchForegroundColor());
-		refresh();
-	}
-
-	/**
-	 * Update the title
-	 */
-	protected void updateTitle() {
-		boolean hasCurrentSearch= SearchManager.getDefault().getCurrentSearch() != null;
-		String title;
-		if (hasCurrentSearch) {
-			String description= SearchManager.getDefault().getCurrentSearch().getFullDescription();
-			title= Messages.format(SearchMessages.SearchResultView_titleWithDescription, description);
-		} else
-			title= SearchMessages.SearchResultView_title;
-		if (title == null || !title.equals(fOuterPart.getContentDescription()))
-			fOuterPart.setContentDescription(title);
-	}
-
-	/**
-	 * Clear the title
-	 */
-	protected void clearTitle() {
-		String title= SearchMessages.SearchResultView_title;
-		if (!title.equals(fOuterPart.getContentDescription()))
-			fOuterPart.setContentDescription(title);
-	}
-
-	/**
-	 * Sets the message text to be displayed on the status line.
-	 * The image on the status line is cleared.
-	 * @param message the message
-	 */
-	private void setStatusLineMessage(String message) {
-		fOuterPart.getViewSite().getActionBars().getStatusLineManager().setMessage(message);
-	}
-
-
-	@Override
-	protected void handleDispose(DisposeEvent event) {
-		fLastSelection= null;
-		Menu menu= getTable().getMenu();
-		if (menu != null)
-			menu.dispose();
-		if (fActionGroup != null) {
-			fActionGroup.dispose();
-			fActionGroup= null;
-		}
-		super.handleDispose(event);
-	}
-
-	//--- Change event handling -------------------------------------------------
-
-	/**
-	 * Handle a single add.
-	 * @param entry the entry to add
-	 */
-	protected void handleAddMatch(ISearchResultViewEntry entry) {
-		insert(entry, -1);
-	}
-
-	/**
-	 * Handle a single remove.
-	 * @param entry the entry to remove
-	 */
-	protected void handleRemoveMatch(ISearchResultViewEntry entry) {
-		Widget item= findItem(entry);
-		if (entry.getMatchCount() == 0)
-			remove(entry);
-		else
-			updateItem(item, entry);
-		updateStatusLine();
-	}
-
-	/**
-	 * Handle remove all.
-	 */
-	protected void handleRemoveAll() {
-		setContextMenuTarget(null);
-		setActionGroupFactory(null);
-		setInput(null);
-	}
-
-	/**
-	 * Handle an update of an entry.
-	 *
-	 * @param entry the entry
-	 * @param matchRemoved <code>true</code> if a match got removed
-	 */
-	protected void handleUpdateMatch(ISearchResultViewEntry entry, boolean matchRemoved) {
-		Widget item= findItem(entry);
-		updateItem(item, entry);
-		if (matchRemoved && getSelectionFromWidget().contains(entry))
-			fCurrentMatchRemoved= true;
-	}
-
-	//--- Persistency -------------------------------------------------
-
-	void restoreState(IMemento memento) {
-		fSortDropDownAction.restoreState(memento);
-	}
-
-	void saveState(IMemento memento) {
-		fSortDropDownAction.saveState(memento);
-	}
-
-	@Override
-	protected void handleLabelProviderChanged(LabelProviderChangedEvent event) {
-		Object[] changed= event.getElements();
-		if (changed != null && !fResourceToItemsMapper.isEmpty()) {
-			ArrayList<Object> others= new ArrayList<>(changed.length);
-			for (Object curr : changed) {
-				if (curr instanceof IResource)
-					fResourceToItemsMapper.resourceChanged((IResource) curr);
-				else if (curr instanceof IAdaptable) {
-					IResource resource= ((IAdaptable)curr).getAdapter(IResource.class);
-					if (resource != null)
-						fResourceToItemsMapper.resourceChanged(resource);
-				} else
-					others.add(curr);
-			}
-			if (others.isEmpty()) {
-				return;
-			}
-			event= new LabelProviderChangedEvent((IBaseLabelProvider) event.getSource(), others.toArray());
-		}
-		super.handleLabelProviderChanged(event);
-	}
-
-	@Override
-	protected void mapElement(Object element, Widget item) {
-		super.mapElement(element, item);
-		if (item instanceof Item) {
-			fResourceToItemsMapper.addToMap(element, (Item)item);
-		}
-	}
-
-	@Override
-	protected void unmapElement(Object element, Widget item) {
-		if (item instanceof Item) {
-			fResourceToItemsMapper.removeFromMap(element, (Item)item);
-		}
-		super.unmapElement(element, item);
-	}
-
-	@Override
-	protected void unmapAllElements() {
-		fResourceToItemsMapper.clearMap();
-		super.unmapAllElements();
-	}
-
-	@Override
-	protected void internalRefresh(Object element, boolean updateLabels) {
-		// see bug 44891
-		getTable().setRedraw(false);
-		super.internalRefresh(element, updateLabels);
-		getTable().setRedraw(true);
-	}
-
-	void handleAllSearchesRemoved() {
-		setContextMenuTarget(null);
-		setActionGroupFactory(null);
-		setInput(null);
-		fSearchDropDownAction.clear();
-	}
-
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowNextResultAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowNextResultAction.java
deleted file mode 100644
index 43f566a..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowNextResultAction.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 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.search.internal.ui;
-
-import org.eclipse.jface.action.Action;
-
-import org.eclipse.ui.IWorkbenchCommandConstants;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class ShowNextResultAction extends Action {
-
-	private SearchResultViewer fViewer;
-
-	public ShowNextResultAction(SearchResultViewer viewer) {
-		super(SearchMessages.SearchResultView_showNext_text);
-		SearchPluginImages.setImageDescriptors(this, SearchPluginImages.T_LCL, SearchPluginImages.IMG_LCL_SEARCH_NEXT);
-		setToolTipText(SearchMessages.SearchResultView_showNext_tooltip);
-		fViewer= viewer;
-		setActionDefinitionId(IWorkbenchCommandConstants.NAVIGATE_NEXT);
-	}
-
-	@Override
-	public void run() {
-		fViewer.showNextResult();
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowPreviousResultAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowPreviousResultAction.java
deleted file mode 100644
index 9b461d4..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowPreviousResultAction.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 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.search.internal.ui;
-
-import org.eclipse.jface.action.Action;
-
-import org.eclipse.ui.IWorkbenchCommandConstants;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class ShowPreviousResultAction extends Action {
-
-	private SearchResultViewer fViewer;
-
-	public ShowPreviousResultAction(SearchResultViewer viewer) {
-		super(SearchMessages.SearchResultView_showPrev_text);
-		SearchPluginImages.setImageDescriptors(this, SearchPluginImages.T_LCL, SearchPluginImages.IMG_LCL_SEARCH_PREV);
-		setToolTipText(SearchMessages.SearchResultView_showPrev_tooltip);
-		setActionDefinitionId(IWorkbenchCommandConstants.NAVIGATE_PREVIOUS);
-		fViewer= viewer;
-	}
-
-	@Override
-	public void run() {
-		fViewer.showPreviousResult();
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowSearchAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowSearchAction.java
deleted file mode 100644
index ef92309..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowSearchAction.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 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.search.internal.ui;
-
-import org.eclipse.jface.action.Action;
-
-/**
- * @deprecated old search
- */
-@Deprecated
-class ShowSearchAction extends Action {
-	private Search fSearch;
-
-	/**
-	 * Create a new instance of this class.
-	 *
-	 * @param search the search
-	 */
-	public ShowSearchAction(Search search) {
-		fSearch= search;
-		String desc= search.getShortDescription();
-		setText(desc);
-		setToolTipText(desc);
-		setImageDescriptor(search.getImageDescriptor());
-	}
-	/**
-	 *	Invoke the resource wizard selection wizard
-	 */
-	@Override
-	public void run() {
-		if (fSearch != SearchManager.getDefault().getCurrentSearch())
-			SearchManager.getDefault().setCurrentSearch(fSearch);
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowSearchesAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowSearchesAction.java
deleted file mode 100644
index 16889b7..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/ShowSearchesAction.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 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.search.internal.ui;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.swt.graphics.Image;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.window.Window;
-
-import org.eclipse.ui.dialogs.ListDialog;
-
-
-/**
- * Invoke the resource creation wizard selection Wizard.
- * This action will retarget to the active view.
- * @deprecated old search
- */
-@Deprecated
-class ShowSearchesAction extends Action {
-
-	private static final class SearchesLabelProvider extends LabelProvider {
-
-		private ArrayList<Image> fImages= new ArrayList<>();
-
-		@Override
-		public String getText(Object element) {
-			if (!(element instanceof ShowSearchAction))
-				return ""; //$NON-NLS-1$
-			return ((ShowSearchAction)element).getText();
-		}
-		@Override
-		public Image getImage(Object element) {
-			if (!(element instanceof ShowSearchAction))
-				return null;
-
-			ImageDescriptor imageDescriptor= ((ShowSearchAction)element).getImageDescriptor();
-			if (imageDescriptor == null)
-				return null;
-
-			Image image= imageDescriptor.createImage();
-			fImages.add(image);
-
-			return image;
-		}
-
-		@Override
-		public void dispose() {
-			Iterator<Image> iter= fImages.iterator();
-			while (iter.hasNext())
-				iter.next().dispose();
-
-			fImages= null;
-		}
-	}
-
-	/**
-	 *	Create a new instance of this class
-	 */
-	public ShowSearchesAction() {
-		super(SearchMessages.ShowOtherSearchesAction_label);
-		setToolTipText(SearchMessages.ShowOtherSearchesAction_tooltip);
-	}
-	/*
-	 * Overrides method from Action
-	 */
-	@Override
-	public void run() {
-		run(false);
-	}
-
-	public void run(boolean showAll) {
-		Iterator<Search> iter= SearchManager.getDefault().getPreviousSearches().iterator();
-		int cutOffSize;
-		if (showAll)
-			cutOffSize= 0;
-		else
-			cutOffSize= SearchDropDownAction.RESULTS_IN_DROP_DOWN;
-		int size= SearchManager.getDefault().getPreviousSearches().size() - cutOffSize;
-		Search selectedSearch= SearchManager.getDefault().getCurrentSearch();
-		Action selectedAction = null;
-		ArrayList<Action> input= new ArrayList<>(size);
-		int i= 0;
-		while (iter.hasNext()) {
-			Search search= iter.next();
-			if (i++ < cutOffSize)
-				continue;
-			Action action= new ShowSearchAction(search);
-			input.add(action);
-			if (selectedSearch == search)
-				selectedAction= action;
-		}
-
-		// Open a list dialog.
-		String title;
-		String message;
-		if (showAll) {
-			title= SearchMessages.PreviousSearchesDialog_title;
-			message= SearchMessages.PreviousSearchesDialog_message;
-		}
-		else {
-			title= SearchMessages.OtherSearchesDialog_title;
-			message= SearchMessages.OtherSearchesDialog_message;
-		}
-
-		LabelProvider labelProvider=new SearchesLabelProvider();
-
-		ListDialog dlg= new ListDialog(SearchPlugin.getActiveWorkbenchShell());
-		dlg.setInput(input);
-		dlg.setTitle(title);
-		dlg.setContentProvider(ArrayContentProvider.getInstance());
-		dlg.setLabelProvider(labelProvider);
-		dlg.setMessage(message);
-		if (selectedAction != null) {
-			Object[] selected= new Object[1];
-			selected[0]= selectedAction;
-			dlg.setInitialSelections(selected);
-		}
-		if (dlg.open() == Window.OK) {
-			List<Object> result= Arrays.asList(dlg.getResult());
-			if (result != null && result.size() == 1) {
-				((ShowSearchAction)result.get(0)).run();
-			}
-		}
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/SortDropDownAction.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/SortDropDownAction.java
deleted file mode 100644
index 6d843df..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/SortDropDownAction.java
+++ /dev/null
@@ -1,226 +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.search.internal.ui;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.model.WorkbenchViewerSorter;
-
-/**
- * Drop down action that holds the currently registered sort actions.
- * @deprecated old search
- */
-@Deprecated
-class SortDropDownAction extends Action implements IMenuCreator {
-
-	// Persistance tags.
-	private static final String TAG_SORTERS= "sorters"; //$NON-NLS-1$
-	private static final String TAG_DEFAULT_SORTERS= "defaultSorters"; //$NON-NLS-1$
-	private static final String TAG_ELEMENT= "element"; //$NON-NLS-1$
-	private static final String TAG_PAGE_ID= "pageId"; //$NON-NLS-1$
-	private static final String TAG_SORTER_ID= "sorterId"; //$NON-NLS-1$
-
-	private static Map<String, SorterDescriptor> fgLastCheckedForType= new HashMap<>(5);
-
-	private SearchResultViewer fViewer;
-	private String fPageId;
-	private Menu fMenu;
-	private Map<String, SorterDescriptor> fLastCheckedForType;
-
-	public SortDropDownAction(SearchResultViewer viewer) {
-		super(SearchMessages.SortDropDownAction_label);
-		SearchPluginImages.setImageDescriptors(this, SearchPluginImages.T_LCL, SearchPluginImages.IMG_LCL_SEARCH_SORT);
-		fViewer= viewer;
-		setToolTipText(SearchMessages.SortDropDownAction_tooltip);
-		setMenuCreator(this);
-		fLastCheckedForType= new HashMap<>(5);
-	}
-
-	@Override
-	public void dispose() {
-		if (fMenu != null && !fMenu.isDisposed())
-			fMenu.dispose();
-		fMenu= null;
-	}
-
-	@Override
-	public Menu getMenu(Control parent) {
-		return null;
-	}
-
-	void setPageId(String pageId) {
-		fPageId= pageId;
-		SorterDescriptor sorterDesc= fLastCheckedForType.get(pageId);
-		if (sorterDesc == null)
-			sorterDesc= fgLastCheckedForType.get(pageId);
-		if (sorterDesc == null)
-			sorterDesc= findSorter(fPageId);
-		if (sorterDesc != null) {
-			setChecked(sorterDesc);
-			fViewer.setSorter(sorterDesc.createObject());
-		} else {
-			// Use default sort workbench viewer sorter
-			fViewer.setSorter(new WorkbenchViewerSorter());
-		}
-	}
-
-	@Override
-	public Menu getMenu(final Menu parent) {
-		dispose(); // ensure old menu gets disposed
-
-		fMenu= new Menu(parent);
-
-		Iterator<SorterDescriptor> iter= SearchPlugin.getDefault().getSorterDescriptors().iterator();
-		while (iter.hasNext()) {
-			Object value= fLastCheckedForType.get(fPageId);
-			final String checkedId;
-			if (value instanceof SorterDescriptor)
-				checkedId= ((SorterDescriptor)value).getId();
-			else
-				checkedId= ""; //$NON-NLS-1$
-
-			final SorterDescriptor sorterDesc= iter.next();
-			if (!sorterDesc.getPageId().equals(fPageId) && !sorterDesc.getPageId().equals("*")) //$NON-NLS-1$
-				continue;
-			final ViewerSorter sorter= sorterDesc.createObject();
-			if (sorter != null) {
-				final Action action= new Action() {
-					@Override
-					public void run() {
-						if (!checkedId.equals(sorterDesc.getId())) {
-							SortDropDownAction.this.setChecked(sorterDesc);
-							BusyIndicator.showWhile(parent.getDisplay(), () -> fViewer.setSorter(sorter));
-						}
-					}
-				};
-				action.setText(sorterDesc.getLabel());
-				action.setImageDescriptor(sorterDesc.getImage());
-				action.setToolTipText(sorterDesc.getToolTipText());
-				action.setChecked(checkedId.equals(sorterDesc.getId()));
-				addActionToMenu(fMenu, action);
-			}
-		}
-		return fMenu;
-	}
-
-	protected void addActionToMenu(Menu parent, Action action) {
-		ActionContributionItem item= new ActionContributionItem(action);
-		item.fill(parent, -1);
-	}
-
-	@Override
-	public void run() {
-		// nothing to do
-	}
-
-	private SorterDescriptor findSorter(String pageId) {
-		Iterator<SorterDescriptor> iter= SearchPlugin.getDefault().getSorterDescriptors().iterator();
-		while (iter.hasNext()) {
-			SorterDescriptor sorterDesc= iter.next();
-			if (sorterDesc.getPageId().equals(pageId) || sorterDesc.getPageId().equals("*")) //$NON-NLS-1$
-				return sorterDesc;
-		}
-		return null;
-	}
-
-	private SorterDescriptor getSorter(String sorterId) {
-		Iterator<SorterDescriptor> iter= SearchPlugin.getDefault().getSorterDescriptors().iterator();
-		while (iter.hasNext()) {
-			SorterDescriptor sorterDesc= iter.next();
-			if (sorterDesc.getId().equals(sorterId))
-				return sorterDesc;
-		}
-		return null;
-	}
-
-	private void setChecked(SorterDescriptor sorterDesc) {
-		fLastCheckedForType.put(fPageId, sorterDesc);
-		fgLastCheckedForType.put(fPageId, sorterDesc);
-	}
-
-	/**
-	 * Disposes this action's menu and returns a new unused instance.
-	 * @return the action
-	 */
-	SortDropDownAction renew() {
-		SortDropDownAction action= new SortDropDownAction(fViewer);
-		action.fLastCheckedForType= fLastCheckedForType;
-		action.fPageId= fPageId;
-		dispose();
-		return action;
-	}
-
-	//--- Persistency -------------------------------------------------
-
-	void restoreState(IMemento memento) {
-		if (fLastCheckedForType.isEmpty())
-			restoreState(memento, fLastCheckedForType, TAG_SORTERS);
-		if (fgLastCheckedForType.isEmpty())
-			restoreState(memento, fgLastCheckedForType, TAG_DEFAULT_SORTERS);
-	}
-
-	private void restoreState(IMemento memento, Map<String, SorterDescriptor> map, String mapName) {
-		memento= memento.getChild(mapName);
-		if (memento == null)
-			return;
-		IMemento[] mementoElements= memento.getChildren(TAG_ELEMENT);
-		for (IMemento mementoElement : mementoElements) {
-			String pageId= mementoElement.getString(TAG_PAGE_ID);
-			String sorterId= mementoElement.getString(TAG_SORTER_ID);
-			SorterDescriptor sorterDesc= getSorter(sorterId);
-			if (sorterDesc != null)
-				map.put(pageId, sorterDesc);
-		}
-	}
-
-	void saveState(IMemento memento) {
-		saveState(memento, fgLastCheckedForType, TAG_DEFAULT_SORTERS);
-		saveState(memento, fLastCheckedForType, TAG_SORTERS);
-	}
-
-	private void saveState(IMemento memento, Map<String, SorterDescriptor> map, String mapName) {
-		Iterator<Entry<String, SorterDescriptor>> iter= map.entrySet().iterator();
-		memento= memento.createChild(mapName);
-		while (iter.hasNext()) {
-			IMemento mementoElement= memento.createChild(TAG_ELEMENT);
-			Entry<String, SorterDescriptor> entry= iter.next();
-			mementoElement.putString(TAG_PAGE_ID, entry.getKey());
-			mementoElement.putString(TAG_SORTER_ID, entry.getValue().getId());
-		}
-	}
-
-	int getSorterCount() {
-		int count= 0;
-		Iterator<SorterDescriptor> iter= SearchPlugin.getDefault().getSorterDescriptors().iterator();
-		while (iter.hasNext()) {
-			SorterDescriptor sorterDesc= iter.next();
-			if (sorterDesc.getPageId().equals(fPageId) || sorterDesc.getPageId().equals("*")) //$NON-NLS-1$
-				count++;
-		}
-		return count;
-	}
-}
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/util/FileLabelProvider.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/util/FileLabelProvider.java
deleted file mode 100644
index 73fa651..0000000
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/util/FileLabelProvider.java
+++ /dev/null
@@ -1,145 +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.search.internal.ui.util;
-
-
-import java.text.MessageFormat;
-
-import org.eclipse.swt.graphics.Image;
-
-import org.eclipse.core.runtime.IPath;
-
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.LabelProvider;
-
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-import org.eclipse.search.internal.ui.SearchMessages;
-import org.eclipse.search.ui.ISearchResultViewEntry;
-
-/**
- * @deprecated Old search view
- */
-@Deprecated
-public class FileLabelProvider extends LabelProvider {
-
-	public static final int SHOW_LABEL= 1;
-	public static final int SHOW_LABEL_PATH= 2;
-	public static final int SHOW_PATH_LABEL= 3;
-	public static final int SHOW_PATH= 4;
-
-	private static final String fgSeparatorFormat= SearchMessages.FileLabelProvider_dashSeparated;
-
-	private WorkbenchLabelProvider fLabelProvider;
-	private ILabelDecorator fDecorator;
-
-	private int fOrder;
-	private Object[] fArgs= new String[2];
-
-	public FileLabelProvider(int orderFlag) {
-		fDecorator= PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator();
-		fLabelProvider= new WorkbenchLabelProvider();
-		fOrder= orderFlag;
-	}
-
-	public void setOrder(int orderFlag) {
-		fOrder= orderFlag;
-	}
-
-	@Override
-	public String getText(Object element) {
-		if (!(element instanceof ISearchResultViewEntry))
-			return ""; //$NON-NLS-1$
-
-		IResource resource= ((ISearchResultViewEntry) element).getResource();
-		String text= null;
-
-		if (resource == null || !resource.exists())
-			text= SearchMessages.SearchResultView_removed_resource;
-
-		else {
-			IPath path= resource.getFullPath().removeLastSegments(1);
-			if (path.getDevice() == null)
-				path= path.makeRelative();
-			if (fOrder == SHOW_LABEL || fOrder == SHOW_LABEL_PATH) {
-				text= fLabelProvider.getText(resource);
-				if (path != null && fOrder == SHOW_LABEL_PATH) {
-					fArgs[0]= text;
-					fArgs[1]= path.toString();
-					text= MessageFormat.format(fgSeparatorFormat, fArgs);
-				}
-			} else {
-				if (path != null)
-					text= path.toString();
-				else
-					text= ""; //$NON-NLS-1$
-				if (fOrder == SHOW_PATH_LABEL) {
-					fArgs[0]= text;
-					fArgs[1]= fLabelProvider.getText(resource);
-					text= MessageFormat.format(fgSeparatorFormat, fArgs);
-				}
-			}
-		}
-
-		// Do the decoration
-		if (fDecorator != null) {
-			String decoratedText= fDecorator.decorateText(text, resource);
-		if (decoratedText != null)
-			return decoratedText;
-		}
-		return text;
-	}
-
-	@Override
-	public Image getImage(Object element) {
-		if (!(element instanceof ISearchResultViewEntry))
-			return null;
-
-		IResource resource= ((ISearchResultViewEntry) element).getResource();
-		Image image= fLabelProvider.getImage(resource);
-		if (fDecorator != null) {
-			Image decoratedImage= fDecorator.decorateImage(image, resource);
-			if (decoratedImage != null)
-				return decoratedImage;
-		}
-		return image;
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-		fLabelProvider.dispose();
-	}
-
-	@Override
-	public boolean isLabelProperty(Object element, String property) {
-		return fLabelProvider.isLabelProperty(element, property);
-	}
-
-	@Override
-	public void removeListener(ILabelProviderListener listener) {
-		super.removeListener(listener);
-		fLabelProvider.removeListener(listener);
-	}
-
-	@Override
-	public void addListener(ILabelProviderListener listener) {
-		super.addListener(listener);
-		fLabelProvider.addListener(listener);
-	}
-}
