diff --git a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/editor/internal/search/FilterMenuContributor.java b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/editor/internal/search/FilterMenuContributor.java
deleted file mode 100644
index 3047bbb..0000000
--- a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/editor/internal/search/FilterMenuContributor.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.xsd.editor.internal.search;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.wst.common.ui.internal.search.dialogs.ComponentSearchListDialog;
-import org.eclipse.wst.common.ui.internal.search.dialogs.ComponentSpecification;
-import org.eclipse.wst.xsd.editor.XSDEditorPlugin;
-import org.eclipse.wst.xsd.editor.internal.dialogs.BuiltInTypesTreeViewerProvider;
-import org.eclipse.wst.xsd.editor.internal.dialogs.SelectBuiltInTypesForFilteringDialog;
-import org.eclipse.xsd.XSDTypeDefinition;
-
-public class FilterMenuContributor {
-	private static final String CONST_PREFERED_BUILT_IN_TYPES = XSDEditorPlugin.CONST_PREFERED_BUILT_IN_TYPES;
-	
-	private XSDTypesSearchListProvider searchListProvider;
-	private ComponentSearchListDialog parentDialog;
-
-	private MenuManager fMenuManager;
-	private ToolItem toolItem;
-	private ToolBar filterToolBar;
-	private IXSDTypesFilter filter;
-
-	private String toolItemIconFile = "icons/filter.gif"; 
-	private String on_off_filter_actionText = "Uncommon built-in types";
-	private String configureFilterDialogText = "Filter...";
-	private String filterIconFile = "filter.gif";
-	
-	/**
-	 * I need to know which dialog i will contribute to and which provider that
-	 * dialog use,provide it for me here
-	 * @param searchListProvider
-	 * @param parentDialog
-	 */
-	public FilterMenuContributor(XSDTypesSearchListProvider searchListProvider,
-			ComponentSearchListDialog parentDialog) {
-		this.searchListProvider = searchListProvider;		
-		this.parentDialog = parentDialog;
-	}
-
-
-
-	/**
-	 * Give me the toolbar where I will contribute the items to
-	 * @param toolBar
-	 * @return
-	 */
-	public ToolItem createToolItem(ToolBar toolBar) {
-		this.filterToolBar = toolBar;
-		toolItem = new ToolItem(filterToolBar, SWT.PUSH, 0);
-		
-		GridData data= new GridData();
-		data.horizontalAlignment= GridData.END;
-		filterToolBar.setLayoutData(data);
-		
-		fMenuManager = new MenuManager();
-		fMenuManager.add(new FilterUncommonBuiltInTypesAction());
-		fMenuManager.add(new LaunchConfigFilterDialogAction());
-		
-		toolItem.setImage(XSDEditorPlugin.getXSDImage(toolItemIconFile));
-		toolItem.setToolTipText("Filter uncommon built-in types");
-		toolItem.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				Menu menu = fMenuManager.createContextMenu(parentDialog.getShell());
-				Rectangle bounds = toolItem.getBounds();
-				Point topLeft = new Point(bounds.x, bounds.y + bounds.height);
-				topLeft = filterToolBar.toDisplay(topLeft);
-				menu.setLocation(topLeft.x, topLeft.y);
-				menu.setVisible(true);
-			}
-		}); ///
-		
-		// register the filter with the Provider object
-		filter = new BuiltInTypesFilter();
-		filter.turnOn();
-		searchListProvider.setBuiltInFilter(filter);
-		
-		return toolItem;
-	}
-
-
-	/**
-	 * Action for the button to turn on and off Built-In types filter
-	 */
-	private class FilterUncommonBuiltInTypesAction extends Action {
-		public FilterUncommonBuiltInTypesAction() {
-			super(on_off_filter_actionText, Action.AS_CHECK_BOX);
-		}
-
-		public void run() {
-			// flip states of the filter
-			if(	filter.isOn() )
-				filter.turnOff();
-			else
-				filter.turnOn();
-			
-			parentDialog.updateForFilterChange();
-		}
-	}
-
-	private class LaunchConfigFilterDialogAction extends Action {
-		public LaunchConfigFilterDialogAction(){
-			super(configureFilterDialogText, 
-					XSDEditorPlugin.getImageDescriptor(filterIconFile, true)	);
-		}
-		public void run(){
-			Shell shell = Display.getCurrent().getActiveShell();
-
-			BuiltInTypesTreeViewerProvider provider = 
-				new BuiltInTypesTreeViewerProvider();
-
-			SelectBuiltInTypesForFilteringDialog typeFilterDialog = 
-				new SelectBuiltInTypesForFilteringDialog(shell, 
-						provider.getLabelProvider(), provider.getContentProvider());
-
-			List allBuiltInTypes = BuiltInTypesTreeViewerProvider.getAllBuiltInTypes();
-			typeFilterDialog.setInput(allBuiltInTypes);
-			
-			IPreferenceStore store = XSDEditorPlugin.getPlugin().getPreferenceStore();			
-			String listString = store.getString(CONST_PREFERED_BUILT_IN_TYPES);
-
-			Object[] selectedBuiltInTypes = 
-				SelectBuiltInTypesForFilteringDialog.getSelectedBuiltInTypesFromString(listString,
-						allBuiltInTypes).toArray();
-
-			typeFilterDialog.setInitialSelections(selectedBuiltInTypes);
-
-			typeFilterDialog.create();
-			//typeFilter.getTreeViewer().setSorter(new ViewerSorter());
-
-			if (typeFilterDialog.open() == Window.OK){
-				/* we don't use getResult() because it also returns grayed
-				 * elements */
-				selectedBuiltInTypes = typeFilterDialog.getResult();
-
-				// removed grayed checked elements (parent node)
-				List nonGrayItems = new ArrayList();
-				for(int i = 0; i < selectedBuiltInTypes.length; i++ ){
-					if ( selectedBuiltInTypes[i] instanceof ComponentSpecification){
-						nonGrayItems.add(selectedBuiltInTypes[i]);
-					}
-				}
-				selectedBuiltInTypes = nonGrayItems.toArray();
-
-				String newlySelectionToBeStored = 
-					SelectBuiltInTypesForFilteringDialog.getTypesListInString(selectedBuiltInTypes);
-				store.setValue(CONST_PREFERED_BUILT_IN_TYPES, newlySelectionToBeStored);
-
-				parentDialog.updateForFilterChange();				
-			}
-		}
-	}
-	
-	/**
-	 * This is a concrete filter, used to filter out built-in types
-	 * Register it with a provider to use it. 
-	 */
-	private class BuiltInTypesFilter implements IXSDTypesFilter{
-		
-		private static final String BUILT_IN_TYPES_TARGET_NAMESPACE = "http://www.w3.org/2001/XMLSchema";
-		private static final String LIST_SEP = SelectBuiltInTypesForFilteringDialog.CUSTOM_LIST_SEPARATOR;
-		private IPreferenceStore store = XSDEditorPlugin.getPlugin().getPreferenceStore();
-		
-		/**
-		 * True is the Filter is currently turned on, false otherwise
-		 */
-		public boolean currentStatus = true;
-		
-		private String selectedBuiltInTypes;
-		
-		/**
-		 * Give me the name of the built-in type, i will say whether or not
-		 * to filter it out.
-		 * Note: I will say no/false whenever I am not sure..
-		 */
-		public boolean shouldFilterOut(Object o) {
-			// if the I am turned on
-			if ( currentStatus ){				
-				
-				// selectedBuiltInTypes must always contain a trail LIST_SEP
-				// at the end for the filter to work properly
-				selectedBuiltInTypes =
-					store.getString(CONST_PREFERED_BUILT_IN_TYPES);
-				
-				if ( o instanceof XSDTypeDefinition){
-					XSDTypeDefinition td = (XSDTypeDefinition) o;
-					/*  if the targetname space indicates this is of built-in types AND
-					 *  the name is not in the allowed list (not-filter list) then
-					 *  it should be filtered
-					 */
-					if  ( td.getTargetNamespace().equals(BUILT_IN_TYPES_TARGET_NAMESPACE) &&
-							selectedBuiltInTypes.indexOf(td.getName() + LIST_SEP) == -1 ){
-						return true;
-					}
-				}
-			}
-			return false;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.xsd.adt.search.IXSDTypesFilter#turnOn()
-		 */
-		public void turnOn() {
-			currentStatus = true;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.xsd.adt.search.IXSDTypesFilter#turnOff()
-		 */
-		public void turnOff() {
-			currentStatus = false;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.xsd.adt.search.IXSDTypesFilter#isOn()
-		 */
-		public boolean isOn() {
-			return currentStatus;
-		}
-		
-	}
-
-	public void setConfigureFilterDialogText(String configureFilterDialogText) {
-		this.configureFilterDialogText = configureFilterDialogText;
-	}
-
-	public void setFilterIconFile(String filterIconFile) {
-		this.filterIconFile = filterIconFile;
-	}
-
-	public void setOn_off_filter_actionText(String on_off_action) {
-		this.on_off_filter_actionText = on_off_action;
-	}
-
-	public void setToolItemIconFile(String toolItemIconFile) {
-		this.toolItemIconFile = toolItemIconFile;
-	}
-}
