Adding unit tests.
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)
  */