Code cleanup.
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
index 3f90d7b..346a39a 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
@@ -26,7 +26,7 @@
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
-class ComplexTypeFinderStrategy implements ModelElementFinder.FinderStrategy {
+class ComplexTypeFinderStrategy implements ModelElementFinder.FinderStrategy<Class<? extends ComplexType>> {
   @Inject private PackageIntersectionDescriptions packageIntersectionDescriptions;
   @Inject private ProtoDescriptorProvider descriptorProvider;
   @Inject private LocalNamesProvider localNamesProvider;
@@ -34,8 +34,8 @@
   @Inject private QualifiedNameDescriptions qualifiedNamesDescriptions;
 
   @Override public Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Object target,
-      Object criteria) {
-    if (!isInstance(target, criteria)) {
+      Class<? extends ComplexType> typeOfComplexType) {
+    if (!typeOfComplexType.isInstance(target)) {
       return emptySet();
     }
     Set<IEObjectDescription> descriptions = newHashSet();
@@ -45,20 +45,23 @@
     return descriptions;
   }
 
-  @Override public Collection<IEObjectDescription> inDescriptor(Import anImport, Object criteria) {
+  @Override public Collection<IEObjectDescription> inDescriptor(Import anImport,
+      Class<? extends ComplexType> typeOfComplexType) {
     Set<IEObjectDescription> descriptions = newHashSet();
     ProtoDescriptor descriptor = descriptorProvider.descriptor(anImport.getImportURI());
-    for (ComplexType type : descriptor.allTypes()) {
-      if (!isInstance(type, criteria)) {
+    for (ComplexType complexType : descriptor.allTypes()) {
+      if (!typeOfComplexType.isInstance(complexType)) {
         continue;
       }
-      descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(type, namingStrategy));
+      descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(complexType, namingStrategy));
     }
     return descriptions;
   }
 
-  @Override public Collection<IEObjectDescription> local(Object target, Object criteria, int level) {
-    if (!isInstance(target, criteria)) {
+  @Override
+  public Collection<IEObjectDescription> local(Object target, Class<? extends ComplexType> typeOfComplexType,
+      int level) {
+    if (!typeOfComplexType.isInstance(target)) {
       return emptySet();
     }
     EObject e = (EObject) target;
@@ -71,16 +74,4 @@
     descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(e, namingStrategy));
     return descriptions;
   }
-
-  private boolean isInstance(Object target, Object criteria) {
-    Class<?> targetType = targetTypeFrom(criteria);
-    return targetType.isInstance(target);
-  }
-
-  private Class<?> targetTypeFrom(Object criteria) {
-    if (criteria instanceof Class<?>) {
-      return (Class<?>) criteria;
-    }
-    throw new IllegalArgumentException("Search criteria should be Class<?>");
-  }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFinderStrategy.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFinderStrategy.java
index 7af5fd1..8a14590 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFinderStrategy.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFinderStrategy.java
@@ -26,15 +26,14 @@
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
-class CustomOptionFinderStrategy implements ModelElementFinder.FinderStrategy {
+class CustomOptionFinderStrategy implements ModelElementFinder.FinderStrategy<OptionType> {
   @Inject private LocalNamesProvider localNamesProvider;
   @Inject private OptionNamingStrategy namingStrategy;
   @Inject private QualifiedNameDescriptions qualifiedNamesDescriptions;
   @Inject private TypeExtensions typeExtensions;
 
   @Override public Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Object target,
-      Object criteria) {
-    OptionType optionType = optionTypeFrom(criteria);
+      OptionType optionType) {
     if (!isExtendingOptionMessage(target, optionType)) {
       return emptySet();
     }
@@ -46,12 +45,11 @@
     return descriptions;
   }
 
-  @Override public Collection<IEObjectDescription> inDescriptor(Import anImport, Object criteria) {
+  @Override public Collection<IEObjectDescription> inDescriptor(Import anImport, OptionType criteria) {
     return emptySet();
   }
 
-  @Override public Collection<IEObjectDescription> local(Object target, Object criteria, int level) {
-    OptionType optionType = optionTypeFrom(criteria);
+  @Override public Collection<IEObjectDescription> local(Object target, OptionType optionType, int level) {
     if (!isExtendingOptionMessage(target, optionType)) {
       return emptySet();
     }
@@ -68,13 +66,6 @@
     return descriptions;
   }
 
-  private OptionType optionTypeFrom(Object criteria) {
-    if (!(criteria instanceof OptionType)) {
-      throw new IllegalArgumentException("Search criteria should be OptionType");
-    }
-    return (OptionType) criteria;
-  }
-
   private boolean isExtendingOptionMessage(Object o, OptionType optionType) {
     if (!(o instanceof TypeExtension)) {
       return false;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java
index 6428fbb..7d69160 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java
@@ -36,7 +36,7 @@
   @Inject private Resources resources;
   @Inject private ResourceSets resourceSets;
 
-  Collection<IEObjectDescription> find(EObject start, FinderStrategy strategy, Object criteria) {
+  <T> Collection<IEObjectDescription> find(EObject start, FinderStrategy<T> strategy, T criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
     descriptions.addAll(local(start, strategy, criteria));
     Protobuf root = modelObjects.rootOf(start);
@@ -44,7 +44,7 @@
     return unmodifiableSet(descriptions);
   }
 
-  private Collection<IEObjectDescription> local(EObject start, FinderStrategy strategy, Object criteria) {
+  private <T> Collection<IEObjectDescription> local(EObject start, FinderStrategy<T> strategy, T criteria) {
     UniqueDescriptions descriptions = new UniqueDescriptions();
     EObject current = start.eContainer();
     while (current != null) {
@@ -54,14 +54,14 @@
     return descriptions.values();
   }
 
-  Collection<IEObjectDescription> find(Protobuf start, FinderStrategy strategy, Object criteria) {
+  <T> Collection<IEObjectDescription> find(Protobuf start, FinderStrategy<T> strategy, T criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
     descriptions.addAll(local(start, strategy, criteria, 0));
     descriptions.addAll(imported(start, strategy, criteria));
     return unmodifiableSet(descriptions);
   }
 
-  private Collection<IEObjectDescription> local(EObject start, FinderStrategy strategy, Object criteria, int level) {
+  private <T> Collection<IEObjectDescription> local(EObject start, FinderStrategy<T> strategy, T criteria, int level) {
     UniqueDescriptions descriptions = new UniqueDescriptions();
     for (EObject element : start.eContents()) {
       descriptions.addAll(strategy.local(element, criteria, level));
@@ -72,7 +72,7 @@
     return descriptions.values();
   }
 
-  private Collection<IEObjectDescription> imported(Protobuf start, FinderStrategy strategy, Object criteria) {
+  private <T> Collection<IEObjectDescription> imported(Protobuf start, FinderStrategy<T> strategy, T criteria) {
     List<Import> allImports = protobufs.importsIn(start);
     if (allImports.isEmpty()) {
       return emptyList();
@@ -81,8 +81,8 @@
     return imported(allImports, modelObjects.packageOf(start), resourceSet, strategy, criteria);
   }
 
-  private Collection<IEObjectDescription> imported(List<Import> allImports, Package fromImporter,
-      ResourceSet resourceSet, FinderStrategy strategy, Object criteria) {
+  private <T> Collection<IEObjectDescription> imported(List<Import> allImports, Package fromImporter,
+      ResourceSet resourceSet, FinderStrategy<T> strategy, T criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
     for (Import anImport : allImports) {
       if (imports.isImportingDescriptor(anImport)) {
@@ -114,7 +114,7 @@
     return descriptions;
   }
 
-  private Collection<IEObjectDescription> publicImported(Protobuf start, FinderStrategy strategy, Object criteria) {
+  private <T> Collection<IEObjectDescription> publicImported(Protobuf start, FinderStrategy<T> strategy, T criteria) {
     if (!protobufs.isProto2(start)) {
       return emptySet();
     }
@@ -131,8 +131,8 @@
     return packages.areRelated(aPackage, p);
   }
 
-  private Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Resource resource,
-      FinderStrategy strategy, Object criteria) {
+  private <T> Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Resource resource,
+      FinderStrategy<T> strategy, T criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
     TreeIterator<Object> contents = getAllContents(resource, true);
     while (contents.hasNext()) {
@@ -142,11 +142,11 @@
     return descriptions;
   }
 
-  static interface FinderStrategy {
-    Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Object target, Object criteria);
+  static interface FinderStrategy<T> {
+    Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Object target, T criteria);
 
-    Collection<IEObjectDescription> inDescriptor(Import anImport, Object criteria);
+    Collection<IEObjectDescription> inDescriptor(Import anImport, T criteria);
 
-    Collection<IEObjectDescription> local(Object target, Object criteria, int level);
+    Collection<IEObjectDescription> local(Object target, T criteria, int level);
   }
 }