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 0472113..e56893c 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
@@ -8,17 +8,15 @@
  */
 package com.google.eclipse.protobuf.ui.util;
 
-import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
+import static com.google.eclipse.protobuf.ui.util.ProtobufElements.findLiteral;
 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.*;
-import com.google.eclipse.protobuf.protobuf.Enum;
+import com.google.eclipse.protobuf.protobuf.Literal;
+import com.google.eclipse.protobuf.protobuf.Protobuf;
 
 /**
  * Tests for <code>{@link Literals#calculateIndexOf(Literal)}</code>.
@@ -37,30 +35,25 @@
 
   @Test public void should_return_zero_for_first_and_only_literal() {
     StringBuilder proto = new StringBuilder();
-    proto.append("enum PhoneType {");
-    proto.append("  MOBILE = 1;   ");
-    proto.append("}               ");
+    proto.append("enum PhoneType {")
+         .append("  MOBILE = 1;   ")
+         .append("}               ");
     Protobuf root = xtext.parse(proto.toString());
-    Literal mobileLiteral = allLiteralsInFirstEnum(root).get(0);
-    int index = literals.calculateIndexOf(mobileLiteral);
+    Literal mobile = findLiteral("MOBILE", root);
+    int index = literals.calculateIndexOf(mobile);
     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 = 1;   ");
-    proto.append("  HOME = 5;     ");
-    proto.append("  WORK = 9;     ");
-    proto.append("}               ");
+    proto.append("enum PhoneType {")
+         .append("  MOBILE = 1;   ")
+         .append("  HOME = 5;     ")
+         .append("  WORK = 9;     ")
+         .append("}               ");
     Protobuf root = xtext.parse(proto.toString());
-    Literal workLiteral = allLiteralsInFirstEnum(root).get(2);
-    int index = literals.calculateIndexOf(workLiteral);
+    Literal work = findLiteral("WORK", root);
+    int index = literals.calculateIndexOf(work);
     assertThat(index, equalTo(6));
   }
-
-  private List<Literal> allLiteralsInFirstEnum(Protobuf root) {
-    List<Enum> allEnums = getAllContentsOfType(root, Enum.class);
-    return allEnums.get(0).getLiterals();
-  }
 }
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
index b7ca338..6c8c05c 100644
--- 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
@@ -8,16 +8,15 @@
  */
 package com.google.eclipse.protobuf.ui.util;
 
-import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
+import static com.google.eclipse.protobuf.ui.util.ProtobufElements.findProperty;
 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.*;
+import com.google.eclipse.protobuf.protobuf.Property;
+import com.google.eclipse.protobuf.protobuf.Protobuf;
 
 /**
  * Tests for <code>{@link Properties#calculateTagNumberOf(Property)}</code>.
@@ -36,29 +35,24 @@
 
   @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("}                          ");
+    proto.append("message Person {           ")
+         .append("  required string name = 2;")
+         .append("}                          ");
     Protobuf root = xtext.parse(proto.toString());
-    Property nameProperty = allPropertiesInFirstMessage(root).get(0);
-    int index = properties.calculateTagNumberOf(nameProperty);
+    Property name = findProperty("name", root);
+    int index = properties.calculateTagNumberOf(name);
     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("}                          ");
+    proto.append("message Person {           ")
+         .append("  required string name = 6;")
+         .append("  required int32 id = 8;   ")
+         .append("}                          ");
     Protobuf root = xtext.parse(proto.toString());
-    Property idProperty = allPropertiesInFirstMessage(root).get(1);
-    int index = properties.calculateTagNumberOf(idProperty);
+    Property id = findProperty("id", root);
+    int index = properties.calculateTagNumberOf(id);
     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
index 13d5e81..c859b75 100644
--- 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
@@ -6,19 +6,17 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-
 package com.google.eclipse.protobuf.ui.util;
 
-import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
+import static com.google.eclipse.protobuf.ui.util.ProtobufElements.findProperty;
 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.*;
+import com.google.eclipse.protobuf.protobuf.Property;
+import com.google.eclipse.protobuf.protobuf.Protobuf;
 
 /**
  * Tests for <code>{@link Properties#isBool(Property)}</code>.
@@ -37,26 +35,21 @@
 
   @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("}                          ");
+    proto.append("message Person {           ")
+         .append("  optional bool active = 1;")
+         .append("}                          ");
     Protobuf root = xtext.parse(proto.toString());
-    Property activeProperty = allPropertiesInFirstMessage(root).get(0);
-    assertThat(properties.isBool(activeProperty), equalTo(true));
+    Property active = findProperty("active", root);
+    assertThat(properties.isBool(active), 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("}                          ");
+    proto.append("message Person {           ")
+         .append("  optional string name = 1;")
+         .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);
+    Property name = findProperty("name", root);
+    assertThat(properties.isBool(name), equalTo(false));
   }
 }
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Properties_isString_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Properties_isString_Test.java
new file mode 100644
index 0000000..dad29f4
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/Properties_isString_Test.java
@@ -0,0 +1,55 @@
+/*
+ * 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 com.google.eclipse.protobuf.ui.util.ProtobufElements.findProperty;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+import com.google.eclipse.protobuf.protobuf.Property;
+import com.google.eclipse.protobuf.protobuf.Protobuf;
+
+/**
+ * Tests for <code>{@link Properties#isString(Property)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Properties_isString_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_string() {
+    StringBuilder proto = new StringBuilder();
+    proto.append("message Person {           ")
+         .append("  optional string name = 1;")
+         .append("}                          ");
+    Protobuf root = xtext.parse(proto.toString());
+    Property name = findProperty("name", root);
+    assertThat(properties.isString(name), equalTo(true));
+  }
+
+  @Test public void should_return_false_if_property_is_not_string() {
+    StringBuilder proto = new StringBuilder();
+    proto.append("message Person {           ")
+         .append("  optional bool active = 1;")
+         .append("}                          ");
+    Protobuf root = xtext.parse(proto.toString());
+    Property active = findProperty("active", root);
+    assertThat(properties.isString(active), equalTo(false));
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/ProtobufElements.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/ProtobufElements.java
new file mode 100644
index 0000000..fc6af47
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/ProtobufElements.java
@@ -0,0 +1,37 @@
+/*
+ * 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 java.util.List;
+
+import com.google.eclipse.protobuf.protobuf.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public final class ProtobufElements {
+  
+  public static Literal findLiteral(String name, Protobuf root) {
+    List<Literal> literals = getAllContentsOfType(root, Literal.class);
+    for (Literal literal : literals)
+      if (name.equals(literal.getName())) return literal;
+    return null;
+  }
+  
+  public static Property findProperty(String name, Protobuf root) {
+    List<Property> proeperties = getAllContentsOfType(root, Property.class);
+    for (Property property : proeperties)
+      if (name.equals(property.getName())) return property;
+    return null;
+  }
+  
+  private ProtobufElements() {}
+}
