diff --git a/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/mapping/ClassMappingStrategy_createMappingFrom_Test.java b/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/mapping/ClassMappingStrategy_createMappingFrom_Test.java
index 756bad8..c35c9a5 100644
--- a/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/mapping/ClassMappingStrategy_createMappingFrom_Test.java
+++ b/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/mapping/ClassMappingStrategy_createMappingFrom_Test.java
@@ -8,6 +8,7 @@
  */
 package com.google.eclipse.protobuf.cdt.mapping;
 
+import static com.google.common.collect.ImmutableList.copyOf;
 import static com.google.eclipse.protobuf.junit.core.UnitTestModule.unitTestModule;
 import static com.google.eclipse.protobuf.junit.core.XtextRule.overrideRuntimeModuleWith;
 import static org.hamcrest.core.IsEqual.equalTo;
@@ -18,7 +19,6 @@
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
 import org.eclipse.cdt.internal.core.dom.parser.c.CASTName;
 import org.eclipse.cdt.internal.core.dom.parser.cpp.*;
-import org.eclipse.xtext.naming.QualifiedName;
 import org.junit.*;
 
 import com.google.eclipse.protobuf.junit.core.*;
@@ -42,7 +42,7 @@
     String[] segments = { "com", "google", "proto", "Test" };
     when(classType.getQualifiedName()).thenReturn(segments);
     CppToProtobufMapping mapping = mappingStrategy.createMappingFrom(classType);
-    assertThat(mapping.qualifiedName(), equalTo(QualifiedName.create(segments)));
+    assertThat(mapping.qualifiedNameSegments(), equalTo(copyOf(segments)));
     assertEquals(Message.class, mapping.type());
   }
 
diff --git a/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/matching/PatternBuilder_patternToMatchFrom_Test.java b/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/matching/PatternBuilder_patternToMatchFrom_Test.java
index ffe207e..f1ccfd0 100644
--- a/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/matching/PatternBuilder_patternToMatchFrom_Test.java
+++ b/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/matching/PatternBuilder_patternToMatchFrom_Test.java
@@ -17,7 +17,6 @@
 
 import java.util.regex.Pattern;
 
-import org.eclipse.xtext.naming.IQualifiedNameConverter;
 import org.junit.*;
 
 import com.google.eclipse.protobuf.cdt.mapping.CppToProtobufMapping;
@@ -33,24 +32,23 @@
   @Rule public XtextRule xtext = overrideRuntimeModuleWith(unitTestModule());
 
   @Inject private PatternBuilder builder;
-  @Inject private IQualifiedNameConverter converter;
 
   @Test public void should_escape_dots() {
-    CppToProtobufMapping mapping = createMessageMapping("com.google.proto.test.Person");
+    CppToProtobufMapping mapping = createMessageMapping("com", "google", "proto", "test", "Person");
     Pattern pattern = builder.patternToMatchFrom(mapping);
     assertThat(pattern.pattern(), equalTo("com\\.google\\.proto\\.test\\.Person"));
     assertThat("com.google.proto.test.Person", matches(pattern));
   }
 
   @Test public void should_escape_underscore() {
-    CppToProtobufMapping mapping = createMessageMapping("com.google.proto.test.Person_PhoneType");
+    CppToProtobufMapping mapping = createMessageMapping("com", "google", "proto", "test", "Person_PhoneType");
     Pattern pattern = builder.patternToMatchFrom(mapping);
     assertThat(pattern.pattern(), equalTo("com\\.google\\.proto\\.test\\.Person(\\.|_)PhoneType"));
     assertThat("com.google.proto.test.Person.PhoneType", matches(pattern));
     assertThat("com.google.proto.test.Person_PhoneType", matches(pattern));
   }
 
-  private CppToProtobufMapping createMessageMapping(String qualifiedNameAsText) {
-    return new CppToProtobufMapping(converter.toQualifiedName(qualifiedNameAsText), MESSAGE);
+  private CppToProtobufMapping createMessageMapping(String... qualifiedNameSegments) {
+    return new CppToProtobufMapping(qualifiedNameSegments, MESSAGE);
   }
 }
diff --git a/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatcher_findUriOfMatchingProtobufElement_Test.java b/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatcher_findUriOfMatchingProtobufElement_Test.java
deleted file mode 100644
index 15f9ec1..0000000
--- a/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatcher_findUriOfMatchingProtobufElement_Test.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2012 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.cdt.matching;
-
-import static com.google.eclipse.protobuf.junit.core.UnitTestModule.unitTestModule;
-import static com.google.eclipse.protobuf.junit.core.XtextRule.overrideRuntimeModuleWith;
-import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.MESSAGE;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.*;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.xtext.naming.*;
-import org.eclipse.xtext.resource.*;
-import org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions;
-import org.junit.*;
-
-import com.google.eclipse.protobuf.cdt.mapping.CppToProtobufMapping;
-import com.google.eclipse.protobuf.junit.core.XtextRule;
-import com.google.eclipse.protobuf.protobuf.Message;
-import com.google.inject.Inject;
-
-/**
- * Tests for <code>{@link ProtobufElementMatcher#findUriOfMatchingProtobufElement(IResourceDescription, CppToProtobufMapping)}</code>
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ProtobufElementMatcher_findUriOfMatchingProtobufElement_Test {
-  @Rule public XtextRule xtext = overrideRuntimeModuleWith(unitTestModule());
-
-  @Inject private IQualifiedNameConverter fqnConverter;
-  @Inject private ResourceSetBasedResourceDescriptions index;
-  @Inject private ProtobufElementMatcher matcher;
-
-  // syntax = "proto2";
-  // package com.google.proto;
-  //
-  // message Outer {
-  //   message Inner {}
-  // }
-  @Test public void should_return_URI_nested_message_when_qualified_name_does_not_contain_underscores() {
-    CppToProtobufMapping mapping = messageMapping("com.google.proto.Outer.Inner");
-    URI foundUri = matcher.findUriOfMatchingProtobufElement(descriptionOf(xtext.resource()), mapping);
-    assertThat(foundUri, equalTo(uriOfMessageWithName("Inner")));
-  }
-
-  // syntax = "proto2";
-  // package com.google.proto;
-  //
-  // message Outer {
-  //   message Inner {}
-  // }
-  @Test public void should_return_URI_nested_message_when_underscores_in_qualified_name_represent_nesting() {
-    CppToProtobufMapping mapping = messageMapping("com.google.proto.Outer_Inner");
-    URI foundUri = matcher.findUriOfMatchingProtobufElement(descriptionOf(xtext.resource()), mapping);
-    assertThat(foundUri, equalTo(uriOfMessageWithName("Inner")));
-  }
-
-  // syntax = "proto2";
-  // package com.google.proto;
-  //
-  // message Outer_Message {
-  //   message Inner {}
-  // }
-  @Test public void should_return_URI_nested_message_when_underscores_are_part_of_naming() {
-    CppToProtobufMapping mapping = messageMapping("com.google.proto.Outer_Message_Inner");
-    URI foundUri = matcher.findUriOfMatchingProtobufElement(descriptionOf(xtext.resource()), mapping);
-    assertThat(foundUri, equalTo(uriOfMessageWithName("Inner")));
-  }
-
-  // syntax = "proto2";
-  // package com.google.proto;
-  //
-  // message Outer_Message {
-  //   message Inner {}
-  // }
-  //
-  // message Outer {
-  //   message Message {
-  //     message Inner {}
-  //   }
-  // }
-  @Test public void should_return_first_match_if_both_qualified_names_and_types_match() {
-    CppToProtobufMapping mapping = messageMapping("com.google.proto.Outer_Message_Inner");
-    URI foundUri = matcher.findUriOfMatchingProtobufElement(descriptionOf(xtext.resource()), mapping);
-    assertThat(foundUri, equalTo(uriOfMessageWithName("Inner")));
-  }
-
-  // syntax = "proto2";
-  // package com.google.proto;
-  //
-  // message Outer {
-  //   message Inner {}
-  // }
-  @Test public void should_return_null_if_match_not_found() {
-    CppToProtobufMapping mapping = messageMapping("com.google.proto.Outer__Inner");
-    URI foundUri = matcher.findUriOfMatchingProtobufElement(descriptionOf(xtext.resource()), mapping);
-    assertNull(foundUri);
-  }
-
-  private CppToProtobufMapping messageMapping(String qualifiedNameAsText) {
-    QualifiedName qualifiedName = fqnConverter.toQualifiedName(qualifiedNameAsText);
-    return new CppToProtobufMapping(qualifiedName, MESSAGE);
-  }
-
-  private URI uriOfMessageWithName(String name) {
-    XtextResource resource = xtext.resource();
-    Message message = xtext.find(name, Message.class);
-    String fragment = resource.getURIFragment(message);
-    return resource.getURI().appendFragment(fragment);
-  }
-
-  private IResourceDescription descriptionOf(Resource resource) {
-    index.setContext(resource);
-    return index.getResourceDescription(resource.getURI());
-  }
-}
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/ProtobufCdtModule.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/ProtobufCdtModule.java
index ac97696..f4e9941 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/ProtobufCdtModule.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/ProtobufCdtModule.java
@@ -10,13 +10,14 @@
 
 import static com.google.eclipse.protobuf.cdt.ProtobufObjectsProvider.getfromProtobufPlugin;
 
-import org.eclipse.xtext.naming.IQualifiedNameConverter;
 import org.eclipse.xtext.service.AbstractGenericModule;
 import org.eclipse.xtext.ui.editor.IURIEditorOpener;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+import org.eclipse.xtext.ui.resource.IResourceSetProvider;
 
 import com.google.eclipse.protobuf.model.util.*;
-import com.google.eclipse.protobuf.resource.*;
+import com.google.eclipse.protobuf.resource.IndexLookup;
+import com.google.eclipse.protobuf.util.StringLists;
 import com.google.inject.Binder;
 
 /**
@@ -24,16 +25,17 @@
  */
 public class ProtobufCdtModule extends AbstractGenericModule {
   public void configureModelObjectDefinitionNavigator(Binder binder) {
-    bindToProtobufPluginObject(IndexLookup.class, binder);
-    bindToProtobufPluginObject(IPreferenceStoreAccess.class, binder);
-    bindToProtobufPluginObject(IQualifiedNameConverter.class, binder);
-    bindToProtobufPluginObject(IURIEditorOpener.class, binder);
-    bindToProtobufPluginObject(ModelObjects.class, binder);
-    bindToProtobufPluginObject(ResourceDescriptions.class, binder);
-    bindToProtobufPluginObject(Resources.class, binder);
+    bindToTypeInProtobufPlugin(IndexLookup.class, binder);
+    bindToTypeInProtobufPlugin(IPreferenceStoreAccess.class, binder);
+    bindToTypeInProtobufPlugin(IResourceSetProvider.class, binder);
+    bindToTypeInProtobufPlugin(IURIEditorOpener.class, binder);
+    bindToTypeInProtobufPlugin(ModelObjects.class, binder);
+    bindToTypeInProtobufPlugin(Packages.class, binder);
+    bindToTypeInProtobufPlugin(Resources.class, binder);
+    bindToTypeInProtobufPlugin(StringLists.class, binder);
   }
 
-  private <T> void bindToProtobufPluginObject(Class<T> type, Binder binder) {
+  private <T> void bindToTypeInProtobufPlugin(Class<T> type, Binder binder) {
     binder.bind(type).toProvider(getfromProtobufPlugin(type));
   }
 }
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/ProtobufObjectsProvider.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/ProtobufObjectsProvider.java
index 0bdb758..216d64a 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/ProtobufObjectsProvider.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/ProtobufObjectsProvider.java
@@ -8,7 +8,7 @@
  */
 package com.google.eclipse.protobuf.cdt;
 
-import com.google.eclipse.protobuf.ui.util.ProtobufPlugIn;
+import com.google.eclipse.protobuf.ui.util.ProtobufEditorPlugIn;
 import com.google.inject.Provider;
 
 /**
@@ -29,6 +29,6 @@
   }
 
   @Override public T get() {
-    return ProtobufPlugIn.getInstance(type);
+    return ProtobufEditorPlugIn.getInstanceOf(type);
   }
 }
\ No newline at end of file
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/OpenProtoDeclarationAction.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/OpenProtoDeclarationAction.java
index 7b96f7e..324e22b 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/OpenProtoDeclarationAction.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/OpenProtoDeclarationAction.java
@@ -31,7 +31,7 @@
     if (editor == null) {
       return;
     }
-    URI foundUri = uriFinder.findProtobufElementUriFromSelectionOf(editor);
+    URI foundUri = uriFinder.findProtobufElementLocationFromSelectionOf(editor);
     if (foundUri != null) {
       editorOpener.open(foundUri, true);
     }
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/ProtobufElementUriFinder.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/ProtobufElementUriFinder.java
index badec44..d6a360d 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/ProtobufElementUriFinder.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/ProtobufElementUriFinder.java
@@ -8,50 +8,60 @@
  */
 package com.google.eclipse.protobuf.cdt.actions;
 
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.*;
 import org.eclipse.ui.IEditorPart;
-import org.eclipse.xtext.naming.QualifiedName;
 import org.eclipse.xtext.resource.IResourceDescription;
+import org.eclipse.xtext.ui.resource.IResourceSetProvider;
 
 import com.google.eclipse.protobuf.cdt.mapping.CppToProtobufMapping;
-import com.google.eclipse.protobuf.cdt.matching.ProtobufElementMatcher;
-import com.google.eclipse.protobuf.resource.*;
+import com.google.eclipse.protobuf.cdt.matching.ProtobufElementMatchFinder;
+import com.google.eclipse.protobuf.cdt.util.Editors;
+import com.google.eclipse.protobuf.resource.IndexLookup;
 import com.google.inject.Inject;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
 class ProtobufElementUriFinder {
-  @Inject private ProtobufElementMatcher matcher;
-  @Inject private ResourceDescriptions descriptions;
+  @Inject private Editors editors;
+  @Inject private IResourceSetProvider resourceSetProvider;
+  @Inject private ProtobufElementMatchFinder matcher;
   @Inject private IndexLookup indexLookup;
   @Inject private AstBasedCppToProtobufMapper mapper;
   @Inject private ProtoFilePathFinder pathFinder;
 
-  URI findProtobufElementUriFromSelectionOf(IEditorPart editor) {
+  URI findProtobufElementLocationFromSelectionOf(IEditorPart editor) {
     IPath protoFilePath = pathFinder.findProtoFilePathIn(editor);
     if (protoFilePath != null) {
       CppToProtobufMapping mapping = mapper.createMappingFromSelectionOf(editor);
       if (mapping != null) {
-        IResourceDescription resource = indexLookup.resourceIn(protoFilePath);
-        return findProtobufElementUri(resource, mapping);
+        return protobufElementLocation(protoFilePath, editor, mapping);
       }
     }
     return null;
   }
 
-  private URI findProtobufElementUri(IResourceDescription resource, CppToProtobufMapping mapping) {
+  private URI protobufElementLocation(IPath protoFilePath, IEditorPart editor, CppToProtobufMapping mapping) {
+    Resource resource = protoFileResource(protoFilePath, editor);
     if (resource == null) {
       return null;
     }
-    // try first direct lookup.
-    QualifiedName qualifiedName = mapping.qualifiedName();
-    URI foundUri = descriptions.modelObjectUri(resource, qualifiedName);
-    if (foundUri != null) {
-      return foundUri;
+    List<URI> locations = matcher.matchingProtobufElementLocations(resource, mapping);
+    return (!locations.isEmpty()) ? locations.get(0) : null;
+  }
+
+  private Resource protoFileResource(IPath protoFilePath, IEditorPart editor) {
+    IFile cppHeaderFile = editors.fileDisplayedIn(editor);
+    ResourceSet resourceSet = resourceSetProvider.get(cppHeaderFile.getProject());
+    if (resourceSet != null) {
+      IResourceDescription description = indexLookup.resourceIn(protoFilePath);
+      return (description != null) ? resourceSet.getResource(description.getURI(), true) : null;
     }
-    // try finding the best match.
-    return matcher.findUriOfMatchingProtobufElement(resource, mapping);
+    return null;
   }
 }
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/cpplang/CppKeywords.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/cpplang/CppKeywords.java
index 87604a6..a01b976 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/cpplang/CppKeywords.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/cpplang/CppKeywords.java
@@ -8,10 +8,9 @@
  */
 package com.google.eclipse.protobuf.cdt.cpplang;
 
-import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.ImmutableList.of;
 
-import java.util.List;
-
+import com.google.common.collect.ImmutableList;
 import com.google.inject.Singleton;
 
 /**
@@ -21,7 +20,7 @@
  */
 @Singleton public class CppKeywords {
 
-  private static final List<String> KEYWORDS = newArrayList("and", "and_eq", "asm", "auto", "bitand", "bitor", "bool",
+  private static final ImmutableList<String> KEYWORDS = of("and", "and_eq", "asm", "auto", "bitand", "bitor", "bool",
       "break", "case", "catch", "char", "class", "compl", "const", "const_cast", "continue", "default", "delete",
       "double", "dynamic_cast", "else", "enum", "explicit", "export", "extern", "false", "float", "for", "friend",
       "goto", "if", "inline", "int", "long", "mutable", "namespace", "new", "not", "not_eq", "operator", "or", "or_eq",
@@ -30,7 +29,7 @@
       "typename", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq");
 
   @SuppressWarnings("unused")
-  private static final List<String> CPP11_KEYWORDS = newArrayList("alignas", "alignof", "char16_t", "char32_t",
+  private static final ImmutableList<String> CPP11_KEYWORDS = of("alignas", "alignof", "char16_t", "char32_t",
       "constexpr", "decltype", "noexcept", "nullptr", "static_assert", "thread_local");
 
   /**
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/AstElements.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/AstElements.java
new file mode 100644
index 0000000..3dc7e4a
--- /dev/null
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/AstElements.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2012 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.cdt.mapping;
+
+import static com.google.common.collect.ImmutableList.of;
+
+import org.eclipse.cdt.core.dom.IName;
+import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.*;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@SuppressWarnings("restriction")
+class AstElements {
+  private static final ImmutableList<String> MESSAGE_SUPER_TYPES = of("::google::protobuf::Message",
+      "google::protobuf::MessageLite");
+
+  boolean isMessage(IBinding binding) {
+    if (!(binding instanceof CPPClassType)) {
+      return false;
+    }
+    CPPClassType classType = (CPPClassType) binding;
+    ICPPBase[] bases = classType.getBases();
+    if (bases.length != 1) {
+      return false;
+    }
+    IName name = bases[0].getBaseClassSpecifierName();
+    if (!(name instanceof CPPASTQualifiedName)) {
+      return false;
+    }
+    CPPASTQualifiedName qualifiedName = (CPPASTQualifiedName) name;
+    if (!qualifiedName.isFullyQualified()) {
+      return false;
+    }
+    String qualifiedNameAsText = qualifiedName.toString();
+    return MESSAGE_SUPER_TYPES.contains(qualifiedNameAsText);
+  }
+}
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/ClassMappingStrategy.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/ClassMappingStrategy.java
index 2b9a1f5..9e87acf 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/ClassMappingStrategy.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/ClassMappingStrategy.java
@@ -10,47 +10,26 @@
 
 import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.MESSAGE;
 
-import org.eclipse.cdt.core.dom.IName;
 import org.eclipse.cdt.core.dom.ast.IBinding;
-import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
-import org.eclipse.cdt.internal.core.dom.parser.cpp.*;
-import org.eclipse.xtext.naming.QualifiedName;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType;
 
-import com.google.inject.Singleton;
+import com.google.inject.Inject;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
 @SuppressWarnings("restriction")
-@Singleton class ClassMappingStrategy implements IBindingMappingStrategy<CPPClassType> {
+class ClassMappingStrategy implements IBindingMappingStrategy<CPPClassType> {
+  @Inject private AstElements astElements;
 
   @Override public CppToProtobufMapping createMappingFrom(IBinding binding) {
     CPPClassType classType = typeOfSupportedBinding().cast(binding);
-    if (isMessage(classType)) {
-      String[] segments = classType.getQualifiedName();
-      QualifiedName qualifiedName = QualifiedName.create(segments);
-      return new CppToProtobufMapping(qualifiedName, MESSAGE);
+    if (astElements.isMessage(classType)) {
+      return new CppToProtobufMapping(classType.getQualifiedName(), MESSAGE);
     }
     return null;
   }
 
-  private boolean isMessage(CPPClassType classType) {
-    ICPPBase[] bases = classType.getBases();
-    if (bases.length != 1) {
-      return false;
-    }
-    IName name = bases[0].getBaseClassSpecifierName();
-    if (!(name instanceof CPPASTQualifiedName)) {
-      return false;
-    }
-    CPPASTQualifiedName qualifiedName = (CPPASTQualifiedName) name;
-    if (!qualifiedName.isFullyQualified()) {
-      return false;
-    }
-    String qualifiedNameAsText = qualifiedName.toString();
-    return "::google::protobuf::Message".equals(qualifiedNameAsText);
-  }
-
   @Override public Class<CPPClassType> typeOfSupportedBinding() {
     return CPPClassType.class;
   }
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/CppToProtobufMapper.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/CppToProtobufMapper.java
index 969cef3..4e6d8b8 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/CppToProtobufMapper.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/CppToProtobufMapper.java
@@ -15,7 +15,7 @@
 import org.eclipse.cdt.core.dom.ast.IBinding;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 
-import com.google.inject.Singleton;
+import com.google.inject.*;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -24,10 +24,12 @@
 @Singleton public class CppToProtobufMapper {
   private final Map<Class<? extends IBinding>, IBindingMappingStrategy<?>> strategies = newHashMap();
 
-  public CppToProtobufMapper() {
-    register(new ClassMappingStrategy());
-    register(new EnumMappingStrategy());
-    register(new MethodMappingStrategy());
+  @Inject public CppToProtobufMapper(ClassMappingStrategy s1, EnumMappingStrategy s2, MethodMappingStrategy s3,
+      TypeDefMappingStrategy s4) {
+    register(s1);
+    register(s2);
+    register(s3);
+    register(s4);
   }
 
   private void register(IBindingMappingStrategy<?> strategy) {
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/CppToProtobufMapping.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/CppToProtobufMapping.java
index b600a3b..9422974 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/CppToProtobufMapping.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/CppToProtobufMapping.java
@@ -8,8 +8,11 @@
  */
 package com.google.eclipse.protobuf.cdt.mapping;
 
+import static com.google.common.collect.ImmutableList.copyOf;
+
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.xtext.naming.QualifiedName;
+
+import com.google.common.collect.ImmutableList;
 
 /**
  * Information of the protocol buffer element obtained from a generated C++ element.
@@ -17,20 +20,20 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class CppToProtobufMapping {
-  private final QualifiedName qualifiedName;
+  private final ImmutableList<String> qualifiedNameSegments;
   private final EClass type;
 
-  public CppToProtobufMapping(QualifiedName qualifiedName, EClass type) {
-    this.qualifiedName = qualifiedName;
+  public CppToProtobufMapping(String[] qualifiedNameSegments, EClass type) {
+    this.qualifiedNameSegments = copyOf(qualifiedNameSegments);
     this.type = type;
   }
 
   /**
-   * Returns the possible qualified name of the protocol buffer element.
-   * @return the possible qualified name of the protocol buffer element.
+   * Returns the qualified name segments of the selected C++ element.
+   * @return the qualified name segments of the selected C++ element.
    */
-  public QualifiedName qualifiedName() {
-    return qualifiedName;
+  public ImmutableList<String> qualifiedNameSegments() {
+    return qualifiedNameSegments;
   }
 
   /**
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/EnumMappingStrategy.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/EnumMappingStrategy.java
index 5c30caf..c2db20c 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/EnumMappingStrategy.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/EnumMappingStrategy.java
@@ -12,21 +12,16 @@
 
 import org.eclipse.cdt.core.dom.ast.IBinding;
 import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPEnumeration;
-import org.eclipse.xtext.naming.QualifiedName;
-
-import com.google.inject.Singleton;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
 @SuppressWarnings("restriction")
-@Singleton class EnumMappingStrategy implements IBindingMappingStrategy<CPPEnumeration> {
+class EnumMappingStrategy implements IBindingMappingStrategy<CPPEnumeration> {
 
   @Override public CppToProtobufMapping createMappingFrom(IBinding binding) {
     CPPEnumeration enumeration = typeOfSupportedBinding().cast(binding);
-    String[] segments = enumeration.getQualifiedName();
-    QualifiedName qualifiedName = QualifiedName.create(segments);
-    return new CppToProtobufMapping(qualifiedName, ENUM);
+    return new CppToProtobufMapping(enumeration.getQualifiedName(), ENUM);
   }
 
   @Override public Class<CPPEnumeration> typeOfSupportedBinding() {
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/IBindingMappingStrategy.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/IBindingMappingStrategy.java
index c57b3d7..a74b36c 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/IBindingMappingStrategy.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/IBindingMappingStrategy.java
@@ -17,7 +17,7 @@
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-interface IBindingMappingStrategy <T extends IBinding> {
+interface IBindingMappingStrategy<T extends IBinding> {
   CppToProtobufMapping createMappingFrom(IBinding binding);
 
   Class<T> typeOfSupportedBinding();
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/MethodMappingStrategy.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/MethodMappingStrategy.java
index 5dce848..dcef34a 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/MethodMappingStrategy.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/MethodMappingStrategy.java
@@ -13,7 +13,6 @@
 import org.eclipse.cdt.core.dom.ast.*;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
 import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPMethod;
-import org.eclipse.xtext.naming.QualifiedName;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -31,8 +30,7 @@
     if (types != null && types.length > 0) {
       return null;
     }
-    QualifiedName qualifiedName = QualifiedName.create(method.getQualifiedName());
-    return new CppToProtobufMapping(qualifiedName, MESSAGE_FIELD);
+    return new CppToProtobufMapping(method.getQualifiedName(), MESSAGE_FIELD);
   }
 
   @Override public Class<CPPMethod> typeOfSupportedBinding() {
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/TypeDefMappingStrategy.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/TypeDefMappingStrategy.java
new file mode 100644
index 0000000..88fca85
--- /dev/null
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/TypeDefMappingStrategy.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2012 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.cdt.mapping;
+
+import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.MESSAGE;
+
+import org.eclipse.cdt.core.dom.ast.*;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.*;
+
+import com.google.inject.Inject;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@SuppressWarnings("restriction")
+class TypeDefMappingStrategy implements IBindingMappingStrategy<CPPTypedef> {
+  @Inject private AstElements astElements;
+
+  @Override public CppToProtobufMapping createMappingFrom(IBinding binding) {
+    CPPTypedef typeDef = typeOfSupportedBinding().cast(binding);
+    IBinding owner = binding.getOwner();
+    if (!astElements.isMessage(owner)) {
+      return null;
+    }
+    String typeName = typeNameOf(typeDef);
+    String typeNameSuffix = owner.getName() + "_" + typeDef.getName();
+    if (typeName == null || !typeName.endsWith(typeNameSuffix)) {
+      return null;
+    }
+    return new CppToProtobufMapping(typeDef.getQualifiedName(), MESSAGE);
+  }
+
+  private String typeNameOf(CPPTypedef typeDef) {
+    IType type = typeDef.getType();
+    if (type instanceof CPPClassType) {
+      return ((CPPClassType) type).getName();
+    }
+    return null;
+  }
+
+  @Override public Class<CPPTypedef> typeOfSupportedBinding() {
+    return CPPTypedef.class;
+  }
+}
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ContentsByType.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ContentsByType.java
new file mode 100644
index 0000000..fb6cde7
--- /dev/null
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ContentsByType.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2012 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.cdt.matching;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Maps.newHashMap;
+import static java.util.Collections.*;
+
+import java.util.*;
+
+import org.eclipse.emf.ecore.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class ContentsByType {
+  private final Map<EClass, List<EObject>> contentsByType = newHashMap();
+
+  static ContentsByType contentsOf(EObject target) {
+    return new ContentsByType(target);
+  }
+
+  private ContentsByType(EObject target) {
+    for (EObject child : target.eContents()) {
+      EClass type = child.eClass();
+      List<EObject> children = contentsByType.get(type);
+      if (children == null) {
+        children = newArrayList();
+        contentsByType.put(type, children);
+      }
+      children.add(child);
+    }
+  }
+
+  List<EObject> ofType(EClass type) {
+    List<EObject> children = contentsByType.get(type);
+    if (children == null) {
+      return emptyList();
+    }
+    return unmodifiableList(children);
+  }
+}
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/MessageMatcherStrategy.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/MessageMatcherStrategy.java
new file mode 100644
index 0000000..1f9fe3c
--- /dev/null
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/MessageMatcherStrategy.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2012 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.cdt.matching;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static com.google.eclipse.protobuf.cdt.matching.ContentsByType.contentsOf;
+import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.MESSAGE;
+import static java.util.Collections.unmodifiableList;
+
+import java.util.List;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.emf.ecore.resource.Resource;
+
+import com.google.eclipse.protobuf.protobuf.Message;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class MessageMatcherStrategy implements ProtobufElementMatcherStrategy {
+  @Override public List<URI> matchingProtobufElementLocations(ContentsByType contents, String[] qualifiedNameSegments) {
+    List<URI> matches = newArrayList();
+    int segmentCount = qualifiedNameSegments.length;
+    for (int i = 0; i < segmentCount; i++) {
+      String segment = qualifiedNameSegments[i];
+      for (EObject e : contents.ofType(supportedType())) {
+        if (!(e instanceof Message)) {
+          continue;
+        }
+        Message message = (Message) e;
+        if (segment.equals(message.getName())) {
+          if (i == segmentCount - 1) {
+            // we found what we were looking for.
+            matches.add(uriOf(message));
+            break;
+          }
+          // perfect segment match - go one level deeper.
+          contents = contentsOf(message);
+          continue;
+        }
+        if (segment.contains("_")) {
+
+        }
+      }
+    }
+    return unmodifiableList(matches);
+  }
+
+  // TODO move to ModelObjects
+  private URI uriOf(EObject e) {
+    Resource resource = e.eResource();
+    URI uri = resource.getURI();
+    uri = uri.appendFragment(resource.getURIFragment(e));
+    return uri;
+  }
+
+  @Override public EClass supportedType() {
+    return MESSAGE;
+  }
+}
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/PatternBuilder.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/PatternBuilder.java
index f080950..08c6db5 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/PatternBuilder.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/PatternBuilder.java
@@ -8,36 +8,27 @@
  */
 package com.google.eclipse.protobuf.cdt.matching;
 
+import static com.google.common.collect.Lists.newArrayList;
+
+import java.util.List;
 import java.util.regex.Pattern;
 
-import org.eclipse.xtext.naming.IQualifiedNameConverter;
-
 import com.google.eclipse.protobuf.cdt.mapping.CppToProtobufMapping;
-import com.google.inject.Inject;
+import com.google.inject.Singleton;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
-class PatternBuilder {
-  @Inject private IQualifiedNameConverter converter;
-
+@Singleton class PatternBuilder {
   Pattern patternToMatchFrom(CppToProtobufMapping mapping) {
-    String qualifiedNameAsText = converter.toString(mapping.qualifiedName());
     StringBuilder regex = new StringBuilder();
-    int size = qualifiedNameAsText.length();
-    // escape existing "."
-    // replace "_" with "(\.|_)"
-    for (int i = 0; i < size; i++) {
-      char c = qualifiedNameAsText.charAt(i);
-      switch (c) {
-        case '.':
-          regex.append("\\.");
-          break;
-        case '_':
-          regex.append("(\\.|_)");
-          break;
-        default:
-          regex.append(c);
+    List<String> segments = newArrayList(mapping.qualifiedNameSegments());
+    int segmentCount = segments.size();
+    for (int i = 0; i < segmentCount; i++) {
+      String segment = segments.get(i);
+      regex.append(segment.replaceAll("_", "(\\\\.|_)"));
+      if (i < segmentCount - 1) {
+        regex.append("\\.");
       }
     }
     return Pattern.compile(regex.toString());
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatchFinder.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatchFinder.java
new file mode 100644
index 0000000..cfd9596
--- /dev/null
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatchFinder.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2012 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.cdt.matching;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Maps.newHashMap;
+import static com.google.eclipse.protobuf.cdt.matching.ContentsByType.contentsOf;
+import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.PACKAGE;
+import static java.util.Collections.emptyList;
+
+import java.util.*;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.emf.ecore.resource.Resource;
+
+import com.google.eclipse.protobuf.cdt.mapping.CppToProtobufMapping;
+import com.google.eclipse.protobuf.model.util.*;
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.eclipse.protobuf.protobuf.Package;
+import com.google.eclipse.protobuf.util.StringLists;
+import com.google.inject.Inject;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProtobufElementMatchFinder {
+  private final Map<EClass, ProtobufElementMatcherStrategy> strategies = newHashMap();
+
+  @Inject private Packages packages;
+  @Inject private Resources resources;
+  @Inject private StringLists stringLists;
+
+  @Inject public ProtobufElementMatchFinder(MessageMatcherStrategy s1) {
+    register(s1);
+  }
+
+  private void register(MessageMatcherStrategy strategy) {
+    strategies.put(strategy.supportedType(), strategy);
+  }
+
+  public List<URI> matchingProtobufElementLocations(Resource resource, CppToProtobufMapping mapping) {
+    Protobuf root = resources.rootOf(resource);
+    // TODO check for proto2?
+    ContentsByType contents = contentsOf(root);
+    String[] qualifiedNameSegments = removePackageFromQualifiedName(mapping.qualifiedNameSegments(), contents);
+    ProtobufElementMatcherStrategy strategy = strategies.get(mapping.type());
+    if (strategy != null) {
+      return strategy.matchingProtobufElementLocations(contents, qualifiedNameSegments);
+    }
+    return emptyList();
+  }
+
+  private String[] removePackageFromQualifiedName(List<String> qualifiedNameSegments, ContentsByType contents) {
+    Package aPackage = packageFrom(contents);
+    if (aPackage != null) {
+      return stringLists.toArray(qualifiedNameSegments);
+    }
+    List<String> segments = newArrayList(qualifiedNameSegments);
+    for (String packageSegment : packages.segmentsOf(aPackage)) {
+      if (segments.isEmpty() || !packageSegment.equals(segments.get(0))) {
+        break;
+      }
+      segments.remove(0);
+    }
+    return stringLists.toArray(segments);
+  }
+
+  private Package packageFrom(ContentsByType contents) {
+    List<EObject> packages = contents.ofType(PACKAGE);
+    if (packages.isEmpty()) {
+      return null;
+    }
+    return (Package) packages.get(0);
+  }
+}
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatcher.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatcher.java
deleted file mode 100644
index 94655af..0000000
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatcher.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2012 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.cdt.matching;
-
-import static com.google.eclipse.protobuf.resource.filter.MatchingQualifiedNameAndTypeFilter.matchingQualifiedNameAndType;
-
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.xtext.resource.*;
-
-import com.google.common.base.Predicate;
-import com.google.eclipse.protobuf.cdt.mapping.CppToProtobufMapping;
-import com.google.eclipse.protobuf.resource.ResourceDescriptions;
-import com.google.inject.Inject;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ProtobufElementMatcher {
-  @Inject private PatternBuilder patternBuilder;
-  @Inject private ResourceDescriptions descriptions;
-
-  /**
-   * Returns the URI of the protocol buffer element in the given resource, whose qualified name matches the one in the
-   * given <code>{@link CppToProtobufMapping}</code>.
-   * @param resource describes the contents of a .proto file.
-   * @param mapping information of the protocol buffer element to look for.
-   * @return the found URI, or {@code null} if it was not possible to find a matching protocol buffer element.
-   */
-  public URI findUriOfMatchingProtobufElement(IResourceDescription resource, CppToProtobufMapping mapping) {
-    Pattern pattern = patternBuilder.patternToMatchFrom(mapping);
-    Predicate<IEObjectDescription> filter = matchingQualifiedNameAndType(pattern, mapping.type());
-    List<IEObjectDescription> matches = descriptions.filterModelObjects(resource, filter);
-    if (!matches.isEmpty()) {
-      return matches.get(0).getEObjectURI();
-    }
-    return null;
-  }
-}
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatcherStrategy.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatcherStrategy.java
new file mode 100644
index 0000000..b4cb9e2
--- /dev/null
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/ProtobufElementMatcherStrategy.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2012 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.cdt.matching;
+
+import java.util.List;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+interface ProtobufElementMatcherStrategy {
+  List<URI> matchingProtobufElementLocations(ContentsByType contents, String[] qualifiedNameSegments);
+
+  EClass supportedType();
+}
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_fieldsOf_CustomFieldOption_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_fieldsOf_CustomFieldOption_Test.java
new file mode 100644
index 0000000..598e753
--- /dev/null
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_fieldsOf_CustomFieldOption_Test.java
@@ -0,0 +1,54 @@
+/*
+ * 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.model.util;
+
+import static com.google.eclipse.protobuf.junit.core.IntegrationTestModule.integrationTestModule;
+import static com.google.eclipse.protobuf.junit.core.XtextRule.overrideRuntimeModuleWith;
+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.core.XtextRule;
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.inject.Inject;
+
+/**
+ * Tests for <code>{@link Options#fieldsOf(AbstractCustomOption)}</code>.
+ *
+ * alruiz@google.com (Alex Ruiz)
+ */
+public class Options_fieldsOf_CustomFieldOption_Test {
+  @Rule public XtextRule xtext = overrideRuntimeModuleWith(integrationTestModule());
+
+  @Inject private Options options;
+
+  // syntax = "proto2";
+  //
+  // import 'google/protobuf/descriptor.proto';
+  //
+  // message Custom {
+  //   optional int32 count = 1;
+  // }
+  //
+  // extend google.protobuf.FieldOptions {
+  //   optional Custom custom = 1000;
+  // }
+  //
+  // message Person {
+  //   optional boolean active = 1 [(custom).count = 6];
+  // }
+  @Test public void should_return_option_field() {
+    CustomFieldOption option = xtext.find("custom", ").", CustomFieldOption.class);
+    List<OptionField> fields = option.getFields();
+    assertThat(options.fieldsOf(option), equalTo(fields));
+  }
+}
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_fieldsOf_CustomOption_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_fieldsOf_CustomOption_Test.java
new file mode 100644
index 0000000..d76df26
--- /dev/null
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_fieldsOf_CustomOption_Test.java
@@ -0,0 +1,52 @@
+/*
+ * 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.model.util;
+
+import static com.google.eclipse.protobuf.junit.core.IntegrationTestModule.integrationTestModule;
+import static com.google.eclipse.protobuf.junit.core.XtextRule.overrideRuntimeModuleWith;
+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.core.XtextRule;
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.inject.Inject;
+
+/**
+ * Tests for <code>{@link Options#fieldsOf(AbstractCustomOption)}</code>.
+ *
+ * alruiz@google.com (Alex Ruiz)
+ */
+public class Options_fieldsOf_CustomOption_Test {
+  @Rule public XtextRule xtext = overrideRuntimeModuleWith(integrationTestModule());
+
+  @Inject private Options options;
+
+  // syntax = "proto2";
+  //
+  // import 'google/protobuf/descriptor.proto';
+  //
+  // message Custom {
+  //   optional int32 count = 1;
+  // }
+  //
+  // extend google.protobuf.FileOptions {
+  //   optional Custom custom = 1000;
+  // }
+  //
+  // option (custom).count = 6;
+  @Test public void should_return_option_field() {
+    CustomOption option = xtext.find("custom", ")", CustomOption.class);
+    List<OptionField> fields = option.getFields();
+    assertThat(options.fieldsOf(option), equalTo(fields));
+  }
+}
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_sourceOfLastFieldIn_CustomFieldOption_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_sourceOfLastFieldIn_CustomFieldOption_Test.java
index 69c785f..210e8dd 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_sourceOfLastFieldIn_CustomFieldOption_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/model/util/Options_sourceOfLastFieldIn_CustomFieldOption_Test.java
@@ -27,7 +27,7 @@
 public class Options_sourceOfLastFieldIn_CustomFieldOption_Test {
   @Rule public XtextRule xtext = overrideRuntimeModuleWith(integrationTestModule());
 
-  @Inject private Options fieldOptions;
+  @Inject private Options options;
 
   // syntax = "proto2";
   //
@@ -46,7 +46,7 @@
   // }
   @Test public void should_return_option_field() {
     CustomFieldOption option = xtext.find("custom", ").", CustomFieldOption.class);
-    MessageField field = (MessageField) fieldOptions.sourceOfLastFieldIn(option);
+    MessageField field = (MessageField) options.sourceOfLastFieldIn(option);
     assertThat(field.getName(), equalTo("count"));
   }
 }
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Packages_addPackageNameSegments_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Packages_addPackageNameSegments_Test.java
new file mode 100644
index 0000000..0c3c294
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Packages_addPackageNameSegments_Test.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2012 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.model.util;
+
+import static com.google.eclipse.protobuf.junit.core.UnitTestModule.unitTestModule;
+import static com.google.eclipse.protobuf.junit.core.XtextRule.overrideRuntimeModuleWith;
+import static com.google.eclipse.protobuf.model.util.QualifiedNameCollectionContains.contains;
+import static org.junit.Assert.*;
+
+import java.util.Collection;
+
+import org.eclipse.xtext.naming.QualifiedName;
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.core.XtextRule;
+import com.google.eclipse.protobuf.protobuf.Package;
+import com.google.inject.Inject;
+
+/**
+ * Tests for <code>{@link Packages#addPackageNameSegments(Package, QualifiedName)}</code>
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Packages_addPackageNameSegments_Test {
+  @Rule public XtextRule xtext = overrideRuntimeModuleWith(unitTestModule());
+
+  @Inject private Packages packages;
+
+
+  // syntax = "proto2";
+  //
+  // package com.google.test;
+  @Test public void should_create_a_qualified_name_per_segment_in_package_name() {
+    Package aPackage = xtext.find("com.google.test", Package.class);
+    Collection<QualifiedName> names = packages.addPackageNameSegments(aPackage, QualifiedName.create("Person"));
+    assertThat(names, contains("test.Person", "google.test.Person"));
+  }
+
+  // syntax = "proto2";
+  //
+  // package google;
+  @Test public void should_return_empty_list_if_package_has_only_one_segment() {
+    Package aPackage = xtext.find("google", Package.class);
+    Collection<QualifiedName> names = packages.addPackageNameSegments(aPackage, QualifiedName.create("Person"));
+    assertTrue(names.isEmpty());
+  }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/QualifiedNameCollectionContains.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/QualifiedNameCollectionContains.java
new file mode 100644
index 0000000..4ba52db
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/QualifiedNameCollectionContains.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2012 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.model.util;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+import java.util.*;
+
+import org.eclipse.xtext.naming.QualifiedName;
+import org.hamcrest.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class QualifiedNameCollectionContains extends TypeSafeMatcher<Collection<QualifiedName>> {
+  private final List<String> qualifiedNames;
+
+  static QualifiedNameCollectionContains contains(String...qualifiedNames) {
+    return new QualifiedNameCollectionContains(qualifiedNames);
+  }
+
+  private QualifiedNameCollectionContains(String[] qualifiedNames) {
+    this.qualifiedNames = newArrayList(qualifiedNames);
+  }
+
+  @Override public boolean matchesSafely(Collection<QualifiedName> item) {
+    if (item.size() != qualifiedNames.size()) {
+      return false;
+    }
+    List<String> copy = newArrayList(qualifiedNames);
+    for (QualifiedName name : item) {
+      copy.remove(name.toString());
+    }
+    return copy.isEmpty();
+  }
+
+  @Override public void describeTo(Description description) {
+    description.appendValue(qualifiedNames);
+  }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/resource/ResourceDescriptions_modelObjectUri_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/resource/ResourceDescriptions_modelObjectUri_Test.java
deleted file mode 100644
index a566616..0000000
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/resource/ResourceDescriptions_modelObjectUri_Test.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2012 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.resource;
-
-import static com.google.eclipse.protobuf.junit.core.UnitTestModule.unitTestModule;
-import static com.google.eclipse.protobuf.junit.core.XtextRule.overrideRuntimeModuleWith;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.*;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.xtext.naming.*;
-import org.eclipse.xtext.resource.*;
-import org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions;
-import org.junit.*;
-
-import com.google.eclipse.protobuf.junit.core.XtextRule;
-import com.google.eclipse.protobuf.protobuf.Enum;
-import com.google.inject.Inject;
-
-/**
- * Tests for <code>{@link ResourceDescriptions#modelObjectUri(IResourceDescription, QualifiedName)}</code>
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ResourceDescriptions_modelObjectUri_Test {
-  @Rule public XtextRule xtext = overrideRuntimeModuleWith(unitTestModule());
-
-  @Inject private IQualifiedNameConverter fqnConverter;
-  @Inject private ResourceSetBasedResourceDescriptions index;
-  @Inject private ResourceDescriptions resourceDescriptions;
-
-  // syntax = "proto2";
-  // package com.google.proto;
-  //
-  // enum Type {
-  //   ONE = 1;
-  //   TWO = 2;
-  // }
-  @Test public void should_find_URI_of_model_object_given_its_qualified_name() {
-    QualifiedName qualifiedName = fqnConverter.toQualifiedName("com.google.proto.Type");
-    URI foundUri = resourceDescriptions.modelObjectUri(descriptionOf(xtext.resource()), qualifiedName);
-    assertThat(foundUri, equalTo(uriOfEnumWithName("Type")));
-  }
-
-  private URI uriOfEnumWithName(String name) {
-    XtextResource resource = xtext.resource();
-    Enum anEnum = xtext.find("Type", Enum.class);
-    String fragment = resource.getURIFragment(anEnum);
-    return resource.getURI().appendFragment(fragment);
-  }
-
-  // syntax = "proto2";
-  // package com.google.proto;
-  //
-  // message Person {}
-  @Test public void should_return_null_if_file_name_is_equal_but_file_path_is_not() {
-    QualifiedName qualifiedName = fqnConverter.toQualifiedName("com.google.proto.Type");
-    URI foundUri = resourceDescriptions.modelObjectUri(descriptionOf(xtext.resource()), qualifiedName);
-    assertNull(foundUri);
-  }
-
-  private IResourceDescription descriptionOf(Resource resource) {
-    index.setContext(resource);
-    return index.getResourceDescription(resource.getURI());
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/parser/PreferenceDrivenProtobufParser_doParse_Test.java b/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/parser/PreferenceDrivenProtobufParser_doParse_Test.java
index 0c2ad39..62b11ef 100644
--- a/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/parser/PreferenceDrivenProtobufParser_doParse_Test.java
+++ b/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/parser/PreferenceDrivenProtobufParser_doParse_Test.java
@@ -22,7 +22,7 @@
 import com.google.eclipse.protobuf.junit.util.MultiLineTextBuilder;
 import com.google.eclipse.protobuf.parser.NonProto2Protobuf;
 import com.google.eclipse.protobuf.protobuf.Protobuf;
-import com.google.eclipse.protobuf.ui.util.ProtobufPlugIn;
+import com.google.eclipse.protobuf.ui.util.ProtobufEditorPlugIn;
 import com.google.inject.Inject;
 
 /**
@@ -40,7 +40,7 @@
     proto1 = proto.toString();
   }
 
-  @Rule public XtextRule xtext = createWith(ProtobufPlugIn.injector());
+  @Rule public XtextRule xtext = createWith(ProtobufEditorPlugIn.injector());
 
   @Inject private IPreferenceStoreAccess storeAccess;
   private IPreferenceStore store;
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 301ceac..6a9c433 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
@@ -18,15 +18,7 @@
 import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
 import static org.eclipse.xtext.util.Strings.*;
 
-import com.google.eclipse.protobuf.grammar.CommonKeyword;
-import com.google.eclipse.protobuf.model.util.*;
-import com.google.eclipse.protobuf.protobuf.*;
-import com.google.eclipse.protobuf.protobuf.Enum;
-import com.google.eclipse.protobuf.scoping.*;
-import com.google.eclipse.protobuf.ui.grammar.CompoundElement;
-import com.google.eclipse.protobuf.ui.labeling.Images;
-import com.google.eclipse.protobuf.ui.util.Literals;
-import com.google.inject.Inject;
+import java.util.*;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jface.text.contentassist.ICompletionProposal;
@@ -39,7 +31,15 @@
 import org.eclipse.xtext.ui.PluginImageHelper;
 import org.eclipse.xtext.ui.editor.contentassist.*;
 
-import java.util.*;
+import com.google.eclipse.protobuf.grammar.CommonKeyword;
+import com.google.eclipse.protobuf.model.util.*;
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.eclipse.protobuf.protobuf.Enum;
+import com.google.eclipse.protobuf.scoping.*;
+import com.google.eclipse.protobuf.ui.grammar.CompoundElement;
+import com.google.eclipse.protobuf.ui.labeling.Images;
+import com.google.eclipse.protobuf.ui.util.Literals;
+import com.google.inject.Inject;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java
index b0f2c95..903e0d3 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java
@@ -8,14 +8,15 @@
  */
 package com.google.eclipse.protobuf.ui.labeling;
 
-import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.ImmutableList.of;
 import static com.google.common.collect.Maps.newHashMap;
 import static com.google.eclipse.protobuf.protobuf.Modifier.*;
 
-import java.util.*;
+import java.util.Map;
 
 import org.eclipse.xtext.Keyword;
 
+import com.google.common.collect.ImmutableList;
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.eclipse.protobuf.protobuf.Enum;
 import com.google.eclipse.protobuf.protobuf.Package;
@@ -53,7 +54,7 @@
     IMAGES_BY_TYPE.put(Syntax.class, "syntax.gif");
   }
 
-  private static final List<String> STANDALONE_IMAGES = newArrayList("extensions.gif", "imports.gif", "options.gif");
+  private static final ImmutableList<String> STANDALONE_IMAGES = of("extensions.gif", "imports.gif", "options.gif");
 
   public String imageFor(Object o) {
     if (o instanceof Keyword) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java
index c61e6a6..3a383f1 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java
@@ -8,7 +8,7 @@
  */
 package com.google.eclipse.protobuf.ui.outline;
 
-import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.ImmutableList.of;
 import static com.google.eclipse.protobuf.ui.outline.Messages.importDeclarations;
 
 import java.util.List;
@@ -17,6 +17,7 @@
 import org.eclipse.xtext.ui.editor.outline.IOutlineNode;
 import org.eclipse.xtext.ui.editor.outline.impl.*;
 
+import com.google.common.collect.ImmutableList;
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.eclipse.protobuf.protobuf.Package;
 
@@ -26,13 +27,8 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class ProtobufOutlineTreeProvider extends DefaultOutlineTreeProvider {
-  private static final List<Class<? extends EObject>> IGNORED_ELEMENT_TYPES = newArrayList();
-
-  static {
-    IGNORED_ELEMENT_TYPES.add(BooleanLink.class);
-    IGNORED_ELEMENT_TYPES.add(FieldOption.class);
-    IGNORED_ELEMENT_TYPES.add(MessageLink.class);
-  }
+  private static final ImmutableList<Class<? extends EObject>> IGNORED_ELEMENT_TYPES = of(BooleanLink.class,
+      FieldOption.class, MessageLink.class);
 
   boolean _isLeaf(Extensions extensions) {
     return true;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/output/CompositeOutputParser.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/output/CompositeOutputParser.java
index c52bb9c..6e8ff80 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/output/CompositeOutputParser.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/output/CompositeOutputParser.java
@@ -8,12 +8,12 @@
  */
 package com.google.eclipse.protobuf.ui.protoc.output;
 
-import static com.google.common.collect.Lists.newArrayList;
-
-import java.util.List;
+import static com.google.common.collect.ImmutableList.of;
 
 import org.eclipse.core.runtime.CoreException;
 
+import com.google.common.collect.ImmutableList;
+
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
@@ -52,7 +52,7 @@
    */
   private static final ProtocOutputParser PARSER3 = new RegexOutputParser("(--.*):\\s*(.*):\\s*(.*)", 2, 3);
 
-  private static final List<ProtocOutputParser> PARSERS = newArrayList(PARSER1, PARSER2, PARSER3);
+  private static final ImmutableList<ProtocOutputParser> PARSERS = of(PARSER1, PARSER2, PARSER3);
 
   @Override
   public boolean parseAndAddMarkerIfNecessary(String line, ProtocMarkerFactory markerFactory) throws CoreException {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/ProtobufEditorPlugIn.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/ProtobufEditorPlugIn.java
new file mode 100644
index 0000000..64b029c
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/ProtobufEditorPlugIn.java
@@ -0,0 +1,46 @@
+/*
+ * 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 com.google.eclipse.protobuf.ui.internal.ProtobufActivator;
+import com.google.inject.Injector;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public final class ProtobufEditorPlugIn {
+  private static final String LANGUAGE_NAME = "com.google.eclipse.protobuf.Protobuf";
+
+  /**
+   * Returns the name of the supported language.
+   * @return "com.google.eclipse.protobuf.Protobuf".
+   */
+  public static String languageName() {
+    return LANGUAGE_NAME;
+  }
+
+  /**
+   * Returns the appropriate instance for the given injection type.
+   * @param type the given injection type.
+   * @return the appropriate instance for the given injection type.
+   */
+  public static <T> T getInstanceOf(Class<T> type) {
+    return injector().getInstance(type);
+  }
+
+  /**
+   * Returns the plug-in's injector for the language "com.google.eclipse.protobuf.Protobuf".
+   * @return the plug-in's injector for the language "com.google.eclipse.protobuf.Protobuf".
+   */
+  public static Injector injector() {
+    return ProtobufActivator.getInstance().getInjector(languageName());
+  }
+
+  private ProtobufEditorPlugIn() {}
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/ProtobufPlugIn.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/ProtobufPlugIn.java
deleted file mode 100644
index b4640ea..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/ProtobufPlugIn.java
+++ /dev/null
@@ -1,33 +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.ui.util;
-
-import com.google.eclipse.protobuf.ui.internal.ProtobufActivator;
-import com.google.inject.Injector;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-public final class ProtobufPlugIn {
-  private static final String LANGUAGE_NAME = "com.google.eclipse.protobuf.Protobuf";
-
-  public static <T> T getInstance(Class<T> type) {
-    return injector().getInstance(type);
-  }
-
-  public static Injector injector() {
-    return ProtobufActivator.getInstance().getInjector(languageName());
-  }
-
-  public static String languageName() {
-    return LANGUAGE_NAME;
-  }
-
-  private ProtobufPlugIn() {}
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufValidation.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufValidation.java
index 64bfd73..2d2fb8d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufValidation.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufValidation.java
@@ -23,7 +23,7 @@
 
 import com.google.eclipse.protobuf.model.util.Imports;
 import com.google.eclipse.protobuf.protobuf.Import;
-import com.google.eclipse.protobuf.ui.util.ProtobufPlugIn;
+import com.google.eclipse.protobuf.ui.util.ProtobufEditorPlugIn;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -34,7 +34,7 @@
       return;
     }
     XtextEditor xtextEditor = (XtextEditor) editor;
-    if (!ProtobufPlugIn.languageName().equals(xtextEditor.getLanguageName())) {
+    if (!ProtobufEditorPlugIn.languageName().equals(xtextEditor.getLanguageName())) {
       return;
     }
     validate(xtextEditor);
@@ -70,7 +70,7 @@
   }
 
   private static void resetUri(Import anImport) {
-    Imports imports = ProtobufPlugIn.getInstance(Imports.class);
+    Imports imports = ProtobufEditorPlugIn.getInstanceOf(Imports.class);
     String uri = imports.uriAsEnteredByUser(anImport);
     if (uri == null) {
       return;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateFileOnActivation.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateFileOnActivation.java
index 2eaddc5..7cc2a8b 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateFileOnActivation.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateFileOnActivation.java
@@ -44,12 +44,12 @@
   }
 
   private IProject projectFrom(IEditorPart editor) {
-    Editors editors = ProtobufPlugIn.getInstance(Editors.class);
+    Editors editors = ProtobufEditorPlugIn.getInstanceOf(Editors.class);
     return editors.projectOwningFileDisplayedIn(editor);
   }
 
   private boolean shouldValidateEditor(IProject project) {
-    IPreferenceStoreAccess storeAccess = ProtobufPlugIn.getInstance(IPreferenceStoreAccess.class);
+    IPreferenceStoreAccess storeAccess = ProtobufEditorPlugIn.getInstanceOf(IPreferenceStoreAccess.class);
     GeneralPreferences preferences = generalPreferences(storeAccess, project);
     return preferences.validateFilesOnActivation().getValue();
   }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/ModelObjects.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/ModelObjects.java
index 7aec422..6ec9da1 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/ModelObjects.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/ModelObjects.java
@@ -8,12 +8,12 @@
  */
 package com.google.eclipse.protobuf.model.util;
 
+import org.eclipse.emf.ecore.*;
+
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.eclipse.protobuf.protobuf.Package;
 import com.google.inject.Singleton;
 
-import org.eclipse.emf.ecore.*;
-
 /**
  * Utility methods related to model objects.
  *
@@ -22,27 +22,27 @@
 @Singleton public class ModelObjects {
   /**
    * Returns the value of the structural feature with a matching name in the given model object.
-   * @param e the given model object.
+   * @param o the given model object.
    * @param featureName the name of the structural feature to read the value from.
    * @param valueType the expected type of the value to return.
    * @return the value of the structural feature with a matching name in the given model object, or {@code null} if the
    * given model object is {@code null} or if the model object does not have a structural feature with a matching name.
    * @throws ClassCastException if the value of the structural value is not the same as the expected one.
    */
-  public <T> T valueOfFeature(EObject e, String featureName, Class<T> valueType) {
-    if (e != null) {
-      EStructuralFeature feature = e.eClass().getEStructuralFeature(featureName);
+  public <T> T valueOfFeature(EObject o, String featureName, Class<T> valueType) {
+    if (o != null) {
+      EStructuralFeature feature = o.eClass().getEStructuralFeature(featureName);
       if (feature != null) {
-        return valueType.cast(e.eGet(feature));
+        return valueType.cast(o.eGet(feature));
       }
     }
     return null;
   }
 
   /**
-   * Returns the package of the proto file containing the given object.
-   * @param o the given object.
-   * @return the package of the proto file containing the given object or {@code null} if the proto file does not have a
+   * Returns the package of the root containing the given model object.
+   * @param o the given model object.
+   * @return the package of the root containing the given model object or {@code null} if the root does not have a
    * package.
    */
   public Package packageOf(EObject o) {
@@ -56,9 +56,9 @@
   }
 
   /**
-   * Returns the root element of the proto file containing the given element.
-   * @param o the given element.
-   * @return the root element of the proto file containing the given element.
+   * Returns the root element containing the given model element.
+   * @param o the given model element.
+   * @return the root element containing the given model element.
    */
   public Protobuf rootOf(EObject o) {
     EObject current = o;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java
index e744b0b..5161bc3 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Options.java
@@ -8,7 +8,7 @@
  */
 package com.google.eclipse.protobuf.model.util;
 
-import static java.util.Collections.emptyList;
+import static java.util.Collections.unmodifiableList;
 import static org.eclipse.xtext.util.Strings.isEmpty;
 
 import java.util.List;
@@ -31,14 +31,10 @@
     return option instanceof NativeOption || option instanceof NativeFieldOption;
   }
 
+  @SuppressWarnings("unchecked")
   public List<OptionField> fieldsOf(AbstractCustomOption option) {
-    if (option instanceof CustomOption) {
-      return ((CustomOption) option).getFields();
-    }
-    if (option instanceof CustomFieldOption) {
-      return ((CustomFieldOption) option).getFields();
-    }
-    return emptyList();
+    List<OptionField> fields = modelObjects.valueOfFeature(option, "fields", List.class);
+    return unmodifiableList(fields);
   }
 
   /**
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Packages.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Packages.java
index b22e400..0963f43 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Packages.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Packages.java
@@ -12,12 +12,12 @@
 import static java.util.Collections.*;
 import static org.eclipse.xtext.util.Strings.isEmpty;
 
-import com.google.eclipse.protobuf.protobuf.Package;
-import com.google.inject.Inject;
+import java.util.*;
 
 import org.eclipse.xtext.naming.*;
 
-import java.util.*;
+import com.google.eclipse.protobuf.protobuf.Package;
+import com.google.inject.Inject;
 
 /**
  * Utility methods related to <code>{@link Package}</code>s.
@@ -64,6 +64,38 @@
     return true;
   }
 
+  /**
+   * Adds the segments in the name of the given package to the given qualified name, creating a new qualified name per
+   * segment.
+   * <p>
+   * For example, given the following proto element:
+   *
+   * <pre>
+   * package test.alternative.names;
+   *
+   * message Person {
+   *   optional string name = 1;
+   *
+   *   enum PhoneType {
+   *     HOME = 0;
+   *     WORK = 1;
+   *   }
+   * }
+   * </pre>
+   *
+   * This method will create the following qualified names for {@code PhoneType}:
+   * <ul>
+   * <li>{@code PhoneType}</li>
+   * <li>{@code Person.PhoneType}</li>
+   * <li>{@code names.Person.PhoneType}</li>
+   * <li>{@code test.names.Person.PhoneType}</li>
+   * </ul>
+   * </p>
+   * @param p the given package.
+   * @param name the base name.
+   * @return a collection containing the created qualified names, or an empty list if the name of the given package
+   * contains zero or one segments.
+   */
   public Collection<QualifiedName> addPackageNameSegments(Package p, QualifiedName name) {
     QualifiedName current = name;
     List<String> segments = segmentsOf(p);
@@ -79,6 +111,11 @@
     return unmodifiableList(allNames);
   }
 
+  /**
+   * Returns the segments in the name of the given package.
+   * @param p the given package.
+   * @return the segments in the name of the given package.
+   */
   public List<String> segmentsOf(Package p) {
     QualifiedName name = (p == null) ? null : nameOf(p);
     if (name == null) {
@@ -89,9 +126,6 @@
 
   private QualifiedName nameOf(Package p) {
     String name = p.getName();
-    if (isEmpty(name)) {
-      return null;
-    }
-    return qualifiedNameConverter.toQualifiedName(name);
+    return (isEmpty(name)) ? null : qualifiedNameConverter.toQualifiedName(name);
   }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Protobufs.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Protobufs.java
index 66b4458..9559587 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Protobufs.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Protobufs.java
@@ -24,20 +24,19 @@
  */
 @Singleton public class Protobufs {
   /**
-   * Indicates whether the given <code>{@link Protobuf}</code> is not {@code null} and has "proto2" syntax (not
-   * necessarily in a explicit way.)
-   * @param protobuf the {@code Protobuf} to check.
-   * @return {@code true} if the given <code>{@link Protobuf}</code> is not {@code null} and has "proto2" syntax,
-   * {@code false} otherwise.
+   * Indicates whether the given root is not {@code null} and has a "proto2" syntax element.
+   * @param protobuf the given root.
+   * @return {@code true} if the given root is not {@code null} and has a "proto2" syntax element, {@code false}
+   * otherwise.
    */
   public boolean isProto2(Protobuf protobuf) {
     return protobuf != null && !(protobuf instanceof NonProto2Protobuf);
   }
 
   /**
-   * Returns all the import definitions in the given proto.
-   * @param root the given proto.
-   * @return all the import definitions in the given proto.
+   * Returns all the import definitions in the given root.
+   * @param root the given root.
+   * @return all the import definitions in the given root.
    */
   public List<Import> importsIn(Protobuf root) {
     List<Import> imports = newArrayList();
@@ -50,9 +49,9 @@
   }
 
   /**
-   * Returns all the public import definitions in the given proto.
-   * @param root the given proto.
-   * @return all the public import definitions in the given proto.
+   * Returns all the public import definitions in the given root.
+   * @param root the given root.
+   * @return all the public import definitions in the given root.
    */
   public List<Import> publicImportsIn(Protobuf root) {
     List<Import> imports = newArrayList();
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/QualifiedNames.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/QualifiedNames.java
index 353105b..3a71be2 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/QualifiedNames.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/QualifiedNames.java
@@ -14,7 +14,8 @@
 
 import org.eclipse.xtext.naming.QualifiedName;
 
-import com.google.inject.Singleton;
+import com.google.eclipse.protobuf.util.StringLists;
+import com.google.inject.*;
 
 /**
  * Utility methods related to <code>{@link QualifiedName}</code>s.
@@ -22,13 +23,7 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 @Singleton public class QualifiedNames {
-  public QualifiedName createFqn(List<String> segments) {
-    return QualifiedName.create(asArray(segments));
-  }
-
-  private String[] asArray(List<String> list) {
-    return list.toArray(new String[list.size()]);
-  }
+  @Inject private StringLists stringLists;
 
   public QualifiedName addLeadingDot(QualifiedName name) {
     if (name.getFirstSegment().equals("")) {
@@ -37,6 +32,10 @@
     List<String> segments = newArrayList();
     segments.addAll(name.getSegments());
     segments.add(0, "");
-    return QualifiedName.create(segments.toArray(new String[segments.size()]));
+    return createQualifiedName(segments);
+  }
+
+  public QualifiedName createQualifiedName(List<String> segments) {
+    return QualifiedName.create(stringLists.toArray(segments));
   }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/LocalNamesProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/LocalNamesProvider.java
index 5d7b9bf..0bb3563 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/LocalNamesProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/LocalNamesProvider.java
@@ -14,14 +14,14 @@
 import static org.eclipse.xtext.util.Strings.isEmpty;
 import static org.eclipse.xtext.util.Tuples.pair;
 
-import com.google.eclipse.protobuf.model.util.*;
-import com.google.inject.*;
+import java.util.List;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.xtext.naming.*;
 import org.eclipse.xtext.util.*;
 
-import java.util.List;
+import com.google.eclipse.protobuf.model.util.*;
+import com.google.inject.*;
 
 /**
  * Provides alternative qualified names for protobuf elements.
@@ -50,9 +50,6 @@
  * <li>{@code test.names.Person.PhoneType}</li>
  * </ul>
  * </p>
- * <p>
- * This class provides the non-default qualified names recognized by protoc.
- * </p>
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java
index fa070a7..ad148ba 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java
@@ -77,7 +77,7 @@
     if (segments.isEmpty()) {
       return qualifiedName;
     }
-    QualifiedName packageQualifiedName = qualifiedNames.createFqn(segments);
+    QualifiedName packageQualifiedName = qualifiedNames.createQualifiedName(segments);
     if (qualifiedName.startsWith(packageQualifiedName)) {
       return qualifiedName;
     }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/resource/ResourceDescriptions.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/resource/ResourceDescriptions.java
deleted file mode 100644
index 61b72a2..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/resource/ResourceDescriptions.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2012 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.resource;
-
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Lists.newArrayList;
-import static java.util.Collections.unmodifiableList;
-
-import java.util.List;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.xtext.naming.QualifiedName;
-import org.eclipse.xtext.resource.*;
-
-import com.google.common.base.Predicate;
-import com.google.inject.Singleton;
-
-/**
- * Utility methods related to <code>{@link IResourceDescription}</code>s.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-@Singleton public class ResourceDescriptions {
-  /**
-   * Finds the URI of a model object, in the given resource, whose qualified name matches the given one.
-   * @param resource the given resource.
-   * @param qualifiedName the qualified name to match.
-   * @return the URI of the matching model object, or {@code null} if a model object with a matching URI could not be
-   * found.
-   */
-  public URI modelObjectUri(IResourceDescription resource, QualifiedName qualifiedName) {
-    for (IEObjectDescription exported : resource.getExportedObjects()) {
-      QualifiedName modelObjectQualifiedName = exported.getQualifiedName();
-      if (qualifiedName.equals(modelObjectQualifiedName)) {
-        return exported.getEObjectURI();
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Returns the model objects that match the criteria specified in the given filter.
-   * @param resource the resource containing model objects.
-   * @param filter the filter to use.
-   * @return  the model objects that match the criteria specified in the given filter.
-   */
-  public List<IEObjectDescription> filterModelObjects(IResourceDescription resource, Predicate<IEObjectDescription> filter) {
-    List<IEObjectDescription> filtered = newArrayList(filter(resource.getExportedObjects(), filter));
-    return unmodifiableList(filtered);
-  }
-}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
index 346a39a..549af08 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
@@ -58,10 +58,9 @@
     return descriptions;
   }
 
-  @Override
-  public Collection<IEObjectDescription> local(Object target, Class<? extends ComplexType> typeOfComplexType,
+  @Override public Collection<IEObjectDescription> local(Object target, Class<? extends ComplexType> typeOfComplexType,
       int level) {
-    if (!typeOfComplexType.isInstance(target)) {
+   if (!typeOfComplexType.isInstance(target)) {
       return emptySet();
     }
     EObject e = (EObject) target;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersectionDescriptions.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersectionDescriptions.java
index 9e0c917..71154b7 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersectionDescriptions.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersectionDescriptions.java
@@ -13,15 +13,15 @@
 import static java.util.Collections.emptySet;
 import static org.eclipse.xtext.resource.EObjectDescription.create;
 
-import com.google.eclipse.protobuf.model.util.*;
-import com.google.eclipse.protobuf.protobuf.Package;
-import com.google.inject.Inject;
+import java.util.*;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.xtext.naming.*;
 import org.eclipse.xtext.resource.IEObjectDescription;
 
-import java.util.*;
+import com.google.eclipse.protobuf.model.util.*;
+import com.google.eclipse.protobuf.protobuf.Package;
+import com.google.inject.Inject;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -54,21 +54,17 @@
         break;
       }
     }
-    if (start == 0)
-     {
+    if (start == 0) {
       return emptySet(); // no intersection found.
     }
     Set<IEObjectDescription> descriptions = newHashSet();
-    QualifiedName fqn = nameProvider.getFullyQualifiedName(e);
-    List<String> segments = newArrayList(fqn.getSegments());
+    QualifiedName qualifiedName = nameProvider.getFullyQualifiedName(e);
+    List<String> segments = newArrayList(qualifiedName.getSegments());
     for (int i = 0; i < start; i++) {
       segments.remove(0);
-      descriptions.add(create(fqn(segments), e));
+      QualifiedName newQualifiedName = qualifiedNames.createQualifiedName(segments);
+      descriptions.add(create(newQualifiedName, e));
     }
     return descriptions;
   }
-
-  private QualifiedName fqn(List<String> segments) {
-    return qualifiedNames.createFqn(segments);
-  }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/StringLists.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/StringLists.java
new file mode 100644
index 0000000..a024630
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/StringLists.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2012 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.util;
+
+import java.util.List;
+
+import com.google.inject.Singleton;
+
+/**
+ * Utility methods related to <code>{@link List}</code>s of {@code String}s.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@Singleton public class StringLists {
+  /**
+   * Returns an array containing all of the elements in the given list in proper sequence (from first to last element.)
+   * @param list the given list.
+   * @return an array containing all of the elements in the given list in proper sequence.
+   */
+  public String[] toArray(List<String> list) {
+    return list.toArray(new String[list.size()]);
+  }
+}
