diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider_alternativeFullyQualifiedNames_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider_localNames_Test.java
similarity index 76%
rename from com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider_alternativeFullyQualifiedNames_Test.java
rename to com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider_localNames_Test.java
index 45f0b4d..2a32898 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider_alternativeFullyQualifiedNames_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider_localNames_Test.java
@@ -23,23 +23,23 @@
 import com.google.eclipse.protobuf.protobuf.Enum;
 
 /**
- * Tests for <code>{@link AlternativeQualifiedNamesProvider#alternativeFullyQualifiedNames(EObject)}</code>.
+ * Tests for <code>{@link LocalNamesProvider#localNames(EObject)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class AlternativeQualifiedNamesProvider_alternativeFullyQualifiedNames_Test {
+public class LocalNamesProvider_localNames_Test {
 
   @Rule public XtextRule xtext = new XtextRule();
 
-  private AlternativeQualifiedNamesProvider namesProvider;
+  private LocalNamesProvider namesProvider;
 
   @Before public void setUp() {
-    namesProvider = xtext.getInstanceOf(AlternativeQualifiedNamesProvider.class);
+    namesProvider = xtext.getInstanceOf(LocalNamesProvider.class);
   }
 
-  @Test public void should_return_all_possible_qualified_names() {
+  @Test public void should_return_all_possible_local_names() {
     StringBuilder proto = new StringBuilder();
-    proto.append("package alternative.names;                       ");
+    proto.append("package test.alternative.names;                  ");
     proto.append("                                                 ");
     proto.append("message Person {                                 ");
     proto.append("  message PhoneNumber {                          ");
@@ -53,9 +53,11 @@
     proto.append("}                                                ");
     Protobuf root = xtext.parse(proto);
     Enum phoneType = findEnum("PhoneType", root);
-    List<QualifiedName> names = namesProvider.alternativeFullyQualifiedNames(phoneType);
+    List<QualifiedName> names = namesProvider.localNames(phoneType);
     assertThat(names.get(0).toString(), equalTo("PhoneType"));
     assertThat(names.get(1).toString(), equalTo("PhoneNumber.PhoneType"));
     assertThat(names.get(2).toString(), equalTo("Person.PhoneNumber.PhoneType"));
+    assertThat(names.get(3).toString(), equalTo("names.Person.PhoneNumber.PhoneType"));
+    assertThat(names.get(4).toString(), equalTo("alternative.names.Person.PhoneNumber.PhoneType"));
   }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider.java
similarity index 69%
rename from com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider.java
rename to com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider.java
index 02c901c..b8713b5 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider.java
@@ -8,7 +8,7 @@
  */
 package com.google.eclipse.protobuf.scoping;
 
-import static java.util.Collections.unmodifiableList;
+import static java.util.Collections.*;
 import static org.eclipse.xtext.util.SimpleAttributeResolver.newResolver;
 import static org.eclipse.xtext.util.Strings.isEmpty;
 import static org.eclipse.xtext.util.Tuples.pair;
@@ -20,6 +20,8 @@
 import org.eclipse.xtext.util.*;
 
 import com.google.common.base.Function;
+import com.google.eclipse.protobuf.protobuf.Package;
+import com.google.eclipse.protobuf.util.ProtobufElementFinder;
 import com.google.inject.*;
 
 /**
@@ -51,17 +53,16 @@
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-class AlternativeQualifiedNamesProvider {
-
-  // TODO: in example above, it looks like protoc considers names.Person.PhoneType as valid. In short, qualified
-  // names can use segments of the package as well.
+class LocalNamesProvider {
 
   @Inject private final IQualifiedNameConverter converter = new IQualifiedNameConverter.DefaultImpl();
   @Inject private final IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE;
 
+  @Inject private ProtobufElementFinder finder;
+
   private final Function<EObject, String> resolver = newResolver(String.class, "name");
 
-  List<QualifiedName> alternativeFullyQualifiedNames(final EObject obj) {
+  List<QualifiedName> localNames(final EObject obj) {
     Pair<EObject, String> key = pair(obj, "fqns");
     return cache.get(key, obj.eResource(), new Provider<List<QualifiedName>>() {
       public List<QualifiedName> get() {
@@ -78,6 +79,24 @@
           qualifiedName = converter.toQualifiedName(containerName).append(qualifiedName);
           names.add(qualifiedName);
         }
+        names.addAll(addPackageSegments(qualifiedName));
+        return unmodifiableList(names);
+      }
+
+      private List<QualifiedName> addPackageSegments(QualifiedName qualifiedName) {
+        Package p = finder.packageOf(obj);
+        if (p == null) return emptyList();
+        String packageName = p.getName();
+        if (isEmpty(packageName)) return emptyList();
+        QualifiedName name = qualifiedName;
+        List<String> segments = converter.toQualifiedName(packageName).getSegments();
+        int segmentCount = segments.size();
+        if (segmentCount == 1) return emptyList();
+        List<QualifiedName> names = new ArrayList<QualifiedName>();
+        for (int i = segmentCount - 1; i > 0; i--) {
+          name = QualifiedName.create(segments.get(i)).append(name);
+          names.add(name);
+        }
         return unmodifiableList(names);
       }
     });
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
index 615996d..6d2ddd8 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
@@ -42,7 +42,7 @@
   @Inject private DescriptorProvider descriptorProvider;
   @Inject private IQualifiedNameProvider nameProvider;
   @Inject private ImportUriResolver uriResolver;
-  @Inject private AlternativeQualifiedNamesProvider alternativeNamesProvider;
+  @Inject private LocalNamesProvider localNamesProvider;
 
   @SuppressWarnings("unused")
   IScope scope_TypeReference_type(TypeReference typeRef, EReference reference) {
@@ -82,7 +82,7 @@
     List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
     for (EObject element : root.eContents()) {
       if (!targetType.isInstance(element)) continue;
-      List<QualifiedName> names = alternativeNamesProvider.alternativeFullyQualifiedNames(element);
+      List<QualifiedName> names = localNamesProvider.localNames(element);
       int nameCount = names.size();
       for (int i = level; i < nameCount; i++) {
         descriptions.add(create(names.get(i), element));
