diff --git a/com.google.eclipse.protobuf.ui.test/META-INF/MANIFEST.MF b/com.google.eclipse.protobuf.ui.test/META-INF/MANIFEST.MF
index ee6f07b..92a8b48 100644
--- a/com.google.eclipse.protobuf.ui.test/META-INF/MANIFEST.MF
+++ b/com.google.eclipse.protobuf.ui.test/META-INF/MANIFEST.MF
@@ -6,4 +6,7 @@
 Bundle-Vendor: Google
 Fragment-Host: com.google.eclipse.protobuf.ui;bundle-version="1.0.0"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.junit;bundle-version="4.8.1"
+Require-Bundle: org.junit;bundle-version="4.8.1",
+ org.eclipse.xtext.junit;bundle-version="2.0.0",
+ org.eclipse.xtext.junit4;bundle-version="2.0.0",
+ org.eclipse.xtext.ui.junit;bundle-version="2.0.0"
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/EContainerStub.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/EContainerStub.java
deleted file mode 100644
index 80b9349..0000000
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/EContainerStub.java
+++ /dev/null
@@ -1,19 +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.stubs;
-
-import org.eclipse.emf.ecore.InternalEObject;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-public interface EContainerStub extends InternalEObject {
-
-  void add(EObjectStub...children);
-}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/EObjectStub.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/EObjectStub.java
deleted file mode 100644
index aa377af..0000000
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/EObjectStub.java
+++ /dev/null
@@ -1,19 +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.stubs;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-public interface EObjectStub extends EObject {
-
-  void setContainer(EContainerStub eContainer);
-}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/EnumStub.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/EnumStub.java
deleted file mode 100644
index 1883f46..0000000
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/EnumStub.java
+++ /dev/null
@@ -1,38 +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.stubs;
-
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-import com.google.eclipse.protobuf.protobuf.impl.EnumImpl;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class EnumStub extends EnumImpl implements EContainerStub {
-
-  private EList<EObject> contents = new BasicEList<EObject>();
-
-  public EnumStub(String name) {
-    this.name = name;
-  }
-
-  public void add(EObjectStub...children) {
-    for (EObjectStub child : children) {
-      contents.add(child);
-      child.setContainer(this);
-    }
-  }
-  
-  @Override public EList<EObject> eContents() {
-    return contents;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/LiteralStub.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/LiteralStub.java
deleted file mode 100644
index 117bb70..0000000
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/stubs/LiteralStub.java
+++ /dev/null
@@ -1,25 +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.stubs;
-
-import com.google.eclipse.protobuf.protobuf.impl.LiteralImpl;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class LiteralStub extends LiteralImpl implements EObjectStub {
-
-  public LiteralStub(String name) {
-    this.name = name;
-  }
-
-  public void setContainer(EContainerStub container) {
-    this.eContainer = container;
-  }
-}
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 08eb59c..0473781 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,15 +8,23 @@
  */
 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.io.InputStreamReader;
+import java.util.List;
+
+import org.eclipse.xtext.parser.IParseResult;
+import org.eclipse.xtext.util.StringInputStream;
 import org.junit.Before;
 import org.junit.Test;
 
-import com.google.eclipse.protobuf.protobuf.Literal;
-import com.google.eclipse.protobuf.stubs.EnumStub;
-import com.google.eclipse.protobuf.stubs.LiteralStub;
+import com.google.eclipse.protobuf.ProtobufStandaloneSetup;
+import com.google.eclipse.protobuf.parser.antlr.ProtobufParser;
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.eclipse.protobuf.protobuf.Enum;
+import com.google.inject.Injector;
 
 /**
  * Tests for <code>{@link Literals#calculateIndexOf(Literal)}</code>.
@@ -25,29 +33,46 @@
  */
 public class Literals_calculateIndexOf_Test {
 
-  private EnumStub anEnum;
-
+  private Injector injector;
   private Literals literals;
   
   @Before public void setUp() {
-    anEnum = new EnumStub("PhoneType");
-    literals = new Literals();
+    injector = new ProtobufStandaloneSetup().createInjectorAndDoEMFRegistration();
+    literals = injector.getInstance(Literals.class);
   }
   
-  @Test public void should_return_zero_for_first_literal() {
-    LiteralStub literal = new LiteralStub("HOME");
-    anEnum.add(literal);
-    int index = literals.calculateIndexOf(literal);
+  @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("}               ");
+    Protobuf root = parse(proto.toString());
+    Literal firstLiteral = allLiteralsInFirstEnum(root).get(0);
+    int index = literals.calculateIndexOf(firstLiteral);
     assertThat(index, equalTo(0));
   }
   
   @Test public void should_return_max_index_value_plus_one_for_new_literal() {
-    int maxIndexValue = 1;
-    LiteralStub literal1 = new LiteralStub("HOME");
-    literal1.setIndex(maxIndexValue);
-    LiteralStub literal2 = new LiteralStub("WORK");
-    anEnum.add(literal1, literal2);
-    int index = literals.calculateIndexOf(literal2);
-    assertThat(index, equalTo(maxIndexValue + 1));
+    StringBuilder proto = new StringBuilder();
+    proto.append("enum PhoneType {");
+    proto.append("  MOBILE = 0;   ");
+    proto.append("  HOME = 1;     ");
+    proto.append("  WORK = 2;     ");
+    proto.append("}               ");
+    Protobuf root = parse(proto.toString());
+    Literal lastLiteral = allLiteralsInFirstEnum(root).get(2);
+    int index = literals.calculateIndexOf(lastLiteral);
+    assertThat(index, equalTo(2));
+  }
+
+  private Protobuf parse(String text) {
+    ProtobufParser parser = injector.getInstance(ProtobufParser.class);
+    IParseResult parseResult = parser.parse(new InputStreamReader(new StringInputStream(text)));
+    return (Protobuf) parseResult.getRootASTElement();
+  }
+
+  private List<Literal> allLiteralsInFirstEnum(Protobuf root) {
+    List<Enum> allEnums = getAllContentsOfType(root, Enum.class);
+    return allEnums.get(0).getLiterals();
   }
 }
