diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/CompoundElementsTest.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/CompoundElementsTest.java
deleted file mode 100644
index 9116109..0000000
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/CompoundElementsTest.java
+++ /dev/null
@@ -1,60 +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.ui.grammar;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-
-import org.junit.*;
-
-import com.google.eclipse.protobuf.junit.XtextRule;
-
-/**
- * Tests for <code>{@link CompoundElements}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class CompoundElementsTest {
-
-  @Rule public XtextRule xtext = new XtextRule();
-  
-  private CompoundElements elements;
-  
-  @Before public void setUp() {
-    elements = xtext.getInstanceOf(CompoundElements.class);
-  }
-  
-  @Test public void should_return_default() {
-    assertThat(elements.defaultValue(), equalTo("default ="));
-  }
-  
-  @Test public void should_return_default_in_brackets() {
-    assertThat(elements.defaultValueInBrackets(), equalTo("[default =]"));
-  }
-  
-  @Test public void should_return_default_for_string() {
-    assertThat(elements.defaultStringValue(), equalTo("default = \"\""));
-  }
-  
-  @Test public void should_return_default_for_string_in_brackets() {
-    assertThat(elements.defaultStringValueInBrackets(), equalTo("[default = \"\"]"));
-  }
-
-  @Test public void should_return_empty_string() {
-    assertThat(elements.emptyString(), equalTo("\"\""));
-  }
-  
-  @Test public void should_return_packed() {
-    assertThat(elements.packed(), equalTo("packed = true"));
-  }
-  
-  @Test public void should_return_packed_in_brackets() {
-    assertThat(elements.packedInBrackets(), equalTo("[packed = true]"));
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/KeywordsTest.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/KeywordsTest.java
deleted file mode 100644
index 47bbe46..0000000
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/KeywordsTest.java
+++ /dev/null
@@ -1,76 +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.ui.grammar;
-
-import static com.google.eclipse.protobuf.junit.KeywordHasValueMatcher.hasValue;
-import static org.junit.Assert.assertThat;
-
-import org.junit.*;
-
-import com.google.eclipse.protobuf.junit.XtextRule;
-
-/**
- * Tests for <code>{@link Keywords}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class KeywordsTest {
-
-  @Rule public XtextRule xtext = new XtextRule();
-
-  private Keywords keywords;
-  
-  @Before public void setUp() {
-    keywords = xtext.getInstanceOf(Keywords.class);
-  }
-  
-  @Test public void should_return_bool() {
-    assertThat(keywords.bool(), hasValue("bool"));
-  }
-
-  @Test public void should_return_true() {
-    assertThat(keywords.boolTrue(), hasValue("true"));
-  }
-
-  @Test public void should_return_false() {
-    assertThat(keywords.boolFalse(), hasValue("false"));
-  }
-  
-  @Test public void should_return_bytes() {
-    assertThat(keywords.bytes(), hasValue("bytes"));
-  }
-  
-  @Test public void should_return_opening_bracket() {
-    assertThat(keywords.openingBracket(), hasValue("["));
-  }
-  
-  @Test public void should_return_closing_bracket() {
-    assertThat(keywords.closingBracket(), hasValue("]"));
-  }
-
-  @Test public void should_return_default() {
-    assertThat(keywords.defaultValue(), hasValue("default"));
-  }
-  
-  @Test public void should_return_equal_sign() {
-    assertThat(keywords.equalSign(), hasValue("="));
-  }
-
-  @Test public void should_return_packed() {
-    assertThat(keywords.packed(), hasValue("packed"));
-  }
-
-  @Test public void should_return_semicolon() {
-    assertThat(keywords.semicolon(), hasValue(";"));
-  }
-
-  @Test public void should_return_string() {
-    assertThat(keywords.string(), hasValue("string"));
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java
index c7140ae..b34db80 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/SmartSemicolonHandler.java
@@ -10,6 +10,7 @@
 
 import static com.google.eclipse.protobuf.protobuf.Modifier.REPEATED;
 import static com.google.eclipse.protobuf.ui.grammar.CommonKeyword.SEMICOLON;
+import static com.google.eclipse.protobuf.ui.grammar.CompoundElement.PACKED_EQUAL_TRUE_IN_BRACKETS;
 
 import java.util.regex.Pattern;
 
@@ -21,11 +22,8 @@
 import org.eclipse.xtext.ui.editor.contentassist.antlr.ParserBasedContentAssistContextFactory;
 import org.eclipse.xtext.util.concurrent.IUnitOfWork;
 
-import com.google.eclipse.protobuf.protobuf.Literal;
-import com.google.eclipse.protobuf.protobuf.Property;
-import com.google.eclipse.protobuf.ui.grammar.CompoundElements;
-import com.google.eclipse.protobuf.ui.util.Literals;
-import com.google.eclipse.protobuf.ui.util.Properties;
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.eclipse.protobuf.ui.util.*;
 import com.google.inject.Inject;
 
 /**
@@ -42,18 +40,11 @@
   private static final Pattern PROPERTY_WITH_INDEX =
       Pattern.compile("[\\s]+(.*)[\\s]+(.*)[\\s]+(.*)[\\s]+=[\\s]+[\\d]+(.*)");
 
-  private final CompoundElements compoundElements;
-
   @Inject private ParserBasedContentAssistContextFactory contextFactory;
   @Inject private Literals literals;
   @Inject private Properties properties;
 
-  private final String semicolon;
-
-  @Inject public SmartSemicolonHandler(CompoundElements compoundElements) {
-    this.compoundElements = compoundElements;
-    semicolon = SEMICOLON.value;
-  }
+  private final String semicolon = SEMICOLON.toString();
 
   /** {@inheritDoc} */
   @Override protected void insertContent(XtextEditor editor) {
@@ -107,14 +98,14 @@
     if (hasIndexAlready) {
       // we can still insert '[packed = true]' if necessary
       if (shouldInsertPackedOption(property)) {
-        String content = compoundElements.packedInBrackets() + semicolon;
+        String content = PACKED_EQUAL_TRUE_IN_BRACKETS + semicolon;
         return addSpaceAtBeginning(line, content);
       }
       return semicolon;
     }
     int index = properties.calculateTagNumberOf(property);
     if (shouldInsertPackedOption(property)) {
-      String format = "= %d " + compoundElements.packedInBrackets() + "%s";
+      String format = "= %d " + PACKED_EQUAL_TRUE_IN_BRACKETS + "%s";
       return indexAndSemicolonToInsert(format, line, index);
     }
     return defaultIndexAndSemicolonToInsert(line, index);
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 008f09c..6c8cf04 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
@@ -11,6 +11,7 @@
 import static com.google.eclipse.protobuf.protobuf.Modifier.*;
 import static com.google.eclipse.protobuf.protobuf.ScalarType.STRING;
 import static com.google.eclipse.protobuf.ui.grammar.CommonKeyword.*;
+import static com.google.eclipse.protobuf.ui.grammar.CompoundElement.*;
 import static java.lang.String.valueOf;
 
 import org.eclipse.emf.ecore.EObject;
@@ -25,8 +26,8 @@
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.eclipse.protobuf.protobuf.Enum;
 import com.google.eclipse.protobuf.scoping.Globals;
-import com.google.eclipse.protobuf.ui.grammar.CommonKeyword;
-import com.google.eclipse.protobuf.ui.grammar.CompoundElements;
+import com.google.eclipse.protobuf.ui.grammar.*;
+import com.google.eclipse.protobuf.ui.grammar.CompoundElement;
 import com.google.eclipse.protobuf.ui.labeling.Images;
 import com.google.eclipse.protobuf.ui.util.*;
 import com.google.eclipse.protobuf.util.EObjectFinder;
@@ -39,7 +40,6 @@
  */
 public class ProtobufProposalProvider extends AbstractProtobufProposalProvider {
 
-  @Inject private CompoundElements compoundElements;
   @Inject private EObjectFinder finder;
   @Inject private Globals globals;
   @Inject private PluginImageHelper imageHelper;
@@ -60,10 +60,10 @@
   private void proposeCommonFileOptions(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     for (Property fileOption : globals.fileOptions()) {
       String displayString = fileOption.getName();
-      String proposalText = displayString + " " + EQUAL.value + " ";
+      String proposalText = displayString + " " + EQUAL + " ";
       boolean isStringOption = properties.isString(fileOption);
       if (isStringOption)
-        proposalText = proposalText + compoundElements.emptyString() + SEMICOLON.value;
+        proposalText = proposalText + EMPTY_STRING + SEMICOLON;
       ICompletionProposal proposal = createCompletionProposal(proposalText, displayString, context);
       if (isStringOption && proposal instanceof ConfigurableCompletionProposal) {
         // set cursor between the proposal's quotes
@@ -100,8 +100,12 @@
 
   private void proposeAndAccept(CommonKeyword[] keywords, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
-    for (CommonKeyword keyword : keywords)
-      proposeAndAccept(keyword.value, context, acceptor);
+    for (CommonKeyword keyword : keywords) proposeAndAccept(keyword, context, acceptor);
+  }
+
+  private void proposeAndAccept(CommonKeyword keyword, ContentAssistContext context,
+      ICompletionProposalAcceptor acceptor) {
+    proposeAndAccept(keyword.toString(), context, acceptor);
   }
 
   @Override public void complete_ID(EObject model, RuleCall ruleCall, ContentAssistContext context,
@@ -120,7 +124,7 @@
   }
 
   private void proposeEmptyString(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-    ICompletionProposal proposal = createCompletionProposal(compoundElements.emptyString(), context);
+    ICompletionProposal proposal = createCompletionProposal(EMPTY_STRING, context);
     if (proposal instanceof ConfigurableCompletionProposal) {
       ConfigurableCompletionProposal configurable = (ConfigurableCompletionProposal) proposal;
       configurable.setCursorPosition(1);
@@ -129,16 +133,15 @@
   }
 
   private boolean isProposalForDefaultValue(ContentAssistContext context) {
-    return isProposalForAssignment(DEFAULT.value, context);
+    return isProposalForAssignment(DEFAULT, context);
   }
 
-  private boolean isProposalForAssignment(String feature, ContentAssistContext context) {
+  private boolean isProposalForAssignment(CommonKeyword feature, ContentAssistContext context) {
     ImmutableList<AbstractElement> grammarElements = context.getFirstSetGrammarElements();
     for (AbstractElement e : grammarElements) {
       if (!(e instanceof Assignment)) continue;
       Assignment a = (Assignment) e;
-      String equalSign = EQUAL.value;
-      if (feature.equals(a.getFeature()) && equalSign.equals(a.getOperator())) return true;
+      if (feature.hasValueEqualTo(a.getFeature()) && EQUAL.hasValueEqualTo(a.getOperator())) return true;
     }
     return false;
   }
@@ -191,10 +194,10 @@
     Property p = (Property) model;
     Modifier modifier = p.getModifier();
     if (OPTIONAL.equals(modifier)) {
-      String display = compoundElements.defaultValueInBrackets();
-      int cursorPosition = display.indexOf(CLOSING_BRACKET.value);
+      CompoundElement display = DEFAULT_EQUAL_IN_BRACKETS;
+      int cursorPosition = display.indexOf(CLOSING_BRACKET);
       if (isStringProperty(p)) {
-        display = compoundElements.defaultStringValueInBrackets();
+        display = DEFAULT_EQUAL_STRING_IN_BRACKETS;
         cursorPosition++;
       }
       ICompletionProposal proposal = createCompletionProposal(display, context);
@@ -205,7 +208,7 @@
       acceptor.accept(proposal);
     }
     if (REPEATED.equals(modifier) && properties.isPrimitive(p))
-      proposeAndAccept(compoundElements.packedInBrackets(), context, acceptor);
+      proposeAndAccept(PACKED_EQUAL_TRUE_IN_BRACKETS, context, acceptor);
     return true;
   }
 
@@ -214,16 +217,21 @@
     if (p == null) return;
     Modifier modifier = p.getModifier();
     if (!REPEATED.equals(modifier) || !properties.isPrimitive(p)) return;
-    proposeAndAccept(compoundElements.packed(), context, acceptor);
+    proposeAndAccept(PACKED_EQUAL_TRUE, context, acceptor);
+  }
+
+  private void proposeAndAccept(CompoundElement proposalText, ContentAssistContext context,
+      ICompletionProposalAcceptor acceptor) {
+    proposeAndAccept(proposalText.toString(), context, acceptor);
   }
 
   private void proposeDefaultValue(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     Modifier modifier = extractModifierFromModel(context);
     if (!OPTIONAL.equals(modifier)) return;
-    String display = compoundElements.defaultValue();
-    int cursorPosition = display.length();
+    CompoundElement display = DEFAULT_EQUAL;
+    int cursorPosition = display.charCount();
     if (isStringProperty((Property) context.getCurrentModel())) {
-      display = compoundElements.defaultStringValue();
+      display = DEFAULT_EQUAL_STRING;
       cursorPosition++;
     }
     ICompletionProposal proposal = createCompletionProposal(display, context);
@@ -251,6 +259,10 @@
     return STRING.equals(finder.scalarTypeOf(p));
   }
 
+  private ICompletionProposal createCompletionProposal(CompoundElement proposal, ContentAssistContext context) {
+    return createCompletionProposal(proposal.toString(), context);
+  }
+
   @Override public void completeLiteral_Index(EObject model, Assignment assignment, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
     int index = literals.calculateIndexOf((Literal) model);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CommonKeyword.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CommonKeyword.java
index f156559..24efb42 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CommonKeyword.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CommonKeyword.java
@@ -11,16 +11,19 @@
 import org.eclipse.xtext.Keyword;
 
 /**
- * Set of common keywords (it may or may not include all the keywords in the grammar.)
+ * A commonly used keyword.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
 public enum CommonKeyword {
 
-  BOOL("bool"), TRUE("true"), FALSE("false"), BYTES("bytes"), OPENING_BRACKET("["), CLOSING_BRACKET("]"),
-  DEFAULT("default"), EQUAL("="), PACKED("packet"), SEMICOLON(":"), STRING("string");
+  // we used to get keywords from IGrammarAccess. The problem was that we still had to hardcode the keyword we were
+  // looking for. The code was too complicated and we had to change our implementation anyway.
 
-  public final String value;
+  BOOL("bool"), TRUE("true"), FALSE("false"), BYTES("bytes"), OPENING_BRACKET("["), CLOSING_BRACKET("]"),
+    DEFAULT("default"), EQUAL("="), PACKED("packet"), SEMICOLON(";"), STRING("string");
+
+  private final String value;
 
   private CommonKeyword(String value) {
     this.value = value;
@@ -33,4 +36,8 @@
   public boolean hasValueEqualTo(String s) {
     return value.equals(s);
   }
+
+  @Override public String toString() {
+    return value;
+  }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElement.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElement.java
new file mode 100644
index 0000000..5fe9ed8
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElement.java
@@ -0,0 +1,69 @@
+/*
+ * 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.ui.grammar;
+
+import static com.google.eclipse.protobuf.ui.grammar.CommonKeyword.*;
+
+/**
+ * Element composed of one or more keywords.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public enum CompoundElement {
+
+  DEFAULT_EQUAL(join(DEFAULT, EQUAL)),
+  DEFAULT_EQUAL_IN_BRACKETS(inBrackets(DEFAULT_EQUAL)),
+  EMPTY_STRING("\"\""),
+  DEFAULT_EQUAL_STRING(join(DEFAULT_EQUAL, EMPTY_STRING)),
+  DEFAULT_EQUAL_STRING_IN_BRACKETS(inBrackets(DEFAULT_EQUAL_STRING)),
+  PACKED_EQUAL_TRUE(join(PACKED, EQUAL, TRUE)),
+  PACKED_EQUAL_TRUE_IN_BRACKETS(inBrackets(PACKED_EQUAL_TRUE));
+
+  private final String value;
+
+  private static String join(CommonKeyword...keywords) {
+    StringBuilder buffer = new StringBuilder();
+    int count = keywords.length;
+    for (int i = 0; i < count; i++) {
+      buffer.append(keywords[i].toString());
+      if (i < count - 1) buffer.append(" ");
+    }
+    return buffer.toString();
+  }
+
+  private static String join(CompoundElement...elements) {
+    StringBuilder buffer = new StringBuilder();
+    int count = elements.length;
+    for (int i = 0; i < count; i++) {
+      buffer.append(elements[i].value);
+      if (i < count - 1) buffer.append(" ");
+    }
+    return buffer.toString();
+  }
+
+  private static String inBrackets(CompoundElement element) {
+    return String.format("[%s]", element.value);
+  }
+
+  private CompoundElement(String value) {
+    this.value = value;
+  }
+
+  public int charCount() {
+    return value.length();
+  }
+
+  public int indexOf(CommonKeyword keyword) {
+    return value.indexOf(keyword.toString());
+  }
+
+  @Override public String toString() {
+    return value;
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElements.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElements.java
deleted file mode 100644
index a619471..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElements.java
+++ /dev/null
@@ -1,118 +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.ui.grammar;
-
-import org.eclipse.xtext.Keyword;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-/**
- * Common grammar elements composed of one or more keywords.
- * 
- * @author alruiz@google.com (Alex Ruiz)
- */
-@Singleton
-public class CompoundElements {
-
-  private static final String EMPTY_STRING = "\"\"";
-
-  private final String inBracketsFormat;
-
-  private final String defaultValue;
-  private final String defaultValueInBrackets;
-  private final String defaultStringValue;
-  private final String defaultStringValueInBrackets;
-  private final String packed;
-  private final String packedInBrackets;
-
-  /**
-   * Creates a new </code>{@link CompoundElements}</code>.
-   * @param keywords the keywords in our grammar.
-   */
-  @Inject public CompoundElements(Keywords keywords) {
-    inBracketsFormat = keywords.openingBracket().getValue() + "%s" + keywords.closingBracket().getValue();
-    defaultValue = format("%s %s", keywords.defaultValue(), keywords.equalSign());
-    defaultValueInBrackets = inBrackets(defaultValue);
-    defaultStringValue = format("%s %s %s", keywords.defaultValue(), keywords.equalSign(), EMPTY_STRING);
-    defaultStringValueInBrackets = inBrackets(defaultStringValue);
-    packed = format("%s %s %s", keywords.packed(), keywords.equalSign(), keywords.boolTrue());
-    packedInBrackets = inBrackets(packed);
-  }
-
-  private static String format(String format, Object...values) {
-    int count = values.length;
-    Object[] cleanValues = new Object[count];
-    for (int i = 0; i < count; i++) {
-      Object value = values[i];
-      cleanValues[i] = (value instanceof Keyword) ? ((Keyword) value).getValue() : value;
-    }
-    return String.format(format, cleanValues);
-  }
-
-  private String inBrackets(String element) {
-    return String.format(inBracketsFormat, element);
-  }
-
-  /**
-   * Returns 'default ='.
-   * @return 'default ='.
-   */
-  public String defaultValue() {
-    return defaultValue;
-  }
-
-  /**
-   * Returns '[default =]'.
-   * @return '[default =]'.
-   */
-  public String defaultValueInBrackets() {
-    return defaultValueInBrackets;
-  }
-
-  /**
-   * Returns 'default = ""'.
-   * @return 'default = ""'.
-   */
-  public String defaultStringValue() {
-    return defaultStringValue;
-  }
-
-  /**
-   * Returns '[default = ""]'.
-   * @return '[default = ""]'.
-   */
-  public String defaultStringValueInBrackets() {
-    return defaultStringValueInBrackets;
-  }
-
-  /**
-   * Returns '""'.
-   * @return '""'.
-   */
-  public String emptyString() {
-    return EMPTY_STRING;
-  }
-
-  /**
-   * Returns 'packed = true'.
-   * @return 'packed = true'.
-   */
-  public String packed() {
-    return packed;
-  }
-
-  /**
-   * Returns '[packed = true]'.
-   * @return '[packed = true]'.
-   */
-  public String packedInBrackets() {
-    return packedInBrackets;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/Keywords.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/Keywords.java
deleted file mode 100644
index a8695c2..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/Keywords.java
+++ /dev/null
@@ -1,219 +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.ui.grammar;
-
-import static org.eclipse.xtext.GrammarUtil.containedKeywords;
-
-import java.util.List;
-
-import org.eclipse.xtext.IGrammarAccess;
-import org.eclipse.xtext.Keyword;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-/**
- * Common keywords used in the code base.
- * 
- * @author alruiz@google.com (Alex Ruiz)
- */
-@Singleton
-public class Keywords {
-
-  private Keyword bool;
-  private Keyword boolTrue;
-  private Keyword boolFalse;
-  private Keyword bytes;
-  private Keyword openingBracket;
-  private Keyword closingBracket;
-  private Keyword defaultValue;
-  private Keyword equalSign;
-  private Keyword packed;
-  private Keyword semicolon;
-  private Keyword string;
-
-  /**
-   * Creates a new </code>{@link Keywords}</code>.
-   * @param grammarAccess contains the grammar whose keywords we'll be extracting.
-   */
-  @Inject public Keywords(IGrammarAccess grammarAccess) {
-    List<Keyword> allKeywords = containedKeywords(grammarAccess.getGrammar());
-    for (Keyword k : allKeywords) {
-      if (assignIfIsBool(k)) continue;
-      if (assignIfIsBoolTrue(k)) continue;
-      if (assignIfIsBoolFalse(k)) continue;
-      if (assignIfIsBytes(k)) continue;
-      if (assignIfIsOpeningBracket(k)) continue;
-      if (assignIfIsClosingBracket(k)) continue;
-      if (assignIfIsDefaultValue(k)) continue;
-      if (assignIfIsEqualSign(k)) continue;
-      if (assignIfIsPacked(k)) continue;
-      if (assignIfIsSemicolon(k)) continue;
-      if (assignIfIsString(k)) continue;
-    }
-  }
-
-  private boolean assignIfIsBool(Keyword k) {
-    if (!isKeywordValue(k, "bool")) return false;
-    bool = k;
-    return true;
-  }
-
-  private boolean assignIfIsBoolTrue(Keyword k) {
-    if (!isKeywordValue(k, "true")) return false;
-    boolTrue = k;
-    return true;
-  }
-
-  private boolean assignIfIsBoolFalse(Keyword k) {
-    if (!isKeywordValue(k, "false")) return false;
-    boolFalse = k;
-    return true;
-  }
-
-  private boolean assignIfIsBytes(Keyword k) {
-    if (!isKeywordValue(k, "bytes")) return false;
-    bytes = k;
-    return true;
-  }
-
-  private boolean assignIfIsOpeningBracket(Keyword k) {
-    if (!isKeywordValue(k, "[")) return false;
-    openingBracket = k;
-    return true;
-  }
-
-  private boolean assignIfIsClosingBracket(Keyword k) {
-    if (!isKeywordValue(k, "]")) return false;
-    closingBracket = k;
-    return true;
-  }
-
-  private boolean assignIfIsDefaultValue(Keyword k) {
-    if (!isKeywordValue(k, "default")) return false;
-    defaultValue = k;
-    return true;
-  }
-
-  private boolean assignIfIsEqualSign(Keyword k) {
-    if (!isKeywordValue(k, "=")) return false;
-    equalSign = k;
-    return true;
-  }
-
-  private boolean assignIfIsPacked(Keyword k) {
-    if (!isKeywordValue(k, "packed")) return false;
-    packed = k;
-    return true;
-  }
-
-  private boolean assignIfIsSemicolon(Keyword k) {
-    if (!isKeywordValue(k, ";")) return false;
-    semicolon = k;
-    return true;
-  }
-
-  private boolean assignIfIsString(Keyword k) {
-    if (!isKeywordValue(k, "string")) return false;
-    string = k;
-    return true;
-  }
-
-  private static boolean isKeywordValue(Keyword k, String expectedValue) {
-    return expectedValue.equals(k.getValue());
-  }
-
-  /**
-   * Returns the representation of the keyword "bool".
-   * @return the representation of the keyword "bool".
-   */
-  public Keyword bool() {
-    return bool;
-  }
-
-  /**
-   * Returns the representation of the keyword "true".
-   * @return the representation of the keyword "true".
-   */
-  public Keyword boolTrue() {
-    return boolTrue;
-  }
-
-  /**
-   * Returns the representation of the keyword "false".
-   * @return the representation of the keyword "false".
-   */
-  public Keyword boolFalse() {
-    return boolFalse;
-  }
-
-  /**
-   * Returns the representation of the keyword "bytes".
-   * @return the representation of the keyword "bytes".
-   */
-  public Keyword bytes() {
-    return bytes;
-  }
-
-  /**
-   * Returns the representation of the keyword "[".
-   * @return the representation of the keyword "[".
-   */
-  public Keyword openingBracket() {
-    return openingBracket;
-  }
-
-  /**
-   * Returns the representation of the keyword "]".
-   * @return the representation of the keyword "]".
-   */
-  public Keyword closingBracket() {
-    return closingBracket;
-  }
-
-  /**
-   * Returns the representation of the keyword "default".
-   * @return the representation of the keyword "default".
-   */
-  public Keyword defaultValue() {
-    return defaultValue;
-  }
-
-  /**
-   * Returns the representation of the keyword "=".
-   * @return the representation of the keyword "=".
-   */
-  public Keyword equalSign() {
-    return equalSign;
-  }
-
-  /**
-   * Returns the representation of the keyword "packed".
-   * @return the representation of the keyword "packed".
-   */
-  public Keyword packed() {
-    return packed;
-  }
-
-  /**
-   * Returns the representation of the keyword ";".
-   * @return the representation of the keyword ";".
-   */
-  public Keyword semicolon() {
-    return semicolon;
-  }
-
-  /**
-   * Returns the representation of the keyword "string".
-   * @return the representation of the keyword "string".
-   */
-  public Keyword string() {
-    return string;
-  }
-}
