diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/IEObjectDescriptionChooser.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/IEObjectDescriptionChooser.java
index 297afb1..5345983 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/IEObjectDescriptionChooser.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/IEObjectDescriptionChooser.java
@@ -8,7 +8,7 @@
  */
 package com.google.eclipse.protobuf.ui.contentassist;
 
-import static java.util.Collections.unmodifiableCollection;
+import static java.util.Collections.*;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.xtext.naming.QualifiedName;
@@ -22,6 +22,7 @@
 class IEObjectDescriptionChooser {
 
   Collection<IEObjectDescription> shortestQualifiedNamesIn(Collection<IEObjectDescription> descriptions) {
+    if (descriptions.isEmpty()) return emptySet();
     Map<EObject, IEObjectDescription> shortestOnes = new HashMap<EObject, IEObjectDescription>();
     for (IEObjectDescription d : descriptions) {
       EObject e = d.getEObjectOrProxy();
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
index 791577d..6894a39 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
@@ -76,7 +76,8 @@
 
   @Override public void completeComplexTypeLink_Target(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-    Collection<IEObjectDescription> scope = scoping().findMessageScope(model);
+    if (!(model instanceof MessageField)) return;
+    Collection<IEObjectDescription> scope = scoping().allPossibleTypesFor((MessageField) model);
     for (IEObjectDescription d : descriptionChooser.shortestQualifiedNamesIn(scope)) {
       Image image = imageHelper.getImage(images.imageFor(d.getEObjectOrProxy()));
       proposeAndAccept(d, image, context, acceptor);
@@ -85,8 +86,15 @@
 
   @Override public void completeMessageLink_Target(EObject model, Assignment assignment, ContentAssistContext context, 
       ICompletionProposalAcceptor acceptor) {
-    if (!(model instanceof MessageField)) return;
-    Collection<IEObjectDescription> scope = scoping().findScope((MessageField) model);
+    Collection<IEObjectDescription> scope = emptySet();
+    if (model instanceof MessageExtension) {
+      MessageExtension extension = (MessageExtension) model;
+      scope = scoping().allPossibleMessagesFor(extension);
+    }
+    if (model instanceof Rpc) {
+      Rpc rpc = (Rpc) model;
+      scope = scoping().allPossibleMessagesFor(rpc);
+    }
     for (IEObjectDescription d : descriptionChooser.shortestQualifiedNamesIn(scope)) {
       Image image = imageHelper.getImage(images.imageFor(d.getEObjectOrProxy()));
       proposeAndAccept(d, image, context, acceptor);
@@ -246,6 +254,20 @@
     proposeIndex(index, context, acceptor);
   }
 
+  @Override public void completeLiteralLink_Target(EObject model, Assignment assignment, ContentAssistContext context,
+      ICompletionProposalAcceptor acceptor) {
+    MessageField field = null;
+    if (model instanceof DefaultValueFieldOption) {
+      field = (MessageField) model.eContainer();
+    }
+    if (field == null) return;
+    if (!properties.isOptional(field)) return;
+    Enum enumType = finder.enumTypeOf(field);
+    if (enumType != null) {
+      proposeAndAccept(enumType, context, acceptor);
+    }
+  }
+  
   @Override public void completeMessageField_Index(EObject model, Assignment assignment, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
     long index = indexedElements.calculateTagNumberOf((MessageField) model);
@@ -355,19 +377,17 @@
   
   @Override public void completeDefaultValueFieldOption_Value(EObject model, Assignment assignment, 
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-    if (!(model instanceof MessageField)) return;
-    MessageField field = (MessageField) model;
+    MessageField field = null;
+    if (model instanceof DefaultValueFieldOption) {
+      field = (MessageField) model.eContainer();
+    }
+    if (model instanceof MessageField) {
+      field = (MessageField) model;
+    }
+    if (field == null) return;
     if (!properties.isOptional(field)) return;
     proposeDefaultValue(field, context, acceptor);
   }
-  
-  @Override public ICompletionProposal createCompletionProposal(String proposal, String displayString, Image image,
-      ContentAssistContext contentAssistContext) {
-    StyledString styled = null;
-    if (displayString != null) styled = new StyledString(displayString);
-    return createCompletionProposal(proposal, styled, image, getPriorityHelper().getDefaultPriority(), 
-        contentAssistContext.getPrefix(), contentAssistContext);
-  }
 
   @Override public void completeNativeFieldOption_Value(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
@@ -425,7 +445,7 @@
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     if (!(model instanceof CustomOption)) return;
     CustomOption option = (CustomOption) model;
-    Collection<IEObjectDescription> scope = scoping().findScope(option);
+    Collection<IEObjectDescription> scope = scoping().allPossibleSourcesOf(option);
     proposeAndAcceptOptions(scope, context, acceptor);
   }
 
@@ -433,7 +453,7 @@
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     if (!(model instanceof CustomFieldOption)) return;
     CustomFieldOption option = (CustomFieldOption) model;
-    Collection<IEObjectDescription> scope = scoping().findScope(option);
+    Collection<IEObjectDescription> scope = scoping().allPossibleSourcesOf(option);
     proposeAndAcceptOptions(scope, context, acceptor);
   }
 
@@ -470,15 +490,15 @@
     Collection<IEObjectDescription> scope = emptySet();
     if (e instanceof CustomOption) {
       CustomOption option = (CustomOption) e;
-      scope = scoping().findFieldScope(option);
+      scope = scoping().allPossibleSourcesOfFieldOf(option);
     }
     if (e instanceof CustomFieldOption) {
       CustomFieldOption option = (CustomFieldOption) e;
-      scope = scoping().findFieldScope(option);
+      scope = scoping().allPossibleSourcesOfFieldOf(option);
     }
     if (e instanceof MessageOptionField) {
       MessageOptionField field = (MessageOptionField) e;
-      scope = scoping().findScope(field);
+      scope = scoping().allPossibleSourcesOf(field);
     }
     for (IEObjectDescription d : descriptionChooser.shortestQualifiedNamesIn(scope)) {
       Image image = imageHelper.getImage(images.imageFor(d.getEObjectOrProxy()));
@@ -494,15 +514,15 @@
     Collection<IEObjectDescription> scope = emptySet();
     if (e instanceof CustomOption) {
       CustomOption option = (CustomOption) e;
-      scope = scoping().findFieldScope(option);
+      scope = scoping().allPossibleSourcesOfFieldOf(option);
     }
     if (e instanceof CustomFieldOption) {
       CustomFieldOption option = (CustomFieldOption) e;
-      scope = scoping().findFieldScope(option);
+      scope = scoping().allPossibleSourcesOfFieldOf(option);
     }
     if (e instanceof ExtensionOptionField) {
-      ExtensionOptionField source = (ExtensionOptionField) e;
-      scope = scoping().findScope(source);
+      ExtensionOptionField field = (ExtensionOptionField) e;
+      scope = scoping().allPossibleSourcesOf(field);
     }
     for (IEObjectDescription d : descriptionChooser.shortestQualifiedNamesIn(scope)) {
       Image image = imageHelper.getImage(images.imageFor(d.getEObjectOrProxy()));
@@ -566,4 +586,12 @@
   private Scoping scoping() {
     return (ProtobufScopeProvider) super.getScopeProvider();
   }
+  
+  @Override public ICompletionProposal createCompletionProposal(String proposal, String displayString, Image image,
+      ContentAssistContext contentAssistContext) {
+    StyledString styled = null;
+    if (displayString != null) styled = new StyledString(displayString);
+    return createCompletionProposal(proposal, styled, image, getPriorityHelper().getDefaultPriority(), 
+        contentAssistContext.getPrefix(), contentAssistContext);
+  }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
index 05da44b..60460a0 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
@@ -48,28 +48,32 @@
 
   @SuppressWarnings("unused")
   public IScope scope_ComplexTypeLink_target(ComplexTypeLink link, EReference r) {
-    try {
-      EObject c = link.eContainer();
-      if (c instanceof MessageField) {
-        return createScope(findScope((MessageField) c));
-      }
-    } catch (Throwable t) {
-      t.printStackTrace();
+    EObject c = link.eContainer();
+    if (c instanceof MessageField) {
+      return createScope(allPossibleTypesFor((MessageField) c));
     }
     Set<IEObjectDescription> descriptions = emptySet();
     return createScope(descriptions);
   }
   
-  @Override public Collection<IEObjectDescription> findScope(MessageField field) {
+  @Override public Collection<IEObjectDescription> allPossibleTypesFor(MessageField field) {
     return astWalker.traverseAst(field, typeScopeFinder, ComplexType.class);
   }
 
   @SuppressWarnings("unused")
   public IScope scope_MessageLink_target(MessageLink link, EReference r) {
-    return createScope(findMessageScope(link));
+    return createScope(messagesFor(link));
   }
 
-  @Override public Collection<IEObjectDescription> findMessageScope(EObject o) {
+  @Override public Collection<IEObjectDescription> allPossibleMessagesFor(MessageExtension extension) {
+    return messagesFor(extension);
+  }
+
+  @Override public Collection<IEObjectDescription> allPossibleMessagesFor(Rpc rpc) {
+    return messagesFor(rpc);
+  }
+
+  private Collection<IEObjectDescription> messagesFor(EObject o) {
     Protobuf root = modelFinder.rootOf(o);
     return astWalker.traverseAst(root, typeScopeFinder, Message.class);
   }
@@ -118,17 +122,17 @@
     }
     if (c instanceof CustomOption) {
       CustomOption option = (CustomOption) c;
-      return createScope(findScope(option));
+      return createScope(allPossibleSourcesOf(option));
     }
     if (c instanceof CustomFieldOption) {
       CustomFieldOption option = (CustomFieldOption) c;
-      return createScope(findScope(option));
+      return createScope(allPossibleSourcesOf(option));
     }
     Set<IEObjectDescription> descriptions = emptySet();
     return createScope(descriptions);
   }
   
-  @Override public Collection<IEObjectDescription> findScope(CustomOption option) {
+  @Override public Collection<IEObjectDescription> allPossibleSourcesOf(CustomOption option) {
     OptionType optionType = typeOf(option);
     Collection<IEObjectDescription> descriptions = emptySet();
     if (optionType != null) {
@@ -137,7 +141,7 @@
     return descriptions;
   }
 
-  @Override public Collection<IEObjectDescription> findScope(CustomFieldOption option) {
+  @Override public Collection<IEObjectDescription> allPossibleSourcesOf(CustomFieldOption option) {
     OptionType optionType = typeOf(option);
     Collection<IEObjectDescription> descriptions = emptySet();
     if (optionType != null) {
@@ -148,10 +152,10 @@
 
   @SuppressWarnings("unused") 
   public IScope scope_OptionField_target(OptionField field, EReference r) {
-    return createScope(findScope(field));
+    return createScope(allPossibleSourcesOf(field));
   }
   
-  @Override public Collection<IEObjectDescription> findScope(OptionField field) {
+  @Override public Collection<IEObjectDescription> allPossibleSourcesOf(OptionField field) {
     EObject container = field.eContainer();
     if (container instanceof CustomOption) {
       return findSources((CustomOption) container, field);
@@ -162,11 +166,11 @@
     return emptySet();
   }
   
-  @Override public Collection<IEObjectDescription> findFieldScope(CustomOption option) {
+  @Override public Collection<IEObjectDescription> allPossibleSourcesOfFieldOf(CustomOption option) {
     return findSources(option, (MessageOptionField) null);
   }
 
-  @Override public Collection<IEObjectDescription> findFieldScope(CustomFieldOption option) {
+  @Override public Collection<IEObjectDescription> allPossibleSourcesOfFieldOf(CustomFieldOption option) {
     return findSources(option, (MessageOptionField) null);
   }
 
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/Scoping.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/Scoping.java
index b74f062..5d5df0c 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/Scoping.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/Scoping.java
@@ -10,7 +10,6 @@
 
 import com.google.eclipse.protobuf.protobuf.*;
 
-import org.eclipse.emf.ecore.EObject;
 import org.eclipse.xtext.resource.IEObjectDescription;
 
 import java.util.Collection;
@@ -19,19 +18,20 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public interface Scoping {
+  
+  Collection<IEObjectDescription> allPossibleMessagesFor(MessageExtension extension);
+  
+  Collection<IEObjectDescription> allPossibleMessagesFor(Rpc rpc);
+  
+  Collection<IEObjectDescription> allPossibleSourcesOf(CustomOption option);
 
-  // TODO redo this interface taking same parameters as ProtobufScopeProvider
-  Collection<IEObjectDescription> findFieldScope(CustomFieldOption option);
+  Collection<IEObjectDescription> allPossibleSourcesOf(CustomFieldOption option);
 
-  Collection<IEObjectDescription> findFieldScope(CustomOption option);
+  Collection<IEObjectDescription> allPossibleSourcesOf(OptionField field);
+  
+  Collection<IEObjectDescription> allPossibleSourcesOfFieldOf(CustomOption option);
+  
+  Collection<IEObjectDescription> allPossibleSourcesOfFieldOf(CustomFieldOption option);
 
-  Collection<IEObjectDescription> findMessageScope(EObject o);
-
-  Collection<IEObjectDescription> findScope(CustomFieldOption option);
-
-  Collection<IEObjectDescription> findScope(CustomOption option);
-
-  Collection<IEObjectDescription> findScope(MessageField o);
-
-  Collection<IEObjectDescription> findScope(OptionField field);
+  Collection<IEObjectDescription> allPossibleTypesFor(MessageField field);
 }
