diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_lastFieldSourceFrom_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_sourceOfLastFieldIn_Test.java
similarity index 88%
rename from com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_lastFieldSourceFrom_Test.java
rename to com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_sourceOfLastFieldIn_Test.java
index 7f21876..755de75 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_lastFieldSourceFrom_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_sourceOfLastFieldIn_Test.java
@@ -19,11 +19,11 @@
 import com.google.eclipse.protobuf.protobuf.*;
 
 /**
- * Tests for <code>{@link FieldOptions#lastFieldSourceFrom(CustomFieldOption)}</code>.
+ * Tests for <code>{@link FieldOptions#sourceOfLastFieldIn(CustomFieldOption)}</code>.
  *
  * alruiz@google.com (Alex Ruiz)
  */
-public class FieldOptions_lastFieldSourceFrom_Test {
+public class FieldOptions_sourceOfLastFieldIn_Test {
 
   @Rule public XtextRule xtext = createWith(integrationTestSetup());
 
@@ -50,7 +50,7 @@
   // }
   @Test public void should_return_option_field() {
     CustomFieldOption option = xtext.find("custom", ").", CustomFieldOption.class);
-    MessageField field = (MessageField) fieldOptions.lastFieldSourceFrom(option);
+    MessageField field = (MessageField) fieldOptions.sourceOfLastFieldIn(option);
     assertThat(field.getName(), equalTo("count"));
   }
 }
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue131_AddOptionsForService_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue131_AddOptionsForService_Test.java
index 13cb80f..28443ba 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue131_AddOptionsForService_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue131_AddOptionsForService_Test.java
@@ -59,7 +59,7 @@
   // }
   @Test public void should_support_Service_options() {
     Option option = xtext.find("code", ")", Option.class);
-    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
+    IScope scope = provider.scope_OptionSource_target(option.getSource(), reference);
     assertThat(descriptionsIn(scope), containAll("code", "proto.code", "google.proto.code", "com.google.proto.code",
                                                  ".com.google.proto.code",
                                                  "info", "proto.info", "google.proto.info", "com.google.proto.info",
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue147_AddSupportForGroupOptions_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue147_AddSupportForGroupOptions_Test.java
index 7036bad..8428302 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue147_AddSupportForGroupOptions_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue147_AddSupportForGroupOptions_Test.java
@@ -56,7 +56,7 @@
   // }
   @Test public void should_provide_fields_for_native_option() {
     NativeFieldOption option = xtext.find("deprecated", NativeFieldOption.class);
-    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
+    IScope scope = provider.scope_OptionSource_target(option.getSource(), reference);
     Collection<MessageField> optionSources = descriptor().optionsOfType(FIELD);
     assertThat(descriptionsIn(scope), containAll(optionSources));
   }
@@ -83,7 +83,7 @@
   // }
   @Test public void should_provide_fields_for_custom_option() {
     CustomFieldOption option = xtext.find("code", ")", CustomFieldOption.class);
-    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
+    IScope scope = provider.scope_OptionSource_target(option.getSource(), reference);
     assertThat(descriptionsIn(scope), containAll("code", "proto.code", "google.proto.code", "com.google.proto.code",
                                                  ".com.google.proto.code",
                                                  "info", "proto.info", "google.proto.info", "com.google.proto.info",
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue156_AddSupportForEnumValueOptions_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue156_AddSupportForEnumValueOptions_Test.java
index eacee33..3d8022b 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue156_AddSupportForEnumValueOptions_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue156_AddSupportForEnumValueOptions_Test.java
@@ -56,7 +56,7 @@
   // }
   @Test public void should_provide_fields_for_custom_field_option() {
     CustomFieldOption option = xtext.find("active", ")", CustomFieldOption.class);
-    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
+    IScope scope = provider.scope_OptionSource_target(option.getSource(), reference);
     assertThat(descriptionsIn(scope), containAll("active", ".active"));
   }
 }
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_ExtensionFieldNotationNameSource_extension_Test.java
index e8f9a67..46e8709 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_ExtensionFieldNotationNameSource_extension_Test.java
@@ -65,9 +65,9 @@
   //     }
   //   }
   // };
-  @Test public void should_provide_sources_for_field_notation_in_option() {
-    FieldNotation notation = xtext.find("google.proto.test.fileopt", "]", FieldNotation.class);
-    ExtensionFieldNotationNameSource s = (ExtensionFieldNotationNameSource) notation.getName();
+  @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);
     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_NormalFieldNotationNameSource_property_Test.java
index 40c211a..4d10274 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_NormalFieldNotationNameSource_property_Test.java
@@ -58,9 +58,9 @@
   // option (type) = {
   //   code: 68
   // };
-  @Test public void should_provide_sources_for_field_notation_in_option() {
-    FieldNotation notation = xtext.find("code", ":", FieldNotation.class);
-    NormalFieldNotationNameSource s = (NormalFieldNotationNameSource) notation.getName();
+  @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);
     Message message = xtext.find("Type", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(message));
@@ -87,8 +87,8 @@
   //   name { value: 'Address' }
   // };
   @Test public void should_provide_sources_for_nested_field_notation_in_option() {
-    FieldNotation notation = xtext.find("value", ":", FieldNotation.class);
-    NormalFieldNotationNameSource s = (NormalFieldNotationNameSource) notation.getName();
+    AggregateField field = xtext.find("value", ":", AggregateField.class);
+    NormalFieldNotationNameSource s = (NormalFieldNotationNameSource) field.getName();
     IScope scope = provider.scope_NormalFieldNotationNameSource_property(s, reference);
     Message message = xtext.find("Names", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(message));
@@ -110,8 +110,8 @@
   //   optional int target = 1 [(type) = { code: 68 }];
   // }
   @Test public void should_provide_sources_for_field_notation_in_field_option() {
-    FieldNotation notation = xtext.find("code", ":", FieldNotation.class);
-    NormalFieldNotationNameSource s = (NormalFieldNotationNameSource) notation.getName();
+    AggregateField field = xtext.find("code", ":", AggregateField.class);
+    NormalFieldNotationNameSource s = (NormalFieldNotationNameSource) field.getName();
     IScope scope = provider.scope_NormalFieldNotationNameSource_property(s, reference);
     Message message = xtext.find("Type", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(message));
@@ -138,8 +138,8 @@
   //   optional int target = 1 [(type) = { name: { value: 'Address' } }];
   // }
   @Test public void should_provide_sources_for_nested_field_notation_in_field_option() {
-    FieldNotation notation = xtext.find("value", ":", FieldNotation.class);
-    NormalFieldNotationNameSource s = (NormalFieldNotationNameSource) notation.getName();
+    AggregateField field = xtext.find("value", ":", AggregateField.class);
+    NormalFieldNotationNameSource s = (NormalFieldNotationNameSource) field.getName();
     IScope scope = provider.scope_NormalFieldNotationNameSource_property(s, reference);
     Message message = xtext.find("Names", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(message));
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionExtendMessageFieldSource_optionExtendMessageField_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionField_target_with_ExtensionOptionField_Test.java
similarity index 79%
rename from com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionExtendMessageFieldSource_optionExtendMessageField_Test.java
rename to com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionField_target_with_ExtensionOptionField_Test.java
index 617f43e..499515e 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionExtendMessageFieldSource_optionExtendMessageField_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionField_target_with_ExtensionOptionField_Test.java
@@ -23,11 +23,11 @@
 import com.google.eclipse.protobuf.protobuf.*;
 
 /**
- * Tests for <code>{@link ProtobufScopeProvider#scope_OptionExtendMessageFieldSource_optionExtendMessageField(OptionExtendMessageFieldSource, EReference)}</code>.
+ * Tests for <code>{@link ProtobufScopeProvider#scope_OptionField_target(OptionField, EReference)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class ProtobufScopeProvider_scope_OptionExtendMessageFieldSource_optionExtendMessageField_Test {
+public class ProtobufScopeProvider_scope_OptionField_target_with_ExtensionOptionField_Test {
 
   private static EReference reference;
 
@@ -66,8 +66,8 @@
   // option (type).(active) = true;
   @Test public void should_provide_extend_message_fields_for_first_field_in_custom_option() {
     CustomOption option = xtext.find("type", ")", CustomOption.class);
-    OptionExtendMessageFieldSource codeOptionField = (OptionExtendMessageFieldSource) option.getOptionFields().get(0);
-    IScope scope = provider.scope_OptionExtendMessageFieldSource_optionExtendMessageField(codeOptionField, reference);
+    ExtensionOptionField codeOptionField = (ExtensionOptionField) option.getFields().get(0);
+    IScope scope = provider.scope_OptionField_target(codeOptionField, reference);
     assertThat(descriptionsIn(scope), containAll("active", "com.google.proto.active", ".com.google.proto.active"));
   }
 
@@ -96,8 +96,8 @@
   // }
   @Test public void should_provide_message_fields_for_first_field_in_field_custom_option() {
     CustomFieldOption option = xtext.find("type", ")", CustomFieldOption.class);
-    OptionExtendMessageFieldSource codeOptionField = (OptionExtendMessageFieldSource) option.getOptionFields().get(0);
-    IScope scope = provider.scope_OptionExtendMessageFieldSource_optionExtendMessageField(codeOptionField, reference);
+    ExtensionOptionField codeOptionField = (ExtensionOptionField) option.getFields().get(0);
+    IScope scope = provider.scope_OptionField_target(codeOptionField, reference);
     assertThat(descriptionsIn(scope), containAll("active", "com.google.proto.active", ".com.google.proto.active"));
   }
 }
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionMessageFieldSource_optionMessageField_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionField_target_with_MessageOptionField_Test.java
similarity index 77%
rename from com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionMessageFieldSource_optionMessageField_Test.java
rename to com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionField_target_with_MessageOptionField_Test.java
index 592310f..9cafb44 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionMessageFieldSource_optionMessageField_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionField_target_with_MessageOptionField_Test.java
@@ -24,11 +24,11 @@
 import com.google.eclipse.protobuf.protobuf.*;
 
 /**
- * Tests for <code>{@link ProtobufScopeProvider#scope_OptionMessageFieldSource_optionMessageField(OptionMessageFieldSource, EReference)}</code>.
+ * Tests for <code>{@link ProtobufScopeProvider#scope_OptionField_target(OptionField, EReference)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class ProtobufScopeProvider_scope_OptionMessageFieldSource_optionMessageField_Test {
+public class ProtobufScopeProvider_scope_OptionField_target_with_MessageOptionField_Test {
 
   private static EReference reference;
 
@@ -60,8 +60,8 @@
   // option (type).code = 68;
   @Test public void should_provide_message_fields_for_first_field_in_custom_option() {
     CustomOption option = xtext.find("type", ")", CustomOption.class);
-    OptionMessageFieldSource codeOptionField = (OptionMessageFieldSource) option.getOptionFields().get(0);
-    IScope scope = provider.scope_OptionMessageFieldSource_optionMessageField(codeOptionField, reference);
+    MessageOptionField codeOptionField = (MessageOptionField) option.getFields().get(0);
+    IScope scope = provider.scope_OptionField_target(codeOptionField, reference);
     Message typeMessage = xtext.find("Type", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(typeMessage));
   }
@@ -86,8 +86,8 @@
   // option (type).code.number = 68;
   @Test public void should_provide_message_fields_for_field_in_custom_option() {
     CustomOption option = xtext.find("type", ")", CustomOption.class);
-    OptionMessageFieldSource numberOptionField = (OptionMessageFieldSource) option.getOptionFields().get(1);
-    IScope scope = provider.scope_OptionMessageFieldSource_optionMessageField(numberOptionField, reference);
+    MessageOptionField numberOptionField = (MessageOptionField) option.getFields().get(1);
+    IScope scope = provider.scope_OptionField_target(numberOptionField, reference);
     Message codeMessage = xtext.find("Code", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(codeMessage));
   }
@@ -106,8 +106,8 @@
   // option (type).code = 68;
   @Test public void should_provide_group_fields_for_first_field_in_custom_option() {
     CustomOption option = xtext.find("type", ")", CustomOption.class, IGNORE_CASE);
-    OptionMessageFieldSource codeOptionField = (OptionMessageFieldSource) option.getOptionFields().get(0);
-    IScope scope = provider.scope_OptionMessageFieldSource_optionMessageField(codeOptionField, reference);
+    MessageOptionField codeOptionField = (MessageOptionField) option.getFields().get(0);
+    IScope scope = provider.scope_OptionField_target(codeOptionField, reference);
     Group groupMessage = xtext.find("Type", " =", Group.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(groupMessage));
   }
@@ -130,8 +130,8 @@
   // }
   @Test public void should_provide_message_fields_for_first_field_in_field_custom_option() {
     CustomFieldOption option = xtext.find("type", ")", CustomFieldOption.class);
-    OptionMessageFieldSource codeOptionField = (OptionMessageFieldSource) option.getOptionFields().get(0);
-    IScope scope = provider.scope_OptionMessageFieldSource_optionMessageField(codeOptionField, reference);
+    MessageOptionField codeOptionField = (MessageOptionField) option.getFields().get(0);
+    IScope scope = provider.scope_OptionField_target(codeOptionField, reference);
     Message typeMessage = xtext.find("Type", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(typeMessage));
   }
@@ -158,8 +158,8 @@
   // }
   @Test public void should_provide_message_fields_for_field_in_field_custom_option() {
     CustomFieldOption option = xtext.find("type", ")", CustomFieldOption.class);
-    OptionMessageFieldSource numberOptionField = (OptionMessageFieldSource) option.getOptionFields().get(1);
-    IScope scope = provider.scope_OptionMessageFieldSource_optionMessageField(numberOptionField, reference);
+    MessageOptionField numberOptionField = (MessageOptionField) option.getFields().get(1);
+    IScope scope = provider.scope_OptionField_target(numberOptionField, reference);
     Message codeMessage = xtext.find("Code", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(codeMessage));
   }
@@ -180,8 +180,8 @@
   // }
   @Test public void should_provide_group_fields_for_first_field_in_field_custom_option() {
     CustomFieldOption option = xtext.find("type", ")", CustomFieldOption.class, IGNORE_CASE);
-    OptionMessageFieldSource codeOptionField = (OptionMessageFieldSource) option.getOptionFields().get(0);
-    IScope scope = provider.scope_OptionMessageFieldSource_optionMessageField(codeOptionField, reference);
+    MessageOptionField codeOptionField = (MessageOptionField) option.getFields().get(0);
+    IScope scope = provider.scope_OptionField_target(codeOptionField, reference);
     Group groupMessage = xtext.find("Type", " =", Group.class);
     assertThat(descriptionsIn(scope), containAllFieldsIn(groupMessage));
   }
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_optionField_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_target_Test.java
similarity index 82%
rename from com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_optionField_Test.java
rename to com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_target_Test.java
index 0abef3a..c6317fa 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_optionField_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_target_Test.java
@@ -27,11 +27,11 @@
 import com.google.eclipse.protobuf.protobuf.*;
 
 /**
- * Tests for <code>{@link ProtobufScopeProvider#scope_OptionSource_optionField(OptionSource, EReference)}</code>
+ * Tests for <code>{@link ProtobufScopeProvider#scope_OptionSource_target(OptionSource, EReference)}</code>
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class ProtobufScopeProvider_scope_OptionSource_optionField_Test {
+public class ProtobufScopeProvider_scope_OptionSource_target_Test {
 
   private static EReference reference;
 
@@ -50,9 +50,9 @@
   // syntax = "proto2";
   //
   // option optimize_for = SPEED;
-  @Test public void should_provide_Property_fields_for_native_option() {
+  @Test public void should_provide_sources_for_native_option() {
     Option option = xtext.find("optimize_for", Option.class);
-    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
+    IScope scope = provider.scope_OptionSource_target(option.getSource(), reference);
     Collection<MessageField> optionSources = descriptor().optionsOfType(FILE);
     assertThat(descriptionsIn(scope), containAll(optionSources));
   }
@@ -62,9 +62,9 @@
   // message Person {
   //   optional Type type = 1 [ctype = STRING];
   // }
-  @Test public void should_provide_Property_fields_for_native_field_option() {
+  @Test public void should_provide_sources_for_native_field_option() {
     NativeFieldOption option = xtext.find("ctype", NativeFieldOption.class);
-    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
+    IScope scope = provider.scope_OptionSource_target(option.getSource(), reference);
     Collection<MessageField> optionSources = descriptor().optionsOfType(FIELD);
     assertThat(descriptionsIn(scope), containAll(optionSources));
   }
@@ -85,9 +85,9 @@
   // }
   //
   // option (code) = 68;
-  @Test public void should_provide_Property_fields_for_custom_option() {
+  @Test public void should_provide_sources_for_custom_option() {
     Option option = xtext.find("code", ")", Option.class);
-    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
+    IScope scope = provider.scope_OptionSource_target(option.getSource(), reference);
     assertThat(descriptionsIn(scope), containAll("code", "proto.code", "google.proto.code", "com.google.proto.code",
                                                  ".com.google.proto.code",
                                                  "info", "proto.info", "google.proto.info", "com.google.proto.info",
@@ -111,9 +111,9 @@
   // import 'custom-options.proto';
   //
   // option (test.proto.code) = 68;
-  @Test public void should_provide_imported_Property_fields_for_custom_option() {
+  @Test public void should_provide_imported_sources_for_custom_option() {
     Option option = xtext.find("code", ")", Option.class);
-    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
+    IScope scope = provider.scope_OptionSource_target(option.getSource(), reference);
     assertThat(descriptionsIn(scope), containAll("test.proto.code", ".test.proto.code",
                                                  "test.proto.info", ".test.proto.info"));
   }
@@ -135,9 +135,9 @@
   // import 'custom-options.proto';
   //
   // option (code) = 68;
-  @Test public void should_provide_imported_Property_fields_for_custom_option_with_equal_package() {
+  @Test public void should_provide_imported_sources_for_custom_option_with_equal_package() {
     Option option = xtext.find("code", ")", Option.class);
-    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
+    IScope scope = provider.scope_OptionSource_target(option.getSource(), reference);
     assertThat(descriptionsIn(scope), containAll("code", "proto.code", "google.proto.code", "com.google.proto.code",
                                                  ".com.google.proto.code",
                                                  "info", "proto.info", "google.proto.info", "com.google.proto.info",
@@ -156,9 +156,9 @@
   // message Person {
   //   optional boolean active = 1 [(code) = 68];
   // }
-  @Test public void should_provide_Property_fields_for_custom_field_option() {
+  @Test public void should_provide_sources_for_custom_field_option() {
     CustomFieldOption option = xtext.find("code", ")", CustomFieldOption.class);
-    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
+    IScope scope = provider.scope_OptionSource_target(option.getSource(), reference);
     assertThat(descriptionsIn(scope), containAll("code", "proto.code", "google.proto.code", "com.google.proto.code",
                                                  ".com.google.proto.code",
                                                  "info", "proto.info", "google.proto.info", "com.google.proto.info",
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 242acd7..d4424c1 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
@@ -447,37 +447,37 @@
     return imageHelper.getImage(images.imageFor(Option.class));
   }
 
-  @Override public void completeCustomOption_OptionFields(EObject model, Assignment assignment,
+  @Override public void completeCustomOption_Fields(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {}
 
-  @Override public void completeCustomFieldOption_OptionFields(EObject model, Assignment assignment,
+  @Override public void completeCustomFieldOption_Fields(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {}
 
-  @Override public void completeOptionSource_OptionField(EObject model, Assignment assignment,
+  @Override public void completeOptionSource_Target(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {}
 
-  @Override public void completeOptionMessageFieldSource_OptionMessageField(EObject model, Assignment assignment,
+  @Override public void completeMessageOptionField_Target(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {}
 
-  @Override public void completeOptionExtendMessageFieldSource_OptionExtendMessageField(EObject model,
-      Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {}
+  @Override public void completeExtensionOptionField_Target(EObject model, Assignment assignment,
+      ContentAssistContext context, ICompletionProposalAcceptor acceptor) {}
 
-  @Override public void complete_OptionMessageFieldSource(EObject model, RuleCall ruleCall,
+  @Override public void complete_MessageOptionField(EObject model, RuleCall ruleCall,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     EObject e = findActualSemanticObjectFor(context.getCurrentNode());
     if (e instanceof Protobuf) e = model;
     Collection<IEObjectDescription> scope = emptySet();
     if (e instanceof CustomOption) {
       CustomOption option = (CustomOption) e;
-      scope = scoping().findMessageFieldScope(option);
+      scope = scoping().findFieldScope(option);
     }
     if (e instanceof CustomFieldOption) {
       CustomFieldOption option = (CustomFieldOption) e;
-      scope = scoping().findMessageFieldScope(option);
+      scope = scoping().findFieldScope(option);
     }
-    if (e instanceof OptionMessageFieldSource) {
-      OptionMessageFieldSource source = (OptionMessageFieldSource) e;
-      scope = scoping().findScope(source);
+    if (e instanceof MessageOptionField) {
+      MessageOptionField field = (MessageOptionField) e;
+      scope = scoping().findScope(field);
     }
     for (IEObjectDescription d : descriptionChooser.shortestQualifiedNamesIn(scope)) {
       Image image = imageHelper.getImage(images.imageFor(d.getEObjectOrProxy()));
@@ -485,21 +485,22 @@
     }
   }
 
-  @Override public void complete_OptionExtendMessageFieldSource(EObject model, RuleCall ruleCall,
+  // TODO fix parenthesis
+  @Override public void complete_ExtensionOptionField(EObject model, RuleCall ruleCall,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     EObject e = findActualSemanticObjectFor(context.getCurrentNode());
     if (e instanceof Protobuf) e = model;
     Collection<IEObjectDescription> scope = emptySet();
     if (e instanceof CustomOption) {
       CustomOption option = (CustomOption) e;
-      scope = scoping().findExtendMessageFieldScope(option);
+      scope = scoping().findFieldScope(option);
     }
     if (e instanceof CustomFieldOption) {
       CustomFieldOption option = (CustomFieldOption) e;
-      scope = scoping().findExtendMessageFieldScope(option);
+      scope = scoping().findFieldScope(option);
     }
-    if (e instanceof OptionExtendMessageFieldSource) {
-      OptionExtendMessageFieldSource source = (OptionExtendMessageFieldSource) e;
+    if (e instanceof ExtensionOptionField) {
+      ExtensionOptionField source = (ExtensionOptionField) e;
       scope = scoping().findScope(source);
     }
     for (IEObjectDescription d : descriptionChooser.shortestQualifiedNamesIn(scope)) {
@@ -532,7 +533,7 @@
     // TODO content assist returns "{"
     if (!(model instanceof CustomFieldOption)) return;
     CustomFieldOption option = (CustomFieldOption) model;
-    IndexedElement e = fieldOptions.lastFieldSourceFrom(option);
+    IndexedElement e = fieldOptions.sourceOfLastFieldIn(option);
     if (e == null) e = fieldOptions.rootSourceOf(option);
     if (e instanceof MessageField) {
       proposeDefaultValue((MessageField) e, context, acceptor);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/syntaxcoloring/ProtobufSemanticHighlightingCalculator.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/syntaxcoloring/ProtobufSemanticHighlightingCalculator.java
index f854c15..42d2b7f 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/syntaxcoloring/ProtobufSemanticHighlightingCalculator.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/syntaxcoloring/ProtobufSemanticHighlightingCalculator.java
@@ -122,12 +122,12 @@
 
   private void highlightOptions(IndexedElement element, IHighlightedPositionAcceptor acceptor) {
     for (FieldOption option : indexedElements.fieldOptionsOf(element)) {
-      ValueLink link = option.getValue();
-      if (link instanceof LiteralLink) {
+      Value value = option.getValue();
+      if (value instanceof LiteralLink) {
         highlightFirstFeature(option, FIELD_OPTION__VALUE, acceptor, ENUM_LITERAL_ID);
         return;
       }
-      if (link instanceof NumberLink) {
+      if (value instanceof NumberLink) {
         highlightFirstFeature(option, FIELD_OPTION__VALUE, acceptor, NUMBER_ID);
       }
     }
@@ -208,12 +208,12 @@
     if (element != null) {
       highlightFirstFeature(option, OPTION__SOURCE, acceptor, DEFAULT_ID);
     }
-    ValueLink link = option.getValue();
-    if (link instanceof LiteralLink) {
+    Value value = option.getValue();
+    if (value instanceof LiteralLink) {
       highlightFirstFeature(option, OPTION__VALUE, acceptor, ENUM_LITERAL_ID);
       return;
     }
-    if (link instanceof NumberLink) {
+    if (value instanceof NumberLink) {
       highlightFirstFeature(option, OPTION__VALUE, acceptor, NUMBER_ID);
     }
   }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java
index f714048..f9ddbd5 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java
@@ -74,23 +74,23 @@
     b.append(name);
     if (isCustomOption) b.append(")");
     if (option instanceof CustomOption) {
-      appendFields(b, ((CustomOption) option).getOptionFields());
+      appendFields(b, ((CustomOption) option).getFields());
     }
     if (option instanceof CustomFieldOption) {
-      appendFields(b, ((CustomFieldOption) option).getOptionFields());
+      appendFields(b, ((CustomFieldOption) option).getFields());
     }
     return b.toString();
   }
   
-  private void appendFields(StringBuilder b, List<OptionFieldSource> fields) {
-    for (OptionFieldSource field : fields) {
+  private void appendFields(StringBuilder b, List<OptionField> fields) {
+    for (OptionField field : fields) {
       b.append(".");
-      if (field instanceof OptionMessageFieldSource) {
-        IndexedElement source = ((OptionMessageFieldSource) field).getOptionMessageField();
+      if (field instanceof MessageOptionField) {
+        IndexedElement source = ((MessageOptionField) field).getTarget();
         b.append(options.nameForOption(source));
       }
-      if (field instanceof OptionExtendMessageFieldSource) {
-        IndexedElement source = ((OptionExtendMessageFieldSource) field).getOptionExtendMessageField();
+      if (field instanceof ExtensionOptionField) {
+        IndexedElement source = ((ExtensionOptionField) field).getTarget();
         b.append("(")
          .append(options.nameForOption(source))
          .append(")");
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 a37934e..fbed3c2 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
@@ -134,57 +134,57 @@
   NativeOption | CustomOption;
 
 NativeOption:
-  'option' source=OptionSource '=' value=ValueLink ';';
+  'option' source=OptionSource '=' value=Value ';';
 
 CustomOption:
   'option' '(' source=OptionSource ')'
-  ('.' optionFields+=OptionFieldSource ('.' optionFields+=OptionFieldSource)*)? '=' value=ValueLink ';';
+  ('.' fields+=OptionField ('.' fields+=OptionField)*)? '=' value=Value ';';
  
 FieldOption:
   DefaultValueFieldOption | NativeFieldOption | CustomFieldOption;
 
 DefaultValueFieldOption:
-  'default' '=' value=ValueLink;
+  'default' '=' value=Value;
 
 NativeFieldOption:
-  source=OptionSource '=' value=ValueLink;
+  source=OptionSource '=' value=Value;
 
 CustomFieldOption:
   '(' source=OptionSource ')'
-  ('.' optionFields+=OptionFieldSource ('.' optionFields+=OptionFieldSource)*)? '=' value=ValueLink;
+  ('.' fields+=OptionField ('.' fields+=OptionField)*)? '=' value=Value;
 
 OptionSource:
-  optionField=[IndexedElement|QualifiedName];
+  target=[IndexedElement|QualifiedName];
 
-OptionFieldSource:
-  OptionMessageFieldSource | OptionExtendMessageFieldSource;
+OptionField:
+  MessageOptionField | ExtensionOptionField;
 
-OptionMessageFieldSource:
-  optionMessageField=[IndexedElement];  
+MessageOptionField:
+  target=[IndexedElement];  
 
-OptionExtendMessageFieldSource:
-  '(' optionExtendMessageField=[IndexedElement|QualifiedName] ')';  
+ExtensionOptionField:
+  '(' target=[IndexedElement|QualifiedName] ')';  
 
 IndexedElement:
   MessageField | Group;
 
-ValueLink:
-  MessageNotation | SimpleValueLink;
+Value:
+  AggregateValue | SimpleValueLink;
 
 // { foo: 1, bar: 2 }
-MessageNotation:
+AggregateValue:
   '{'
-  fields+=FieldNotation ((',')? fields+=FieldNotation)*
+  fields+=AggregateField ((',')? fields+=AggregateField)*
   '}';
 
-FieldNotation:
+AggregateField:
   SimpleFieldNotation | ComplexFieldNotation;
 
 SimpleFieldNotation:
   name=FieldNotationNameSource ':' value=SimpleValueLink;
 
 ComplexFieldNotation:
-  name=FieldNotationNameSource ':'? values=MessageNotation;
+  name=FieldNotationNameSource ':'? values=AggregateValue;
 
 FieldNotationNameSource:
   NormalFieldNotationNameSource | ExtensionFieldNotationNameSource;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/FieldOptions.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/FieldOptions.java
index f212187..01081da 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/FieldOptions.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/FieldOptions.java
@@ -66,7 +66,7 @@
    * cannot be found.
    */
   public IndexedElement sourceOf(CustomFieldOption option) {
-    IndexedElement e = lastFieldSourceFrom(option);
+    IndexedElement e = sourceOfLastFieldIn(option);
     if (e == null) e = rootSourceOf(option);
     return e;
   }
@@ -91,7 +91,7 @@
       CustomFieldOption customOption = (CustomFieldOption) option;
       source = customOption.getSource();
     }
-    return (source == null) ? null : source.getOptionField();
+    return (source == null) ? null : source.getTarget();
   }
 
   /**
@@ -105,10 +105,10 @@
    * @return the last field of the given {@code CustomFieldOption} is referring to, or {@code null} if one cannot be
    * found.
    */
-  public IndexedElement lastFieldSourceFrom(CustomFieldOption option) {
-    List<OptionFieldSource> fields = option.getOptionFields();
+  public IndexedElement sourceOfLastFieldIn(CustomFieldOption option) {
+    List<OptionField> fields = option.getFields();
     if (fields.isEmpty()) return null;
-    OptionFieldSource last = fields.get(fields.size() - 1);
+    OptionField last = fields.get(fields.size() - 1);
     return optionFields.sourceOf(last);
   }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/OptionFields.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/OptionFields.java
index 7956532..77bfc8a 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/OptionFields.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/OptionFields.java
@@ -21,17 +21,15 @@
 
   /**
    * Returns the field the given option field is referring to.
-   * @param fieldSource the given option field.
+   * @param field the given option field.
    * @return the field the given option field is referring to, or {@code null} if one cannot be found.
    */
-  public IndexedElement sourceOf(OptionFieldSource fieldSource) {
-    if (fieldSource instanceof OptionMessageFieldSource) {
-      OptionMessageFieldSource source = (OptionMessageFieldSource) fieldSource;
-      return source.getOptionMessageField();
+  public IndexedElement sourceOf(OptionField field) {
+    if (field instanceof MessageOptionField) {
+      return ((MessageOptionField) field).getTarget();
     }
-    if (fieldSource instanceof OptionExtendMessageFieldSource) {
-      OptionExtendMessageFieldSource source = (OptionExtendMessageFieldSource) fieldSource;
-      return source.getOptionExtendMessageField();
+    if (field instanceof ExtensionOptionField) {
+      return ((ExtensionOptionField) field).getTarget();
     }
     return null;
   }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java
index 17e7d16..6732395 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java
@@ -66,7 +66,7 @@
    */
   public IndexedElement rootSourceOf(Option option) {
     OptionSource source = option.getSource();
-    return (source == null) ? null : source.getOptionField();
+    return (source == null) ? null : source.getTarget();
   }
 
   /**
@@ -80,9 +80,9 @@
    * @return the last field of the given {@code CustomOption} is referring to, or {@code null} if one cannot be found.
    */
   public IndexedElement lastFieldSourceFrom(CustomOption option) {
-    List<OptionFieldSource> fields = option.getOptionFields();
+    List<OptionField> fields = option.getFields();
     if (fields.isEmpty()) return null;
-    OptionFieldSource last = fields.get(fields.size() - 1);
+    OptionField last = fields.get(fields.size() - 1);
     return optionFields.sourceOf(last);
   }
   
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldScopeFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldScopeFinder.java
index 12fa210..7140cb1 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldScopeFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldScopeFinder.java
@@ -31,13 +31,13 @@
   @Inject private Options options;
   @Inject private QualifiedNameDescriptions qualifiedNameDescriptions;
 
-  Collection<IEObjectDescription> findScope(CustomOption option, OptionMessageFieldSource source) {
-    return findScope(option, source, new MessageFieldDescriptorProvider());
+  Collection<IEObjectDescription> findScope(CustomOption option, OptionField field) {
+    return findScope(option, field, descriptionsProvider(field));
   }
 
-  private Collection<IEObjectDescription> findScope(final CustomOption option, EObject source,
+  private Collection<IEObjectDescription> findScope(final CustomOption option, OptionField field,
       IEObjectDescriptionsProvider provider) {
-    IndexedElement e = referredField(source, option.getOptionFields(), new Provider<IndexedElement>() {
+    IndexedElement e = referredField(field, option.getFields(), new Provider<IndexedElement>() {
       @Override public IndexedElement get() {
         return options.rootSourceOf(option);
       }
@@ -46,21 +46,18 @@
     return emptySet();
   }
 
-  Collection<IEObjectDescription> findScope(CustomFieldOption option, OptionMessageFieldSource source) {
-    return findScope(option, source, new MessageFieldDescriptorProvider());
+  Collection<IEObjectDescription> findScope(CustomFieldOption option, OptionField field) {
+    return findScope(option, field, descriptionsProvider(field));
+  }
+  
+  private IEObjectDescriptionsProvider descriptionsProvider(OptionField field) {
+    if (field instanceof MessageOptionField) return new MessageFieldDescriptorProvider();
+    return new ExtensionFieldDescriptorProvider();
   }
 
-  Collection<IEObjectDescription> findScope(CustomOption option, OptionExtendMessageFieldSource source) {
-    return findScope(option, source, new ExtendMessageFieldDescriptorProvider());
-  }
-
-  Collection<IEObjectDescription> findScope(CustomFieldOption option, OptionExtendMessageFieldSource source) {
-    return findScope(option, source, new ExtendMessageFieldDescriptorProvider());
-  }
-
-  private Collection<IEObjectDescription> findScope(final CustomFieldOption option, EObject source,
+  private Collection<IEObjectDescription> findScope(final CustomFieldOption option, OptionField field,
       IEObjectDescriptionsProvider provider) {
-    IndexedElement e = referredField(source, option.getOptionFields(), new Provider<IndexedElement>() {
+    IndexedElement e = referredField(field, option.getFields(), new Provider<IndexedElement>() {
       @Override public IndexedElement get() {
         return fieldOptions.rootSourceOf(option);
       }
@@ -69,18 +66,18 @@
     return emptySet();
   }
 
-  private IndexedElement referredField(EObject source, List<OptionFieldSource> allFieldSources,
+  private IndexedElement referredField(OptionField field, List<OptionField> allFields, 
       Provider<IndexedElement> provider) {
-    OptionFieldSource previous = null;
+    OptionField previous = null;
     boolean isFirstField = true;
-    for (OptionFieldSource s : allFieldSources) {
-      if (s == source) {
+    for (OptionField current : allFields) {
+      if (current == field) {
         return (isFirstField) ? provider.get() : optionFields.sourceOf(previous);
       }
-      previous = s;
+      previous = current;
       isFirstField = false;
     }
-    if (source == null) {
+    if (field == null) {
       if (previous == null) return provider.get();
       return optionFields.sourceOf(previous);
     }
@@ -113,7 +110,7 @@
     }
   }
 
-  private class ExtendMessageFieldDescriptorProvider implements IEObjectDescriptionsProvider {
+  private class ExtensionFieldDescriptorProvider implements IEObjectDescriptionsProvider {
     @Override public Collection<IEObjectDescription> fieldsInTypeOf(IndexedElement e) {
       if (!(e instanceof MessageField)) return emptyList();
       Message fieldType = modelFinder.messageTypeOf((MessageField) e);
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 56af398..0c90c7d 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
@@ -32,8 +32,8 @@
 
   Collection<IEObjectDescription> sourceOf(FieldNotationNameSource s) {
     EObject container = s.eContainer();
-    if (!(container instanceof FieldNotation)) return emptySet();
-    MessageField field = sourceOf((FieldNotation) container);
+    if (!(container instanceof AggregateField)) return emptySet();
+    MessageField field = sourceOf((AggregateField) container);
     if (field == null) return emptySet();
     if (s instanceof NormalFieldNotationNameSource) {
       return propertiesInTypeOf(field);
@@ -41,10 +41,10 @@
     return propertiesInExtendMessageOf(field);
   }
   
-  private MessageField sourceOf(FieldNotation notation) {
-    EObject container = notation.eContainer();
+  private MessageField sourceOf(AggregateField field) {
+    EObject container = field.eContainer();
     IndexedElement source = null;
-    if (container instanceof MessageNotation) {
+    if (container instanceof AggregateValue) {
       container = container.eContainer();
       if (container instanceof CustomOption) {
         CustomOption option = (CustomOption) container;
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 0e1f131..012bf69 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
@@ -47,8 +47,8 @@
   @Inject private TypeScopeFinder typeScopeFinder;
 
   @SuppressWarnings("unused")
-  public IScope scope_ComplexTypeLink_target(ComplexTypeLink t, EReference r) {
-    EObject c = t.eContainer();
+  public IScope scope_ComplexTypeLink_target(ComplexTypeLink link, EReference r) {
+    EObject c = link.eContainer();
     if (c instanceof MessageField) {
       return createScope(findTypeScope(c));
     }
@@ -61,8 +61,8 @@
   }
 
   @SuppressWarnings("unused")
-  public IScope scope_MessageLink_target(MessageLink m, EReference r) {
-    return createScope(findMessageScope(m));
+  public IScope scope_MessageLink_target(MessageLink link, EReference r) {
+    return createScope(findMessageScope(link));
   }
 
   @Override public Collection<IEObjectDescription> findMessageScope(EObject o) {
@@ -71,8 +71,8 @@
   }
 
   @SuppressWarnings("unused")
-  public IScope scope_LiteralLink_target(LiteralLink l, EReference r) {
-    EObject container = l.eContainer();
+  public IScope scope_LiteralLink_target(LiteralLink link, EReference r) {
+    EObject container = link.eContainer();
     Enum anEnum = null;
     if (container instanceof DefaultValueFieldOption) {
       container = container.eContainer();
@@ -102,7 +102,7 @@
   }
   
   @SuppressWarnings("unused")
-  public IScope scope_OptionSource_optionField(OptionSource s, EReference r) {
+  public IScope scope_OptionSource_target(OptionSource s, EReference r) {
     EObject c = s.eContainer();
     if (c instanceof NativeOption) {
       NativeOption option = (NativeOption) c;
@@ -124,87 +124,54 @@
     return createScope(descriptions);
   }
   
-  @Override public Collection<IEObjectDescription> findScope(CustomOption o) {
-    OptionType optionType = typeOf(o);
+  @Override public Collection<IEObjectDescription> findScope(CustomOption option) {
+    OptionType optionType = typeOf(option);
     Collection<IEObjectDescription> descriptions = emptySet();
     if (optionType != null) {
-      descriptions = astWalker.traverseAst(o, customOptionScopeFinder, optionType);
+      descriptions = astWalker.traverseAst(option, customOptionScopeFinder, optionType);
     }
     return descriptions;
   }
 
-  @Override public Collection<IEObjectDescription> findScope(CustomFieldOption o) {
-    OptionType optionType = typeOf(o);
+  @Override public Collection<IEObjectDescription> findScope(CustomFieldOption option) {
+    OptionType optionType = typeOf(option);
     Collection<IEObjectDescription> descriptions = emptySet();
     if (optionType != null) {
-      descriptions = astWalker.traverseAst(o, customOptionScopeFinder, optionType);
+      descriptions = astWalker.traverseAst(option, customOptionScopeFinder, optionType);
     }
     return descriptions;
   }
 
   @SuppressWarnings("unused") 
-  public IScope scope_OptionMessageFieldSource_optionMessageField(OptionMessageFieldSource s, EReference r) {
-    return createScope(findScope(s));
+  public IScope scope_OptionField_target(OptionField field, EReference r) {
+    return createScope(findScope(field));
   }
   
-  @Override public Collection<IEObjectDescription> findScope(OptionMessageFieldSource s) {
-    EObject container = s.eContainer();
+  @Override public Collection<IEObjectDescription> findScope(OptionField field) {
+    EObject container = field.eContainer();
     if (container instanceof CustomOption) {
-      return findSources((CustomOption) container, s);
+      return findSources((CustomOption) container, field);
     }
     if (container instanceof CustomFieldOption) {
-      return findSources((CustomFieldOption) container, s);
+      return findSources((CustomFieldOption) container, field);
     }
     return emptySet();
   }
   
-  @Override public Collection<IEObjectDescription> findMessageFieldScope(CustomOption o) {
-    return findSources(o, (OptionMessageFieldSource) null);
+  @Override public Collection<IEObjectDescription> findFieldScope(CustomOption option) {
+    return findSources(option, (MessageOptionField) null);
   }
 
-  @Override public Collection<IEObjectDescription> findMessageFieldScope(CustomFieldOption o) {
-    return findSources(o, (OptionMessageFieldSource) null);
+  @Override public Collection<IEObjectDescription> findFieldScope(CustomFieldOption option) {
+    return findSources(option, (MessageOptionField) null);
   }
 
-  private Collection<IEObjectDescription> findSources(CustomOption o, OptionMessageFieldSource s) {
-    return customOptionFieldScopeFinder.findScope(o, s);
+  private Collection<IEObjectDescription> findSources(CustomOption option,OptionField field) {
+    return customOptionFieldScopeFinder.findScope(option, field);
   }
 
-  private Collection<IEObjectDescription> findSources(CustomFieldOption o, OptionMessageFieldSource s) {
-    return customOptionFieldScopeFinder.findScope(o, s);
-  }
-  
-  @SuppressWarnings("unused") 
-  public IScope scope_OptionExtendMessageFieldSource_optionExtendMessageField(OptionExtendMessageFieldSource s, 
-      EReference r) {
-    return createScope(findScope(s));
-  }
-  
-  @Override public Collection<IEObjectDescription> findScope(OptionExtendMessageFieldSource s) {
-    EObject container = s.eContainer();
-    if (container instanceof CustomOption) {
-      return findSources((CustomOption) container, s);
-    }
-    if (container instanceof CustomFieldOption) {
-      return findSources((CustomFieldOption) container, s);
-    }
-    return emptySet();
-  }
-
-  @Override public Collection<IEObjectDescription> findExtendMessageFieldScope(CustomOption o) {
-    return findSources(o, (OptionExtendMessageFieldSource) null);
-  }
-
-  @Override public Collection<IEObjectDescription> findExtendMessageFieldScope(CustomFieldOption o) {
-    return findSources(o, (OptionExtendMessageFieldSource) null);
-  }
-
-  private Collection<IEObjectDescription> findSources(CustomOption option, OptionExtendMessageFieldSource s) {
-    return customOptionFieldScopeFinder.findScope(option, s);
-  }
-
-  private Collection<IEObjectDescription> findSources(CustomFieldOption option, OptionExtendMessageFieldSource o) {
-    return customOptionFieldScopeFinder.findScope(option, o);
+  private Collection<IEObjectDescription> findSources(CustomFieldOption option, OptionField field) {
+    return customOptionFieldScopeFinder.findScope(option, field);
   }
   
   @SuppressWarnings("unused") 
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 813a810..5deda46 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,21 +20,15 @@
  */
 public interface Scoping {
 
-  Collection<IEObjectDescription> findScope(CustomOption o);
+  Collection<IEObjectDescription> findScope(CustomOption option);
 
-  Collection<IEObjectDescription> findScope(CustomFieldOption o);
+  Collection<IEObjectDescription> findScope(CustomFieldOption option);
 
-  Collection<IEObjectDescription> findScope(OptionMessageFieldSource s);
+  Collection<IEObjectDescription> findScope(OptionField field);
 
-  Collection<IEObjectDescription> findScope(OptionExtendMessageFieldSource s);
+  Collection<IEObjectDescription> findFieldScope(CustomOption option);
 
-  Collection<IEObjectDescription> findMessageFieldScope(CustomOption o);
-
-  Collection<IEObjectDescription> findMessageFieldScope(CustomFieldOption o);
-
-  Collection<IEObjectDescription> findExtendMessageFieldScope(CustomOption o);
-
-  Collection<IEObjectDescription> findExtendMessageFieldScope(CustomFieldOption o);
+  Collection<IEObjectDescription> findFieldScope(CustomFieldOption option);
 
   Collection<IEObjectDescription> findTypeScope(EObject o);
 
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
index c9f0265..4ac564b 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
@@ -50,7 +50,7 @@
   @Check public void checkDefaultValueType(FieldOption option) {
     if (!fieldOptions.isDefaultValueOption(option)) return;
     MessageField field = (MessageField) option.eContainer();
-    ValueLink defaultValue = option.getValue();
+    Value defaultValue = option.getValue();
     if (properties.isString(field)) {
       if (defaultValue instanceof StringLink) return;
       error(expectedString, FIELD_OPTION__VALUE);
