diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue161_PackageScoping_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue161_PackageScoping_Test.java
new file mode 100644
index 0000000..c41da43
--- /dev/null
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/Issue161_PackageScoping_Test.java
@@ -0,0 +1,70 @@
+/*
+ * 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.scoping;
+
+import static com.google.eclipse.protobuf.junit.core.Setups.integrationTestSetup;
+import static com.google.eclipse.protobuf.junit.core.XtextRule.createWith;
+import static com.google.eclipse.protobuf.scoping.ContainNames.contain;
+import static com.google.eclipse.protobuf.scoping.IEObjectDescriptions.descriptionsIn;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+
+import com.google.eclipse.protobuf.junit.core.XtextRule;
+import com.google.eclipse.protobuf.protobuf.*;
+
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.xtext.scoping.IScope;
+import org.junit.*;
+
+/**
+ * Tests fix for <a href="http://code.google.com/p/protobuf-dt/issues/detail?id=157">Issue 157</a>.
+ * 
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Issue161_PackageScoping_Test {
+
+  private static EReference reference;
+
+  @BeforeClass public static void setUpOnce() {
+    reference = mock(EReference.class);
+  }
+
+  @Rule public XtextRule xtext = createWith(integrationTestSetup());
+
+  private ProtobufScopeProvider provider;
+
+  @Before public void setUp() {
+    provider = xtext.getInstanceOf(ProtobufScopeProvider.class);
+  }
+
+  // // Create file types.proto
+  //
+  // syntax = 'proto2';
+  // package com.google.proto.base.shared;
+  //
+  // enum Type {
+  //   ONE = 1;
+  //   TWO = 2;
+  // }
+  
+  // syntax = "proto2";
+  // package com.google.proto.project.shared;
+  //
+  // import "types.proto";
+  //
+  // message Summary {
+  //   repeated base.shared.Type type = 1;
+  // }  
+  @Test public void should_include_package_intersection() {
+    MessageField field = xtext.find("type", " =", MessageField.class);
+    IScope scope = provider.scope_ComplexTypeLink_target((ComplexTypeLink) field.getType(), reference);
+    assertThat(descriptionsIn(scope), contain("base.shared.Type", "proto.base.shared.Type", 
+                                              "google.proto.base.shared.Type", "com.google.proto.base.shared.Type"));
+  }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/IntersectedPackageDescriptions_createFqn_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/IntersectedPackageDescriptions_createFqn_Test.java
deleted file mode 100644
index f026fd0..0000000
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/IntersectedPackageDescriptions_createFqn_Test.java
+++ /dev/null
@@ -1,41 +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.scoping;
-
-import static java.util.Arrays.asList;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-
-import org.eclipse.xtext.naming.QualifiedName;
-import org.junit.*;
-
-import java.util.List;
-
-/**
- * Tests for <code>{@link IntersectedPackageDescriptions#createFqn(String, List)}</code>
- * 
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class IntersectedPackageDescriptions_createFqn_Test {
-
-  private String name;
-  private List<String> packageFqn;
-  private IntersectedPackageDescriptions descriptions;
-  
-  @Before public void setUp() {
-    name = "Person";
-    packageFqn = asList("com", "google", "test");
-    descriptions = new IntersectedPackageDescriptions();
-  }
-  
-  @Test public void should_concatenate_name_and_package_fqn() {
-    QualifiedName fqn = descriptions.createFqn(name, packageFqn);
-    assertThat(fqn.toString(), equalTo("com.google.test.Person"));
-  }
-}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/PackageIntersection_intersection_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/PackageIntersection_intersection_Test.java
deleted file mode 100644
index 915e11f..0000000
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/PackageIntersection_intersection_Test.java
+++ /dev/null
@@ -1,71 +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.scoping;
-
-import static com.google.eclipse.protobuf.junit.core.Setups.unitTestSetup;
-import static com.google.eclipse.protobuf.junit.core.XtextRule.createWith;
-import static java.util.Arrays.asList;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-
-import com.google.eclipse.protobuf.junit.core.XtextRule;
-import com.google.eclipse.protobuf.protobuf.Package;
-
-import org.junit.*;
-
-import java.util.List;
-
-/**
- * Tests for <code>{@link PackageIntersection#intersection(Package, Package)}</code>
- * 
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class PackageIntersection_intersection_Test {
-
-  @Rule public XtextRule xtext = createWith(unitTestSetup());
-
-  private Package p1;
-  private Package p2;
-  private PackageIntersection intersection;
-
-  @Before public void setUp() {
-    p1 = mock(Package.class);
-    p2 = mock(Package.class);
-    intersection = xtext.getInstanceOf(PackageIntersection.class);
-  }
-
-  @Test public void should_return_intersection_when_initial_segments_are_equal() {
-    when(p1.getName()).thenReturn("com.google.proto.test.project.shared");
-    when(p2.getName()).thenReturn("com.google.proto.test.base.shared");
-    List<String> segments = intersection.intersection(p1, p2);
-    assertThat(segments, equalTo(asList("base", "shared")));
-  }
-
-  @Test public void should_return_empty_list_when_packages_are_different() {
-    when(p1.getName()).thenReturn("project.shared");
-    when(p2.getName()).thenReturn("base.shared");
-    List<String> segments = intersection.intersection(p1, p2);
-    assertTrue(segments.isEmpty());
-  }
-
-  @Test public void should_return_empty_list_when_packages_are_exactly_equal() {
-    when(p1.getName()).thenReturn("project.shared");
-    when(p2.getName()).thenReturn("project.shared");
-    List<String> segments = intersection.intersection(p1, p2);
-    assertTrue(segments.isEmpty());
-  }
-
-  @Test public void should_return_empty_list_when_packages_are_different_and_first_name_of_first_package_is_shorter() {
-    when(p1.getName()).thenReturn("proto");
-    when(p2.getName()).thenReturn("project.shared");
-    List<String> segments = intersection.intersection(p1, p2);
-    assertTrue(segments.isEmpty());
-  }
-}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/IProtobufQualifiedNameProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/IProtobufQualifiedNameProvider.java
index b4c34aa..35b12b9 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/IProtobufQualifiedNameProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/IProtobufQualifiedNameProvider.java
@@ -1,5 +1,11 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-
+/*
+ * 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.naming;
 
 import com.google.eclipse.protobuf.protobuf.Group;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IntersectedPackageDescriptions.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IntersectedPackageDescriptions.java
deleted file mode 100644
index 64089ed..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IntersectedPackageDescriptions.java
+++ /dev/null
@@ -1,43 +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.scoping;
-
-import static org.eclipse.xtext.resource.EObjectDescription.create;
-import static org.eclipse.xtext.util.SimpleAttributeResolver.newResolver;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.xtext.naming.QualifiedName;
-import org.eclipse.xtext.resource.*;
-
-import java.util.*;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class IntersectedPackageDescriptions {
-
-  private final Function<EObject, String> resolver = newResolver(String.class, "name");
-
-  IEObjectDescription description(EObject e, List<String> packageFqn) {
-    if (packageFqn.isEmpty()) return null;
-    String name = resolver.apply(e);
-    QualifiedName fqn = createFqn(name, packageFqn);
-    return create(fqn, e);
-  }
-  
-  @VisibleForTesting 
-  QualifiedName createFqn(String name, List<String> packageFqn) {
-    List<String> nameSegments = new ArrayList<String>(packageFqn);
-    nameSegments.add(name);
-    return QualifiedName.create(nameSegments.toArray(new String[nameSegments.size()]));
-  }
-}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersection.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersection.java
deleted file mode 100644
index ae498e7..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersection.java
+++ /dev/null
@@ -1,56 +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.scoping;
-
-import static java.util.Collections.*;
-
-import com.google.eclipse.protobuf.protobuf.Package;
-import com.google.inject.Inject;
-
-import org.eclipse.xtext.naming.*;
-
-import java.util.*;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class PackageIntersection {
-
-  @Inject private final IQualifiedNameConverter converter = new IQualifiedNameConverter.DefaultImpl();
-
-  List<String> intersection(Package p1, Package p2) {
-    if (p1 == null || p2 == null) return emptyList();
-    return intersection(converter.toQualifiedName(p1.getName()), converter.toQualifiedName(p2.getName()));
-  }
-
-  private List<String> intersection(QualifiedName n1, QualifiedName n2) {
-    return intersection(n1.getSegments(), n2.getSegments());
-  }
-
-  private List<String> intersection(List<String> n1, List<String> n2) {
-    List<String> intersection = new ArrayList<String>();
-    int n1Count = n1.size();
-    int n2Count = n2.size();
-    int start = -1;
-    for (int i = 0; (i < n1Count && i < n2Count); i++) {
-      if (!n1.get(i).equals(n2.get(i))) {
-        start = i;
-        break;
-      }
-    }
-    if (start >= 0) {
-      for (int i = start; i < n2Count; i++) {
-        intersection.add(n2.get(i));
-      }
-    }
-    if (intersection.equals(n2)) return emptyList();
-    return unmodifiableList(intersection);
-  }
-
-}
