diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/bugs/Issue169_AddSupportForExtendingGroups_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/bugs/Issue169_AddSupportForExtendingGroups_Test.java
new file mode 100644
index 0000000..a48fa5a
--- /dev/null
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/bugs/Issue169_AddSupportForExtendingGroups_Test.java
@@ -0,0 +1,98 @@
+/*
+ * 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.bugs;
+
+import static com.google.eclipse.protobuf.junit.core.Setups.integrationTestSetup;
+import static com.google.eclipse.protobuf.junit.core.XtextRule.createWith;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import com.google.eclipse.protobuf.junit.core.XtextRule;
+import com.google.eclipse.protobuf.protobuf.*;
+
+import org.junit.*;
+
+/**
+ * Tests fix for <a href="http://code.google.com/p/protobuf-dt/issues/detail?id=169">Issue 169</a>.
+ * 
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Issue169_AddSupportForExtendingGroups_Test {
+
+  @Rule public XtextRule xtext = createWith(integrationTestSetup());
+
+  // // Create file types.proto
+  //
+  // syntax = 'proto2';
+  // package google.proto.test;
+  //
+  // message TopMessage {
+  //   optional group MidGroup = 1 {
+  //     optional group BottomGroup = 2 {}
+  //   }
+  // }  
+
+  // syntax = "proto2";
+  // package com.google.proto.project.shared;
+  //
+  // import "types.proto";
+  //
+  // extend .google.proto.test.TopMessage.MidGroup.BottomGroup {}
+  @Test public void should_extend_group_inside_group() {
+    ExtensibleTypeLink link = xtext.find("BottomGroup", " {", ExtensibleTypeLink.class);
+    Group group = (Group) link.getTarget();
+    assertThat(group.getName(), equalTo("BottomGroup"));
+  }
+
+  // // Create file types.proto
+  //
+  // syntax = 'proto2';
+  // package google.proto.test;
+  //
+  // message TopMessage {
+  //   message MidMessage {
+  //     optional group BottomGroup = 1 {}
+  //   }
+  // }  
+
+  // syntax = "proto2";
+  // package com.google.proto.project.shared;
+  //
+  // import "types.proto";
+  //
+  // extend .google.proto.test.TopMessage.MidMessage.BottomGroup {}
+  @Test public void should_extend_group_inside_message() {
+    ExtensibleTypeLink link = xtext.find("BottomGroup", " {", ExtensibleTypeLink.class);
+    Group group = (Group) link.getTarget();
+    assertThat(group.getName(), equalTo("BottomGroup"));
+  }
+
+  // // Create file types.proto
+  //
+  // syntax = 'proto2';
+  // package google.proto.test;
+  //
+  // message TopMessage {
+  //   optional group MidGroup = 1 {
+  //     message BottomMessage {}
+  //   }
+  // }  
+
+  // syntax = "proto2";
+  // package com.google.proto.project.shared;
+  //
+  // import "types.proto";
+  //
+  // extend .google.proto.test.TopMessage.MidGroup.BottomMessage {}
+  @Test public void should_extend_message_inside_group() {
+    ExtensibleTypeLink link = xtext.find("BottomMessage", " {", ExtensibleTypeLink.class);
+    Message message = (Message) link.getTarget();
+    assertThat(message.getName(), equalTo("BottomMessage"));
+  }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/ModelFinder_localExtensionsFrom_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/ModelFinder_localExtensionsFrom_Test.java
index a3a5dee..3832a9e 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/ModelFinder_localExtensionsFrom_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/ModelFinder_localExtensionsFrom_Test.java
@@ -43,8 +43,8 @@
   // extend Person {}
   @Test public void should_return_extensions_of_message() {
     Message m = xtext.find("Person", " {", Message.class);
-    List<MessageExtension> extensions = new ArrayList<MessageExtension>(finder.localExtensionsOf(m));
-    Message referred = extensions.get(0).getMessage().getTarget();
+    List<TypeExtension> extensions = new ArrayList<TypeExtension>(finder.localExtensionsOf(m));
+    Message referred = (Message) extensions.get(0).getType().getTarget();
     assertSame(m, referred);
   }
 }
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/ModelFinder_messageFrom_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/ModelFinder_messageFrom_Test.java
index f51de92..d49dc46 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/ModelFinder_messageFrom_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/ModelFinder_messageFrom_Test.java
@@ -20,7 +20,7 @@
 import com.google.eclipse.protobuf.protobuf.*;
 
 /**
- * Tests for <code>{@link ModelFinder#messageFrom(MessageExtension)}</code>.
+ * Tests for <code>{@link ModelFinder#messageFrom(TypeExtension)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
@@ -42,14 +42,14 @@
   //
   // extend Person {}
   @Test public void should_return_message_from_extension() {
-    MessageExtension extension = xtext.find("Person", " {}", MessageExtension.class);
+    TypeExtension extension = xtext.find("Person", " {}", TypeExtension.class);
     Message message = finder.messageFrom(extension);
     assertThat(message.getName(), equalTo("Person"));
   }
 
   @Test public void should_return_null_if_extension_is_not_referring_to_message() {
-    MessageExtension extension = mock(MessageExtension.class);
-    when(extension.getMessage()).thenReturn(null);
+    TypeExtension extension = mock(TypeExtension.class);
+    when(extension.getType()).thenReturn(null);
     assertNull(finder.messageFrom(extension));
   }
 }
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 b8109f4..1a8d68f 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
@@ -82,13 +82,22 @@
     }
   }
 
+  @Override public void completeExtensibleTypeLink_Target(EObject model, Assignment assignment,
+      ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+    Collection<IEObjectDescription> scope = emptySet();
+    if (model instanceof TypeExtension) {
+      TypeExtension extension = (TypeExtension) model;
+      scope = scoping().allPossibleTypesFor(extension);
+    }
+    for (IEObjectDescription d : descriptionChooser.shortestQualifiedNamesIn(scope)) {
+      Image image = imageHelper.getImage(images.imageFor(d.getEObjectOrProxy()));
+      proposeAndAccept(d, image, context, acceptor);
+    }
+  }
+  
   @Override public void completeMessageLink_Target(EObject model, Assignment assignment, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
     Collection<IEObjectDescription> scope = emptySet();
-    if (model instanceof MessageExtension) {
-      MessageExtension extension = (MessageExtension) model;
-      scope = scoping().allPossibleMessagesFor(extension);
-    }
     if (model instanceof Rpc) {
       Rpc rpc = (Rpc) model;
       scope = scoping().allPossibleMessagesFor(rpc);
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 c7d940b..c9ecbdb 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
@@ -55,8 +55,8 @@
         highlight((ComplexType) element, acceptor);
         continue;
       }
-      if (element instanceof MessageExtension) {
-        highlight((MessageExtension) element, acceptor);
+      if (element instanceof TypeExtension) {
+        highlight((TypeExtension) element, acceptor);
         continue;
       }
       if (element instanceof Service) {
@@ -65,8 +65,8 @@
     }
   }
 
-  private void highlight(MessageExtension extension, IHighlightedPositionAcceptor acceptor) {
-    highlightFirstFeature(extension, MESSAGE_EXTENSION__MESSAGE, acceptor, MESSAGE_ID);
+  private void highlight(TypeExtension extension, IHighlightedPositionAcceptor acceptor) {
+    highlightFirstFeature(extension, TYPE_EXTENSION__TYPE, acceptor, MESSAGE_ID);
     for (MessageElement element : extension.getElements()) {
       highlight(element, acceptor);
     }
@@ -102,8 +102,8 @@
       highlight((ComplexType) element, acceptor);
       return;
     }
-    if (element instanceof MessageExtension) {
-      highlight((MessageExtension) element, acceptor);
+    if (element instanceof TypeExtension) {
+      highlight((TypeExtension) element, acceptor);
     }
   }
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java
index 25e2b12..bc3d548 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java
@@ -41,7 +41,7 @@
   private static final Map<Class<?>, String> IMAGES_BY_TYPE = new HashMap<Class<?>, String>();
   static {
     IMAGES_BY_TYPE.put(Enum.class, "enum.gif");
-    IMAGES_BY_TYPE.put(MessageExtension.class, "extend.gif");
+    IMAGES_BY_TYPE.put(TypeExtension.class, "extend.gif");
     IMAGES_BY_TYPE.put(Extensions.class, "extensions.gif");
     IMAGES_BY_TYPE.put(Group.class, "group.gif");
     IMAGES_BY_TYPE.put(Import.class, "import.gif");
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 579a71f..516633f 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
@@ -49,8 +49,8 @@
       Literal literal = (Literal) o;
       return labelFor(literal);
     }
-    if (o instanceof MessageExtension) {
-      MessageExtension extend = (MessageExtension) o;
+    if (o instanceof TypeExtension) {
+      TypeExtension extend = (TypeExtension) o;
       return labelFor(extend);
     }
     if (o instanceof MessageField) {
@@ -100,8 +100,14 @@
     return text;
   }
 
-  private Object labelFor(MessageExtension extension) {
-    return messageName(extension.getMessage());
+  private Object labelFor(TypeExtension extension) {
+    return typeName(extension.getType());
+  }
+
+  private String typeName(ExtensibleTypeLink link) {
+    ExtensibleType type = link.getTarget();
+    if (type == null) return null;
+    return nameResolver.nameOf(type);
   }
 
   private Object labelFor(MessageField field) {
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 a620330..415e8d4 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
@@ -21,7 +21,7 @@
   'syntax' '=' name=STRING ';';
 
 ProtobufElement:
-  Package | Import | Option | ComplexType | MessageExtension | Service;
+  Package | Import | Option | ComplexType | TypeExtension | Service;
 
 Package:
   'package' name=PackageName ';';
@@ -39,7 +39,7 @@
   'import' 'public' importURI=STRING ';';
 
 ComplexType:
-  Message | Enum | Group;
+  Enum | ExtensibleType;
 
 Message:
   'message' name=Name '{'
@@ -47,7 +47,7 @@
   '}' (';')?;
 
 MessageElement:
-  Option | Extensions | ComplexType | MessageField | MessageExtension;
+  Option | Extensions | ComplexType | MessageField | TypeExtension;
 
 Range:
   from=LONG ('to' to=RangeMax)?;
@@ -62,7 +62,7 @@
   '}' (';')?;
 
 GroupElement:
-  Option | IndexedElement | ComplexType | MessageExtension | Extensions;
+  Option | IndexedElement | ComplexType | TypeExtension | Extensions;
 
 Extensions:
   'extensions' ranges+=Range (',' ranges+=Range)* ';';
@@ -102,11 +102,17 @@
 terminal HEX returns ecore::ELong:
   ('-')? '0x' (NUMBER | 'a'..'f' | 'A'..'F')+;
 
-MessageExtension:
-  =>'extend' message=MessageLink '{'
+TypeExtension:
+  =>'extend' type=ExtensibleTypeLink '{'
   elements+=MessageElement*
   '}' (';')?;
 
+ExtensibleTypeLink:
+  target=[ExtensibleType|QualifiedName];
+
+ExtensibleType:
+  Message | Group;
+
 Service:
   'service' name=Name '{'
   (elements+=ServiceElement)*
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/ModelFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/ModelFinder.java
index b6783e7..ef43699 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/ModelFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/ModelFinder.java
@@ -38,13 +38,13 @@
    * @param message the given message.
    * @return all the <strong>local</strong> extensions of the given message, or an empty collection if none is found.
    */
-  public Collection<MessageExtension> localExtensionsOf(Message message) {
+  public Collection<TypeExtension> localExtensionsOf(Message message) {
     return extensionsOf(message, rootOf(message));
   }
   
-  public Collection<MessageExtension> extensionsOf(Message message, Protobuf root) {
-    Set<MessageExtension> extensions = new HashSet<MessageExtension>();
-    for (MessageExtension extension : getAllContentsOfType(root, MessageExtension.class)) {
+  public Collection<TypeExtension> extensionsOf(Message message, Protobuf root) {
+    Set<TypeExtension> extensions = new HashSet<TypeExtension>();
+    for (TypeExtension extension : getAllContentsOfType(root, TypeExtension.class)) {
       Message referred = messageFrom(extension);
       if (message.equals(referred)) extensions.add(extension);
     }
@@ -56,9 +56,11 @@
    * @param extension the given extension.
    * @return the message from the given extension, or {@code null} if the extension is not referring to a message.
    */
-  public Message messageFrom(MessageExtension extension) {
-    MessageLink link = extension.getMessage();
-    return link == null ? null : link.getTarget();
+  public Message messageFrom(TypeExtension extension) {
+    ExtensibleTypeLink link = extension.getType();
+    if (link == null) return null;
+    ExtensibleType type = link.getTarget();
+    return (type instanceof Message) ? (Message) type : null;
   }
 
   /**
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AstWalker.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AstWalker.java
index 62db31a..aab7e7c 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AstWalker.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AstWalker.java
@@ -61,7 +61,7 @@
     Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
     for (EObject element : start.eContents()) {
       descriptions.addAll(scopeFinder.local(element, criteria, level));
-      if (element instanceof Message) {
+      if (element instanceof Message || element instanceof Group) {
         descriptions.addAll(local(element, scopeFinder, criteria, level + 1));
       }
     }
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 e128e33..00ab0d6 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
@@ -119,7 +119,7 @@
       Message fieldType = modelFinder.messageTypeOf((MessageField) e);
       if (fieldType == null) return emptyList();
       Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
-      for (MessageExtension extension : modelFinder.localExtensionsOf(fieldType)) {
+      for (TypeExtension extension : modelFinder.localExtensionsOf(fieldType)) {
         for (MessageElement element : extension.getElements()) {
           if (!(element instanceof IndexedElement)) continue;
           IndexedElement current = (IndexedElement) element;
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 d3df720..7089de5 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
@@ -36,7 +36,7 @@
     OptionType optionType = optionTypeFrom(criteria);
     if (!isExtendingOptionMessage(target, optionType)) return emptySet();
     Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
-    MessageExtension extension = (MessageExtension) target;
+    TypeExtension extension = (TypeExtension) target;
     for (MessageElement e : extension.getElements()) {
       descriptions.addAll(qualifiedNamesDescriptions.qualifiedNamesForOption(e));
     }
@@ -51,7 +51,7 @@
     OptionType optionType = optionTypeFrom(criteria);
     if (!isExtendingOptionMessage(target, optionType)) return emptySet();
     Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
-    MessageExtension extension = (MessageExtension) target;
+    TypeExtension extension = (TypeExtension) target;
     for (MessageElement e : extension.getElements()) {
       List<QualifiedName> names = localNamesProvider.namesForOption(e);
       int nameCount = names.size();
@@ -70,8 +70,8 @@
   }
 
   private boolean isExtendingOptionMessage(Object o, OptionType optionType) {
-    if (!(o instanceof MessageExtension)) return false;
-    Message message = modelFinder.messageFrom((MessageExtension) o);
+    if (!(o instanceof TypeExtension)) return false;
+    Message message = modelFinder.messageFrom((TypeExtension) o);
     if (message == null) return false;
     String name = message.getName();
     return optionType.messageName().equals(name);
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 39270d8..aabaaa8 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
@@ -81,7 +81,7 @@
     Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
     Message fieldType = modelFinder.messageTypeOf(field);
     // check first in descriptor.proto
-    for (MessageExtension extension : modelFinder.extensionsOf(fieldType, modelFinder.rootOf(field))) {
+    for (TypeExtension extension : modelFinder.extensionsOf(fieldType, modelFinder.rootOf(field))) {
       for (MessageElement element : extension.getElements()) {
         if (!(element instanceof MessageField)) continue;
         descriptions.addAll(qualifiedNameDescriptions.qualifiedNames(element));
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 7cad285..28a1eb3 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
@@ -61,12 +61,22 @@
   }
 
   @SuppressWarnings("unused")
-  public IScope scope_MessageLink_target(MessageLink link, EReference r) {
-    return createScope(messagesFor(link));
+  public IScope scope_ExtensibleTypeLink_target(ExtensibleTypeLink link, EReference r) {
+    return createScope(extensibleTypesFor(link));
   }
 
-  @Override public Collection<IEObjectDescription> allPossibleMessagesFor(MessageExtension extension) {
-    return messagesFor(extension);
+  @Override public Collection<IEObjectDescription> allPossibleTypesFor(TypeExtension extension) {
+    return extensibleTypesFor(extension);
+  }
+
+  private Collection<IEObjectDescription> extensibleTypesFor(EObject o) {
+    Protobuf root = modelFinder.rootOf(o);
+    return astWalker.traverseAst(root, typeScopeFinder, ExtensibleType.class);
+  }
+
+  @SuppressWarnings("unused")
+  public IScope scope_MessageLink_target(MessageLink link, EReference r) {
+    return createScope(messagesFor(link));
   }
 
   @Override public Collection<IEObjectDescription> allPossibleMessagesFor(Rpc rpc) {
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 9f9c425..b35c088 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
@@ -21,7 +21,7 @@
 
   Collection<IEObjectDescription> allPossibleTypesFor(MessageField field);
 
-  Collection<IEObjectDescription> allPossibleMessagesFor(MessageExtension extension);
+  Collection<IEObjectDescription> allPossibleTypesFor(TypeExtension extension);
 
   Collection<IEObjectDescription> allPossibleMessagesFor(Rpc rpc);
 
