diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/callhierarchy/CallHierarchyCore.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/callhierarchy/CallHierarchyCore.java
index a7255cd..5e8c6cf 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/callhierarchy/CallHierarchyCore.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/callhierarchy/CallHierarchyCore.java
@@ -35,6 +35,7 @@
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.manipulation.JavaManipulation;
 import org.eclipse.jdt.core.search.IJavaSearchScope;
 import org.eclipse.jdt.core.search.SearchEngine;
 
@@ -46,7 +47,13 @@
 
 public class CallHierarchyCore {
 
-    private static final String DEFAULT_IGNORE_FILTERS= ""; //$NON-NLS-1$
+    private static final String PREF_USE_IMPLEMENTORS= "PREF_USE_IMPLEMENTORS"; //$NON-NLS-1$
+    private static final String PREF_USE_FILTERS= "PREF_USE_FILTERS"; //$NON-NLS-1$
+    private static final String PREF_FILTERS_LIST= "PREF_FILTERS_LIST"; //$NON-NLS-1$
+    private static final String PREF_FILTER_TESTCODE= "PREF_FILTER_TESTCODE"; //$NON-NLS-1$
+
+    private String defaultIgnoreFilters= "java.*,javax.*"; //$NON-NLS-1$
+
     private static CallHierarchyCore fgInstance;
     private IJavaSearchScope fSearchScope;
     private StringMatcher[] fFilters;
@@ -60,11 +67,11 @@
     }
 
     public boolean isSearchUsingImplementorsEnabled() {
-        return true;
+        return Boolean.parseBoolean(JavaManipulation.getPreference(PREF_USE_IMPLEMENTORS, null));
     }
 
     public boolean isFilterTestCode() {
-        return false;
+        return Boolean.parseBoolean(JavaManipulation.getPreference(PREF_FILTER_TESTCODE, null));
     }
 
     public Collection<IJavaElement> getImplementingMethods(IMethod method) {
@@ -195,7 +202,7 @@
     }
 
     public boolean isFilterEnabled() {
-        return false;
+        return Boolean.parseBoolean(JavaManipulation.getPreference(PREF_USE_FILTERS, null));
     }
 
     /**
@@ -203,7 +210,26 @@
      * @return returns the filters
      */
     public String getFilters() {
-        return null;
+        String pref= JavaManipulation.getPreference(PREF_FILTERS_LIST, null);
+        if (pref == null)
+        	return ""; //$NON-NLS-1$
+        return pref;
+    }
+
+    /**
+     * Set default ignore filters to use.
+     *
+     * @param defaultIgnoreFilters comma-separated filter string
+     */
+    public void setDefaultIgnoreFilters(String defaultIgnoreFilters) {
+    	this.defaultIgnoreFilters= defaultIgnoreFilters;
+    }
+
+    /**
+     * Reset filters variable to null.
+     */
+    public void resetFilters() {
+    	fFilters= null;
     }
 
     /**
@@ -211,7 +237,7 @@
      *
      * @return StringMatcher[]
      */
-    private StringMatcher[] getIgnoreFilters() {
+    public StringMatcher[] getIgnoreFilters() {
         if (fFilters == null) {
             String filterString= null;
 
@@ -219,7 +245,7 @@
                 filterString= getFilters();
 
                 if (filterString == null) {
-                    filterString= DEFAULT_IGNORE_FILTERS;
+                    filterString= defaultIgnoreFilters;
                 }
             }
 
diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/callhierarchy/CallHierarchy.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/callhierarchy/CallHierarchy.java
index 4796966..db2b2d0 100644
--- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/callhierarchy/CallHierarchy.java
+++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/callhierarchy/CallHierarchy.java
@@ -17,10 +17,8 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.corext.callhierarchy;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.StringTokenizer;
 
 import org.eclipse.jface.preference.IPreferenceStore;
 
@@ -44,10 +42,8 @@
     private static final String PREF_FILTERS_LIST = "PREF_FILTERS_LIST"; //$NON-NLS-1$
     private static final String PREF_FILTER_TESTCODE= "PREF_FILTER_TESTCODE"; //$NON-NLS-1$
 
-    private static final String DEFAULT_IGNORE_FILTERS = "java.*,javax.*"; //$NON-NLS-1$
     private static CallHierarchy fgInstance;
     private CallHierarchyCore fgCallHierarchyCore;
-    private StringMatcher[] fFilters;
 
     private CallHierarchy() {
         fgCallHierarchyCore = CallHierarchyCore.getDefault();
@@ -156,7 +152,7 @@
     }
 
     public void setFilters(String filters) {
-        fFilters = null;
+        fgCallHierarchyCore.resetFilters();
 
         IPreferenceStore settings = JavaPlugin.getDefault().getPreferenceStore();
         settings.setValue(PREF_FILTERS_LIST, filters);
@@ -168,50 +164,14 @@
      * @return StringMatcher[]
      */
     private StringMatcher[] getIgnoreFilters() {
-        if (fFilters == null) {
-            String filterString = null;
-
-            if (isFilterEnabled()) {
-                filterString = getFilters();
-
-                if (filterString == null) {
-                    filterString = DEFAULT_IGNORE_FILTERS;
-                }
-            }
-
-            if (filterString != null) {
-                fFilters = parseList(filterString);
-            } else {
-                fFilters = null;
-            }
-        }
-
-        return fFilters;
+    	return fgCallHierarchyCore.getIgnoreFilters();
     }
 
     public static boolean arePossibleInputElements(List<?> elements) {
         return CallHierarchyCore.arePossibleInputElements(elements);
 	}
 
-	/**
-	 * Parses the comma separated string into an array of {@link StringMatcher} objects.
-	 *
-	 * @param listString the string to parse
-	 * @return an array of {@link StringMatcher} objects
-	 */
-    private static StringMatcher[] parseList(String listString) {
-        List<StringMatcher> list = new ArrayList<>(10);
-        StringTokenizer tokenizer = new StringTokenizer(listString, ","); //$NON-NLS-1$
-
-        while (tokenizer.hasMoreTokens()) {
-            String textFilter = tokenizer.nextToken().trim();
-            list.add(new StringMatcher(textFilter, false, false));
-        }
-
-        return list.toArray(new StringMatcher[list.size()]);
-    }
-
-    static CompilationUnit getCompilationUnitNode(IMember member, boolean resolveBindings) {
+	static CompilationUnit getCompilationUnitNode(IMember member, boolean resolveBindings) {
     	ITypeRoot typeRoot= member.getTypeRoot();
         try {
 	    	if (typeRoot.exists() && typeRoot.getBuffer() != null) {
