Fixed linking to groups in complex values, for example:
  message M {
    option (custom_option) = {
      groupMember {
        valueInGroup: true
      }
    }
  }
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 b0b7f57..d524df7 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
@@ -8,14 +8,6 @@
  */
 package com.google.eclipse.protobuf.ui.contentassist;
 
-import static java.lang.String.valueOf;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.emptySet;
-
-import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
-import static org.eclipse.xtext.util.Strings.isEmpty;
-import static org.eclipse.xtext.util.Strings.toFirstLower;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.eclipse.protobuf.grammar.CommonKeyword.CLOSING_BRACKET;
 import static com.google.eclipse.protobuf.grammar.CommonKeyword.DEFAULT;
@@ -38,24 +30,12 @@
 import static com.google.eclipse.protobuf.ui.grammar.CompoundElement.EQUAL_PROTO2_IN_QUOTES;
 import static com.google.eclipse.protobuf.ui.grammar.CompoundElement.PROTO2_IN_QUOTES;
 import static com.google.eclipse.protobuf.util.CommonWords.space;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.xtext.Assignment;
-import org.eclipse.xtext.Keyword;
-import org.eclipse.xtext.RuleCall;
-import org.eclipse.xtext.naming.QualifiedName;
-import org.eclipse.xtext.resource.IEObjectDescription;
-import org.eclipse.xtext.ui.PluginImageHelper;
-import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
-import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
-import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+import static java.lang.String.valueOf;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptySet;
+import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
+import static org.eclipse.xtext.util.Strings.isEmpty;
+import static org.eclipse.xtext.util.Strings.toFirstLower;
 
 import com.google.eclipse.protobuf.grammar.CommonKeyword;
 import com.google.eclipse.protobuf.model.util.IndexedElements;
@@ -90,6 +70,24 @@
 import com.google.eclipse.protobuf.ui.labeling.Images;
 import com.google.inject.Inject;
 
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.naming.QualifiedName;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.ui.PluginImageHelper;
+import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+
+import java.util.Collection;
+import java.util.List;
+
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -696,7 +694,10 @@
       SimpleValueField field = (SimpleValueField) model;
       FieldName name = field.getName();
       if (name != null) {
-        proposeFieldValue(name.getTarget(), context, acceptor);
+        IndexedElement target = name.getTarget();
+        if (target instanceof MessageField) {
+          proposeFieldValue((MessageField) target, context, acceptor);
+        }
       }
     }
   }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
index cfb6a0b..eb022ea 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
@@ -212,13 +212,13 @@
 // { foo: 1, bar: 2 }
 ComplexValueCurlyBracket:
   '{'
-  (fields+=ValueField (',')? (fields+=ValueField (',')?)*)?
+  fields+=ValueField ((',')? fields+=ValueField)* (',')?
   '}';
-  
+
 // < foo: 1, bar: 2 >
 ComplexValueAngleBracket:
   '<'
-  (fields+=ValueField (',')? (fields+=ValueField (',')?)*)?
+  fields+=ValueField ((',')? fields+=ValueField)* (',')?
   '>';
 
 ValueField:
@@ -234,10 +234,10 @@
   NormalFieldName | ExtensionFieldName;
 
 NormalFieldName:
-  target=[MessageField|Name];
+  target=[IndexedElement|Name];
 
 ExtensionFieldName:
-  '[' target=[MessageField|QualifiedName] ']';
+  '[' target=[IndexedElement|QualifiedName] ']';
 
 QualifiedName:
   '.'? SafeId ('.' (WS)* SafeId)*;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java
index b78b18a..c5c7ff0 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java
@@ -10,20 +10,19 @@
 
 import static java.util.Collections.emptySet;
 
-import java.util.Collection;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.xtext.resource.IEObjectDescription;
-
 import com.google.eclipse.protobuf.model.util.Options;
 import com.google.eclipse.protobuf.protobuf.AbstractCustomOption;
 import com.google.eclipse.protobuf.protobuf.ComplexValue;
 import com.google.eclipse.protobuf.protobuf.ComplexValueField;
 import com.google.eclipse.protobuf.protobuf.FieldName;
 import com.google.eclipse.protobuf.protobuf.IndexedElement;
-import com.google.eclipse.protobuf.protobuf.MessageField;
 import com.google.inject.Inject;
 
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.resource.IEObjectDescription;
+
+import java.util.Collection;
+
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
@@ -31,14 +30,14 @@
   @Inject private Options options;
 
   Collection<IEObjectDescription> findFieldNamesSources(ComplexValue value, FinderStrategy strategy) {
-    MessageField source = sourceOf(value);
+    IndexedElement source = sourceOf(value);
     if (source == null) {
       return emptySet();
     }
     return strategy.findMessageFields(source);
   }
 
-  private MessageField sourceOf(ComplexValue value) {
+  private IndexedElement sourceOf(ComplexValue value) {
     IndexedElement source = null;
     EObject container = value.eContainer();
     if (container instanceof AbstractCustomOption) {
@@ -48,15 +47,15 @@
     if (container instanceof ComplexValueField) {
       source = sourceOfNameOf((ComplexValueField) container);
     }
-    return (source instanceof MessageField) ? (MessageField) source : null;
+    return source;
   }
 
-  private MessageField sourceOfNameOf(ComplexValueField field) {
+  private IndexedElement sourceOfNameOf(ComplexValueField field) {
     FieldName name = field.getName();
     return (name == null) ? null : name.getTarget();
   }
 
   static interface FinderStrategy {
-    Collection<IEObjectDescription> findMessageFields(MessageField reference);
+    Collection<IEObjectDescription> findMessageFields(IndexedElement reference);
   }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ExtensionFieldNameFinderStrategy.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ExtensionFieldNameFinderStrategy.java
index f9e1a71..39cbfbd 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ExtensionFieldNameFinderStrategy.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ExtensionFieldNameFinderStrategy.java
@@ -15,10 +15,13 @@
 
 import org.eclipse.xtext.resource.IEObjectDescription;
 
+import com.google.common.base.Strings;
 import com.google.eclipse.protobuf.model.util.MessageFields;
 import com.google.eclipse.protobuf.model.util.Messages;
 import com.google.eclipse.protobuf.model.util.ModelObjects;
 import com.google.eclipse.protobuf.naming.NormalNamingStrategy;
+import com.google.eclipse.protobuf.protobuf.Group;
+import com.google.eclipse.protobuf.protobuf.IndexedElement;
 import com.google.eclipse.protobuf.protobuf.Message;
 import com.google.eclipse.protobuf.protobuf.MessageElement;
 import com.google.eclipse.protobuf.protobuf.MessageField;
@@ -35,16 +38,22 @@
   @Inject private NormalNamingStrategy namingStrategy;
   @Inject private QualifiedNameDescriptions qualifiedNameDescriptions;
 
-  @Override public Collection<IEObjectDescription> findMessageFields(MessageField reference) {
+  @Override public Collection<IEObjectDescription> findMessageFields(IndexedElement reference) {
     Set<IEObjectDescription> descriptions = newHashSet();
-    Message type = messageFields.messageTypeOf(reference);
-    // check first in descriptor.proto
-    for (TypeExtension extension : messages.extensionsOf(type, modelObjects.rootOf(reference))) {
-      for (MessageElement element : extension.getElements()) {
-        if (!(element instanceof MessageField)) {
-          continue;
+    if (reference instanceof MessageField) {
+      Message type = messageFields.messageTypeOf((MessageField) reference);
+      // check first in descriptor.proto
+      for (TypeExtension extension : messages.extensionsOf(type, modelObjects.rootOf(reference))) {
+        for (MessageElement element : extension.getElements()) {
+          if (element instanceof IndexedElement) {
+            descriptions.addAll(qualifiedNameDescriptions.qualifiedNames(element, namingStrategy));
+          }
         }
-        descriptions.addAll(qualifiedNameDescriptions.qualifiedNames(element, namingStrategy));
+      }
+    } else if (reference instanceof Group) {
+      String name = ((Group) reference).getName();
+      if (!Strings.isNullOrEmpty(name)) {
+        descriptions.addAll(qualifiedNameDescriptions.qualifiedNames(reference, namingStrategy));
       }
     }
     return descriptions;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java
index f0cb8b8..00ac058 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java
@@ -8,34 +8,47 @@
  */
 package com.google.eclipse.protobuf.scoping;
 
+import static com.google.common.collect.Sets.newHashSet;
 import static org.eclipse.xtext.resource.EObjectDescription.create;
 
-import static com.google.common.collect.Sets.newHashSet;
+import com.google.common.base.Strings;
+import com.google.eclipse.protobuf.model.util.MessageFields;
+import com.google.eclipse.protobuf.protobuf.Group;
+import com.google.eclipse.protobuf.protobuf.IndexedElement;
+import com.google.eclipse.protobuf.protobuf.MessageField;
+import com.google.inject.Inject;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.resource.IEObjectDescription;
 
 import java.util.Collection;
 import java.util.Set;
 
-import org.eclipse.xtext.resource.IEObjectDescription;
-
-import com.google.eclipse.protobuf.model.util.MessageFields;
-import com.google.eclipse.protobuf.protobuf.Message;
-import com.google.eclipse.protobuf.protobuf.MessageElement;
-import com.google.eclipse.protobuf.protobuf.MessageField;
-import com.google.inject.Inject;
-
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
 class NormalFieldNameFinderStrategy implements CustomOptionFieldNameFinder.FinderStrategy {
   @Inject private MessageFields messageFields;
 
-  @Override public Collection<IEObjectDescription> findMessageFields(MessageField reference) {
+  @Override public Collection<IEObjectDescription> findMessageFields(IndexedElement reference) {
     Set<IEObjectDescription> descriptions = newHashSet();
-    Message type = messageFields.messageTypeOf(reference);
-    for (MessageElement element : type.getElements()) {
-      if (element instanceof MessageField) {
-        String name = ((MessageField) element).getName();
-        descriptions.add(create(name, element));
+    Iterable<? extends EObject> elements = reference instanceof Group 
+        ? ((Group) reference).getElements()
+        : reference instanceof MessageField 
+            ? messageFields.messageTypeOf((MessageField) reference).getElements()
+            : null;
+
+    if (elements != null) {
+      for (EObject element : elements) {
+        if (element instanceof MessageField) {
+          String name = ((MessageField) element).getName();
+          descriptions.add(create(name, element));
+        } else if (element instanceof Group) {
+          String name = ((Group) element).getName();
+          if (!Strings.isNullOrEmpty(name)) {
+            descriptions.add(create(name, element));
+          }
+        }
       }
     }
     return descriptions;