diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/semicolon/SmartSemicolonHandler.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/semicolon/SmartSemicolonHandler.java
index 8bf92ce..1478c89 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/semicolon/SmartSemicolonHandler.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/semicolon/SmartSemicolonHandler.java
@@ -54,10 +54,12 @@
   private static Logger logger = Logger.getLogger(SmartSemicolonHandler.class);
 
   @Inject private CommentNodesFinder commentNodesFinder;
+  @Inject private ParserBasedContentAssistContextFactory contextFactory;
   @Inject private IndexedElements indexedElements;
   @Inject private Literals literals;
   @Inject private INodes nodes;
-  @Inject private ParserBasedContentAssistContextFactory contextFactory;
+  @Inject private Protobufs protobufs;
+  @Inject private Resources resources;
   @Inject private IPreferenceStoreAccess storeAccess;
 
   private static final String SEMICOLON = CommonKeyword.SEMICOLON.toString();
@@ -80,6 +82,10 @@
     try {
       document.modify(new IUnitOfWork.Void<XtextResource>() {
         @Override public void process(XtextResource resource) {
+          Protobuf root = resources.rootOf(resource);
+          if (!protobufs.isProto2(root)) {
+            return;
+          }
           int offset = styledTextAccess.caretOffset();
           ContentAssistContext[] context = contextFactory.create(editor.getInternalSourceViewer(), offset, resource);
           for (ContentAssistContext c : context) {
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Protobufs.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Protobufs.java
index a6c4a44..66b4458 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Protobufs.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Protobufs.java
@@ -11,12 +11,12 @@
 import static com.google.common.collect.Lists.newArrayList;
 import static java.util.Collections.unmodifiableList;
 
+import java.util.List;
+
 import com.google.eclipse.protobuf.parser.NonProto2Protobuf;
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.inject.Singleton;
 
-import java.util.List;
-
 /**
  * Utility methods related to <code>{@link Protobuf}</code>s.
  *
@@ -24,7 +24,8 @@
  */
 @Singleton public class Protobufs {
   /**
-   * Indicates whether the given <code>{@link Protobuf}</code> is not {@code null} and has "proto2" syntax.
+   * Indicates whether the given <code>{@link Protobuf}</code> is not {@code null} and has "proto2" syntax (not
+   * necessarily in a explicit way.)
    * @param protobuf the {@code Protobuf} to check.
    * @return {@code true} if the given <code>{@link Protobuf}</code> is not {@code null} and has "proto2" syntax,
    * {@code false} otherwise.
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldFinder.java
index 4e5f5b7..d76411f 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldFinder.java
@@ -25,11 +25,11 @@
   @Inject private OptionFields optionFields;
   @Inject private Options options;
 
-  Collection<IEObjectDescription> findOptionFields(AbstractCustomOption customOption, FinderStrategy finderStrategy) {
-    return findOptionFields(customOption, finderStrategy, null);
+  Collection<IEObjectDescription> findOptionFields(AbstractCustomOption customOption, FinderStrategy strategy) {
+    return findOptionFields(customOption, strategy, null);
   }
 
-  Collection<IEObjectDescription> findOptionFields(AbstractCustomOption customOption, FinderStrategy finderStrategy,
+  Collection<IEObjectDescription> findOptionFields(AbstractCustomOption customOption, FinderStrategy strategy,
       OptionField field) {
     // TODO(alruiz): remove Provider of IndexedElement.
     final AbstractOption option = (AbstractOption) customOption;
@@ -39,7 +39,7 @@
       }
     });
     if (e != null) {
-      return finderStrategy.findOptionFields(e);
+      return strategy.findOptionFields(e);
     }
     return emptySet();
   }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java
index 986699b..4410159 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java
@@ -25,12 +25,12 @@
 class CustomOptionFieldNameFinder {
   @Inject private Options options;
 
-  Collection<IEObjectDescription> findFieldNamesSources(ComplexValue value, FinderStrategy finderStrategy) {
+  Collection<IEObjectDescription> findFieldNamesSources(ComplexValue value, FinderStrategy strategy) {
     MessageField source = sourceOf(value);
     if (source == null) {
       return emptySet();
     }
-    return finderStrategy.findMessageFields(source);
+    return strategy.findMessageFields(source);
   }
 
   private MessageField sourceOf(ComplexValue value) {
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 53fa8bc..6428fbb 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,57 +36,57 @@
   @Inject private Resources resources;
   @Inject private ResourceSets resourceSets;
 
-  Collection<IEObjectDescription> find(EObject start, FinderStrategy finderStrategy, Object criteria) {
+  Collection<IEObjectDescription> find(EObject start, FinderStrategy strategy, Object criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
-    descriptions.addAll(local(start, finderStrategy, criteria));
+    descriptions.addAll(local(start, strategy, criteria));
     Protobuf root = modelObjects.rootOf(start);
-    descriptions.addAll(imported(root, finderStrategy, criteria));
+    descriptions.addAll(imported(root, strategy, criteria));
     return unmodifiableSet(descriptions);
   }
 
-  private Collection<IEObjectDescription> local(EObject start, FinderStrategy finderStrategy, Object criteria) {
+  private Collection<IEObjectDescription> local(EObject start, FinderStrategy strategy, Object criteria) {
     UniqueDescriptions descriptions = new UniqueDescriptions();
     EObject current = start.eContainer();
     while (current != null) {
-      descriptions.addAll(local(current, finderStrategy, criteria, 0));
+      descriptions.addAll(local(current, strategy, criteria, 0));
       current = current.eContainer();
     }
     return descriptions.values();
   }
 
-  Collection<IEObjectDescription> find(Protobuf start, FinderStrategy finderStrategy, Object criteria) {
+  Collection<IEObjectDescription> find(Protobuf start, FinderStrategy strategy, Object criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
-    descriptions.addAll(local(start, finderStrategy, criteria, 0));
-    descriptions.addAll(imported(start, finderStrategy, criteria));
+    descriptions.addAll(local(start, strategy, criteria, 0));
+    descriptions.addAll(imported(start, strategy, criteria));
     return unmodifiableSet(descriptions);
   }
 
-  private Collection<IEObjectDescription> local(EObject start, FinderStrategy finder, Object criteria, int level) {
+  private Collection<IEObjectDescription> local(EObject start, FinderStrategy strategy, Object criteria, int level) {
     UniqueDescriptions descriptions = new UniqueDescriptions();
     for (EObject element : start.eContents()) {
-      descriptions.addAll(finder.local(element, criteria, level));
+      descriptions.addAll(strategy.local(element, criteria, level));
       if (element instanceof Message || element instanceof Group) {
-        descriptions.addAll(local(element, finder, criteria, level + 1));
+        descriptions.addAll(local(element, strategy, criteria, level + 1));
       }
     }
     return descriptions.values();
   }
 
-  private Collection<IEObjectDescription> imported(Protobuf start, FinderStrategy finderStrategy, Object criteria) {
+  private Collection<IEObjectDescription> imported(Protobuf start, FinderStrategy strategy, Object criteria) {
     List<Import> allImports = protobufs.importsIn(start);
     if (allImports.isEmpty()) {
       return emptyList();
     }
     ResourceSet resourceSet = start.eResource().getResourceSet();
-    return imported(allImports, modelObjects.packageOf(start), resourceSet, finderStrategy, criteria);
+    return imported(allImports, modelObjects.packageOf(start), resourceSet, strategy, criteria);
   }
 
   private Collection<IEObjectDescription> imported(List<Import> allImports, Package fromImporter,
-      ResourceSet resourceSet, FinderStrategy finderStrategy, Object criteria) {
+      ResourceSet resourceSet, FinderStrategy strategy, Object criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
     for (Import anImport : allImports) {
       if (imports.isImportingDescriptor(anImport)) {
-        descriptions.addAll(finderStrategy.inDescriptor(anImport, criteria));
+        descriptions.addAll(strategy.inDescriptor(anImport, criteria));
         continue;
       }
       URI resolvedUri = imports.resolvedUriOf(anImport);
@@ -102,20 +102,19 @@
         continue;
       }
       if (rootOfImported != null) {
-        descriptions.addAll(publicImported(rootOfImported, finderStrategy, criteria));
+        descriptions.addAll(publicImported(rootOfImported, strategy, criteria));
         if (arePackagesRelated(fromImporter, rootOfImported)) {
-          descriptions.addAll(local(rootOfImported, finderStrategy, criteria, 0));
+          descriptions.addAll(local(rootOfImported, strategy, criteria, 0));
           continue;
         }
         Package packageOfImported = modelObjects.packageOf(rootOfImported);
-        descriptions.addAll(imported(fromImporter, packageOfImported, imported, finderStrategy, criteria));
+        descriptions.addAll(imported(fromImporter, packageOfImported, imported, strategy, criteria));
       }
     }
     return descriptions;
   }
 
-  private Collection<IEObjectDescription> publicImported(Protobuf start, FinderStrategy finderStrategy,
-      Object criteria) {
+  private Collection<IEObjectDescription> publicImported(Protobuf start, FinderStrategy strategy, Object criteria) {
     if (!protobufs.isProto2(start)) {
       return emptySet();
     }
@@ -124,7 +123,7 @@
       return emptyList();
     }
     ResourceSet resourceSet = start.eResource().getResourceSet();
-    return imported(allImports, modelObjects.packageOf(start), resourceSet, finderStrategy, criteria);
+    return imported(allImports, modelObjects.packageOf(start), resourceSet, strategy, criteria);
   }
 
   private boolean arePackagesRelated(Package aPackage, EObject root) {
@@ -133,12 +132,12 @@
   }
 
   private Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Resource resource,
-      FinderStrategy finderStrategy, Object criteria) {
+      FinderStrategy strategy, Object criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
     TreeIterator<Object> contents = getAllContents(resource, true);
     while (contents.hasNext()) {
       Object next = contents.next();
-      descriptions.addAll(finderStrategy.imported(fromImporter, fromImported, next, criteria));
+      descriptions.addAll(strategy.imported(fromImporter, fromImported, next, criteria));
     }
     return descriptions;
   }
