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 1633d1b..c7140ae 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
@@ -9,6 +9,7 @@
 package com.google.eclipse.protobuf.ui.commands;
 
 import static com.google.eclipse.protobuf.protobuf.Modifier.REPEATED;
+import static com.google.eclipse.protobuf.ui.grammar.CommonKeyword.SEMICOLON;
 
 import java.util.regex.Pattern;
 
@@ -23,7 +24,6 @@
 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.grammar.Keywords;
 import com.google.eclipse.protobuf.ui.util.Literals;
 import com.google.eclipse.protobuf.ui.util.Properties;
 import com.google.inject.Inject;
@@ -50,9 +50,9 @@
 
   private final String semicolon;
 
-  @Inject public SmartSemicolonHandler(CompoundElements compoundElements, Keywords keywords) {
+  @Inject public SmartSemicolonHandler(CompoundElements compoundElements) {
     this.compoundElements = compoundElements;
-    semicolon = keywords.semicolon().getValue();
+    semicolon = SEMICOLON.value;
   }
 
   /** {@inheritDoc} */
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 53bcd64..008f09c 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
@@ -10,6 +10,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 java.lang.String.valueOf;
 
 import org.eclipse.emf.ecore.EObject;
@@ -24,8 +25,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.Keywords;
 import com.google.eclipse.protobuf.ui.labeling.Images;
 import com.google.eclipse.protobuf.ui.util.*;
 import com.google.eclipse.protobuf.util.EObjectFinder;
@@ -43,7 +44,6 @@
   @Inject private Globals globals;
   @Inject private PluginImageHelper imageHelper;
   @Inject private Images imageRegistry;
-  @Inject private Keywords keywords;
   @Inject private Literals literals;
   @Inject private Properties properties;
   @Inject private Strings strings;
@@ -60,10 +60,10 @@
   private void proposeCommonFileOptions(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     for (Property fileOption : globals.fileOptions()) {
       String displayString = fileOption.getName();
-      String proposalText = displayString + " " + keywords.equalSign().getValue() + " ";
+      String proposalText = displayString + " " + EQUAL.value + " ";
       boolean isStringOption = properties.isString(fileOption);
       if (isStringOption)
-        proposalText = proposalText + compoundElements.emptyString() + keywords.semicolon().getValue();
+        proposalText = proposalText + compoundElements.emptyString() + SEMICOLON.value;
       ICompletionProposal proposal = createCompletionProposal(proposalText, displayString, context);
       if (isStringOption && proposal instanceof ConfigurableCompletionProposal) {
         // set cursor between the proposal's quotes
@@ -94,8 +94,14 @@
   }
 
   private void proposeBooleanValues(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-    proposeAndAccept(keywords.boolFalse().getValue(), context, acceptor);
-    proposeAndAccept(keywords.boolTrue().getValue(), context, acceptor);
+    CommonKeyword[] keywords = { FALSE, TRUE };
+    proposeAndAccept(keywords, context, acceptor);
+  }
+
+  private void proposeAndAccept(CommonKeyword[] keywords, ContentAssistContext context,
+      ICompletionProposalAcceptor acceptor) {
+    for (CommonKeyword keyword : keywords)
+      proposeAndAccept(keyword.value, context, acceptor);
   }
 
   @Override public void complete_ID(EObject model, RuleCall ruleCall, ContentAssistContext context,
@@ -123,7 +129,7 @@
   }
 
   private boolean isProposalForDefaultValue(ContentAssistContext context) {
-    return isProposalForAssignment(keywords.defaultValue().getValue(), context);
+    return isProposalForAssignment(DEFAULT.value, context);
   }
 
   private boolean isProposalForAssignment(String feature, ContentAssistContext context) {
@@ -131,7 +137,7 @@
     for (AbstractElement e : grammarElements) {
       if (!(e instanceof Assignment)) continue;
       Assignment a = (Assignment) e;
-      String equalSign = keywords.equalSign().getValue();
+      String equalSign = EQUAL.value;
       if (feature.equals(a.getFeature()) && equalSign.equals(a.getOperator())) return true;
     }
     return false;
@@ -141,18 +147,18 @@
       ICompletionProposalAcceptor acceptor) {
     if (keyword == null) return;
     if (isKeywordEqualToPreviousWordInEditor(keyword, context)) return;
-    if (keyword.equals(keywords.boolTrue()) || keyword.equals(keywords.boolFalse())) {
+    if (TRUE.hasValueEqualTo(keyword) || FALSE.hasValueEqualTo(keyword)) {
       if (!isBoolProposalValid(context)) return;
     }
-    if (keyword.equals(keywords.openingBracket())) {
+    if (OPENING_BRACKET.hasValueEqualTo(keyword)) {
       boolean proposalWasHandledAlready = proposeOpenBracket(context, acceptor);
       if (proposalWasHandledAlready) return;
     }
-    if (keyword.equals(keywords.packed())) {
+    if (PACKED.hasValueEqualTo(keyword)) {
       proposePackedOption(context, acceptor);
       return;
     }
-    if (keyword.equals(keywords.defaultValue())) {
+    if (DEFAULT.hasValueEqualTo(keyword)) {
       proposeDefaultValue(context, acceptor);
       return;
     }
@@ -186,7 +192,7 @@
     Modifier modifier = p.getModifier();
     if (OPTIONAL.equals(modifier)) {
       String display = compoundElements.defaultValueInBrackets();
-      int cursorPosition = display.indexOf(keywords.closingBracket().getValue());
+      int cursorPosition = display.indexOf(CLOSING_BRACKET.value);
       if (isStringProperty(p)) {
         display = compoundElements.defaultStringValueInBrackets();
         cursorPosition++;
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
new file mode 100644
index 0000000..f156559
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CommonKeyword.java
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+/**
+ * Set of common keywords (it may or may not include all the keywords in the grammar.)
+ *
+ * @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");
+
+  public final String value;
+
+  private CommonKeyword(String value) {
+    this.value = value;
+  }
+
+  public boolean hasValueEqualTo(Keyword k) {
+    return hasValueEqualTo(k.getValue());
+  }
+
+  public boolean hasValueEqualTo(String s) {
+    return value.equals(s);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Properties.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Properties.java
index a484024..ebd00e4 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Properties.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Properties.java
@@ -8,16 +8,14 @@
  */
 package com.google.eclipse.protobuf.ui.util;
 
+import static com.google.eclipse.protobuf.ui.grammar.CommonKeyword.*;
 import static java.lang.Math.max;
 import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
 
 import java.util.List;
 
-import org.eclipse.xtext.Keyword;
-
 import com.google.eclipse.protobuf.protobuf.*;
-import com.google.eclipse.protobuf.ui.grammar.Keywords;
-import com.google.inject.Inject;
+import com.google.eclipse.protobuf.ui.grammar.CommonKeyword;
 import com.google.inject.Singleton;
 
 /**
@@ -28,10 +26,8 @@
 @Singleton
 public class Properties {
 
-  @Inject private Keywords keywords;
-
   /**
-   * Indicates whether the type of the given property is primitive. Primitive types include: {@code double}, 
+   * Indicates whether the type of the given property is primitive. Primitive types include: {@code double},
    * {@code float}, {@code int32}, {@code int64}, {@code uint32}, {@code uint64}, {@code sint32}, {@code sint64},
    * {@code fixed32}, {@code fixed64}, {@code sfixed32}, {@code sfixed64} and {@code bool}.
    * @param p the given property.
@@ -41,7 +37,7 @@
     AbstractTypeReference r = p.getType();
     if (!(r instanceof ScalarTypeReference)) return false;
     String typeName = ((ScalarTypeReference) r).getScalar().getName();
-    return !keywords.string().getValue().equals(typeName) && !keywords.bytes().getValue().equals(typeName);
+    return !STRING.hasValueEqualTo(typeName) && !BYTES.hasValueEqualTo(typeName);
   }
 
   /**
@@ -50,7 +46,7 @@
    * @return {@code true} if the given property is of type {@code bool}, {@code false} otherwise.
    */
   public boolean isBool(Property p) {
-    return isScalarType(p, keywords.bool());
+    return isScalarType(p, BOOL);
   }
 
   /**
@@ -59,11 +55,11 @@
    * @return {@code true} if the given property is of type {@code string}, {@code false} otherwise.
    */
   public boolean isString(Property p) {
-    return isScalarType(p, keywords.string());
+    return isScalarType(p, STRING);
   }
-  
-  private boolean isScalarType(Property p, Keyword typeKeyword) {
-    return typeKeyword.getValue().equals(typeNameOf(p));
+
+  private boolean isScalarType(Property p, CommonKeyword typeKeyword) {
+    return typeKeyword.hasValueEqualTo(typeNameOf(p));
   }
 
   /**
@@ -82,18 +78,18 @@
   }
 
   /**
-   * Calculates the tag number value for the given property. The calculated tag number value is the maximum of all the 
+   * Calculates the tag number value for the given property. The calculated tag number value is the maximum of all the
    * tag number values of the given property's siblings, plus one. The minimum tag number value is 1.
    * <p>
    * For example, in the following message:
-   * 
+   *
    * <pre>
    * message Person {
    *   required string name = 1;
    *   optional string email = 2;
    *   optional PhoneNumber phone =
    * </pre>
-   * 
+   *
    * The calculated tag number value for the property {@code PhoneNumber} will be 3.
    * </p>
    * @param p the given property.
