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 dfc694f..6524ed1 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,7 +43,7 @@
   // extend Person {}
   @Test public void should_return_extensions_of_message() {
     Message m = xtext.find("Person", " {", Message.class);
-    List<ExtendMessage> extensions = new ArrayList<ExtendMessage>(finder.localExtensionsOf(m));
+    List<Extend> extensions = new ArrayList<Extend>(finder.localExtensionsOf(m));
     Message referred = extensions.get(0).getMessage().getType();
     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 037ff2d..f3f045c 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(ExtendMessage)}</code>.
+ * Tests for <code>{@link ModelFinder#messageFrom(Extend)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
@@ -42,13 +42,13 @@
   //
   // extend Person {}
   @Test public void should_return_message_from_extension() {
-    ExtendMessage extension = xtext.find("Person", " {}", ExtendMessage.class);
+    Extend extension = xtext.find("Person", " {}", Extend.class);
     Message message = finder.messageFrom(extension);
     assertThat(message.getName(), equalTo("Person"));
   }
 
   @Test public void should_return_null_if_extension_is_not_referring_to_message() {
-    ExtendMessage extension = mock(ExtendMessage.class);
+    Extend extension = mock(Extend.class);
     when(extension.getMessage()).thenReturn(null);
     assertNull(finder.messageFrom(extension));
   }
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 60f312d..6a6dcd9 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 ExtendMessage) {
-        highlight((ExtendMessage) element, acceptor);
+      if (element instanceof Extend) {
+        highlight((Extend) element, acceptor);
         continue;
       }
       if (element instanceof Service) {
@@ -65,7 +65,7 @@
     }
   }
 
-  private void highlight(ExtendMessage extend, IHighlightedPositionAcceptor acceptor) {
+  private void highlight(Extend extend, IHighlightedPositionAcceptor acceptor) {
     highlightFirstFeature(extend, EXTEND_MESSAGE__MESSAGE, acceptor, MESSAGE_ID);
     for (MessageElement element : extend.getElements()) {
       highlight(element, acceptor);
@@ -102,8 +102,8 @@
       highlight((ComplexType) element, acceptor);
       return;
     }
-    if (element instanceof ExtendMessage) {
-      highlight((ExtendMessage) element, acceptor);
+    if (element instanceof Extend) {
+      highlight((Extend) 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 85bc753..b4499ce 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(ExtendMessage.class, "extend.gif");
+    IMAGES_BY_TYPE.put(Extend.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 a88aaa0..ae4e1df 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
@@ -38,8 +38,8 @@
       Option option = (Option) o;
       return labelFor(option);
     }
-    if (o instanceof ExtendMessage) {
-      ExtendMessage extend = (ExtendMessage) o;
+    if (o instanceof Extend) {
+      Extend extend = (Extend) o;
       return labelFor(extend);
     }
     if (o instanceof Extensions) {
@@ -98,7 +98,7 @@
     }
   }
 
-  private Object labelFor(ExtendMessage e) {
+  private Object labelFor(Extend e) {
     return messageName(e.getMessage());
   }
 
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 ce6f408..47dcb5e 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 | ExtendMessage | Service;
+  Package | Import | Option | ComplexType | Extend | Service;
 
 Package:
   'package' name=QualifiedName ';';
@@ -47,7 +47,7 @@
   '}' (';')?;
 
 MessageElement:
-  Option | Extensions | ComplexType | Property | ExtendMessage;
+  Option | Extensions | ComplexType | Property | Extend;
 
 Extensions:
   'extensions' ranges+=Range (',' ranges+=Range)* ';';
@@ -65,7 +65,7 @@
   '}' (';')?;
 
 GroupElement:
-  Option | Property | Group | Enum | ExtendMessage;
+  Option | Property | Group | Enum | Extend;
 
 Property:
   modifier=Modifier type=AbstractTypeRef name=Name '=' index=(LONG | HEX)
@@ -176,7 +176,7 @@
 terminal NUMBER:
   '0'..'9';
 
-ExtendMessage:
+Extend:
   'extend' message=MessageRef '{'
   elements+=MessageElement*
   '}' (';')?;
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 23e3b14..df316a9 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
@@ -37,13 +37,13 @@
    * @param m the given message.
    * @return all the <strong>local</strong> extensions of the given message, or an empty collection if none is found.
    */
-  public Collection<ExtendMessage> localExtensionsOf(Message m) {
+  public Collection<Extend> localExtensionsOf(Message m) {
     return extensionsOf(m, rootOf(m));
   }
   
-  public Collection<ExtendMessage> extensionsOf(Message m, Protobuf root) {
-    Set<ExtendMessage> extensions = new HashSet<ExtendMessage>();
-    for (ExtendMessage extension : getAllContentsOfType(root, ExtendMessage.class)) {
+  public Collection<Extend> extensionsOf(Message m, Protobuf root) {
+    Set<Extend> extensions = new HashSet<Extend>();
+    for (Extend extension : getAllContentsOfType(root, Extend.class)) {
       Message referred = messageFrom(extension);
       if (m.equals(referred)) extensions.add(extension);
     }
@@ -55,7 +55,7 @@
    * @param e 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(ExtendMessage e) {
+  public Message messageFrom(Extend e) {
     MessageRef ref = e.getMessage();
     return ref == null ? null : ref.getType();
   }
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 5aaeca3..eacb2ed 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 propertyType = modelFinder.messageTypeOf((Property) e);
       if (propertyType == null) return emptyList();
       Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
-      for (ExtendMessage extend : modelFinder.localExtensionsOf(propertyType)) {
+      for (Extend extend : modelFinder.localExtensionsOf(propertyType)) {
         for (MessageElement element : extend.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 33523c6..97ddcbc 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
@@ -38,7 +38,7 @@
     OptionType optionType = optionTypeFrom(criteria);
     if (!isExtendingOptionMessage(target, optionType)) return emptySet();
     Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
-    ExtendMessage extend = (ExtendMessage) target;
+    Extend extend = (Extend) target;
     for (MessageElement e : extend.getElements()) {
       descriptions.addAll(qualifiedNamesDescriptions.qualifiedNamesForOption(e));
     }
@@ -49,7 +49,7 @@
     OptionType optionType = optionTypeFrom(criteria);
     if (!isExtendingOptionMessage(target, optionType)) return emptySet();
     Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
-    ExtendMessage extend = (ExtendMessage) target;
+    Extend extend = (Extend) target;
     for (MessageElement e : extend.getElements()) {
       List<QualifiedName> names = localNamesProvider.namesForOption(e);
       int nameCount = names.size();
@@ -68,8 +68,8 @@
   }
 
   private boolean isExtendingOptionMessage(Object o, OptionType optionType) {
-    if (!(o instanceof ExtendMessage)) return false;
-    Message message = modelFinder.messageFrom((ExtendMessage) o);
+    if (!(o instanceof Extend)) return false;
+    Message message = modelFinder.messageFrom((Extend) 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/FieldNotationScopeFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/FieldNotationScopeFinder.java
index ad804d5..c4e8de8 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
@@ -92,7 +92,7 @@
     Message propertyType = modelFinder.messageTypeOf(p);
     // check first in descriptor.proto
     
-    for (ExtendMessage extend : modelFinder.extensionsOf(propertyType, modelFinder.rootOf(p))) {
+    for (Extend extend : modelFinder.extensionsOf(propertyType, modelFinder.rootOf(p))) {
       for (MessageElement element : extend.getElements()) {
         if (!(element instanceof Property)) continue;
         descriptions.addAll(qualifiedNameDescriptions.qualifiedNames(element));
