diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_propertyFrom_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_sourceOf_Test.java
similarity index 87%
rename from com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_propertyFrom_Test.java
rename to com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_sourceOf_Test.java
index 52d524c..c9a5470 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_propertyFrom_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/FieldOptions_sourceOf_Test.java
@@ -19,11 +19,11 @@
 import org.junit.*;
 
 /**
- * Tests for <code>{@link FieldOptions#propertyFrom(FieldOption)}</code>.
+ * Tests for <code>{@link FieldOptions#sourceOf(FieldOption)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class FieldOptions_propertyFrom_Test {
+public class FieldOptions_sourceOf_Test {
 
   @Rule public XtextRule xtext = createWith(integrationTestSetup());
 
@@ -38,7 +38,7 @@
   // }
   @Test public void should_return_property_of_native_field_option() {
     FieldOption option = xtext.find("deprecated", FieldOption.class);
-    Property p = fieldOptions.propertyFrom(option);
+    Property p = (Property) fieldOptions.sourceOf(option);
     assertThat(p.getName(), equalTo("deprecated"));
   }
 
@@ -53,7 +53,7 @@
   // }
   @Test public void should_return_property_of_custom_field_option() {
     FieldOption option = xtext.find("encoding", ")", FieldOption.class);
-    Property p = fieldOptions.propertyFrom(option);
+    Property p = (Property) fieldOptions.sourceOf(option);
     assertThat(p.getName(), equalTo("encoding"));
   }
 }
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_propertyFrom_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_sourceOf_Test.java
similarity index 88%
rename from com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_propertyFrom_Test.java
rename to com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_sourceOf_Test.java
index af538ea..55a084b 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_propertyFrom_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_sourceOf_Test.java
@@ -19,11 +19,11 @@
 import org.junit.*;
 
 /**
- * Tests for <code>{@link Options#propertyFrom(Option)}</code>.
+ * Tests for <code>{@link Options#sourceOf(Option)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class Options_propertyFrom_Test {
+public class Options_sourceOf_Test {
 
   @Rule public XtextRule xtext = createWith(integrationTestSetup());
 
@@ -36,7 +36,7 @@
   // option java_package = 'com.google.eclipse.protobuf.tests';
   @Test public void should_return_property_of_native_option() {
     Option option = xtext.find("java_package", Option.class);
-    Property p = options.propertyFrom(option);
+    Property p = (Property) options.sourceOf(option);
     assertThat(p.getName(), equalTo("java_package"));
   }
 
@@ -49,7 +49,7 @@
   // option (encoding) = 'UTF-8';
   @Test public void should_return_property_of_custom_option() {
     Option option = xtext.find("encoding", ")", Option.class);
-    Property p = options.propertyFrom(option);
+    Property p = (Property) options.sourceOf(option);
     assertThat(p.getName(), equalTo("encoding"));
   }
 }
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 dceff51..dcd8633 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
@@ -58,7 +58,7 @@
   // }
   @Test public void should_support_Service_options() {
     Option option = xtext.find("code", ")", Option.class);
-    IScope scope = provider.scope_PropertyRef_property(option.getProperty(), reference);
+    IScope scope = provider.scope_OptionSource_optionField(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 99008d8..c394448 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
@@ -54,7 +54,7 @@
   // }
   @Test public void should_provide_Property_fields_for_native_option() {
     NativeFieldOption option = xtext.find("deprecated", NativeFieldOption.class);
-    IScope scope = provider.scope_PropertyRef_property(option.getProperty(), reference);
+    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
     Collection<Property> fieldOptions = descriptor().optionsOfType(FIELD);
     assertThat(descriptionsIn(scope), containAll(fieldOptions));
   }
@@ -79,7 +79,7 @@
   // }
   @Test public void should_provide_Property_fields_for_custom_option() {
     CustomFieldOption option = xtext.find("code", ")", CustomFieldOption.class);
-    IScope scope = provider.scope_PropertyRef_property(option.getProperty(), reference);
+    IScope scope = provider.scope_OptionSource_optionField(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/ProtobufScopeProvider_scope_MessagePropertyRef_messageProperty_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionMessageFieldSource_optionMessageField_Test.java
similarity index 79%
rename from com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_MessagePropertyRef_messageProperty_Test.java
rename to com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionMessageFieldSource_optionMessageField_Test.java
index 0eb89a7..b9c9687 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_MessagePropertyRef_messageProperty_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionMessageFieldSource_optionMessageField_Test.java
@@ -23,11 +23,11 @@
 import org.junit.*;
 
 /**
- * Tests for <code>{@link ProtobufScopeProvider#scope_MessagePropertyRef_messageProperty(MessagePropertyRef, EReference)}</code>.
+ * Tests for <code>{@link ProtobufScopeProvider#scope_OptionMessageFieldSource_optionMessageField(OptionMessageFieldSource, EReference)}</code>.
  * 
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class ProtobufScopeProvider_scope_MessagePropertyRef_messageProperty_Test {
+public class ProtobufScopeProvider_scope_OptionMessageFieldSource_optionMessageField_Test {
 
   private static EReference reference;
   
@@ -57,8 +57,8 @@
   // option (type).code = 68;
   @Test public void should_provide_Property_fields_for_custom_option_field() {
     CustomOption option = xtext.find("type", ")", CustomOption.class);
-    MessagePropertyRef optionField = (MessagePropertyRef) option.getOptionFields().get(0);
-    IScope scope = provider.scope_MessagePropertyRef_messageProperty(optionField, reference);
+    OptionMessageFieldSource optionField = (OptionMessageFieldSource) option.getOptionFields().get(0);
+    IScope scope = provider.scope_OptionMessageFieldSource_optionMessageField(optionField, reference);
     Message typeMessage = xtext.find("Type", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllPropertiesIn(typeMessage));
   }
@@ -79,8 +79,8 @@
   // }
   @Test public void should_provide_Property_fields_for_custom_field_option_field() {
     CustomFieldOption option = xtext.find("type", ")", CustomFieldOption.class);
-    MessagePropertyRef optionField = (MessagePropertyRef) option.getOptionFields().get(0);
-    IScope scope = provider.scope_MessagePropertyRef_messageProperty(optionField, reference);
+    OptionMessageFieldSource optionField = (OptionMessageFieldSource) option.getOptionFields().get(0);
+    IScope scope = provider.scope_OptionMessageFieldSource_optionMessageField(optionField, reference);
     Message typeMessage = xtext.find("Type", " {", Message.class);
     assertThat(descriptionsIn(scope), containAllPropertiesIn(typeMessage));
   }
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_PropertyRef_property_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_optionField_Test.java
similarity index 88%
rename from com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_PropertyRef_property_Test.java
rename to com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_optionField_Test.java
index 9ab54a2..c7f9721 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_PropertyRef_property_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_optionField_Test.java
@@ -27,11 +27,11 @@
 import java.util.Collection;
 
 /**
- * Tests for <code>{@link ProtobufScopeProvider#scope_PropertyRef_property(PropertyRef, EReference)}</code>
+ * Tests for <code>{@link ProtobufScopeProvider#scope_OptionSource_optionField(OptionSource, EReference)}</code>
  * 
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class ProtobufScopeProvider_scope_PropertyRef_property_Test {
+public class ProtobufScopeProvider_scope_OptionSource_optionField_Test {
 
   private static EReference reference;
   
@@ -50,7 +50,7 @@
   // option optimize_for = SPEED;
   @Test public void should_provide_Property_fields_for_native_option() {
     Option option = xtext.find("optimize_for", Option.class);
-    IScope scope = provider.scope_PropertyRef_property(option.getProperty(), reference);
+    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
     Collection<Property> fileOptions = descriptor().optionsOfType(FILE);
     assertThat(descriptionsIn(scope), containAll(fileOptions));
   }
@@ -60,7 +60,7 @@
   // }
   @Test public void should_provide_Property_fields_for_native_field_option() {
     NativeFieldOption option = xtext.find("ctype", NativeFieldOption.class);
-    IScope scope = provider.scope_PropertyRef_property(option.getProperty(), reference);
+    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
     Collection<Property> fieldOptions = descriptor().optionsOfType(FIELD);
     assertThat(descriptionsIn(scope), containAll(fieldOptions));
   }
@@ -81,7 +81,7 @@
   // option (code) = 68;
   @Test public void should_provide_Property_fields_for_custom_option() {
     Option option = xtext.find("code", ")", Option.class);
-    IScope scope = provider.scope_PropertyRef_property(option.getProperty(), reference);
+    IScope scope = provider.scope_OptionSource_optionField(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", 
@@ -106,7 +106,7 @@
   // option (test.proto.code) = 68;
   @Test public void should_provide_imported_Property_fields_for_custom_option() {
     Option option = xtext.find("code", ")", Option.class);
-    IScope scope = provider.scope_PropertyRef_property(option.getProperty(), reference);
+    IScope scope = provider.scope_OptionSource_optionField(option.getSource(), reference);
     assertThat(descriptionsIn(scope), containAll("test.proto.code", ".test.proto.code",
                                                  "test.proto.info", ".test.proto.info"));
   }
@@ -129,7 +129,7 @@
   // option (code) = 68;
   @Test public void should_provide_imported_Property_fields_for_custom_option_with_equal_package() {
     Option option = xtext.find("code", ")", Option.class);
-    IScope scope = provider.scope_PropertyRef_property(option.getProperty(), reference);
+    IScope scope = provider.scope_OptionSource_optionField(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",
@@ -149,7 +149,7 @@
   // }
   @Test public void should_provide_Property_fields_for_custom_field_option() {
     CustomFieldOption option = xtext.find("code", ")", CustomFieldOption.class);
-    IScope scope = provider.scope_PropertyRef_property(option.getProperty(), reference);
+    IScope scope = provider.scope_OptionSource_optionField(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.test/src/com/google/eclipse/protobuf/junit/core/Finder.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/Finder.java
index ad6c527..3360420 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/Finder.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/Finder.java
@@ -22,7 +22,7 @@
  */
 class Finder {
 
-  private static final String[] FEATURE_NAMES = { "name", "property", "message", "type" };
+  private static final String[] FEATURE_NAMES = { "name", "message", "type", "source", "optionField" };
   
   private final String protoAsText;
   private final AbstractNode root;
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 f15b361..5efc73c 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
@@ -73,8 +73,8 @@
     String proposal = SYNTAX + space() + EQUAL_PROTO2_IN_QUOTES;
     proposeAndAccept(proposal, imageHelper.getImage(images.imageFor(Syntax.class)), context, acceptor);
   }
-
-  @Override public void completeNativeOption_Property(EObject model, Assignment assignment,
+  
+  @Override public void completeNativeOption_Source(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     ProtoDescriptor descriptor = descriptorProvider.primaryDescriptor();
     Collection<Property> optionProperties = descriptor.availableOptionsFor(model);
@@ -89,7 +89,7 @@
   @Override public void completeNativeOption_Value(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     NativeOption option = (NativeOption) model;
-    Property property = options.propertyFrom(option);
+    Property property = (Property) options.sourceOf(option);
     if (property == null) return;
     ProtoDescriptor descriptor = descriptorProvider.primaryDescriptor();
     Enum enumType = descriptor.enumTypeOf(property);
@@ -167,11 +167,13 @@
     if (model instanceof Property) return (Property) model;
     if (model instanceof Option) {
       Option option = (Option) model;
-      return options.propertyFrom(option);
+      Field source = options.sourceOf(option);
+      if (source instanceof Property) return (Property) source;
     }
     if (model instanceof FieldOption) {
       FieldOption option = (FieldOption) model;
-      return fieldOptions.propertyFrom(option);
+      Field source = fieldOptions.sourceOf(option);
+      if (source instanceof Property) return (Property) source;
     }
     return null;
   }
@@ -263,7 +265,7 @@
     return imageHelper.getImage(images.defaultImage());
   }
 
-  @Override public void completeNativeFieldOption_Property(EObject model, Assignment assignment,
+  @Override public void completeNativeFieldOption_Source(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     Property p = extractElementFromContext(context, Property.class);
     if (p != null) {
@@ -338,7 +340,7 @@
       return;
     }
     ProtoDescriptor descriptor = descriptorProvider.primaryDescriptor();
-    Property property = fieldOptions.propertyFrom(option);
+    Property property = (Property) fieldOptions.sourceOf(option);
     Enum enumType = descriptor.enumTypeOf(property);
     if (enumType != null) {
       proposeAndAccept(enumType, context, acceptor);
@@ -401,27 +403,23 @@
     return word.equals(previousWord);
   }
 
-  @Override public void completePropertyRef_Property(EObject model, Assignment assignment,
+  @Override public void completeOptionSource_OptionField(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
   }
   
-  @Override public void completeMessagePropertyRef_MessageProperty(EObject model, Assignment assignment,
-      ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-  }
-  
-  @Override public void completeCustomOption_Property(EObject model, Assignment assignment,
+  @Override public void completeCustomOption_Source(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     if (!(model instanceof CustomOption)) return;
     CustomOption option = (CustomOption) model;
-    IScope scope = scopes.scope_PropertyRef_property(option.getProperty(), null);
+    IScope scope = scopes.scope_OptionSource_optionField(option.getSource(), null);
     proposeAndAcceptOptions(scope, context, acceptor);
   }
 
-  @Override public void completeCustomFieldOption_Property(EObject model, Assignment assignment,
+  @Override public void completeCustomFieldOption_Source(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     if (!(model instanceof CustomFieldOption)) return;
     CustomFieldOption option = (CustomFieldOption) model;
-    IScope scope = scopes.scope_PropertyRef_property(option.getProperty(), null);
+    IScope scope = scopes.scope_OptionSource_optionField(option.getSource(), null);
     proposeAndAcceptOptions(scope, context, acceptor);
   }
   
@@ -453,11 +451,7 @@
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     super.completeCustomFieldOption_OptionFields(model, assignment, context, acceptor);
   }
-  
-  @Override public void complete_MessagePropertyRef(EObject model, RuleCall ruleCall, ContentAssistContext context,
-      ICompletionProposalAcceptor acceptor) {  
-    super.complete_MessagePropertyRef(model, ruleCall, context, acceptor);
-  }
+
   
 //  @Override public void completeCustomOption_PropertyField(EObject model, Assignment assignment,
 //      ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
@@ -487,9 +481,11 @@
       ICompletionProposalAcceptor acceptor) {
     if (!(model instanceof CustomOption)) return;
     CustomOption option = (CustomOption) model;
-    Property property = options.fieldFrom(option);
-    if (property == null) property = options.propertyFrom(option);
-    proposeAndAcceptOptionFieldValue(property, context, acceptor);
+    Field f = options.fieldFrom(option);
+    if (f == null) f = options.sourceOf(option);
+    if (f instanceof Property) {
+      proposeAndAcceptOptionFieldValue((Property) f, context, acceptor);
+    }
   }
   
   @Override public void completeCustomFieldOption_Value(EObject model, Assignment assignment,
@@ -498,7 +494,7 @@
     if (!(model instanceof CustomFieldOption)) return;
     CustomFieldOption option = (CustomFieldOption) model;
     Property property = fieldOptions.fieldFrom(option);
-    if (property == null) property = fieldOptions.propertyFrom(option);
+    if (property == null) property = fieldOptions.fieldFrom(option);
     proposeAndAcceptOptionFieldValue(property, context, acceptor);
   }
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/SLCommentDocumentationProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/SLCommentDocumentationProvider.java
index 43a0409..85a234c 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/SLCommentDocumentationProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/SLCommentDocumentationProvider.java
@@ -59,11 +59,11 @@
 
   private EObject findRealTarget(EObject o) {
     if (o instanceof Option) {
-      Property p = options.propertyFrom((Option) o);
+      Field p = options.sourceOf((Option) o);
       return p != null ? p : o;
     }
     if (o instanceof FieldOption) {
-      Property p = fieldOptions.propertyFrom((FieldOption) o);
+      Field p = fieldOptions.sourceOf((FieldOption) o);
       return p != null ? p : o;
     }
     return o;
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 ccc663d..8f1134b 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
@@ -203,9 +203,9 @@
   }
 
   private void highlight(Option option, IHighlightedPositionAcceptor acceptor) {
-    Property property = options.propertyFrom(option);
-    if (property != null) {
-      highlightFirstFeature(option, OPTION__PROPERTY, acceptor, DEFAULT_ID);
+    Field field = options.sourceOf(option);
+    if (field != null) {
+      highlightFirstFeature(option, OPTION__SOURCE, acceptor, DEFAULT_ID);
     }
     ValueRef ref = option.getValue();
     if (ref instanceof LiteralRef) {
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 8eb7508..b901d76 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
@@ -64,8 +64,9 @@
   }
 
   private Object labelFor(Option o) {
-    Property p = options.propertyFrom(o);
-    return p == null ? null : p.getName();
+    Field f = options.sourceOf(o);
+    if (f instanceof Property) return ((Property) f).getName();
+    return null;
   }
 
   private Object labelFor(ExtendMessage e) {
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 1698f3f..33cb82a 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
@@ -197,11 +197,11 @@
   NativeOption | CustomOption;
 
 NativeOption:
-  'option' property=PropertyRef '=' value=ValueRef ';';
+  'option' source=OptionSource '=' value=ValueRef ';';
 
 CustomOption:
-  'option' '(' property=PropertyRef ')'
-  ('.' optionFields+=OptionField ('.' optionFields+=OptionField)*)? '=' value=ValueRef ';';
+  'option' '(' source=OptionSource ')'
+  ('.' optionFields+=OptionFieldSource ('.' optionFields+=OptionFieldSource)*)? '=' value=ValueRef ';';
  
 FieldOption:
   DefaultValueFieldOption | NativeFieldOption | CustomFieldOption;
@@ -210,21 +210,21 @@
   'default' '=' value=ValueRef;
 
 NativeFieldOption:
-  property=PropertyRef '=' value=ValueRef;
+  source=OptionSource '=' value=ValueRef;
 
 CustomFieldOption:
-  '(' property=PropertyRef ')'
-  ('.' optionFields+=OptionField ('.' optionFields+=OptionField)*)? '=' value=ValueRef;
+  '(' source=OptionSource ')'
+  ('.' optionFields+=OptionFieldSource ('.' optionFields+=OptionFieldSource)*)? '=' value=ValueRef;
 
-PropertyRef:
-  property=[Property|QualifiedName];
+OptionSource:
+  optionField=[Field|QualifiedName];
 
-OptionField:
-  MessagePropertyRef | ExtendMessagePropertyRef;
+OptionFieldSource:
+  OptionMessageFieldSource | OptionExtendMessageFieldSource;
 
-MessagePropertyRef:
-  messageProperty=[Property];  
+OptionMessageFieldSource:
+  optionMessageField=[Field];  
 
-ExtendMessagePropertyRef:
-  '(' extendMessageProperty=[Property|QualifiedName] ')';  
+OptionExtendMessageFieldSource:
+  '(' optionExtendMessageField=[Field|QualifiedName] ')';  
   
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 2b6cac0..9717eb6 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
@@ -34,8 +34,9 @@
    * @return the name of the given option.
    */
   public String nameOf(FieldOption option) {
-    Property p = propertyFrom(option);
-    return (p == null) ? null : p.getName();
+    Field f = sourceOf(option);
+    if (f instanceof Property) return ((Property) f).getName();
+    return null;
   }
   
   /**
@@ -44,33 +45,32 @@
    * <pre>
    * [(myFieldOption) = true]
    * </pre>
-   * this method will return the <code>{@link Property}</code> "myFieldOption" is pointing to.
+   * this method will return the <code>{@link Field}</code> "myFieldOption" is pointing to.
    * @param option the given {@code FieldOption}.
-   * @return the {@code Property} the given {@code FieldOption} is referring to, or {@code null} if it cannot be
-   * found.
+   * @return the {@code Property} the given {@code FieldOption} is referring to, or {@code null} if it cannot be found.
    */
-  public Property propertyFrom(FieldOption option) {
-    PropertyRef ref = null;
+  public Field sourceOf(FieldOption option) {
+    OptionSource source = null;
     if (option instanceof NativeFieldOption) {
       NativeFieldOption nativeOption = (NativeFieldOption) option;
-      ref = nativeOption.getProperty();
+      source = nativeOption.getSource();
     }
     if (option instanceof CustomFieldOption) {
       CustomFieldOption customOption = (CustomFieldOption) option;
-      ref = customOption.getProperty();
+      source = customOption.getSource();
     }
-    return (ref == null) ? null : ref.getProperty();
+    return (source == null) ? null : source.getOptionField();
   }
 
   /**
-   * Returns the field of the <code>{@link Property}</code> the given <code>{@link CustomFieldOption}</code> is 
-   * referring to. In the following example
+   * Returns the field of the <code>{@link Field}</code> the given <code>{@link CustomFieldOption}</code> is referring 
+   * to. In the following example
    * <pre>
    * [(myFieldOption).field = true]
    * </pre>
-   * this method will return the <code>{@link Property}</code> "field" is pointing to.
+   * this method will return the <code>{@link Field}</code> "field" is pointing to.
    * @param option the given {@code FieldOption}.
-   * @return the field of the {@code Property} the given {@code CustomFieldOption} is referring to, or {@code null} if 
+   * @return the field of the {@code Field} the given {@code CustomFieldOption} is referring to, or {@code null} if 
    * one cannot be found.
    */
   public Property fieldFrom(CustomFieldOption option) {
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 afa0b5a..d199747 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
@@ -20,19 +20,19 @@
 public class Options {
 
   /**
-   * Returns the <code>{@link Property}</code> the given <code>{@link Option}</code> is referring to. In the
+   * Returns the <code>{@link Field}</code> the given <code>{@link Option}</code> is referring to. In the
    * following example
    * <pre>
    * option (myOption) = true;
    * </pre>
-   * this method will return the <code>{@link Property}</code> "myOption" is pointing to.
+   * this method will return the <code>{@link Field}</code> "myOption" is pointing to.
    * @param option the given {@code Option}.
-   * @return the {@code Property} the given {@code Option} is referring to, or {@code null} if it cannot be
+   * @return the {@code Field} the given {@code Option} is referring to, or {@code null} if it cannot be
    * found.
    */
-  public Property propertyFrom(Option option) {
-    PropertyRef ref = option.getProperty();
-    return (ref == null) ? null : ref.getProperty();
+  public Field sourceOf(Option option) {
+    OptionSource source = option.getSource();
+    return (source == null) ? null : source.getOptionField();
   }
 
   /**
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 7a72d69..21a625f 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
@@ -30,34 +30,36 @@
   @Inject private Options options;
   @Inject private QualifiedNameDescriptions qualifiedNamesDescriptions;
 
-  Collection<IEObjectDescription> findScope(MessagePropertyRef ref) {
-    return findScope(ref, new IEObjectDescriptionsProvider() {
-      @Override public Collection<IEObjectDescription> fieldsInType(Property p) {
-        Message propertyType = modelFinder.messageTypeOf(p);
+  Collection<IEObjectDescription> findScope(OptionMessageFieldSource fieldSource) {
+    return findScope(fieldSource, new IEObjectDescriptionsProvider() {
+      @Override public Collection<IEObjectDescription> fieldsInType(Field f) {
+        if (!(f instanceof Property)) return emptyList();
+        Message propertyType = modelFinder.messageTypeOf((Property) f);
         if (propertyType == null) return emptyList();
         Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
         for (MessageElement e : propertyType.getElements()) {
           if (!(e instanceof Property)) continue;
-          Property f = (Property) e;
-          descriptions.add(create(f.getName(), f));
+          Property current = (Property) e;
+          descriptions.add(create(current.getName(), current));
         }
         return descriptions;
       }
     });
   }
 
-  Collection<IEObjectDescription> findScope(ExtendMessagePropertyRef ref) {
-    return findScope(ref, new IEObjectDescriptionsProvider() {
-      @Override public Collection<IEObjectDescription> fieldsInType(Property p) {
-        Message propertyType = modelFinder.messageTypeOf(p);
+  Collection<IEObjectDescription> findScope(OptionExtendMessageFieldSource fieldSource) {
+    return findScope(fieldSource, new IEObjectDescriptionsProvider() {
+      @Override public Collection<IEObjectDescription> fieldsInType(Field f) {
+        if (!(f instanceof Property)) return emptyList();
+        Message propertyType = modelFinder.messageTypeOf((Property) f);
         if (propertyType == null) return emptyList();
         Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
         for (ExtendMessage extend : modelFinder.extensionsOf(propertyType)) {
           for (MessageElement e : extend.getElements()) {
             if (!(e instanceof Property)) continue;
-            Property f = (Property) e;
-            descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(f));
-            descriptions.add(create(f.getName(), f));
+            Property current = (Property) e;
+            descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(current));
+            descriptions.add(create(current.getName(), current));
           }
         }
         return descriptions;
@@ -65,63 +67,64 @@
     });
   }
 
-  private Collection<IEObjectDescription> findScope(EObject ref, IEObjectDescriptionsProvider provider) {
-    EObject container = ref.eContainer();
-    Property p = null;
+  private Collection<IEObjectDescription> findScope(EObject fieldSource, IEObjectDescriptionsProvider provider) {
+    EObject container = fieldSource.eContainer();
+    Field f = null;
     if (container instanceof CustomOption) {
       CustomOption option = (CustomOption) container;
-      p = referredProperty(ref, option);
+      f = referredField(fieldSource, option);
     }
     if (container instanceof CustomFieldOption) {
       CustomFieldOption option = (CustomFieldOption) container;
-      p = referredProperty(ref, option);
+      f = referredField(fieldSource, option);
     }
-    if (p != null) return provider.fieldsInType(p);
+    if (f != null) return provider.fieldsInType(f);
     return emptySet();
   }
 
-  private Property referredProperty(EObject ref, final CustomOption option) {
-    return referredProperty(ref, option.getOptionFields(), new Provider<Property>() {
-      @Override public Property get() {
-        return options.propertyFrom(option);
+  private Field referredField(EObject fieldSource, final CustomOption option) {
+    return referredField(fieldSource, option.getOptionFields(), new Provider<Field>() {
+      @Override public Field get() {
+        return options.sourceOf(option);
       }
     });
   }
 
-  private Property referredProperty(EObject ref, final CustomFieldOption option) {
-    return referredProperty(ref, option.getOptionFields(), new Provider<Property>() {
-      @Override public Property get() {
-        return fieldOptions.propertyFrom(option);
+  private Field referredField(EObject fieldSource, final CustomFieldOption option) {
+    return referredField(fieldSource, option.getOptionFields(), new Provider<Field>() {
+      @Override public Field get() {
+        return fieldOptions.fieldFrom(option);
       }
     });
   }
   
-  private Property referredProperty(EObject ref, List<OptionField> fields, Provider<Property> provider) {
-    OptionField previous = null;
+  private Field referredField(EObject fieldSource, List<OptionFieldSource> allFieldSources, 
+      Provider<Field> provider) {
+    OptionFieldSource previous = null;
     boolean isFirstField = true;
-    for (OptionField field : fields) {
-      if (field == ref) {
-        return (isFirstField) ? provider.get() : propertyFrom(previous);
+    for (OptionFieldSource s : allFieldSources) {
+      if (s == fieldSource) {
+        return (isFirstField) ? provider.get() : fieldFrom(previous);
       }
-      previous = field;
+      previous = s;
       isFirstField = false;
     }
     return null;
   }
 
-  private Property propertyFrom(OptionField field) {
-    if (field instanceof MessagePropertyRef) {
-      MessagePropertyRef ref = (MessagePropertyRef) field;
-      return ref.getMessageProperty();
+  private Field fieldFrom(OptionFieldSource fieldSource) {
+    if (fieldSource instanceof OptionMessageFieldSource) {
+      OptionMessageFieldSource source = (OptionMessageFieldSource) fieldSource;
+      return source.getOptionMessageField();
     }
-    if (field instanceof ExtendMessagePropertyRef) {
-      ExtendMessagePropertyRef ref = (ExtendMessagePropertyRef) field;
-      return ref.getExtendMessageProperty();
+    if (fieldSource instanceof OptionExtendMessageFieldSource) {
+      OptionExtendMessageFieldSource source = (OptionExtendMessageFieldSource) fieldSource;
+      return source.getOptionExtendMessageField();
     }
     return null;
   }
   
   private static interface IEObjectDescriptionsProvider {
-    Collection<IEObjectDescription> fieldsInType(Property p);
+    Collection<IEObjectDescription> fieldsInType(Field f);
   }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionScopeFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionScopeFinder.java
index 74b9f96..7906fc8 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionScopeFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionScopeFinder.java
@@ -8,23 +8,60 @@
  */
 package com.google.eclipse.protobuf.scoping;
 
+import static java.util.Collections.emptySet;
+import static org.eclipse.xtext.resource.EObjectDescription.create;
+
+import com.google.eclipse.protobuf.model.util.ModelFinder;
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.inject.Inject;
+
+import org.eclipse.xtext.naming.QualifiedName;
 import org.eclipse.xtext.resource.IEObjectDescription;
 
-import java.util.Collection;
+import java.util.*;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
-class CustomOptionScopeFinder extends ExtendMessageScopeFinder {
+class CustomOptionScopeFinder implements ScopeFinder {
+
+  @Inject private LocalNamesProvider localNamesProvider;
+  @Inject private ModelFinder modelFinder;
+  @Inject private QualifiedNameDescriptions qualifiedNamesDescriptions;
+
+  @Override public Collection<IEObjectDescription> fromProtoDescriptor(Import anImport, Object criteria) {
+    return emptySet();
+  }
 
   @Override public Collection<IEObjectDescription> descriptions(Object target, Object criteria) {
     OptionType optionType = optionTypeFrom(criteria);
-    return super.descriptions(target, optionType.messageName());
+    if (!isExtendingOptionMessage(target, optionType)) return emptySet();
+    Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
+    ExtendMessage extend = (ExtendMessage) target;
+    for (MessageElement e : extend.getElements()) {
+      if (!(e instanceof Property)) continue;
+      Property p = (Property) e;
+      descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(p));
+    }
+    return descriptions;
   }
 
   @Override public Collection<IEObjectDescription> descriptions(Object target, Object criteria, int level) {
     OptionType optionType = optionTypeFrom(criteria);
-    return super.descriptions(target, optionType.messageName(), level);
+    if (!isExtendingOptionMessage(target, optionType)) return emptySet();
+    Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
+    ExtendMessage extend = (ExtendMessage) target;
+    for (MessageElement e : extend.getElements()) {
+      if (!(e instanceof Property)) continue;
+      Property p = (Property) e;
+      List<QualifiedName> names = localNamesProvider.namesOf(p);
+      int nameCount = names.size();
+      for (int i = level; i < nameCount; i++) {
+        descriptions.add(create(names.get(i), p));
+      }
+      descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(p));
+    }
+    return descriptions;
   }
 
   private OptionType optionTypeFrom(Object criteria) {
@@ -32,4 +69,11 @@
       throw new IllegalArgumentException("Search criteria should be OptionType");
     return (OptionType) criteria;
   }
+
+  private boolean isExtendingOptionMessage(Object o, OptionType optionType) {
+    if (!(o instanceof ExtendMessage)) return false;
+    Message message = modelFinder.messageFrom((ExtendMessage) o);
+    if (message == null) return false;
+    return optionType.messageName().equals(message.getName());
+  }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ExtendMessageScopeFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ExtendMessageScopeFinder.java
deleted file mode 100644
index d1729c8..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ExtendMessageScopeFinder.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2011 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
- *
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package com.google.eclipse.protobuf.scoping;
-
-import static java.util.Collections.emptySet;
-import static org.eclipse.xtext.resource.EObjectDescription.create;
-
-import com.google.eclipse.protobuf.model.util.ModelFinder;
-import com.google.eclipse.protobuf.protobuf.*;
-import com.google.inject.Inject;
-
-import org.eclipse.xtext.naming.QualifiedName;
-import org.eclipse.xtext.resource.IEObjectDescription;
-
-import java.util.*;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class ExtendMessageScopeFinder implements ScopeFinder {
-
-  @Inject private LocalNamesProvider localNamesProvider;
-  @Inject private ModelFinder modelFinder;
-  @Inject private QualifiedNameDescriptions qualifiedNamesDescriptions;
-
-  @Override public Collection<IEObjectDescription> fromProtoDescriptor(Import anImport, Object criteria) {
-    return emptySet();
-  }
-
-  @Override public Collection<IEObjectDescription> descriptions(Object target, Object criteria) {
-    String messageName = messageNameFrom(criteria);
-    if (!isExtendingOptionMessage(target, messageName)) return emptySet();
-    Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
-    ExtendMessage extend = (ExtendMessage) target;
-    for (MessageElement e : extend.getElements()) {
-      if (!(e instanceof Property)) continue;
-      Property p = (Property) e;
-      descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(p));
-    }
-    return descriptions;
-  }
-
-  @Override public Collection<IEObjectDescription> descriptions(Object target, Object criteria, int level) {
-    String messageName = messageNameFrom(criteria);
-    if (!isExtendingOptionMessage(target, messageName)) return emptySet();
-    Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
-    ExtendMessage extend = (ExtendMessage) target;
-    for (MessageElement e : extend.getElements()) {
-      if (!(e instanceof Property)) continue;
-      Property p = (Property) e;
-      List<QualifiedName> names = localNamesProvider.namesOf(p);
-      int nameCount = names.size();
-      for (int i = level; i < nameCount; i++) {
-        descriptions.add(create(names.get(i), p));
-      }
-      descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(p));
-    }
-    return descriptions;
-  }
-
-  private String messageNameFrom(Object criteria) {
-    if (!(criteria instanceof String)) 
-      throw new IllegalArgumentException("Search criteria should be String");
-    return (String) criteria;
-  }
-
-  private boolean isExtendingOptionMessage(Object o, String messageName) {
-    if (!(o instanceof ExtendMessage)) return false;
-    Message message = modelFinder.messageFrom((ExtendMessage) o);
-    if (message == null) return false;
-    return messageName.equals(message.getName());
-  }
-}
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 89023d1..33c7d1c 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
@@ -72,23 +72,23 @@
     }
     if (c instanceof NativeOption) {
       ProtoDescriptor descriptor = descriptorProvider.primaryDescriptor();
-      Property p = options.propertyFrom((Option) c);
-      anEnum = descriptor.enumTypeOf(p);
+      Field f = options.sourceOf((Option) c);
+      if (f instanceof Property) anEnum = descriptor.enumTypeOf((Property) f);
     }
     if (c instanceof CustomOption) {
       CustomOption option = (CustomOption) c;
       c = options.fieldFrom(option);
-      if (c == null) c = options.propertyFrom(option);
+      if (c == null) c = options.sourceOf(option);
     }
     if (c instanceof NativeFieldOption) {
       ProtoDescriptor descriptor = descriptorProvider.primaryDescriptor();
-      Property p = fieldOptions.propertyFrom((FieldOption) c);
-      anEnum = descriptor.enumTypeOf(p);
+      Field f = fieldOptions.sourceOf((FieldOption) c);
+      if (f instanceof Property) anEnum = descriptor.enumTypeOf((Property) f);
     }
     if (c instanceof CustomFieldOption) {
       CustomFieldOption option = (CustomFieldOption) c;
       c = fieldOptions.fieldFrom(option);
-      if (c == null) c = fieldOptions.propertyFrom(option);
+      if (c == null) c = fieldOptions.fieldFrom(option);
     }
     if (c instanceof Property) {
       anEnum = modelFinder.enumTypeOf((Property) c);
@@ -97,8 +97,8 @@
   }
 
   @SuppressWarnings("unused")
-  public IScope scope_PropertyRef_property(PropertyRef propertyRef, EReference reference) {
-    EObject c = propertyRef.eContainer();
+  public IScope scope_OptionSource_optionField(OptionSource optionSource, EReference reference) {
+    EObject c = optionSource.eContainer();
     if (c instanceof NativeOption) {
       NativeOption option = (NativeOption) c;
       return createScope(nativeOptionDescriptions.properties(option));
@@ -120,14 +120,15 @@
   }
   
   @SuppressWarnings("unused") 
-  public IScope scope_MessagePropertyRef_messageProperty(MessagePropertyRef propertyRef, EReference reference) {
-    return createScope(customOptionFieldScopeFinder.findScope(propertyRef));
+  public IScope scope_OptionMessageFieldSource_optionMessageField(OptionMessageFieldSource source, 
+      EReference reference) {
+    return createScope(customOptionFieldScopeFinder.findScope(source));
   }
   
   @SuppressWarnings("unused") 
-  public IScope scope_ExtendMessagePropertyRef_extendMessageProperty(ExtendMessagePropertyRef propertyRef, 
+  public IScope scope_OptionExtendMessageFieldSource_optionExtendMessageField(OptionExtendMessageFieldSource source, 
       EReference reference) {
-    return createScope(customOptionFieldScopeFinder.findScope(propertyRef));
+    return createScope(customOptionFieldScopeFinder.findScope(source));
   }
   
   private static IScope createScope(Iterable<IEObjectDescription> descriptions) {
