diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Literals_calculateIndexOf_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Literals_calculateIndexOf_Test.java
index 43eb726..0472113 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Literals_calculateIndexOf_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Literals_calculateIndexOf_Test.java
@@ -38,25 +38,25 @@
   @Test public void should_return_zero_for_first_and_only_literal() {
     StringBuilder proto = new StringBuilder();
     proto.append("enum PhoneType {");
-    proto.append("  MOBILE = 0;   ");
+    proto.append("  MOBILE = 1;   ");
     proto.append("}               ");
     Protobuf root = xtext.parse(proto.toString());
-    Literal firstLiteral = allLiteralsInFirstEnum(root).get(0);
-    int index = literals.calculateIndexOf(firstLiteral);
+    Literal mobileLiteral = allLiteralsInFirstEnum(root).get(0);
+    int index = literals.calculateIndexOf(mobileLiteral);
     assertThat(index, equalTo(0));
   }
 
   @Test public void should_return_max_index_value_plus_one_for_new_literal() {
     StringBuilder proto = new StringBuilder();
     proto.append("enum PhoneType {");
-    proto.append("  MOBILE = 0;   ");
-    proto.append("  HOME = 1;     ");
-    proto.append("  WORK = 2;     ");
+    proto.append("  MOBILE = 1;   ");
+    proto.append("  HOME = 5;     ");
+    proto.append("  WORK = 9;     ");
     proto.append("}               ");
     Protobuf root = xtext.parse(proto.toString());
-    Literal lastLiteral = allLiteralsInFirstEnum(root).get(2);
-    int index = literals.calculateIndexOf(lastLiteral);
-    assertThat(index, equalTo(2));
+    Literal workLiteral = allLiteralsInFirstEnum(root).get(2);
+    int index = literals.calculateIndexOf(workLiteral);
+    assertThat(index, equalTo(6));
   }
 
   private List<Literal> allLiteralsInFirstEnum(Protobuf root) {
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Properties_calculateTagNumberOf_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Properties_calculateTagNumberOf_Test.java
new file mode 100644
index 0000000..b7ca338
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Properties_calculateTagNumberOf_Test.java
@@ -0,0 +1,64 @@
+/*
+ * 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.util;
+
+import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+import com.google.eclipse.protobuf.protobuf.*;
+
+/**
+ * Tests for <code>{@link Properties#calculateTagNumberOf(Property)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Properties_calculateTagNumberOf_Test {
+
+  @Rule public XtextRule xtext = new XtextRule();
+
+  private Properties properties;
+
+  @Before public void setUp() {
+    properties = xtext.getInstanceOf(Properties.class);
+  }
+
+  @Test public void should_return_one_for_first_and_only_property() {
+    StringBuilder proto = new StringBuilder();
+    proto.append("message Person {           ");
+    proto.append("  required string name = 2;");
+    proto.append("}                          ");
+    Protobuf root = xtext.parse(proto.toString());
+    Property nameProperty = allPropertiesInFirstMessage(root).get(0);
+    int index = properties.calculateTagNumberOf(nameProperty);
+    assertThat(index, equalTo(1));
+  }
+
+  @Test public void should_return_max_tag_number_value_plus_one_for_new_property() {
+    StringBuilder proto = new StringBuilder();
+    proto.append("message Person {           ");
+    proto.append("  required string name = 6;");
+    proto.append("  required int32 id = 8;   ");
+    proto.append("}                          ");
+    Protobuf root = xtext.parse(proto.toString());
+    Property idProperty = allPropertiesInFirstMessage(root).get(1);
+    int index = properties.calculateTagNumberOf(idProperty);
+    assertThat(index, equalTo(7));
+  }
+
+  private List<Property> allPropertiesInFirstMessage(Protobuf root) {
+    List<Message> messages = getAllContentsOfType(root, Message.class);
+    return getAllContentsOfType(messages.get(0), Property.class);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Properties_isBool_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Properties_isBool_Test.java
new file mode 100644
index 0000000..13d5e81
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Properties_isBool_Test.java
@@ -0,0 +1,62 @@
+/*
+ * 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.util;
+
+import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+import com.google.eclipse.protobuf.protobuf.*;
+
+/**
+ * Tests for <code>{@link Properties#isBool(Property)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Properties_isBool_Test {
+
+  @Rule public XtextRule xtext = new XtextRule();
+
+  private Properties properties;
+
+  @Before public void setUp() {
+    properties = xtext.getInstanceOf(Properties.class);
+  }
+
+  @Test public void should_return_true_if_property_is_bool() {
+    StringBuilder proto = new StringBuilder();
+    proto.append("message Person {           ");
+    proto.append("  optional bool active = 0;");
+    proto.append("}                          ");
+    Protobuf root = xtext.parse(proto.toString());
+    Property activeProperty = allPropertiesInFirstMessage(root).get(0);
+    assertThat(properties.isBool(activeProperty), equalTo(true));
+  }
+
+  @Test public void should_return_false_if_property_is_not_bool() {
+    StringBuilder proto = new StringBuilder();
+    proto.append("message Person {           ");
+    proto.append("  optional string name = 0;");
+    proto.append("}                          ");
+    Protobuf root = xtext.parse(proto.toString());
+    Property nameProperty = allPropertiesInFirstMessage(root).get(0);
+    assertThat(properties.isBool(nameProperty), equalTo(false));
+  }
+
+  private List<Property> allPropertiesInFirstMessage(Protobuf root) {
+    List<Message> messages = getAllContentsOfType(root, Message.class);
+    return getAllContentsOfType(messages.get(0), Property.class);
+  }
+}
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 6912347..1633d1b 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
@@ -112,7 +112,7 @@
       }
       return semicolon;
     }
-    int index = properties.calculateIndexOf(property);
+    int index = properties.calculateTagNumberOf(property);
     if (shouldInsertPackedOption(property)) {
       String format = "= %d " + compoundElements.packedInBrackets() + "%s";
       return indexAndSemicolonToInsert(format, line, index);
@@ -121,7 +121,7 @@
   }
 
   private boolean shouldInsertPackedOption(Property property) {
-    return REPEATED.equals(property.getModifier()) && properties.isPrimitiveProperty(property);
+    return REPEATED.equals(property.getModifier()) && properties.isPrimitive(property);
   }
 
   private String defaultIndexAndSemicolonToInsert(String line, int 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 f3efcd9..d32d6d5 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
@@ -61,7 +61,7 @@
     for (Property fileOption : globalScope.fileOptions()) {
       String displayString = fileOption.getName();
       String proposalText = displayString + " " + keywords.equalSign().getValue() + " ";
-      boolean isStringOption = properties.isStringProperty(fileOption);
+      boolean isStringOption = properties.isString(fileOption);
       if (isStringOption)
         proposalText = proposalText + compoundElements.emptyString() + keywords.semicolon().getValue();
       ICompletionProposal proposal = createCompletionProposal(proposalText, displayString, context);
@@ -83,11 +83,11 @@
       proposeAndAccept(globalScope.optimizedMode(), context, acceptor);
       return;
     }
-    if (properties.isStringProperty(fileOption)) {
+    if (properties.isString(fileOption)) {
       proposeEmptyString(context, acceptor);
       return;
     }
-    if (properties.isBoolProperty(fileOption)) {
+    if (properties.isBool(fileOption)) {
       proposeBooleanValues(context, acceptor);
       return;
     }
@@ -171,10 +171,10 @@
 
   private boolean isBoolProposalValid(ContentAssistContext context) {
     EObject model = context.getCurrentModel();
-    if (model instanceof Property) return properties.isBoolProperty((Property) model);
+    if (model instanceof Property) return properties.isBool((Property) model);
     if (model instanceof Option) {
       Property fileOption = globalScope.lookupFileOption(((Option) model).getName());
-      return fileOption != null && properties.isBoolProperty(fileOption);
+      return fileOption != null && properties.isBool(fileOption);
     }
     return false;
   }
@@ -198,7 +198,7 @@
       }
       acceptor.accept(proposal);
     }
-    if (REPEATED.equals(modifier) && properties.isPrimitiveProperty(p))
+    if (REPEATED.equals(modifier) && properties.isPrimitive(p))
       proposeAndAccept(compoundElements.packedInBrackets(), context, acceptor);
     return true;
   }
@@ -207,7 +207,7 @@
     Property p = extractPropertyFrom(context);
     if (p == null) return;
     Modifier modifier = p.getModifier();
-    if (!REPEATED.equals(modifier) || !properties.isPrimitiveProperty(p)) return;
+    if (!REPEATED.equals(modifier) || !properties.isPrimitive(p)) return;
     proposeAndAccept(compoundElements.packed(), context, acceptor);
   }
 
@@ -272,7 +272,7 @@
 
   @Override public void completeProperty_Index(EObject model, Assignment assignment, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
-    int index = properties.calculateIndexOf((Property) model);
+    int index = properties.calculateTagNumberOf((Property) model);
     proposeIndex(index, context, acceptor);
   }
 
@@ -282,7 +282,7 @@
 
   @Override public void completeProperty_Name(EObject model, Assignment assignment, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
-    String typeName = strings.firstCharToLowerCase(properties.nameOfTypeIn((Property) model));
+    String typeName = strings.firstCharToLowerCase(properties.typeNameOf((Property) model));
     int index = 1;
     String name = typeName + index;
     for (EObject o : model.eContainer().eContents()) {
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 966c26d..13abf5f 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
@@ -59,7 +59,7 @@
   }
 
   private String labelFor(Property p) {
-    return String.format(PROPERTY_FORMAT, p.getName(), p.getIndex(), properties.nameOfTypeIn(p));
+    return String.format(PROPERTY_FORMAT, p.getName(), p.getIndex(), properties.typeNameOf(p));
   }
 
   private String labelFor(Protobuf p) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Literals.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Literals.java
index f18820e..2ec9a2f 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Literals.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Literals.java
@@ -16,13 +16,31 @@
 import com.google.inject.Singleton;
 
 /**
- * Utility methods for instances of <code>{@link Literal}</code>.
+ * Utility methods related to <code>{@link Literal}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
 @Singleton
 public class Literals {
 
+  /**
+   * Calculates the index value for the given literal. The calculated index value is the maximum of all the index values
+   * of the given literal's siblings, plus one. The minimum index value is zero.
+   * <p>
+   * For example, in the following message:
+   * 
+   * <pre>
+   * enum PhoneType {
+   *   MOBILE = 0;
+   *   HOME = 1;
+   *   WORK =
+   * </pre>
+   * 
+   * The calculated index value for the literal {@code WORK} will be 2.
+   * </p>
+   * @param l the given literal.
+   * @return the calculated index value.
+   */
   public int calculateIndexOf(Literal l) {
     int index = -1;
     EObject container = l.eContainer();
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 74d1b0b..5e20379 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
@@ -11,6 +11,7 @@
 import static java.lang.Math.max;
 
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.Keyword;
 
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.eclipse.protobuf.ui.grammar.Keywords;
@@ -18,7 +19,7 @@
 import com.google.inject.Singleton;
 
 /**
- * Utility methods for instances of <code>{@link Property}</code>.
+ * Utility methods re <code>{@link Property}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
@@ -27,19 +28,33 @@
 
   @Inject private Keywords keywords;
 
-  public boolean isPrimitiveProperty(Property p) {
+  public boolean isPrimitive(Property p) {
     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);
   }
 
-  public boolean isStringProperty(Property p) {
-    return keywords.string().getValue().equals(nameOfTypeIn(p));
+  /**
+   * Indicates whether the given property is of type {@code bool}.
+   * @param p the given property.
+   * @return {@code true} if the given property is of type {@code bool}, {@code false} otherwise.
+   */
+  public boolean isBool(Property p) {
+    return isOfScalarType(p, keywords.bool());
   }
 
-  public boolean isBoolProperty(Property p) {
-    return keywords.bool().getValue().equals(nameOfTypeIn(p));
+  /**
+   * Indicates whether the given property is of type {@code string}.
+   * @param p the given property.
+   * @return {@code true} if the given property is of type {@code string}, {@code false} otherwise.
+   */
+  public boolean isString(Property p) {
+    return isOfScalarType(p, keywords.string());
+  }
+  
+  private boolean isOfScalarType(Property p, Keyword typeKeyword) {
+    return typeKeyword.getValue().equals(typeNameOf(p));
   }
 
   /**
@@ -47,7 +62,7 @@
    * @param p the given {@code Property}.
    * @return the name of the type of the given {@code Property}.
    */
-  public String nameOfTypeIn(Property p) {
+  public String typeNameOf(Property p) {
     AbstractTypeReference r = p.getType();
     if (r instanceof ScalarTypeReference) return ((ScalarTypeReference) r).getScalar().getName();
     if (r instanceof TypeReference) {
@@ -57,7 +72,25 @@
     return r.toString();
   }
 
-  public int calculateIndexOf(Property p) {
+  /**
+   * 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.
+   * @return the calculated value for the tag number of the given property.
+   */
+  public int calculateTagNumberOf(Property p) {
     int index = 0;
     for (EObject o : p.eContainer().eContents()) {
       if (o == p || !(o instanceof Property)) continue;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Strings.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Strings.java
index 6a9f9cb..e20982d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Strings.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Strings.java
@@ -13,7 +13,7 @@
 import com.google.inject.Singleton;
 
 /**
- * Utility classes for {@code String}s.
+ * Utility methods related to {@code String}.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
