diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java
index 00ac058..f888abf 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012 Google Inc.
+ * Copyright (c) 2014 Google Inc.
  *
  * 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
@@ -12,10 +12,12 @@
 import static org.eclipse.xtext.resource.EObjectDescription.create;
 
 import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
 import com.google.eclipse.protobuf.model.util.MessageFields;
 import com.google.eclipse.protobuf.protobuf.Group;
 import com.google.eclipse.protobuf.protobuf.IndexedElement;
 import com.google.eclipse.protobuf.protobuf.MessageField;
+import com.google.eclipse.protobuf.protobuf.OneOf;
 import com.google.inject.Inject;
 
 import org.eclipse.emf.ecore.EObject;
@@ -31,24 +33,30 @@
   @Inject private MessageFields messageFields;
 
   @Override public Collection<IEObjectDescription> findMessageFields(IndexedElement reference) {
-    Set<IEObjectDescription> descriptions = newHashSet();
-    Iterable<? extends EObject> elements = reference instanceof Group 
+    Iterable<? extends EObject> elements = reference instanceof Group
         ? ((Group) reference).getElements()
-        : reference instanceof MessageField 
+        : reference instanceof MessageField
             ? messageFields.messageTypeOf((MessageField) reference).getElements()
             : null;
+    return getDescriptions(elements);
+  }
 
-    if (elements != null) {
-      for (EObject element : elements) {
-        if (element instanceof MessageField) {
-          String name = ((MessageField) element).getName();
+  private Set<IEObjectDescription> getDescriptions(Iterable<? extends EObject> elements) {
+    if (elements == null) {
+      return ImmutableSet.of();
+    }
+    Set<IEObjectDescription> descriptions = newHashSet();
+    for (EObject element : elements) {
+      if (element instanceof MessageField) {
+        String name = ((MessageField) element).getName();
+        descriptions.add(create(name, element));
+      } else if (element instanceof Group) {
+        String name = ((Group) element).getName();
+        if (!Strings.isNullOrEmpty(name)) {
           descriptions.add(create(name, element));
-        } else if (element instanceof Group) {
-          String name = ((Group) element).getName();
-          if (!Strings.isNullOrEmpty(name)) {
-            descriptions.add(create(name, element));
-          }
         }
+      } else if (element instanceof OneOf) {
+        descriptions.addAll(getDescriptions(((OneOf) element).getElements()));
       }
     }
     return descriptions;
