Finished cleaning up the grammar.
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_ExtensionFieldNotationNameSource_extension_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_ExtensionFieldName_target_Test.java
similarity index 79%
rename from com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_ExtensionFieldNotationNameSource_extension_Test.java
rename to com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_ExtensionFieldName_target_Test.java
index 46e8709..47bd44a 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_ExtensionFieldNotationNameSource_extension_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_ExtensionFieldName_target_Test.java
@@ -23,11 +23,11 @@
 import org.junit.*;
 
 /**
- * Tests for <code>{@link ProtobufScopeProvider#scope_ExtensionFieldNotationNameSource_extension(ExtensionFieldNotationNameSource, EReference)}</code>.
+ * Tests for <code>{@link ProtobufScopeProvider#scope_FieldName_target(FieldName, EReference)}</code>.
  * 
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class ProtobufScopeProvider_scope_ExtensionFieldNotationNameSource_extension_Test {
+public class ProtobufScopeProvider_scope_ExtensionFieldName_target_Test {
 
   private static EReference reference;
 
@@ -66,9 +66,9 @@
   //   }
   // };
   @Test public void should_provide_sources_for_aggregate_field() {
-    AggregateField field = xtext.find("google.proto.test.fileopt", "]", AggregateField.class);
-    ExtensionFieldNotationNameSource s = (ExtensionFieldNotationNameSource) field.getName();
-    IScope scope = provider.scope_ExtensionFieldNotationNameSource_extension(s, reference);
+    ValueField field = xtext.find("google.proto.test.fileopt", "]", ValueField.class);
+    ExtensionFieldName name = (ExtensionFieldName) field.getName();
+    IScope scope = provider.scope_FieldName_target(name, reference);
     assertThat(descriptionsIn(scope), containAll("google.proto.test.fileopt", ".google.proto.test.fileopt"));
   }
 }
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_NormalFieldNotationNameSource_property_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_NormalFieldName_target_Test.java
similarity index 74%
rename from com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_NormalFieldNotationNameSource_property_Test.java
rename to com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_NormalFieldName_target_Test.java
index 4d10274..15c7562 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_NormalFieldNotationNameSource_property_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_NormalFieldName_target_Test.java
@@ -23,11 +23,11 @@
 import org.junit.*;
 
 /**
- * Tests for <code>{@link ProtobufScopeProvider#scope_NormalFieldNotationNameSource_property(NormalFieldNotationNameSource, EReference)}</code>
+ * Tests for <code>{@link ProtobufScopeProvider#scope_FieldName_target(FieldName, EReference)}</code>
  * 
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class ProtobufScopeProvider_scope_NormalFieldNotationNameSource_property_Test {
+public class ProtobufScopeProvider_scope_NormalFieldName_target_Test {
 
   private static EReference reference;
 
@@ -59,9 +59,9 @@
   //   code: 68
   // };
   @Test public void should_provide_sources_for_aggregate_field() {
-    AggregateField field = xtext.find("code", ":", AggregateField.class);
-    NormalFieldNotationNameSource s = (NormalFieldNotationNameSource) field.getName();
-    IScope scope = provider.scope_NormalFieldNotationNameSource_property(s, reference);
+    ValueField field = xtext.find("code", ":", ValueField.class);
+    NormalFieldName name = (NormalFieldName) field.getName();
+    IScope scope = provider.scope_FieldName_target(name, reference);
     Message message = xtext.find("Type", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(message));
   }
@@ -87,9 +87,9 @@
   //   name { value: 'Address' }
   // };
   @Test public void should_provide_sources_for_nested_field_notation_in_option() {
-    AggregateField field = xtext.find("value", ":", AggregateField.class);
-    NormalFieldNotationNameSource s = (NormalFieldNotationNameSource) field.getName();
-    IScope scope = provider.scope_NormalFieldNotationNameSource_property(s, reference);
+    ValueField field = xtext.find("value", ":", ValueField.class);
+    NormalFieldName name = (NormalFieldName) field.getName();
+    IScope scope = provider.scope_FieldName_target(name, reference);
     Message message = xtext.find("Names", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(message));
   }
@@ -110,9 +110,9 @@
   //   optional int target = 1 [(type) = { code: 68 }];
   // }
   @Test public void should_provide_sources_for_field_notation_in_field_option() {
-    AggregateField field = xtext.find("code", ":", AggregateField.class);
-    NormalFieldNotationNameSource s = (NormalFieldNotationNameSource) field.getName();
-    IScope scope = provider.scope_NormalFieldNotationNameSource_property(s, reference);
+    ValueField field = xtext.find("code", ":", ValueField.class);
+    NormalFieldName name = (NormalFieldName) field.getName();
+    IScope scope = provider.scope_FieldName_target(name, reference);
     Message message = xtext.find("Type", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(message));
   }
@@ -138,9 +138,9 @@
   //   optional int target = 1 [(type) = { name: { value: 'Address' } }];
   // }
   @Test public void should_provide_sources_for_nested_field_notation_in_field_option() {
-    AggregateField field = xtext.find("value", ":", AggregateField.class);
-    NormalFieldNotationNameSource s = (NormalFieldNotationNameSource) field.getName();
-    IScope scope = provider.scope_NormalFieldNotationNameSource_property(s, reference);
+    ValueField field = xtext.find("value", ":", ValueField.class);
+    NormalFieldName name = (NormalFieldName) field.getName();
+    IScope scope = provider.scope_FieldName_target(name, reference);
     Message message = xtext.find("Names", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(message));
   }
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 d4424c1..da7d2ea 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
@@ -33,7 +33,6 @@
 
 import com.google.eclipse.protobuf.grammar.CommonKeyword;
 import com.google.eclipse.protobuf.model.util.*;
-import com.google.eclipse.protobuf.model.util.Fields;
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.eclipse.protobuf.protobuf.Enum;
 import com.google.eclipse.protobuf.scoping.*;
@@ -85,7 +84,8 @@
 
   @Override public void completeMessageLink_Target(EObject model, Assignment assignment, ContentAssistContext context, 
       ICompletionProposalAcceptor acceptor) {
-    Collection<IEObjectDescription> scope = scoping().findTypeScope(model);
+    if (!(model instanceof MessageField)) return;
+    Collection<IEObjectDescription> scope = scoping().findScope((MessageField) model);
     for (IEObjectDescription d : descriptionChooser.shortestQualifiedNamesIn(scope)) {
       Image image = imageHelper.getImage(images.imageFor(d.getEObjectOrProxy()));
       proposeAndAccept(d, image, context, acceptor);
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
index fbed3c2..1c76d53 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
@@ -169,31 +169,31 @@
   MessageField | Group;
 
 Value:
-  AggregateValue | SimpleValueLink;
+  ComplexValue | SimpleValueLink;
 
 // { foo: 1, bar: 2 }
-AggregateValue:
+ComplexValue:
   '{'
-  fields+=AggregateField ((',')? fields+=AggregateField)*
+  fields+=ValueField ((',')? fields+=ValueField)*
   '}';
 
-AggregateField:
+ValueField:
   SimpleFieldNotation | ComplexFieldNotation;
 
 SimpleFieldNotation:
-  name=FieldNotationNameSource ':' value=SimpleValueLink;
+  name=FieldName ':' value=SimpleValueLink;
 
 ComplexFieldNotation:
-  name=FieldNotationNameSource ':'? values=AggregateValue;
+  name=FieldName ':'? values=ComplexValue;
 
-FieldNotationNameSource:
-  NormalFieldNotationNameSource | ExtensionFieldNotationNameSource;
+FieldName:
+  NormalFieldName | ExtensionFieldName;
 
-NormalFieldNotationNameSource:
-  property=[MessageField];
+NormalFieldName:
+  target=[MessageField];
 
-ExtensionFieldNotationNameSource:
-  '[' extension=[MessageField|QualifiedName] ']';
+ExtensionFieldName:
+  '[' target=[MessageField|QualifiedName] ']';
 
 SimpleValueLink:
   LiteralLink | BooleanLink | NumberLink | StringLink;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/FieldNotationScopeFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/FieldNotationScopeFinder.java
index 0c90c7d..967478f 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/FieldNotationScopeFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/FieldNotationScopeFinder.java
@@ -30,21 +30,21 @@
   @Inject private ModelFinder modelFinder;
   @Inject private QualifiedNameDescriptions qualifiedNameDescriptions;
 
-  Collection<IEObjectDescription> sourceOf(FieldNotationNameSource s) {
-    EObject container = s.eContainer();
-    if (!(container instanceof AggregateField)) return emptySet();
-    MessageField field = sourceOf((AggregateField) container);
+  Collection<IEObjectDescription> sourceOf(FieldName name) {
+    EObject container = name.eContainer();
+    if (!(container instanceof ValueField)) return emptySet();
+    MessageField field = sourceOf((ValueField) container);
     if (field == null) return emptySet();
-    if (s instanceof NormalFieldNotationNameSource) {
+    if (name instanceof NormalFieldName) {
       return propertiesInTypeOf(field);
     }
     return propertiesInExtendMessageOf(field);
   }
   
-  private MessageField sourceOf(AggregateField field) {
+  private MessageField sourceOf(ValueField field) {
     EObject container = field.eContainer();
     IndexedElement source = null;
-    if (container instanceof AggregateValue) {
+    if (container instanceof ComplexValue) {
       container = container.eContainer();
       if (container instanceof CustomOption) {
         CustomOption option = (CustomOption) container;
@@ -63,16 +63,8 @@
   }
 
   private MessageField sourceOf(ComplexFieldNotation n) {
-    FieldNotationNameSource s = n.getName();
-    if (s instanceof NormalFieldNotationNameSource) {
-      NormalFieldNotationNameSource normal = (NormalFieldNotationNameSource) s;
-      return normal.getProperty();
-    }
-    if (s instanceof ExtensionFieldNotationNameSource) {
-      ExtensionFieldNotationNameSource normal = (ExtensionFieldNotationNameSource) s;
-      return normal.getExtension();
-    }
-    return null;
+    FieldName name = n.getName();
+    return (name == null) ? null : name.getTarget();
   }
   
   private Collection<IEObjectDescription> propertiesInTypeOf(MessageField field) {
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 012bf69..010a499 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
@@ -50,14 +50,14 @@
   public IScope scope_ComplexTypeLink_target(ComplexTypeLink link, EReference r) {
     EObject c = link.eContainer();
     if (c instanceof MessageField) {
-      return createScope(findTypeScope(c));
+      return createScope(findScope((MessageField) c));
     }
     Set<IEObjectDescription> descriptions = emptySet();
     return createScope(descriptions);
   }
   
-  @Override public Collection<IEObjectDescription> findTypeScope(EObject o) {
-    return astWalker.traverseAst(o, typeScopeFinder, ComplexType.class);
+  @Override public Collection<IEObjectDescription> findScope(MessageField field) {
+    return astWalker.traverseAst(field, typeScopeFinder, ComplexType.class);
   }
 
   @SuppressWarnings("unused")
@@ -102,8 +102,8 @@
   }
   
   @SuppressWarnings("unused")
-  public IScope scope_OptionSource_target(OptionSource s, EReference r) {
-    EObject c = s.eContainer();
+  public IScope scope_OptionSource_target(OptionSource source, EReference r) {
+    EObject c = source.eContainer();
     if (c instanceof NativeOption) {
       NativeOption option = (NativeOption) c;
       return createScope(nativeOptionDescriptions.properties(option));
@@ -175,17 +175,12 @@
   }
   
   @SuppressWarnings("unused") 
-  public IScope scope_NormalFieldNotationNameSource_property(NormalFieldNotationNameSource s, EReference r) {
-    return findScope(s);
+  public IScope scope_FieldName_target(FieldName name, EReference r) {
+    return findScope(name);
   }
 
-  @SuppressWarnings("unused") 
-  public IScope scope_ExtensionFieldNotationNameSource_extension(ExtensionFieldNotationNameSource s, EReference r) {
-    return findScope(s);
-  }
-
-  private IScope findScope(FieldNotationNameSource s) {
-    return createScope(fieldNotationScopeFinder.sourceOf(s));
+  private IScope findScope(FieldName name) {
+    return createScope(fieldNotationScopeFinder.sourceOf(name));
   }
   
   private static IScope createScope(Iterable<IEObjectDescription> descriptions) {
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 5deda46..b74f062 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
@@ -20,17 +20,18 @@
  */
 public interface Scoping {
 
-  Collection<IEObjectDescription> findScope(CustomOption option);
-
-  Collection<IEObjectDescription> findScope(CustomFieldOption option);
-
-  Collection<IEObjectDescription> findScope(OptionField field);
+  // TODO redo this interface taking same parameters as ProtobufScopeProvider
+  Collection<IEObjectDescription> findFieldScope(CustomFieldOption option);
 
   Collection<IEObjectDescription> findFieldScope(CustomOption option);
 
-  Collection<IEObjectDescription> findFieldScope(CustomFieldOption option);
-
-  Collection<IEObjectDescription> findTypeScope(EObject o);
-
   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);
 }