Don't keep packages in the default repository around after loading.

Previously, this would get thrown when referring to the same package
from both the main and default repositories:
java.lang.IllegalArgumentException: Multiple entries with same key: tools/cpp=/home/brian/971-Robot-Code and tools/cpp=/home/brian/971-Robot-Code
	at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:136)
	at com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:98)
	at com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:84)
	at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:295)
	at com.google.devtools.build.lib.buildtool.BuildTool.transformPackageRoots(BuildTool.java:301)
	at com.google.devtools.build.lib.buildtool.BuildTool.buildTargets(BuildTool.java:209)
	at com.google.devtools.build.lib.buildtool.BuildTool.processRequest(BuildTool.java:334)
	at com.google.devtools.build.lib.runtime.commands.TestCommand.doTest(TestCommand.java:119)
	at com.google.devtools.build.lib.runtime.commands.TestCommand.exec(TestCommand.java:104)
	at com.google.devtools.build.lib.runtime.BlazeCommandDispatcher.exec(BlazeCommandDispatcher.java:371)
	at com.google.devtools.build.lib.runtime.BlazeRuntime$3.exec(BlazeRuntime.java:1016)
	at com.google.devtools.build.lib.server.RPCService.executeRequest(RPCService.java:65)
	at com.google.devtools.build.lib.server.RPCServer.executeRequest(RPCServer.java:434)
	at com.google.devtools.build.lib.server.RPCServer.serve(RPCServer.java:229)
	at com.google.devtools.build.lib.runtime.BlazeRuntime.serverMain(BlazeRuntime.java:975)
	at com.google.devtools.build.lib.runtime.BlazeRuntime.main(BlazeRuntime.java:772)
	at com.google.devtools.build.lib.bazel.BazelMain.main(BazelMain.java:55)

And this would get thrown for any packages in the main repository loaded
from other repositories:
java.lang.RuntimeException: Unrecoverable error while evaluating node 'PACKAGE:@//tools/build_rules/go/toolchain' (requested by nodes )
	at com.google.devtools.build.skyframe.ParallelEvaluator$Evaluate.run(ParallelEvaluator.java:982)
	at com.google.devtools.build.lib.concurrent.AbstractQueueVisitor$WrappedRunnable.run(AbstractQueueVisitor.java:499)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Invalid BUILD file name for package '@//tools/build_rules/go/toolchain': /home/brian/bazel/tools/build_rules/go/toolchain/BUILD
	at com.google.devtools.build.lib.packages.Package.finishInit(Package.java:299)
	at com.google.devtools.build.lib.packages.Package$Builder.finishBuild(Package.java:1308)
	at com.google.devtools.build.lib.skyframe.PackageFunction.compute(PackageFunction.java:501)
	at com.google.devtools.build.skyframe.ParallelEvaluator$Evaluate.run(ParallelEvaluator.java:933)
	... 4 more

Sponsor's comment: note the abundance of new Label.resolveRepositoryRelative() calls. They are ugly, but it's only making existing ugliness explicit. Yes, we should fix it, especially in the implementation of configurable attributes.

Refs #940

--
Change-Id: I8bd7f7b00bec58a7157507595421bc50c81b404c
Reviewed-on: https://bazel-review.googlesource.com/#/c/2591
MOS_MIGRATED_REVID=117429733
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
index 4509092..2642687 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
@@ -342,7 +342,7 @@
       return null;
     }
 
-    RepositoryName repoName = PackageIdentifier.DEFAULT_REPOSITORY_NAME;
+    RepositoryName repoName = PackageIdentifier.MAIN_REPOSITORY_NAME;
 
     Pair<RepositoryName, PathFragment> repo = RepositoryName.fromPathFragment(dir);
     if (repo != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
index b694cc6..780e881 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
@@ -386,11 +386,14 @@
         }
         try {
           if (attribute.getType() == BuildType.LABEL) {
-            Label label = BuildType.LABEL.cast(actualValue);
+            Label label = rule.getLabel().resolveRepositoryRelative(
+                BuildType.LABEL.cast(actualValue));
             builder.put(attribute, LabelAndConfiguration.of(label, actualConfig));
           } else if (attribute.getType() == BuildType.LABEL_LIST) {
             for (Label label : BuildType.LABEL_LIST.cast(actualValue)) {
-              builder.put(attribute, LabelAndConfiguration.of(label, actualConfig));
+              builder.put(attribute, LabelAndConfiguration.of(
+                  rule.getLabel().resolveRepositoryRelative(label),
+                  actualConfig));
             }
           } else {
             throw new IllegalStateException(
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
index 48a9fea..7c48f54 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
@@ -18,6 +18,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.AggregatingAttributeMapper;
 import com.google.devtools.build.lib.packages.Rule;
@@ -363,6 +364,14 @@
   // Resolve the label given by value into a file path.
   private SkylarkPath getPathFromLabel(Label label) throws EvalException {
     // Look for package.
+    if (label.getPackageIdentifier().getRepository().isDefault()) {
+      try {
+        label = Label.create(label.getPackageIdentifier().makeAbsolute(),
+            label.getName());
+      } catch (LabelSyntaxException e) {
+        throw new IllegalStateException(e);  // Can't happen because the input label is valid
+      }
+    }
     SkyKey pkgSkyKey = PackageLookupValue.key(label.getPackageIdentifier());
     PackageLookupValue pkgLookupValue = (PackageLookupValue) env.getValue(pkgSkyKey);
     if (pkgLookupValue == null) {
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
index b1bcffa..030e689 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
@@ -48,7 +48,7 @@
    * Package names that aren't made relative to the current repository because they mean special
    * things to Bazel.
    */
-  private static final ImmutableSet<PathFragment> ABSOLUTE_PACKAGE_NAMES = ImmutableSet.of(
+  public static final ImmutableSet<PathFragment> ABSOLUTE_PACKAGE_NAMES = ImmutableSet.of(
       // Used for select
       new PathFragment("conditions"),
       // dependencies that are a function of the configuration
@@ -59,7 +59,7 @@
       Label.EXTERNAL_PACKAGE_NAME);
 
   public static final PackageIdentifier EXTERNAL_PACKAGE_IDENTIFIER =
-      PackageIdentifier.createInDefaultRepo(EXTERNAL_PACKAGE_NAME);
+      PackageIdentifier.createInMainRepo(EXTERNAL_PACKAGE_NAME);
 
   public static final String EXTERNAL_PATH_PREFIX = "external";
 
@@ -71,9 +71,28 @@
    * {@literal @}foo//bar
    * {@literal @}foo//bar:baz
    * </pre>
+   *
+   * <p>Treats labels in the default repository as being in the main repository instead.
    */
   public static Label parseAbsolute(String absName) throws LabelSyntaxException {
-    String repo = PackageIdentifier.DEFAULT_REPOSITORY;
+    return parseAbsolute(absName, true);
+  }
+
+  /**
+   * Factory for Labels from absolute string form. e.g.
+   * <pre>
+   * //foo/bar
+   * //foo/bar:quux
+   * {@literal @}foo//bar
+   * {@literal @}foo//bar:baz
+   * </pre>
+   *
+   * @param defaultToMain Treat labels in the default repository as being in the main
+   *   one instead.
+   */
+  public static Label parseAbsolute(String absName, boolean defaultToMain)
+      throws LabelSyntaxException {
+    String repo = defaultToMain ? "@" : PackageIdentifier.DEFAULT_REPOSITORY;
     int packageStartPos = absName.indexOf("//");
     if (packageStartPos > 0) {
       repo = absName.substring(0, packageStartPos);
@@ -83,8 +102,12 @@
       LabelValidator.PackageAndTarget labelParts = LabelValidator.parseAbsoluteLabel(absName);
       PackageIdentifier pkgIdWithoutRepo =
           validate(labelParts.getPackageName(), labelParts.getTargetName());
+      PathFragment packageFragment = pkgIdWithoutRepo.getPackageFragment();
+      if (repo.isEmpty() && ABSOLUTE_PACKAGE_NAMES.contains(packageFragment)) {
+        repo = "@";
+      }
       return new Label(
-          PackageIdentifier.create(repo, pkgIdWithoutRepo.getPackageFragment()),
+          PackageIdentifier.create(repo, packageFragment),
           labelParts.getTargetName());
     } catch (BadLabelException e) {
       throw new LabelSyntaxException(e.getMessage());
@@ -98,14 +121,18 @@
    *
    * <p>Do not use this when the argument is not hard-wired.
    */
-  public static Label parseAbsoluteUnchecked(String absName) {
+  public static Label parseAbsoluteUnchecked(String absName, boolean defaultToMain) {
     try {
-      return parseAbsolute(absName);
+      return parseAbsolute(absName, defaultToMain);
     } catch (LabelSyntaxException e) {
       throw new IllegalArgumentException(e);
     }
   }
 
+  public static Label parseAbsoluteUnchecked(String absName) {
+    return parseAbsoluteUnchecked(absName, true);
+  }
+
   /**
    * Factory for Labels from separate components.
    *
@@ -243,7 +270,7 @@
   }
 
   private Object writeReplace() {
-    return new LabelSerializationProxy(toString());
+    return new LabelSerializationProxy(getUnambiguousCanonicalForm());
   }
 
   private void readObject(ObjectInputStream stream) throws InvalidObjectException {
@@ -322,7 +349,7 @@
   /**
    * Renders this label in canonical form.
    *
-   * <p>invariant: {@code parseAbsolute(x.toString()).equals(x)}
+   * <p>invariant: {@code parseAbsolute(x.toString(), false).equals(x)}
    */
   @Override
   public String toString() {
@@ -332,21 +359,46 @@
   /**
    * Renders this label in canonical form.
    *
-   * <p>invariant: {@code parseAbsolute(x.toString()).equals(x)}
+   * <p>invariant: {@code parseAbsolute(x.getCanonicalForm(), false).equals(x)}
    */
   public String getCanonicalForm() {
+    return getDefaultCanonicalForm();
+  }
+
+  public String getUnambiguousCanonicalForm() {
     return packageIdentifier.getRepository() + "//" + packageIdentifier.getPackageFragment()
         + ":" + name;
   }
 
   /**
+   * Renders this label in canonical form, except with labels in the main and default
+   * repositories conflated.
+   */
+  public String getDefaultCanonicalForm() {
+    String repository;
+    if (packageIdentifier.getRepository().isMain()) {
+      repository = "";
+    } else {
+      repository = packageIdentifier.getRepository().getName();
+    }
+    return repository + "//" + packageIdentifier.getPackageFragment()
+        + ":" + name;
+  }
+
+  /**
    * Renders this label in shorthand form.
    *
    * <p>Labels with canonical form {@code //foo/bar:bar} have the shorthand form {@code //foo/bar}.
    * All other labels have identical shorthand and canonical forms.
    */
   public String toShorthandString() {
-    return packageIdentifier.getRepository() + (getPackageFragment().getBaseName().equals(name)
+    String repository;
+    if (packageIdentifier.getRepository().isMain()) {
+      repository = "";
+    } else {
+      repository = packageIdentifier.getRepository().getName();
+    }
+    return repository + (getPackageFragment().getBaseName().equals(name)
         ? "//" + getPackageFragment()
         : toString());
   }
@@ -391,7 +443,7 @@
     }
 
     if (LabelValidator.isAbsolute(relName)) {
-      return resolveRepositoryRelative(parseAbsolute(relName));
+      return resolveRepositoryRelative(parseAbsolute(relName, false));
     } else if (relName.equals(":")) {
       throw new LabelSyntaxException("':' is not a valid package-relative label");
     } else if (relName.charAt(0) == ':') {
@@ -407,11 +459,12 @@
    * <p>This is necessary so that dependency edges in remote repositories do not need to explicitly
    * mention their repository name. Otherwise, referring to e.g. <code>//a:b</code> in a remote
    * repository would point back to the main repository, which is usually not what is intended.
+   *
+   * <p>The return value will not be in the default repository.
    */
   public Label resolveRepositoryRelative(Label relative) {
     if (packageIdentifier.getRepository().isDefault()
-        || !relative.packageIdentifier.getRepository().isDefault()
-        || ABSOLUTE_PACKAGE_NAMES.contains(relative.getPackageIdentifier().getPackageFragment())) {
+        || !relative.packageIdentifier.getRepository().isDefault()) {
       return relative;
     } else {
       try {
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/LabelSerializationProxy.java b/src/main/java/com/google/devtools/build/lib/cmdline/LabelSerializationProxy.java
index 5d7e6d0..c28e185 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/LabelSerializationProxy.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/LabelSerializationProxy.java
@@ -44,6 +44,6 @@
   }
 
   private Object readResolve() {
-    return Label.parseAbsoluteUnchecked(labelString);
+    return Label.parseAbsoluteUnchecked(labelString, false);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
index 4c995eb..69fb31a 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
@@ -60,19 +60,22 @@
     }
   }
 
-  // Temporary factory for identifiers without explicit repositories.
-  // TODO(bazel-team): remove all usages of this.
+  /**
+   * This is only used by legacy callers. Actually creates the package identifier in the main
+   * repository, not the default one.
+   */
+  // TODO(lberki): Remove this method.
+  @Deprecated
   public static PackageIdentifier createInDefaultRepo(String name) {
-    return createInDefaultRepo(new PathFragment(name));
+    return create(MAIN_REPOSITORY_NAME, new PathFragment(name));
   }
 
-  public static PackageIdentifier createInDefaultRepo(PathFragment name) {
-    try {
-      return create(DEFAULT_REPOSITORY, name);
-    } catch (LabelSyntaxException e) {
-      throw new IllegalArgumentException("could not create package identifier for " + name
-          + ": " + e.getMessage());
-    }
+  public static PackageIdentifier createInMainRepo(String name) {
+    return createInMainRepo(new PathFragment(name));
+  }
+
+  public static PackageIdentifier createInMainRepo(PathFragment name) {
+    return create(MAIN_REPOSITORY_NAME, name);
   }
 
   /**
@@ -136,6 +139,14 @@
     return repository.getPathFragment().getRelative(pkgName);
   }
 
+  public PackageIdentifier makeAbsolute() {
+    if (!repository.isDefault()) {
+      return this;
+    }
+
+    return create(MAIN_REPOSITORY_NAME, pkgName);
+  }
+
   /**
    * Returns the name of this package.
    *
@@ -145,7 +156,7 @@
    */
   @Override
   public String toString() {
-    return (repository.isDefault() ? "" : repository + "//") + pkgName;
+    return (repository.isDefault() || repository.isMain() ? "" : repository + "//") + pkgName;
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java
index 6f5811d..9a4e5a7 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java
@@ -178,6 +178,13 @@
   }
 
   /**
+   * Returns if this is the default repository, that is, {@link #name} is "@".
+   */
+  public boolean isMain() {
+    return name.equals("@");
+  }
+
+  /**
    * Returns the repository name, with leading "{@literal @}" (or "" for the default repository).
    */
   // TODO(bazel-team): Use this over toString()- easier to track its usage.
@@ -189,7 +196,7 @@
    * Returns the path at which this repository is mapped within the exec root.
    */
   public PathFragment getPathFragment() {
-    return isDefault() || this.equals(PackageIdentifier.MAIN_REPOSITORY_NAME)
+    return isDefault() || isMain()
         ? PathFragment.EMPTY_FRAGMENT
         : new PathFragment(Label.EXTERNAL_PATH_PREFIX).getRelative(strippedName());
   }
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
index f8c1a83..c405efa 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
@@ -270,7 +270,7 @@
       Preconditions.checkArgument(excludedSubdirectories.isEmpty(),
           "Target pattern \"%s\" of type %s cannot be evaluated with excluded subdirectories: %s.",
           getOriginalPattern(), getType(), excludedSubdirectories);
-      if (resolver.isPackage(PackageIdentifier.createInDefaultRepo(path))) {
+      if (resolver.isPackage(PackageIdentifier.createInMainRepo(path))) {
         // User has specified a package name. lookout for default target.
         callback.process(resolver.getExplicitTarget(label("//" + path)).getTargets());
       } else {
@@ -281,7 +281,7 @@
         // first BUILD file is found (i.e. longest prefix match).
         for (int i = pieces.size() - 1; i > 0; i--) {
           String packageName = SLASH_JOINER.join(pieces.subList(0, i));
-          if (resolver.isPackage(PackageIdentifier.createInDefaultRepo(packageName))) {
+          if (resolver.isPackage(PackageIdentifier.createInMainRepo(packageName))) {
             String targetName = SLASH_JOINER.join(pieces.subList(i, pieces.size()));
             callback.process(
                 resolver
@@ -304,7 +304,7 @@
     public PackageIdentifier getDirectory() {
       int lastSlashIndex = path.lastIndexOf('/');
       // The package name cannot be illegal because we verified it during target parsing
-      return PackageIdentifier.createInDefaultRepo(
+      return PackageIdentifier.createInMainRepo(
           lastSlashIndex < 0 ? "" : path.substring(0, lastSlashIndex));
     }
 
@@ -591,7 +591,7 @@
 
       String originalPattern = pattern;
       final boolean includesRepo = pattern.startsWith("@");
-      RepositoryName repository = PackageIdentifier.DEFAULT_REPOSITORY_NAME;
+      RepositoryName repository = null;
       if (includesRepo) {
         int pkgStart = pattern.indexOf("//");
         if (pkgStart < 0) {
@@ -638,6 +638,14 @@
             + "' should not end in a slash");
       }
 
+      if (repository == null) {
+        if (packagePart.startsWith(Label.EXTERNAL_PACKAGE_NAME.toString())) {
+          repository = PackageIdentifier.DEFAULT_REPOSITORY_NAME;
+        } else {
+          repository = PackageIdentifier.MAIN_REPOSITORY_NAME;
+        }
+      }
+
       if (packagePart.endsWith("/...")) {
         String realPackagePart = removeSuffix(packagePart, "/...");
         PackageIdentifier packageIdentifier;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
index 993113a..96a20fb 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
@@ -114,7 +114,7 @@
         for (Object value : visitAttribute(attribute.getName(), attribute.getType())) {
           if (value != null) {
             for (Label label : extractLabels(type, value)) {
-              observer.acceptLabelAttribute(label, attribute);
+              observer.acceptLabelAttribute(getLabel().resolveRepositoryRelative(label), attribute);
             }
           }
         }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
index 875d9dc..9d2af18 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
@@ -29,7 +29,6 @@
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -196,13 +195,15 @@
         continue;
       }
       if (aspectAttribute.getType() == BuildType.LABEL) {
-        Label label = BuildType.LABEL.cast(aspectAttribute.getDefaultValue(from));
+        Label label = from.getLabel().resolveRepositoryRelative(
+            BuildType.LABEL.cast(aspectAttribute.getDefaultValue(from)));
         if (label != null) {
           labelBuilder.put(aspectAttribute, label);
         }
       } else if (aspectAttribute.getType() == BuildType.LABEL_LIST) {
-        List<Label> labelList = BuildType.LABEL_LIST.cast(aspectAttribute.getDefaultValue(from));
-        labelBuilder.putAll(aspectAttribute, labelList);
+        for (Label label : BuildType.LABEL_LIST.cast(aspectAttribute.getDefaultValue(from))) {
+          labelBuilder.put(aspectAttribute, from.getLabel().resolveRepositoryRelative(label));
+        }
       }
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index 9181d76..d2f7090 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -699,7 +699,7 @@
                   inputFile.getName()));
         }
         if (license == null && pkgBuilder.getDefaultLicense() == License.NO_LICENSE
-            && pkgBuilder.getBuildFileLabel().toString().startsWith("//third_party/")) {
+            && RuleClass.isThirdPartyPackage(pkgBuilder.getPackageIdentifier())) {
           throw new EvalException(ast.getLocation(),
               "third-party file '" + inputFile.getName() + "' lacks a license declaration "
               + "with one of the following types: notice, reciprocal, permissive, "
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RelativePackageNameResolver.java b/src/main/java/com/google/devtools/build/lib/packages/RelativePackageNameResolver.java
index f7e3aed..144dc89 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RelativePackageNameResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RelativePackageNameResolver.java
@@ -58,7 +58,7 @@
       relativePkg = pkg.substring(2);
     } else if (pkg.startsWith("/")) {
       throw new InvalidPackageNameException(
-          PackageIdentifier.createInDefaultRepo(pkg),
+          PackageIdentifier.createInMainRepo(pkg),
           "package name cannot start with a single slash");
     } else {
       isAbsolute = false;
@@ -75,7 +75,7 @@
     result = result.normalize();
     if (result.containsUplevelReferences()) {
       throw new InvalidPackageNameException(
-          PackageIdentifier.createInDefaultRepo(pkg),
+          PackageIdentifier.createInMainRepo(pkg),
           "package name contains too many '..' segments");
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index 8064936..9accac3 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -30,6 +30,7 @@
 import com.google.common.collect.Ordering;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
+import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.BuildType.SelectorList;
@@ -103,6 +104,9 @@
 public final class RuleClass {
   public static final Function<? super Rule, Map<String, Label>> NO_EXTERNAL_BINDINGS =
         Functions.<Map<String, Label>>constant(ImmutableMap.<String, Label>of());
+
+  private static final PathFragment THIRD_PARTY_PREFIX = new PathFragment("third_party");
+
   /**
    * A constraint for the package name of the Rule instances.
    */
@@ -1540,7 +1544,7 @@
    */
   private static void checkThirdPartyRuleHasLicense(Rule rule,
       Package.Builder pkgBuilder, EventHandler eventHandler) {
-    if (rule.getLabel().getPackageName().startsWith("third_party/")) {
+    if (isThirdPartyPackage(rule.getLabel().getPackageIdentifier())) {
       License license = rule.getLicense();
       if (license == null) {
         license = pkgBuilder.getDefaultLicense();
@@ -1778,4 +1782,20 @@
   public boolean outputsDefaultExecutable() {
     return outputsDefaultExecutable;
   }
+
+  public static boolean isThirdPartyPackage(PackageIdentifier packageIdentifier) {
+    if (!packageIdentifier.getRepository().isMain()) {
+      return false;
+    }
+
+    if (!packageIdentifier.getPackageFragment().startsWith(THIRD_PARTY_PREFIX)) {
+      return false;
+    }
+
+    if (packageIdentifier.getPackageFragment().segmentCount() <= 1) {
+      return false;
+    }
+
+    return true;
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java
index a187ca9..ff4dff4 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java
@@ -17,6 +17,7 @@
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
@@ -186,4 +187,15 @@
     }
 
   }
+
+  public ImmutableSet<PackageIdentifier> getDeletedPackages() {
+    if (deletedPackages == null) {
+      return ImmutableSet.of();
+    }
+    ImmutableSet.Builder<PackageIdentifier> newDeletedPackages = ImmutableSet.builder();
+    for (PackageIdentifier pkg : deletedPackages) {
+      newDeletedPackages.add(pkg.makeAbsolute());
+    }
+    return newDeletedPackages.build();
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java b/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java
index 93a5e01..f00606d 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/PathPackageLocator.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.lib.pkgcache;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
 import com.google.common.base.Verify;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -98,9 +99,10 @@
    */
   public Path getPackageBuildFileNullable(PackageIdentifier packageIdentifier,
       AtomicReference<? extends UnixGlob.FilesystemCalls> cache)  {
-    if (packageIdentifier.getRepository().isDefault()) {
+    Preconditions.checkArgument(!packageIdentifier.getRepository().isDefault());
+    if (packageIdentifier.getRepository().isMain()) {
       return getFilePath(packageIdentifier.getPackageFragment().getRelative("BUILD"), cache);
-    } else if (!packageIdentifier.getRepository().isDefault()) {
+    } else {
       Verify.verify(outputBase != null, String.format(
           "External package '%s' needs to be loaded but this PathPackageLocator instance does not "
               + "support external packages", packageIdentifier));
@@ -116,8 +118,6 @@
       } else {
         return null;
       }
-    } else {
-      return null;
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/TargetPatternResolverUtil.java b/src/main/java/com/google/devtools/build/lib/pkgcache/TargetPatternResolverUtil.java
index 413eb1c..d00db1e 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/TargetPatternResolverUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/TargetPatternResolverUtil.java
@@ -60,7 +60,7 @@
     if (LabelValidator.validatePackageName(packageName) != null) {
       throw new TargetParsingException("'" + packageName + "' is not a valid package name");
     }
-    if (!resolver.isPackage(PackageIdentifier.createInDefaultRepo(packageName))) {
+    if (!resolver.isPackage(PackageIdentifier.createInMainRepo(packageName))) {
       throw new TargetParsingException(
           TargetPatternResolverUtil.getParsingErrorMessage(
               "no such package '" + packageName + "': BUILD file not found on package path",
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index f5186c8..3e96693 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -773,7 +773,7 @@
       Map<SkyKey, PathFragment> keys = new HashMap<>();
       for (PathFragment pathFragment : currentToOriginal.keySet()) {
         keys.put(
-            PackageLookupValue.key(PackageIdentifier.createInDefaultRepo(pathFragment)),
+            PackageLookupValue.key(PackageIdentifier.createInMainRepo(pathFragment)),
             pathFragment);
       }
       Map<SkyKey, SkyValue> lookupValues = graph.getSuccessfulValues(keys.keySet());
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
index a4cc45d..4949acd 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
@@ -229,7 +229,7 @@
               out.print(target.getTargetKind());
               out.print(' ');
             }
-            out.println(target.getLabel());
+            out.println(target.getLabel().getDefaultCanonicalForm());
           }
         }
       };
@@ -306,7 +306,8 @@
             throws IOException, InterruptedException {
           for (Target target : partialResult) {
             Location location = target.getLocation();
-            out.println(location.print() + ": " + target.getTargetKind() + " " + target.getLabel());
+            out.println(location.print() + ": " + target.getTargetKind()
+                + " " + target.getLabel().getDefaultCanonicalForm());
           }
         }
       };
@@ -348,7 +349,7 @@
             Object value = Iterables.getOnlyElement(values.first);
             out.printf("  %s = ", attr.getPublicName());
             if (value instanceof Label) {
-              value = value.toString();
+              value = ((Label) value).getDefaultCanonicalForm();
             } else if (value instanceof List<?> && EvalUtils.isImmutable(value)) {
               // Display it as a list (and not as a tuple). Attributes can never be tuples.
               value = new ArrayList<>((List<?>) value);
@@ -398,7 +399,7 @@
 
     @Override
     public String toString() {
-      return rank + " " + label;
+      return rank + " " + label.getDefaultCanonicalForm();
     }
   }
 
@@ -423,7 +424,7 @@
       if (toSave != null) {
         toSave.add(new RankAndLabel(rank, label));
       } else {
-        out.println(rank + " " + label);
+        out.println(rank + " " + label.getDefaultCanonicalForm());
       }
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
index 339592e..38f73c1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
@@ -170,7 +170,7 @@
     @Override
     public Label load(String from) throws Exception {
       try {
-        return Label.parseAbsolute(from);
+        return Label.parseAbsolute(from, false);
       } catch (LabelSyntaxException e) {
         throw new Exception(from);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
index 81fc573..65a300c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
@@ -629,7 +629,8 @@
     }
     if (targetLabel != null) {
       result.add("--target_label");
-      if (targetLabel.getPackageIdentifier().getRepository().isDefault()) {
+      if (targetLabel.getPackageIdentifier().getRepository().isDefault()
+          || targetLabel.getPackageIdentifier().getRepository().isMain()) {
         result.add(targetLabel.toString());
       } else {
         // @-prefixed strings will be assumed to be filenames and expanded by
@@ -677,6 +678,7 @@
       Label label = getTargetName(jar);
       builder.add(
           label.getPackageIdentifier().getRepository().isDefault()
+              || label.getPackageIdentifier().getRepository().isMain()
               ? label.toString()
               // Escape '@' prefix for .params file.
               : "@" + label);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java
index 02b2a34..787fb7f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileActionBuilder.java
@@ -315,7 +315,8 @@
     }
     if (targetLabel != null) {
       result.add("--target_label");
-      if (targetLabel.getPackageIdentifier().getRepository().isDefault()) {
+      if (targetLabel.getPackageIdentifier().getRepository().isDefault()
+          || targetLabel.getPackageIdentifier().getRepository().isMain()) {
         result.add(targetLabel.toString());
       } else {
         // @-prefixed strings will be assumed to be params filenames and expanded,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java
index 4ed2341..baae555 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java
@@ -513,7 +513,7 @@
 
   private static String xcodeTargetName(Label label, String labelSuffix) {
     String pathFromWorkspaceRoot = label + labelSuffix;
-    if (label.getPackageIdentifier().getRepository().isDefault()) {
+    if (label.getPackageIdentifier().getRepository().isMain()) {
       pathFromWorkspaceRoot = pathFromWorkspaceRoot.replace("//", "")
           .replace(':', '/');
     } else {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
index c143581..8b37d9f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
@@ -274,7 +274,7 @@
             path.getParentDirectory(), "Must pass in files, not root directory");
         Preconditions.checkArgument(!parent.isAbsolute(), path);
         SkyKey depKey =
-            ContainingPackageLookupValue.key(PackageIdentifier.createInDefaultRepo(parent));
+            ContainingPackageLookupValue.key(PackageIdentifier.createInMainRepo(parent));
         depKeys.put(path, depKey);
         keysRequested.add(depKey);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java
index ffee11c..0405f63 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java
@@ -39,6 +39,7 @@
 
   public static SkyKey key(PackageIdentifier id) {
     Preconditions.checkArgument(!id.getPackageFragment().isAbsolute(), id);
+    Preconditions.checkArgument(!id.getRepository().isDefault(), id);
     return SkyKey.create(SkyFunctions.CONTAINING_PACKAGE_LOOKUP, id);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
index 8045c59..92888d2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
@@ -120,7 +120,7 @@
     }
 
     List<Path> roots = new ArrayList<>();
-    if (repository.isDefault()) {
+    if (repository.isMain()) {
       roots.addAll(packageLocator.getPathEntries());
     } else {
       RepositoryDirectoryValue repositoryValue =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
index 5703c42..a306f4fe 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
@@ -171,7 +171,7 @@
     }
 
     List<Path> roots = new ArrayList<>();
-    if (repository.isDefault()) {
+    if (repository.isMain()) {
       roots.addAll(pkgPath.getPathEntries());
     } else {
       RepositoryDirectoryValue repositoryValue =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 4021049..90aee2d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -569,6 +569,8 @@
       Environment env,
       SkylarkImportLookupFunction skylarkImportLookupFunctionForInlining)
       throws PackageFunctionException, InterruptedException {
+    Preconditions.checkArgument(!packageId.getRepository().isDefault());
+
     ImmutableList<SkylarkImport> imports = buildFileAST.getImports();
     Map<String, Extension> importMap = Maps.newHashMapWithExpectedSize(imports.size());
     ImmutableList.Builder<SkylarkFileDependency> fileDependencies = ImmutableList.builder();
@@ -803,7 +805,7 @@
               - label.getPackageFragment().segmentCount(),
           labelNameFragment.segmentCount());
       message += " (perhaps you meant to put the colon here: '";
-      if (containingPkg.getRepository().isDefault()) {
+      if (containingPkg.getRepository().isDefault() || containingPkg.getRepository().isMain()) {
         message += "//";
       }
       message += containingPkg + ":" + labelNameInContainingPackage + "'?)";
@@ -1245,7 +1247,7 @@
   }
 
   static boolean isDefaultsPackage(PackageIdentifier packageIdentifier) {
-    return packageIdentifier.getRepository().isDefault()
+    return packageIdentifier.getRepository().isMain()
         && packageIdentifier.getPackageFragment().equals(DEFAULTS_PACKAGE_NAME);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
index 9a53dd3..e4d9dd5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
@@ -54,8 +54,7 @@
       return PackageLookupValue.success(pkgLocator.getPathEntries().get(0));
     }
 
-    if (!packageKey.getRepository().equals(PackageIdentifier.MAIN_REPOSITORY_NAME)
-        && !packageKey.getRepository().isDefault()) {
+    if (!packageKey.getRepository().isMain()) {
       return computeExternalPackageLookupValue(skyKey, env, packageKey);
     } else if (packageKey.equals(Label.EXTERNAL_PACKAGE_IDENTIFIER)) {
       return computeWorkspaceLookupValue(env, packageKey);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java
index 9460b85..e9d5bf5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java
@@ -93,10 +93,11 @@
 
   static SkyKey key(PathFragment directory) {
     Preconditions.checkArgument(!directory.isAbsolute(), directory);
-    return key(PackageIdentifier.createInDefaultRepo(directory));
+    return key(PackageIdentifier.createInMainRepo(directory));
   }
 
   public static SkyKey key(PackageIdentifier pkgIdentifier) {
+    Preconditions.checkArgument(!pkgIdentifier.getRepository().isDefault());
     return SkyKey.create(SkyFunctions.PACKAGE_LOOKUP, pkgIdentifier);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java
index 840a4c8..d637a7f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java
@@ -54,6 +54,7 @@
   }
 
   public static SkyKey key(PackageIdentifier pkgIdentifier) {
+    Preconditions.checkArgument(!pkgIdentifier.getRepository().isDefault());
     return SkyKey.create(SkyFunctions.PACKAGE, pkgIdentifier);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java
index 2261b77..9caa115 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java
@@ -223,7 +223,7 @@
           rulesOnly ? FilteringPolicies.RULES_ONLY : FilteringPolicies.NO_FILTER;
       PathFragment pathFragment = TargetPatternResolverUtil.getPathFragment(directory);
       List<Path> roots = new ArrayList<>();
-      if (repository.isDefault()) {
+      if (repository.isMain()) {
         roots.addAll(pkgPath.getPathEntries());
       } else {
         RepositoryDirectoryValue repositoryValue =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java
index ce9a912..a32e88b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java
@@ -152,7 +152,7 @@
     PackageIdentifier packageId = PackageIdentifier.create(
         recursivePkgKey.getRepository(), rootRelativePath);
 
-    if (packageId.getRepository().isDefault()
+    if ((packageId.getRepository().isDefault() || packageId.getRepository().isMain())
       && fileValue.isSymlink()
       && fileValue.getUnresolvedLinkTarget().startsWith(directories.getOutputBase().asFragment())) {
       // Symlinks back to the output base are not traversed so that we avoid convenience symlinks.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java
index b318519..9bec1ee 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java
@@ -85,6 +85,7 @@
         ImmutableSet<PathFragment> excludedPaths) {
       PathFragment.checkAllPathsAreUnder(excludedPaths,
           rootedPath.getRelativePath());
+      Preconditions.checkState(!repositoryName.isDefault());
       this.repositoryName = repositoryName;
       this.rootedPath = Preconditions.checkNotNull(rootedPath);
       this.excludedPaths = Preconditions.checkNotNull(excludedPaths);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index f4ece81..b948490 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -710,7 +710,7 @@
           execPath.getParentDirectory(), "Must pass in files, not root directory");
       Preconditions.checkArgument(!parent.isAbsolute(), execPath);
       packageKeys.add(ContainingPackageLookupValue.key(
-          PackageIdentifier.createInDefaultRepo(parent)));
+          PackageIdentifier.createInMainRepo(parent)));
     }
 
     EvaluationResult<ContainingPackageLookupValue> result;
@@ -736,7 +736,7 @@
     Map<PathFragment, Root> roots = new HashMap<>();
     for (PathFragment execPath : execPaths) {
       ContainingPackageLookupValue value = result.get(ContainingPackageLookupValue.key(
-          PackageIdentifier.createInDefaultRepo(execPath.getParentDirectory())));
+          PackageIdentifier.createInMainRepo(execPath.getParentDirectory())));
       if (value.hasContainingPackage()) {
         roots.put(execPath, Root.asSourceRoot(value.getContainingPackageRoot()));
       } else {
@@ -1552,6 +1552,8 @@
      * Returns whether the given package should be consider deleted and thus should be ignored.
      */
     public boolean isPackageDeleted(PackageIdentifier packageName) {
+      Preconditions.checkState(!packageName.getRepository().isDefault(),
+          "package must be absolute: %s", packageName);
       return deletedPackages.get().contains(packageName);
     }
 
@@ -1586,7 +1588,7 @@
             workingDirectory),
         packageCacheOptions.defaultVisibility, packageCacheOptions.showLoadingProgress,
         packageCacheOptions.globbingThreads, defaultsPackageContents, commandId);
-    setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.deletedPackages));
+    setDeletedPackages(packageCacheOptions.getDeletedPackages());
 
     incrementalBuildMonitor = new SkyframeIncrementalBuildMonitor();
     invalidateTransientErrors();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
index 2b1f76c..47ee3ef 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
@@ -232,7 +232,7 @@
     for (PathFragment importPath : pathsToLookup) {
       PathFragment relativeImportPath = importPath.toRelative();
       PackageIdentifier pkgToLookUp =
-          PackageIdentifier.createInDefaultRepo(relativeImportPath.getParentDirectory());
+          PackageIdentifier.createInMainRepo(relativeImportPath.getParentDirectory());
       lookupMap.put(ContainingPackageLookupValue.key(pkgToLookUp), importPath);
     }
 
@@ -303,6 +303,8 @@
   static ImmutableMap<String, Label> findLabelsForLoadStatements(
       ImmutableCollection<SkylarkImport> imports, Label containingFileLabel, Environment env)
           throws SkylarkImportFailedException {
+    Preconditions.checkArgument(
+        !containingFileLabel.getPackageIdentifier().getRepository().isDefault());
     Map<String, Label> outputMap = Maps.newHashMapWithExpectedSize(imports.size());
 
     // Filter relative vs. absolute paths.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java
index 2fbaf10..201e8fc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java
@@ -69,6 +69,7 @@
 
     public SkylarkImportLookupKey(Label importLabel, boolean inWorkspace) {
       Preconditions.checkNotNull(importLabel);
+      Preconditions.checkArgument(!importLabel.getPackageIdentifier().getRepository().isDefault());
       this.importLabel = importLabel;
       this.inWorkspace = inWorkspace;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java
index 9c39849..f1aa03d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java
@@ -16,6 +16,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 
@@ -45,6 +46,7 @@
 
   @ThreadSafe
   public static SkyKey key(Label label) {
+    Preconditions.checkArgument(!label.getPackageIdentifier().getRepository().isDefault());
     return SkyKey.create(SkyFunctions.TARGET_MARKER, label);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java
index d8e9b26..6fb4fcf 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.packages.NoSuchTargetException;
+import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 
@@ -170,6 +171,7 @@
 
   @ThreadSafe
   public static SkyKey key(Label label) {
+    Preconditions.checkArgument(!label.getPackageIdentifier().getRepository().isDefault());
     return SkyKey.create(SkyFunctions.TRANSITIVE_TARGET, label);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
index 59252d8..2070ff2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
@@ -125,6 +125,7 @@
 
   @ThreadSafe
   public static SkyKey key(Label label) {
+    Preconditions.checkArgument(!label.getPackageIdentifier().getRepository().isDefault());
     return SkyKey.create(SkyFunctions.TRANSITIVE_TRAVERSAL, label);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
index 8536558..ea6f4dc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
@@ -16,7 +16,7 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
-import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.packages.Package.LegacyBuilder;
 import com.google.devtools.build.lib.packages.Package.NameConflictException;
@@ -44,6 +44,7 @@
   private final PackageFactory packageFactory;
   private final BlazeDirectories directories;
   private final RuleClassProvider ruleClassProvider;
+  private static final PackageIdentifier rootPackage = PackageIdentifier.createInMainRepo("");
 
   public WorkspaceFileFunction(
       RuleClassProvider ruleClassProvider,
@@ -105,7 +106,7 @@
       BuildFileAST ast = workspaceASTValue.getASTs().get(key.getIndex());
       PackageFunction.SkylarkImportResult importResult =
           PackageFunction.fetchImportsFromBuildFile(
-              repoWorkspace, Label.EXTERNAL_PACKAGE_IDENTIFIER, ast, env, null);
+              repoWorkspace, rootPackage, ast, env, null);
       if (importResult == null) {
         return null;
       }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImports.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImports.java
index 2edd38f..8a1bb7e 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImports.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImports.java
@@ -210,7 +210,7 @@
       // Absolute label.
       Label importLabel;
       try {
-        importLabel = Label.parseAbsolute(importString);
+        importLabel = Label.parseAbsolute(importString, false);
       } catch (LabelSyntaxException e) {
         throw new SkylarkImportSyntaxException(INVALID_LABEL_PREFIX + e.getMessage());
       }
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java b/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java
index 2e491b1..ec8c39b 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java
@@ -79,11 +79,11 @@
     outRoot = Root.asDerivedRoot(execRoot, execRoot.getRelative("out-root/x/bin"));
 
     fooPath = new PathFragment("foo");
-    fooPackage = PackageIdentifier.createInDefaultRepo(fooPath);
+    fooPackage = PackageIdentifier.createInMainRepo(fooPath);
     fooRelative = fooPath.getRelative("foosource.txt");
 
     barPath = new PathFragment("foo/bar");
-    barPackage = PackageIdentifier.createInDefaultRepo(barPath);
+    barPackage = PackageIdentifier.createInMainRepo(barPath);
     barRelative = barPath.getRelative("barsource.txt");
 
     alienPath = new PathFragment("external/alien");
@@ -152,7 +152,7 @@
     // We need a package in the root directory to make every exec path (even one with up-level
     // references) be in a package.
     Map<PackageIdentifier, Root> packageRoots = ImmutableMap.of(
-        PackageIdentifier.createInDefaultRepo(new PathFragment("")), clientRoot);
+        PackageIdentifier.createInMainRepo(new PathFragment("")), clientRoot);
     artifactFactory.setPackageRoots(packageRoots);
     PathFragment outsideWorkspace = new PathFragment("../foo");
     PathFragment insideWorkspace =
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
index d4f2801..f5ac38c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
@@ -326,7 +326,7 @@
     NestedSet<ExtraActionArtifactsProvider.ExtraArtifactSet> extraActionArtifacts =
         a.getProvider(ExtraActionArtifactsProvider.class)
             .getTransitiveExtraActionArtifacts();
-    assertThat(getOnlyElement(extraActionArtifacts).getLabel()).isEqualTo(Label.create("a", "b"));
+    assertThat(getOnlyElement(extraActionArtifacts).getLabel()).isEqualTo(Label.create("@//a", "b"));
 
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/LabelExpanderTest.java b/src/test/java/com/google/devtools/build/lib/analysis/LabelExpanderTest.java
index 61335a0..bda0f7a 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/LabelExpanderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/LabelExpanderTest.java
@@ -97,7 +97,7 @@
    * Creates fake label in package "foo".
    */
   private static Label labelFor(String targetName) throws LabelSyntaxException {
-    return Label.create("foo", targetName);
+    return Label.create("@//foo", targetName);
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/select/AggregatingAttributeMapperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/select/AggregatingAttributeMapperTest.java
index f4370c8..4aafb58 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/select/AggregatingAttributeMapperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/select/AggregatingAttributeMapperTest.java
@@ -53,7 +53,7 @@
         "sh_binary(name = 'myrule',",
         "          srcs = ['a.sh'])");
     assertThat(AggregatingAttributeMapper.of(rule).visitAttribute("srcs", BuildType.LABEL_LIST))
-        .containsExactlyElementsIn(ImmutableList.of(ImmutableList.of(Label.create("a", "a.sh"))));
+        .containsExactlyElementsIn(ImmutableList.of(ImmutableList.of(Label.create("@//a", "a.sh"))));
   }
 
   /**
@@ -72,9 +72,9 @@
     assertThat(AggregatingAttributeMapper.of(rule).visitAttribute("srcs", BuildType.LABEL_LIST))
         .containsExactlyElementsIn(
             ImmutableList.of(
-                ImmutableList.of(Label.create("a", "a.sh")),
-                ImmutableList.of(Label.create("a", "b.sh")),
-                ImmutableList.of(Label.create("a", "default.sh"))));
+                ImmutableList.of(Label.create("@//a", "a.sh")),
+                ImmutableList.of(Label.create("@//a", "b.sh")),
+                ImmutableList.of(Label.create("@//a", "default.sh"))));
   }
 
   @Test
@@ -91,10 +91,10 @@
     assertThat(AggregatingAttributeMapper.of(rule).visitAttribute("srcs", BuildType.LABEL_LIST))
         .containsExactlyElementsIn(
             ImmutableList.of(
-                ImmutableList.of(Label.create("a", "a1.sh"), Label.create("a", "a2.sh")),
-                ImmutableList.of(Label.create("a", "a1.sh"), Label.create("a", "b2.sh")),
-                ImmutableList.of(Label.create("a", "b1.sh"), Label.create("a", "a2.sh")),
-                ImmutableList.of(Label.create("a", "b1.sh"), Label.create("a", "b2.sh"))));
+                ImmutableList.of(Label.create("@//a", "a1.sh"), Label.create("@//a", "a2.sh")),
+                ImmutableList.of(Label.create("@//a", "a1.sh"), Label.create("@//a", "b2.sh")),
+                ImmutableList.of(Label.create("@//a", "b1.sh"), Label.create("@//a", "a2.sh")),
+                ImmutableList.of(Label.create("@//a", "b1.sh"), Label.create("@//a", "b2.sh"))));
   }
 
   /**
@@ -156,11 +156,12 @@
         "    }))");
 
     ImmutableList<Label> valueLabels = ImmutableList.of(
-        Label.create("x", "a.cc"), Label.create("x", "b.cc"), Label.create("x", "always.cc"),
-        Label.create("x", "c.cc"), Label.create("x", "d.cc"), Label.create("x", "default.cc"));
+        Label.create("@//x", "a.cc"), Label.create("@//x", "b.cc"),
+        Label.create("@//x", "always.cc"), Label.create("@//x", "c.cc"),
+        Label.create("@//x", "d.cc"), Label.create("@//x", "default.cc"));
     ImmutableList<Label> keyLabels = ImmutableList.of(
-        Label.create("conditions", "a"), Label.create("conditions", "b"),
-        Label.create("conditions", "c"), Label.create("conditions", "d"));
+        Label.create("@//conditions", "a"), Label.create("@//conditions", "b"),
+        Label.create("@//conditions", "c"), Label.create("@//conditions", "d"));
 
     AggregatingAttributeMapper mapper = AggregatingAttributeMapper.of(rule);
     assertThat(mapper.getReachableLabels("srcs", true))
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/select/RawAttributeMapperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/select/RawAttributeMapperTest.java
index 0d9c761..b0d4354 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/select/RawAttributeMapperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/select/RawAttributeMapperTest.java
@@ -64,7 +64,8 @@
     RawAttributeMapper rawMapper = RawAttributeMapper.of(setupGenRule());
     List<Label> value = rawMapper.get("data", BuildType.LABEL_LIST);
     assertNotNull(value);
-    assertThat(value).containsExactly(Label.create("x", "data_a"), Label.create("x", "data_b"));
+    assertThat(value).containsExactly(
+        Label.create("@//x", "data_a"), Label.create("@//x", "data_b"));
 
     // Configurable attribute: trying to directly access from a RawAttributeMapper throws a
     // type mismatch exception.
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 70d6821..c2b8333 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -124,6 +124,7 @@
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutor;
 import com.google.devtools.build.lib.skyframe.SkyValueDirtinessChecker;
+import com.google.devtools.build.lib.testutil.BlazeTestUtils;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
@@ -311,7 +312,7 @@
         packageCacheOptions.defaultVisibility, true,
         7, ruleClassProvider.getDefaultsPackageContent(optionsParser),
         UUID.randomUUID());
-    skyframeExecutor.setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.deletedPackages));
+    skyframeExecutor.setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.getDeletedPackages()));
   }
 
   protected void setPackageCacheOptions(String... options) throws Exception {
@@ -377,7 +378,7 @@
     view.setConfigurationsForTesting(masterConfig);
 
     view.setArtifactRoots(
-        ImmutableMap.of(PackageIdentifier.createInDefaultRepo(""), rootDirectory), masterConfig);
+        ImmutableMap.of(PackageIdentifier.createInMainRepo(""), rootDirectory), masterConfig);
     simulateLoadingPhase();
   }
 
@@ -567,8 +568,8 @@
       Collection<Label> targets, Collection<Label> labels, boolean keepGoing)
           throws InterruptedException, NoSuchTargetException, NoSuchPackageException {
     boolean success = visitor.sync(reporter,
-        ImmutableSet.copyOf(getTargets(targets)),
-        ImmutableSet.copyOf(labels),
+        getTargets(BlazeTestUtils.convertLabels(targets)),
+        ImmutableSet.copyOf(BlazeTestUtils.convertLabels(labels)),
         keepGoing,
         /*parallelThreads=*/4,
         /*maxDepth=*/Integer.MAX_VALUE);
@@ -623,7 +624,8 @@
   protected ConfiguredTarget getConfiguredTarget(Label label, BuildConfiguration config)
       throws NoSuchPackageException, NoSuchTargetException, InterruptedException {
     ensureTargetsVisited(label);
-    return view.getConfiguredTargetForTesting(reporter, label, config);
+    return view.getConfiguredTargetForTesting(
+        reporter, BlazeTestUtils.convertLabel(label), config);
   }
 
   /**
@@ -1468,7 +1470,7 @@
     reporter.removeHandler(failFastHandler);
     scratch.file("" + packageName + "/BUILD", lines);
     return getPackageManager()
-        .getPackage(reporter, PackageIdentifier.createInDefaultRepo(packageName));
+        .getPackage(reporter, PackageIdentifier.createInMainRepo(packageName));
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
index cbb3bec..47dd0b1 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
@@ -181,7 +181,7 @@
 
     Label relative = base.getRelative("//conditions:default");
 
-    PackageIdentifier expected = PackageIdentifier.createInDefaultRepo("conditions");
+    PackageIdentifier expected = PackageIdentifier.createInMainRepo("conditions");
     assertEquals(expected.getRepository(), relative.getPackageIdentifier().getRepository());
     assertEquals(expected.getPackageFragment(), relative.getPackageFragment());
     assertEquals("default", relative.getName());
@@ -206,7 +206,7 @@
     Label mainBase = Label.parseAbsolute("@//foo/bar:baz");
     Label externalTarget = Label.parseAbsolute("//external:target");
     Label l = defaultBase.resolveRepositoryRelative(externalTarget);
-    assertTrue(l.getPackageIdentifier().getRepository().isDefault());
+    assertTrue(l.getPackageIdentifier().getRepository().isMain());
     assertEquals("external", l.getPackageName());
     assertEquals("target", l.getName());
     assertEquals(l, repoBase.resolveRepositoryRelative(externalTarget));
@@ -241,9 +241,9 @@
   @Test
   public void testToString() throws Exception {
     {
-      String s = "//foo/bar:baz";
+      String s = "@//foo/bar:baz";
       Label l = Label.parseAbsolute(s);
-      assertEquals(s, l.toString());
+      assertEquals("//foo/bar:baz", l.toString());
     }
     {
       Label l = Label.parseAbsolute("//foo/bar");
@@ -390,17 +390,17 @@
 
   @Test
   public void testSerializationSimple() throws Exception {
-    checkSerialization("//a", 92);
+    checkSerialization("//a", 93);
   }
 
   @Test
   public void testSerializationNested() throws Exception {
-    checkSerialization("//foo/bar:baz", 100);
+    checkSerialization("//foo/bar:baz", 101);
   }
 
   @Test
   public void testSerializationWithoutTargetName() throws Exception {
-    checkSerialization("//foo/bar", 100);
+    checkSerialization("//foo/bar", 101);
   }
 
   private void checkSerialization(String labelString, int expectedSize) throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java
index 2e43b80..a2a133c 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java
@@ -39,17 +39,21 @@
     PackageIdentifier fooA = PackageIdentifier.parse("@foo//a");
     assertThat(fooA.getRepository().strippedName()).isEqualTo("foo");
     assertThat(fooA.getPackageFragment().getPathString()).isEqualTo("a");
+    assertThat(fooA.getRepository().getPathFragment()).isEqualTo(
+        new PathFragment("external/foo"));
 
     PackageIdentifier absoluteA = PackageIdentifier.parse("//a");
     assertThat(absoluteA.getRepository().strippedName()).isEqualTo("");
-    assertThat(fooA.getPackageFragment().getPathString()).isEqualTo("a");
+    assertThat(absoluteA.getPackageFragment().getPathString()).isEqualTo("a");
 
     PackageIdentifier plainA = PackageIdentifier.parse("a");
     assertThat(plainA.getRepository().strippedName()).isEqualTo("");
-    assertThat(fooA.getPackageFragment().getPathString()).isEqualTo("a");
+    assertThat(plainA.getPackageFragment().getPathString()).isEqualTo("a");
 
     PackageIdentifier mainA = PackageIdentifier.parse("@//a");
     assertThat(mainA.getRepository()).isEqualTo(PackageIdentifier.MAIN_REPOSITORY_NAME);
+    assertThat(mainA.getPackageFragment().getPathString()).isEqualTo("a");
+    assertThat(mainA.getRepository().getPathFragment()).isEqualTo(PathFragment.EMPTY_FRAGMENT);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java b/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
index ad3df44..a5754a4 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
@@ -106,9 +106,9 @@
     assertEquals(BuildType.LABEL, selector.getOriginalType());
 
     Map<Label, Label> expectedMap = ImmutableMap.of(
-        Label.parseAbsolute("//conditions:a"), Label.create("a", "a"),
-        Label.parseAbsolute("//conditions:b"), Label.create("b", "b"),
-        Label.parseAbsolute(BuildType.Selector.DEFAULT_CONDITION_KEY), Label.create("d", "d"));
+        Label.parseAbsolute("//conditions:a"), Label.create("@//a", "a"),
+        Label.parseAbsolute("//conditions:b"), Label.create("@//b", "b"),
+        Label.parseAbsolute(BuildType.Selector.DEFAULT_CONDITION_KEY), Label.create("@//d", "d"));
     assertThat(selector.getEntries().entrySet()).containsExactlyElementsIn(expectedMap.entrySet());
   }
 
@@ -156,7 +156,7 @@
         "//conditions:b", "//b:b",
         BuildType.Selector.DEFAULT_CONDITION_KEY, "//d:d");
     assertEquals(
-        Label.create("d", "d"),
+        Label.create("@//d", "d"),
         new Selector<Label>(input, null, currentRule, BuildType.LABEL).getDefault());
   }
 
@@ -179,15 +179,15 @@
     List<Selector<List<Label>>> selectors = selectorList.getSelectors();
     assertThat(selectors.get(0).getEntries().entrySet())
         .containsExactlyElementsIn(
-            ImmutableMap.of(
-                    Label.parseAbsolute("//conditions:a"), ImmutableList.of(Label.create("a", "a")),
-                    Label.parseAbsolute("//conditions:b"), ImmutableList.of(Label.create("b", "b")))
+            ImmutableMap.of(Label.parseAbsolute("//conditions:a"),
+            ImmutableList.of(Label.create("@//a", "a")), Label.parseAbsolute("//conditions:b"),
+            ImmutableList.of(Label.create("@//b", "b")))
                 .entrySet());
     assertThat(selectors.get(1).getEntries().entrySet())
         .containsExactlyElementsIn(
             ImmutableMap.of(
-                    Label.parseAbsolute("//conditions:c"), ImmutableList.of(Label.create("c", "c")),
-                    Label.parseAbsolute("//conditions:d"), ImmutableList.of(Label.create("d", "d")))
+                Label.parseAbsolute("//conditions:c"), ImmutableList.of(Label.create("@//c", "c")),
+                Label.parseAbsolute("//conditions:d"), ImmutableList.of(Label.create("@//d", "d")))
                 .entrySet());
   }
 
@@ -218,7 +218,8 @@
         SelectorList.of(new SelectorValue(ImmutableMap.of(
             "//conditions:a", nativeInput,
             BuildType.Selector.DEFAULT_CONDITION_KEY, nativeInput)));
-    List<Label> expectedLabels = ImmutableList.of(Label.create("a", "a1"), Label.create("a", "a2"));
+    List<Label> expectedLabels =
+        ImmutableList.of(Label.create("@//a", "a1"), Label.create("@//a", "a2"));
 
     // Conversion to direct type:
     Object converted = BuildType
diff --git a/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java b/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java
index 7b8cbe8..771322a 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java
@@ -57,7 +57,7 @@
     PackageFactory pkgFactory = new PackageFactory(TestRuleClassProvider.getRuleClassProvider());
     pkg =
         pkgFactory.createPackageForTesting(
-            PackageIdentifier.createInDefaultRepo("pkg"), buildfile, getPackageManager(), reporter);
+            PackageIdentifier.createInMainRepo("pkg"), buildfile, getPackageManager(), reporter);
 
     group = (EnvironmentGroup) pkg.getTarget("group");
   }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java b/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java
index d744b42..62f5ca1 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java
@@ -92,7 +92,7 @@
     scratch.file("isolated/sub/sub.js",
         "# this is sub/sub.js");
 
-    cache = new GlobCache(packageDirectory, PackageIdentifier.createInDefaultRepo("isolated"),
+    cache = new GlobCache(packageDirectory, PackageIdentifier.createInMainRepo("isolated"),
         new CachingPackageLocator() {
       @Override
       public Path getBuildFileForPackage(PackageIdentifier packageId) {
diff --git a/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java b/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java
index d32a5a1..7401c16 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java
@@ -47,7 +47,7 @@
             "        outs=['x', 'subdir/y'])");
     this.pkg =
         packageFactory.createPackageForTesting(
-            PackageIdentifier.createInDefaultRepo("pkg"), buildfile, getPackageManager(), reporter);
+            PackageIdentifier.createInMainRepo("pkg"), buildfile, getPackageManager(), reporter);
     assertNoEvents();
 
     this.rule = (Rule) pkg.getTarget("foo");
@@ -120,7 +120,7 @@
 
     reporter.removeHandler(failFastHandler);
     packageFactory.createPackageForTesting(
-        PackageIdentifier.createInDefaultRepo("two_outs"),
+        PackageIdentifier.createInMainRepo("two_outs"),
         buildfile,
         getPackageManager(),
         reporter);
@@ -144,7 +144,7 @@
 
     reporter.removeHandler(failFastHandler);
     packageFactory.createPackageForTesting(
-        PackageIdentifier.createInDefaultRepo("out_is_rule"),
+        PackageIdentifier.createInMainRepo("out_is_rule"),
         buildfile,
         getPackageManager(),
         reporter);
@@ -162,7 +162,7 @@
 
     reporter.removeHandler(failFastHandler);
     packageFactory.createPackageForTesting(
-        PackageIdentifier.createInDefaultRepo("two_outs"),
+        PackageIdentifier.createInMainRepo("two_outs"),
         buildfile,
         getPackageManager(),
         reporter);
@@ -182,7 +182,7 @@
 
     reporter.removeHandler(failFastHandler);
     packageFactory.createPackageForTesting(
-        PackageIdentifier.createInDefaultRepo("bad_out_name"),
+        PackageIdentifier.createInMainRepo("bad_out_name"),
         buildfile,
         getPackageManager(),
         reporter);
@@ -200,7 +200,7 @@
 
     reporter.removeHandler(failFastHandler);
     packageFactory.createPackageForTesting(
-        PackageIdentifier.createInDefaultRepo("cross_package_out"),
+        PackageIdentifier.createInMainRepo("cross_package_out"),
         buildfile,
         getPackageManager(),
         reporter);
@@ -218,7 +218,7 @@
 
     reporter.removeHandler(failFastHandler);
     packageFactory.createPackageForTesting(
-        PackageIdentifier.createInDefaultRepo("output_called_build"), buildfile,
+        PackageIdentifier.createInMainRepo("output_called_build"), buildfile,
         getPackageManager(), reporter);
     assertContainsEvent("generated file 'BUILD' in rule 'a' conflicts with existing source file");
   }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
index d9c175b..cefcf15 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
@@ -557,17 +557,14 @@
     List<Label> yesFiles = attributes(pkg.getRule("yes")).get("srcs", BuildType.LABEL_LIST);
     List<Label> noFiles = attributes(pkg.getRule("no")).get("srcs", BuildType.LABEL_LIST);
 
-    assertThat(
-            Lists.newArrayList(
-                Label.create("fruit", "data/apple"), Label.create("fruit", "data/pear")))
-        .containsExactlyElementsIn(yesFiles);
+    assertThat(yesFiles).containsExactly(
+        Label.parseAbsolute("@//fruit:data/apple"),
+        Label.parseAbsolute("@//fruit:data/pear"));
 
-    assertThat(
-            Lists.newArrayList(
-                Label.create("fruit", "data/apple"),
-                Label.create("fruit", "data/pear"),
-                Label.create("fruit", "data/berry")))
-        .containsExactlyElementsIn(noFiles);
+    assertThat(noFiles).containsExactly(
+        Label.parseAbsolute("@//fruit:data/apple"),
+        Label.parseAbsolute("@//fruit:data/pear"),
+        Label.parseAbsolute("@//fruit:data/berry"));
   }
 
   // TODO(bazel-team): This is really a test for GlobCache.
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
index 99390a6..93ca76a 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
@@ -206,7 +206,7 @@
 
   private static final int TEST_RULE_DEFINED_AT_LINE = 42;
 
-  private static final String TEST_RULE_LABEL = "//" + TEST_PACKAGE_NAME + ":" + TEST_RULE_NAME;
+  private static final String TEST_RULE_LABEL = "@//" + TEST_PACKAGE_NAME + ":" + TEST_RULE_NAME;
 
   private Path testBuildfilePath;
   private Location testRuleLocation;
@@ -219,7 +219,7 @@
   }
 
   private Package.Builder createDummyPackageBuilder() {
-    return new Builder(PackageIdentifier.createInDefaultRepo(TEST_PACKAGE_NAME), "TESTING")
+    return new Builder(PackageIdentifier.createInMainRepo(TEST_PACKAGE_NAME), "TESTING")
         .setFilename(testBuildfilePath)
         .setMakeEnv(new MakeEnvironment.Builder());
   }
@@ -309,16 +309,14 @@
       assertEquals(TEST_RULE_DEFINED_AT_LINE,
           event.getLocation().getStartLineAndColumn().getLine());
       assertEquals(testBuildfilePath.asFragment(), event.getLocation().getPath());
-      assertEquals(TEST_RULE_LABEL + ": " + expectedMessages.next(), event.getMessage());
+      assertEquals(TEST_RULE_LABEL.toString().substring(1)
+          + ": " + expectedMessages.next(), event.getMessage());
     }
 
     // Test basic rule properties:
-    assertEquals("ruleA",
-                 rule.getRuleClass());
-    assertEquals(TEST_RULE_NAME,
-                 rule.getName());
-    assertEquals(TEST_RULE_LABEL,
-                 rule.getLabel().toString());
+    assertEquals("ruleA", rule.getRuleClass());
+    assertEquals(TEST_RULE_NAME, rule.getName());
+    assertEquals(TEST_RULE_LABEL.substring(1), rule.getLabel().toString());
 
     // Test attribute access:
     AttributeMap attributes = RawAttributeMapper.of(rule);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
index 50a8b4b4..6c10d46 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
@@ -52,7 +52,7 @@
   public void testCreateRule() throws Exception {
     Path myPkgPath = scratch.resolve("/foo/workspace/mypkg/BUILD");
     Package.Builder pkgBuilder =
-        new Package.Builder(PackageIdentifier.createInDefaultRepo("mypkg"), "TESTING")
+        new Package.Builder(PackageIdentifier.createInMainRepo("mypkg"), "TESTING")
             .setFilename(myPkgPath)
             .setMakeEnv(new MakeEnvironment.Builder());
 
@@ -135,7 +135,7 @@
   public void testWorkspaceRuleFailsInBuildFile() throws Exception {
     Path myPkgPath = scratch.resolve("/foo/workspace/mypkg/BUILD");
     Package.Builder pkgBuilder =
-        new Package.Builder(PackageIdentifier.createInDefaultRepo("mypkg"), "TESTING")
+        new Package.Builder(PackageIdentifier.createInMainRepo("mypkg"), "TESTING")
             .setFilename(myPkgPath)
             .setMakeEnv(new MakeEnvironment.Builder());
 
@@ -201,7 +201,7 @@
   public void testOutputFileNotEqualDot() throws Exception {
     Path myPkgPath = scratch.resolve("/foo");
     Package.Builder pkgBuilder =
-        new Package.Builder(PackageIdentifier.createInDefaultRepo("mypkg"), "TESTING")
+        new Package.Builder(PackageIdentifier.createInMainRepo("mypkg"), "TESTING")
             .setFilename(myPkgPath)
             .setMakeEnv(new MakeEnvironment.Builder());
 
@@ -232,7 +232,7 @@
   public void testTestRules() throws Exception {
     Path myPkgPath = scratch.resolve("/foo/workspace/mypkg/BUILD");
     Package pkg =
-        new Package.Builder(PackageIdentifier.createInDefaultRepo("mypkg"), "TESTING")
+        new Package.Builder(PackageIdentifier.createInMainRepo("mypkg"), "TESTING")
             .setFilename(myPkgPath)
             .setMakeEnv(new MakeEnvironment.Builder())
             .build();
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
index ef3b268..d3c99a4 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
@@ -71,7 +71,7 @@
    * Parses and evaluates {@code buildFile} and returns the resulting {@link Package} instance.
    */
   public Package createPackage(String packageName, Path buildFile) throws Exception {
-    return createPackage(PackageIdentifier.createInDefaultRepo(packageName), buildFile,
+    return createPackage(PackageIdentifier.createInMainRepo(packageName), buildFile,
         eventHandler);
   }
 
@@ -107,7 +107,7 @@
    */
   public Pair<Package, GlobCache> evalAndReturnGlobCache(String packageName, Path buildFile,
       BuildFileAST buildFileAST) throws InterruptedException {
-    PackageIdentifier packageId = PackageIdentifier.createInDefaultRepo(packageName);
+    PackageIdentifier packageId = PackageIdentifier.createInMainRepo(packageName);
     GlobCache globCache =
         new GlobCache(
             buildFile.getParentDirectory(),
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
index 2d22718..800dc19 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
@@ -289,7 +289,7 @@
                 "java_library(name = 'mylib',",
                 "  srcs = 'java/A.java')");
         packages.createPackage(
-            PackageIdentifier.createInDefaultRepo("isolated"), buildFile, eventHandler);
+            PackageIdentifier.createInMainRepo("isolated"), buildFile, eventHandler);
         parsedOK = true;
       } catch (Exception e) {
         e.printStackTrace();
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
index f22bb27..a7aa9b5 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
@@ -152,7 +152,7 @@
         packageCacheOptions.defaultVisibility, true,
         7, ruleClassProvider.getDefaultsPackageContent(enforcedTestOptions),
         UUID.randomUUID());
-    skyframeExecutor.setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.deletedPackages));
+    skyframeExecutor.setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.getDeletedPackages()));
   }
 
   private PackageCacheOptions parsePackageCacheOptions(String... options) throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformerTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformerTest.java
index a59221d..0b7092f 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformerTest.java
@@ -116,19 +116,19 @@
   public void testCompileOneDep() throws Exception {
     writeSimpleExample();
     assertThat(parseListCompileOneDep("foo/foo1.cc"))
-        .containsExactlyElementsIn(labels("//foo:foo1"));
+        .containsExactlyElementsIn(labels("@//foo:foo1"));
     assertThat(parseListCompileOneDep("foo/foo1.h"))
-        .containsExactlyElementsIn(labels("//foo:foo1"));
+        .containsExactlyElementsIn(labels("@//foo:foo1"));
     assertThat(parseListCompileOneDep("foo:foo1.cc"))
-        .containsExactlyElementsIn(labels("//foo:foo1"));
+        .containsExactlyElementsIn(labels("@//foo:foo1"));
     assertThat(parseListCompileOneDep("//foo:foo1.cc"))
-        .containsExactlyElementsIn(labels("//foo:foo1"));
+        .containsExactlyElementsIn(labels("@//foo:foo1"));
     assertThat(parseListCompileOneDepRelative("//foo:foo1.cc"))
-        .containsExactlyElementsIn(labels("//foo:foo1"));
+        .containsExactlyElementsIn(labels("@//foo:foo1"));
     assertThat(parseListCompileOneDepRelative(":foo1.cc"))
-        .containsExactlyElementsIn(labels("//foo:foo1"));
+        .containsExactlyElementsIn(labels("@//foo:foo1"));
     assertThat(parseListCompileOneDepRelative("foo1.cc"))
-        .containsExactlyElementsIn(labels("//foo:foo1"));
+        .containsExactlyElementsIn(labels("@//foo:foo1"));
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
index 13705ec..b5856a1 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
@@ -109,7 +109,7 @@
         packageCacheOptions.defaultVisibility, true,
         7, ruleClassProvider.getDefaultsPackageContent(),
         UUID.randomUUID());
-    skyframeExecutor.setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.deletedPackages));
+    skyframeExecutor.setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.getDeletedPackages()));
   }
 
   private PackageCacheOptions parsePackageCacheOptions(String... options) throws Exception {
@@ -135,7 +135,7 @@
   private Package getPackage(String packageName)
       throws NoSuchPackageException, InterruptedException {
     return getPackageManager().getPackage(reporter,
-        PackageIdentifier.createInDefaultRepo(packageName));
+        PackageIdentifier.createInMainRepo(packageName));
   }
 
   private Target getTarget(Label label)
@@ -169,7 +169,7 @@
     assertEquals("/workspace/pkg1/BUILD",
                  pkg1.getFilename().toString());
     assertSame(pkg1, getPackageManager().getPackage(reporter,
-        PackageIdentifier.createInDefaultRepo("pkg1")));
+        PackageIdentifier.createInMainRepo("pkg1")));
   }
 
   @Test
@@ -532,13 +532,13 @@
         + "If so, use the --deleted_packages=c/d option)");
 
     assertTrue(getPackageManager().isPackage(
-        reporter, PackageIdentifier.createInDefaultRepo("c/d")));
+        reporter, PackageIdentifier.createInMainRepo("c/d")));
 
     setOptions("--deleted_packages=c/d");
     invalidatePackages();
 
     assertFalse(getPackageManager().isPackage(
-        reporter, PackageIdentifier.createInDefaultRepo("c/d")));
+        reporter, PackageIdentifier.createInMainRepo("c/d")));
 
     // c/d is no longer a subpackage--even though there's a BUILD file in the
     // second root:
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/PathPackageLocatorTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/PathPackageLocatorTest.java
index ccdd30e..47b696c 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/PathPackageLocatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/PathPackageLocatorTest.java
@@ -167,7 +167,7 @@
 
   private void checkFails(String packageName, String expectorError) {
     try {
-      getLocator().getPackageBuildFile(PackageIdentifier.createInDefaultRepo(packageName));
+      getLocator().getPackageBuildFile(PackageIdentifier.createInMainRepo(packageName));
       fail();
     } catch (NoSuchPackageException e) {
       assertThat(e).hasMessage(expectorError);
@@ -178,48 +178,48 @@
   public void testGetPackageBuildFile() throws Exception {
     AtomicReference<? extends UnixGlob.FilesystemCalls> cache = UnixGlob.DEFAULT_SYSCALLS_REF;
     assertEquals(buildFile_1A, locator.getPackageBuildFile(
-        PackageIdentifier.createInDefaultRepo("A")));
+        PackageIdentifier.createInMainRepo("A")));
     assertEquals(buildFile_1A, locator.getPackageBuildFileNullable(
-        PackageIdentifier.createInDefaultRepo("A"), cache));
+        PackageIdentifier.createInMainRepo("A"), cache));
     assertEquals(buildFile_1B, locator.getPackageBuildFile(
-        PackageIdentifier.createInDefaultRepo("B")));
+        PackageIdentifier.createInMainRepo("B")));
     assertEquals(buildFile_1B, locator.getPackageBuildFileNullable(
-        PackageIdentifier.createInDefaultRepo("B"), cache));
+        PackageIdentifier.createInMainRepo("B"), cache));
     assertEquals(buildFile_2C, locator.getPackageBuildFile(
-        PackageIdentifier.createInDefaultRepo("C")));
+        PackageIdentifier.createInMainRepo("C")));
     assertEquals(buildFile_2C, locator.getPackageBuildFileNullable(
-        PackageIdentifier.createInDefaultRepo("C"), cache));
+        PackageIdentifier.createInMainRepo("C"), cache));
     assertEquals(buildFile_2CD, locator.getPackageBuildFile(
-        PackageIdentifier.createInDefaultRepo("C/D")));
+        PackageIdentifier.createInMainRepo("C/D")));
     assertEquals(buildFile_2CD, locator.getPackageBuildFileNullable(
-        PackageIdentifier.createInDefaultRepo("C/D"), cache));
+        PackageIdentifier.createInMainRepo("C/D"), cache));
     checkFails("C/E",
                "no such package 'C/E': BUILD file not found on package path");
     assertNull(locator.getPackageBuildFileNullable(
-        PackageIdentifier.createInDefaultRepo("C/E"), cache));
+        PackageIdentifier.createInMainRepo("C/E"), cache));
     assertEquals(buildFile_2F,
-                 locator.getPackageBuildFile(PackageIdentifier.createInDefaultRepo("F")));
+                 locator.getPackageBuildFile(PackageIdentifier.createInMainRepo("F")));
     checkFails("F/G",
                "no such package 'F/G': BUILD file not found on package path");
     assertNull(locator.getPackageBuildFileNullable(
-        PackageIdentifier.createInDefaultRepo("F/G"), cache));
+        PackageIdentifier.createInMainRepo("F/G"), cache));
     assertEquals(buildFile_2FGH, locator.getPackageBuildFile(
-        PackageIdentifier.createInDefaultRepo("F/G/H")));
+        PackageIdentifier.createInMainRepo("F/G/H")));
     assertEquals(buildFile_2FGH, locator.getPackageBuildFileNullable(
-        PackageIdentifier.createInDefaultRepo("F/G/H"), cache));
+        PackageIdentifier.createInMainRepo("F/G/H"), cache));
     checkFails("I", "no such package 'I': BUILD file not found on package path");
   }
 
   @Test
   public void testGetPackageBuildFileWithSymlinks() throws Exception {
     assertEquals(buildFile_3A, locatorWithSymlinks.getPackageBuildFile(
-        PackageIdentifier.createInDefaultRepo("A")));
+        PackageIdentifier.createInMainRepo("A")));
     assertEquals(buildFile_3B, locatorWithSymlinks.getPackageBuildFile(
-        PackageIdentifier.createInDefaultRepo("B")));
+        PackageIdentifier.createInMainRepo("B")));
     assertEquals(buildFile_3CI, locatorWithSymlinks.getPackageBuildFile(
-        PackageIdentifier.createInDefaultRepo("C/I")));
+        PackageIdentifier.createInMainRepo("C/I")));
     try {
-      locatorWithSymlinks.getPackageBuildFile(PackageIdentifier.createInDefaultRepo("C/D"));
+      locatorWithSymlinks.getPackageBuildFile(PackageIdentifier.createInMainRepo("C/D"));
       fail();
     } catch (BuildFileNotFoundException e) {
       assertThat(e).hasMessage("no such package 'C/D': BUILD file not found on package path");
@@ -247,7 +247,7 @@
     // The package isn't found
     // The package is found, because we didn't drop the root:
     try {
-      locator.getPackageBuildFile(PackageIdentifier.createInDefaultRepo("X"));
+      locator.getPackageBuildFile(PackageIdentifier.createInMainRepo("X"));
       fail("Exception expected");
     } catch (NoSuchPackageException e) {
     }
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/TargetPatternEvaluatorTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/TargetPatternEvaluatorTest.java
index 068ad3f..d2a3451 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/TargetPatternEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/TargetPatternEvaluatorTest.java
@@ -366,9 +366,9 @@
     assertThat(parseList("//foo/bar" + suffix)).containsExactlyElementsIn(rulesInFooBar);
     assertThat(parseList("//otherrules" + suffix)).containsExactlyElementsIn(rulesInOtherrules);
     assertNoEvents();
-    expectError("while parsing 'nosuchpkg" + suffix + "': no such package 'nosuchpkg': "
+    expectError("while parsing '//nosuchpkg" + suffix + "': no such package 'nosuchpkg': "
             + "BUILD file not found on package path",
-        "nosuchpkg" + suffix);
+        "//nosuchpkg" + suffix);
     expectError("while parsing '//nosuchpkg" + suffix + "': no such package 'nosuchpkg': "
             + "BUILD file not found on package path",
         "//nosuchpkg" + suffix);
@@ -536,7 +536,7 @@
   public void testDotDotDotDoesntMatchDeletedPackages() throws Exception {
     scratch.file("x/y/BUILD", "cc_library(name='y')");
     scratch.file("x/z/BUILD", "cc_library(name='z')");
-    setDeletedPackages(Sets.newHashSet(PackageIdentifier.createInDefaultRepo("x/y")));
+    setDeletedPackages(Sets.newHashSet(PackageIdentifier.createInMainRepo("x/y")));
     assertEquals(Sets.newHashSet(Label.parseAbsolute("//x/z")),
         parseList("x/..."));
   }
@@ -545,7 +545,7 @@
   public void testDotDotDotDoesntMatchDeletedPackagesRelative() throws Exception {
     scratch.file("x/y/BUILD", "cc_library(name='y')");
     scratch.file("x/z/BUILD", "cc_library(name='z')");
-    setDeletedPackages(Sets.newHashSet(PackageIdentifier.createInDefaultRepo("x/y")));
+    setDeletedPackages(Sets.newHashSet(PackageIdentifier.createInMainRepo("x/y")));
 
     parser.updateOffset(new PathFragment("x"));
     assertEquals(Sets.newHashSet(Label.parseAbsolute("//x/z")),
@@ -560,7 +560,7 @@
     assertEquals(Sets.newHashSet(Label.parseAbsolute("//x/y"), Label.parseAbsolute("//x/z")),
         parseList("x/..."));
 
-    setDeletedPackages(Sets.newHashSet(PackageIdentifier.createInDefaultRepo("x/y")));
+    setDeletedPackages(Sets.newHashSet(PackageIdentifier.createInMainRepo("x/y")));
     assertEquals(Sets.newHashSet(Label.parseAbsolute("//x/z")), parseList("x/..."));
 
     setDeletedPackages(ImmutableSet.<PackageIdentifier>of());
@@ -813,6 +813,10 @@
         "Skipping '//missing_pkg': no such package 'missing_pkg': "
             + "BUILD file not found on package path",
         "//missing_pkg", "foo/...");
+    assertKeepGoing(rulesBeneathFoo,
+        "Skipping '//missing_pkg': no such package 'missing_pkg': "
+            + "BUILD file not found on package path",
+        "//missing_pkg", "foo/...");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonConfiguredTargetTest.java
index 237e2f1..aa06687 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonConfiguredTargetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonConfiguredTargetTest.java
@@ -468,7 +468,7 @@
         "       deps = [':lib1'],",
         "       alwayslink=1)");
     reporter.removeHandler(failFastHandler);
-    getPackageManager().getPackage(reporter, PackageIdentifier.createInDefaultRepo("cc/common"));
+    getPackageManager().getPackage(reporter, PackageIdentifier.createInMainRepo("cc/common"));
     assertContainsEvent(
         "//cc/common:testlib: no such attribute 'alwayslink'" + " in 'cc_test' rule");
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java
index d6961af..14957b9 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java
@@ -992,8 +992,10 @@
                 + "  dynamic_runtimes_filegroup: \"dynamic-group\""
                 + "}\n");
 
-    final PackageIdentifier ctTop = MockCcSupport.getMockCrosstoolsTop();
-
+    PackageIdentifier ctTop = MockCcSupport.getMockCrosstoolsTop();
+    if (ctTop.getRepository().isDefault()) {
+      ctTop = PackageIdentifier.createInMainRepo(ctTop.getPackageFragment());
+    }
     CppConfiguration defaultLibs = create(loader, "--cpu=piii");
     assertEquals(
         Label.create(ctTop, "static-runtime-libs-piii"), defaultLibs.getStaticRuntimeLibsLabel());
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
index 3d7f77e..0476e56 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
@@ -82,7 +82,7 @@
   private ContainingPackageLookupValue lookupContainingPackage(String packageName)
       throws InterruptedException {
     SkyKey key =
-        ContainingPackageLookupValue.key(PackageIdentifier.createInDefaultRepo(packageName));
+        ContainingPackageLookupValue.key(PackageIdentifier.createInMainRepo(packageName));
     return driver
         .<ContainingPackageLookupValue>evaluate(
             ImmutableList.of(key),
@@ -103,7 +103,7 @@
     scratch.file("a/BUILD");
     ContainingPackageLookupValue value = lookupContainingPackage("a/b");
     assertTrue(value.hasContainingPackage());
-    assertEquals(PackageIdentifier.createInDefaultRepo("a"), value.getContainingPackageName());
+    assertEquals(PackageIdentifier.createInMainRepo("a"), value.getContainingPackageName());
     assertEquals(rootDirectory, value.getContainingPackageRoot());
   }
 
@@ -112,7 +112,7 @@
     scratch.file("a/b/BUILD");
     ContainingPackageLookupValue value = lookupContainingPackage("a/b");
     assertTrue(value.hasContainingPackage());
-    assertEquals(PackageIdentifier.createInDefaultRepo("a/b"), value.getContainingPackageName());
+    assertEquals(PackageIdentifier.createInMainRepo("a/b"), value.getContainingPackageName());
     assertEquals(rootDirectory, value.getContainingPackageRoot());
   }
 
@@ -122,11 +122,11 @@
     ContainingPackageLookupValue valueA2 = ContainingPackageLookupValue.NONE;
     ContainingPackageLookupValue valueB1 =
         ContainingPackageLookupValue.withContainingPackage(
-            PackageIdentifier.createInDefaultRepo("b"), rootDirectory);
+            PackageIdentifier.createInMainRepo("b"), rootDirectory);
     ContainingPackageLookupValue valueB2 =
         ContainingPackageLookupValue.withContainingPackage(
-            PackageIdentifier.createInDefaultRepo("b"), rootDirectory);
-    PackageIdentifier cFrag = PackageIdentifier.createInDefaultRepo("c");
+            PackageIdentifier.createInMainRepo("b"), rootDirectory);
+    PackageIdentifier cFrag = PackageIdentifier.createInMainRepo("c");
     ContainingPackageLookupValue valueC1 =
         ContainingPackageLookupValue.withContainingPackage(cFrag, rootDirectory);
     ContainingPackageLookupValue valueC2 =
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
index e553ef4..8829e77 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
@@ -96,7 +96,7 @@
   private AtomicReference<PathPackageLocator> pkgLocator;
   private TimestampGranularityMonitor tsgm;
 
-  private static final PackageIdentifier PKG_ID = PackageIdentifier.createInDefaultRepo("pkg");
+  private static final PackageIdentifier PKG_ID = PackageIdentifier.createInMainRepo("pkg");
 
   @Before
   public final void setUp() throws Exception  {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
index c985256..9178fd5 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
@@ -110,7 +110,7 @@
 
     scratch.file("foo/BUILD");
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("pkg"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//pkg"));
     result = SkyframeExecutorTestUtils.evaluate(getSkyframeExecutor(),
         skyKey, /*keepGoing=*/false, reporter);
     assertTrue(result.hasError());
@@ -136,7 +136,7 @@
         ConstantRuleVisibility.PUBLIC, true,
         7, "", UUID.randomUUID());
 
-    SkyKey pkgLookupKey = PackageLookupValue.key(PackageIdentifier.parse("foo"));
+    SkyKey pkgLookupKey = PackageLookupValue.key(PackageIdentifier.parse("@//foo"));
     EvaluationResult<PackageLookupValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), pkgLookupKey, /*keepGoing=*/false, reporter);
     assertFalse(result.hasError());
@@ -144,7 +144,7 @@
 
     scratch.file("/root1/foo/BUILD");
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("pkg"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//pkg"));
     result = SkyframeExecutorTestUtils.evaluate(getSkyframeExecutor(),
         skyKey, /*keepGoing=*/false, reporter);
     assertTrue(result.hasError());
@@ -209,7 +209,7 @@
     SkyValue fooDirValue = FileStateValue.create(pkgRootedPath,
         getSkyframeExecutor().getTimestampGranularityMonitorForTesting());
     differencer.inject(ImmutableMap.of(FileStateValue.key(pkgRootedPath), fooDirValue));
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("foo"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     String expectedMessage = "/workspace/foo/BUILD exists but its parent path /workspace/foo isn't "
         + "an existing directory";
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
@@ -248,7 +248,7 @@
         barDirFileValue, DirectoryListingStateValue.create(ImmutableList.of(
             new Dirent("baz", Dirent.Type.DIRECTORY))));
     differencer.inject(ImmutableMap.of(DirectoryListingValue.key(barDirRootedPath), barDirListing));
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("foo"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     String expectedMessage = "Some filesystem operations implied /workspace/foo/bar/baz/baz.sh was "
         + "a regular file with size of 0 and mtime of 0 and nodeId of " + bazFileNodeId + " and "
         + "mtime of 0 but others made us think it was a nonexistent path";
@@ -272,7 +272,7 @@
     scratch.file("foo/bar/baz.sh");
     fs.scheduleMakeUnreadableAfterReaddir(barDir);
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("foo"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     String expectedMessage = "Encountered error 'Directory is not readable'";
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
@@ -298,7 +298,7 @@
         ConstantRuleVisibility.PUBLIC, true,
         7, "", UUID.randomUUID());
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("foo"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     validPackage(skyKey);
   }
 
@@ -320,7 +320,7 @@
         ConstantRuleVisibility.PUBLIC, true,
         7, "", UUID.randomUUID());
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("foo"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     PackageValue value = validPackage(skyKey);
     assertThat(value.getPackage().getSubincludeLabels()).containsExactly(
         Label.parseAbsolute("//bar:a"), Label.parseAbsolute("//baz:b"));
@@ -336,6 +336,32 @@
   }
 
   @Test
+  public void testIncludeInMainAndDefaultRepository() throws Exception {
+    scratch.file("foo/BUILD",
+        "subinclude('//baz:a')");
+    scratch.file("bar/BUILD",
+        "subinclude('@//baz:a')");
+    scratch.file("baz/BUILD",
+        "exports_files(['a'])");
+    scratch.file("baz/a");
+
+    getSkyframeExecutor().preparePackageLoading(
+        new PathPackageLocator(outputBase, ImmutableList.of(rootDirectory)),
+        ConstantRuleVisibility.PUBLIC, true,
+        7, "", UUID.randomUUID());
+
+    SkyKey fooKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
+    PackageValue fooValue = validPackage(fooKey);
+    assertThat(fooValue.getPackage().getSubincludeLabels()).containsExactly(
+        Label.parseAbsolute("//baz:a"));
+
+    SkyKey barKey = PackageValue.key(PackageIdentifier.parse("@//bar"));
+    PackageValue barValue = validPackage(barKey);
+    assertThat(barValue.getPackage().getSubincludeLabels()).containsExactly(
+        Label.parseAbsolute("@//baz:a"));
+  }
+
+  @Test
   public void testTransitiveSkylarkDepsStoredInPackage() throws Exception {
     scratch.file("foo/BUILD",
         "load('/bar/ext', 'a')");
@@ -355,7 +381,7 @@
         ConstantRuleVisibility.PUBLIC, true,
         7, "", UUID.randomUUID());
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("foo"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     PackageValue value = validPackage(skyKey);
     assertThat(value.getPackage().getSkylarkFileDependencies()).containsExactly(
         Label.parseAbsolute("//bar:ext.bzl"), Label.parseAbsolute("//baz:ext.bzl"));
@@ -381,7 +407,7 @@
         "    cmd = 'echo hello >@')");
     invalidatePackages();
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("test/skylark"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//test/skylark"));
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
     assertTrue(result.hasError());
@@ -404,7 +430,7 @@
         "subinclude('//foo:a')");
     invalidatePackages();
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("test/skylark"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//test/skylark"));
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
     assertTrue(result.hasError());
@@ -429,7 +455,7 @@
         "    cmd = 'echo hello >@')");
     invalidatePackages();
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("test/skylark"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//test/skylark"));
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
     assertTrue(result.hasError());
@@ -452,7 +478,7 @@
         "    cmd = 'echo hello >@')");
     invalidatePackages();
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("test/skylark"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//test/skylark"));
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
     assertTrue(result.hasError());
@@ -471,7 +497,7 @@
         "sh_library(name = 'foo', srcs = ['bar/baz.sh'])");
     Path barBuildFile = scratch.file("foo/bar/BUILD");
     fs.stubStatError(barBuildFile, new IOException("nope"));
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("foo"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
     assertTrue(result.hasError());
@@ -482,7 +508,7 @@
   public void testLoadRelativePath() throws Exception {
     scratch.file("pkg/BUILD", "load('ext', 'a')");
     scratch.file("pkg/ext.bzl", "a = 1");
-    validPackage(PackageValue.key(PackageIdentifier.parse("pkg")));
+    validPackage(PackageValue.key(PackageIdentifier.parse("@//pkg")));
   }
 
   @Test
@@ -491,13 +517,13 @@
     scratch.file("pkg2/BUILD",
         "load('/pkg1/ext', 'a')");
     scratch.file("pkg1/ext.bzl", "a = 1");
-    validPackage(PackageValue.key(PackageIdentifier.parse("pkg2")));
+    validPackage(PackageValue.key(PackageIdentifier.parse("@//pkg2")));
   }
 
   @Test
   public void testBadWorkspaceFile() throws Exception {
     Path workspacePath = scratch.overwriteFile("WORKSPACE", "junk");
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.createInDefaultRepo("external"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.createInMainRepo("external"));
     getSkyframeExecutor()
         .invalidate(
             Predicates.equalTo(
@@ -528,7 +554,7 @@
         ConstantRuleVisibility.PUBLIC, true,
         7, "", UUID.randomUUID());
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("foo"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     PackageValue value = validPackage(skyKey);
     assertFalse(value.getPackage().containsErrors());
     assertThat(value.getPackage().getTarget("existing.txt").getName()).isEqualTo("existing.txt");
@@ -584,7 +610,7 @@
         ConstantRuleVisibility.PUBLIC, true,
         7, "", UUID.randomUUID());
 
-    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("foo"));
+    SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     PackageValue value = validPackage(skyKey);
     assertFalse(value.getPackage().containsErrors());
     assertThat(value.getPackage().getTarget("bar-matched").getName()).isEqualTo("bar-matched");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
index 39b038f..3452728 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
@@ -108,7 +108,7 @@
   }
 
   private PackageLookupValue lookupPackage(String packageName) throws InterruptedException {
-    return lookupPackage(PackageIdentifier.createInDefaultRepo(packageName));
+    return lookupPackage(PackageIdentifier.createInMainRepo(packageName));
   }
 
   private PackageLookupValue lookupPackage(PackageIdentifier packageId)
@@ -141,7 +141,7 @@
   public void testDeletedPackage() throws Exception {
     scratch.file("parentpackage/deletedpackage/BUILD");
     deletedPackages.set(ImmutableSet.of(
-        PackageIdentifier.createInDefaultRepo("parentpackage/deletedpackage")));
+        PackageIdentifier.createInMainRepo("parentpackage/deletedpackage")));
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/deletedpackage");
     assertFalse(packageLookupValue.packageExists());
     assertEquals(ErrorReason.DELETED_PACKAGE, packageLookupValue.getErrorReason());
@@ -215,7 +215,8 @@
   @Test
   public void testWorkspaceLookup() throws Exception {
     scratch.overwriteFile("WORKSPACE");
-    PackageLookupValue packageLookupValue = lookupPackage("external");
+    PackageLookupValue packageLookupValue = lookupPackage(
+        PackageIdentifier.createInMainRepo("external"));
     assertTrue(packageLookupValue.packageExists());
     assertEquals(rootDirectory, packageLookupValue.getRoot());
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
index fa3da90..278567a 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
@@ -47,7 +47,7 @@
 
   @Test
   public void testRecursiveEvaluationFailsOnBadBuildFile() throws Exception {
-    // Given a well-formed package "//foo" and a malformed package "//foo/foo",
+    // Given a well-formed package "@//foo" and a malformed package "@//foo/foo",
     createFooAndFooFoo();
 
     // Given a target pattern sequence consisting of a recursive pattern for "//foo/...",
@@ -59,12 +59,12 @@
         getGraphFromPatternsEvaluation(
             patternSequence, /*successExpected=*/ true, /*keepGoing=*/ true);
 
-    // Then the graph contains package values for "//foo" and "//foo/foo",
-    assertTrue(walkableGraph.exists(PackageValue.key(PackageIdentifier.parse("foo"))));
-    assertTrue(walkableGraph.exists(PackageValue.key(PackageIdentifier.parse("foo/foo"))));
+    // Then the graph contains package values for "@//foo" and "@//foo/foo",
+    assertTrue(walkableGraph.exists(PackageValue.key(PackageIdentifier.parse("@//foo"))));
+    assertTrue(walkableGraph.exists(PackageValue.key(PackageIdentifier.parse("@//foo/foo"))));
 
-    // But the graph does not contain a value for the target "//foo/foo:foofoo".
-    assertFalse(walkableGraph.exists(getKeyForLabel(Label.create("foo/foo", "foofoo"))));
+    // But the graph does not contain a value for the target "@//foo/foo:foofoo".
+    assertFalse(walkableGraph.exists(getKeyForLabel(Label.create("@//foo/foo", "foofoo"))));
   }
 
   @Test
@@ -103,14 +103,14 @@
         getGraphFromPatternsEvaluation(
             patternSequence, /*successExpected=*/ true, /*keepGoing=*/ true);
 
-    // Then the graph contains a package value for "//foo",
-    assertTrue(walkableGraph.exists(PackageValue.key(PackageIdentifier.parse("foo"))));
+    // Then the graph contains a package value for "@//foo",
+    assertTrue(walkableGraph.exists(PackageValue.key(PackageIdentifier.parse("@//foo"))));
 
-    // But no package value for "//foo/foo",
-    assertFalse(walkableGraph.exists(PackageValue.key(PackageIdentifier.parse("foo/foo"))));
+    // But no package value for "@//foo/foo",
+    assertFalse(walkableGraph.exists(PackageValue.key(PackageIdentifier.parse("@//foo/foo"))));
 
-    // And the graph does not contain a value for the target "//foo/foo:foofoo".
-    Label label = Label.create("foo/foo", "foofoo");
+    // And the graph does not contain a value for the target "@//foo/foo:foofoo".
+    Label label = Label.create("@//foo/foo", "foofoo");
     assertFalse(walkableGraph.exists(getKeyForLabel(label)));
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
index 1d90220..a21c6f5 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
@@ -59,11 +59,11 @@
     // When PrepareDepsOfPatternsFunction successfully completes evaluation,
     WalkableGraph walkableGraph = getGraphFromPatternsEvaluation(patternSequence);
 
-    // Then the graph contains a value for the target "//foo:foo",
-    assertValidValue(walkableGraph, getKeyForLabel(Label.create("foo", "foo")));
+    // Then the graph contains a value for the target "@//foo:foo",
+    assertValidValue(walkableGraph, getKeyForLabel(Label.create("@//foo", "foo")));
 
-    // And the graph does not contain a value for the target "//foo:foo2".
-    assertFalse(walkableGraph.exists(getKeyForLabel(Label.create("foo", "foo2"))));
+    // And the graph does not contain a value for the target "@//foo:foo2".
+    assertFalse(walkableGraph.exists(getKeyForLabel(Label.create("@//foo", "foo2"))));
   }
 
   @Test
@@ -79,12 +79,12 @@
     WalkableGraph walkableGraph = getGraphFromPatternsEvaluation(patternSequence);
 
     // Then the graph contains an entry for ":foo"'s dependency, ":foo2".
-    assertValidValue(walkableGraph, getKeyForLabel(Label.create("foo", "foo2")));
+    assertValidValue(walkableGraph, getKeyForLabel(Label.create("@//foo", "foo2")));
   }
 
   @Test
   public void testFunctionExpandsTargetPatterns() throws Exception {
-    // Given a package "//foo" with independent target rules ":foo" and ":foo2",
+    // Given a package "@//foo" with independent target rules ":foo" and ":foo2",
     createFooAndFoo2(/*dependent=*/ false);
 
     // Given a target pattern sequence consisting of a pattern for "//foo:*",
@@ -94,8 +94,8 @@
     WalkableGraph walkableGraph = getGraphFromPatternsEvaluation(patternSequence);
 
     // Then the graph contains an entry for ":foo" and ":foo2".
-    assertValidValue(walkableGraph, getKeyForLabel(Label.create("foo", "foo")));
-    assertValidValue(walkableGraph, getKeyForLabel(Label.create("foo", "foo2")));
+    assertValidValue(walkableGraph, getKeyForLabel(Label.create("@//foo", "foo")));
+    assertValidValue(walkableGraph, getKeyForLabel(Label.create("@//foo", "foo2")));
   }
 
   @Test
@@ -108,7 +108,7 @@
     WalkableGraph walkableGraph = getGraphFromPatternsEvaluation(patternSequence);
 
     // Then the graph does not contain an entry for ":foo",
-    assertFalse(walkableGraph.exists(getKeyForLabel(Label.create("foo", "foo"))));
+    assertFalse(walkableGraph.exists(getKeyForLabel(Label.create("@//foo", "foo"))));
   }
 
   @Test
@@ -126,11 +126,11 @@
     // Then the graph contains an entry for ":foo",
     assertValidValue(
         walkableGraph,
-        getKeyForLabel(Label.create("foo", "foo")),
+        getKeyForLabel(Label.create("@//foo", "foo")),
         /*expectTransitiveException=*/ true);
 
     // And an entry with a NoSuchPackageException for "//bar:bar",
-    Exception e = assertException(walkableGraph, getKeyForLabel(Label.create("bar", "bar")));
+    Exception e = assertException(walkableGraph, getKeyForLabel(Label.create("@//bar", "bar")));
     assertThat(e).isInstanceOf(NoSuchPackageException.class);
   }
 
@@ -149,11 +149,11 @@
     // Then the graph contains an entry for ":foo" which has both a value and an exception,
     assertValidValue(
         walkableGraph,
-        getKeyForLabel(Label.create("foo", "foo")),
+        getKeyForLabel(Label.create("@//foo", "foo")),
         /*expectTransitiveException=*/ true);
 
     // And an entry with a NoSuchTargetException for "//bar:bar",
-    Exception e = assertException(walkableGraph, getKeyForLabel(Label.create("bar", "bar")));
+    Exception e = assertException(walkableGraph, getKeyForLabel(Label.create("@//bar", "bar")));
     assertThat(e).isInstanceOf(NoSuchTargetException.class);
   }
 
@@ -189,8 +189,8 @@
     // Then it skips evaluation of the malformed target pattern, but logs about it,
     assertContainsEvent("Skipping '" + bogusPattern + "': ");
 
-    // And then the graph contains a value for the legit target pattern's target "//foo:foo".
-    assertTrue(walkableGraph.exists(getKeyForLabel(Label.create("foo", "foo"))));
+    // And then the graph contains a value for the legit target pattern's target "@//foo:foo".
+    assertTrue(walkableGraph.exists(getKeyForLabel(Label.create("@//foo", "foo"))));
   }
 
   // Helpers:
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java
index 4915f3f..207465c 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java
@@ -59,7 +59,7 @@
       Path root, PathFragment rootRelativePath, ImmutableSet<PathFragment> excludedPaths) {
     RootedPath rootedPath = RootedPath.toRootedPath(root, rootRelativePath);
     return CollectPackagesUnderDirectoryValue.key(
-        PackageIdentifier.DEFAULT_REPOSITORY_NAME, rootedPath, excludedPaths);
+        PackageIdentifier.MAIN_REPOSITORY_NAME, rootedPath, excludedPaths);
   }
 
   private SkyKey createPrepDepsKey(Path root, PathFragment rootRelativePath) {
@@ -70,14 +70,14 @@
       ImmutableSet<PathFragment> excludedPaths) {
     RootedPath rootedPath = RootedPath.toRootedPath(root, rootRelativePath);
     return PrepareDepsOfTargetsUnderDirectoryValue.key(
-        PackageIdentifier.DEFAULT_REPOSITORY_NAME, rootedPath, excludedPaths);
+        PackageIdentifier.MAIN_REPOSITORY_NAME, rootedPath, excludedPaths);
   }
 
   private SkyKey createPrepDepsKey(Path root, PathFragment rootRelativePath,
       ImmutableSet<PathFragment> excludedPaths, FilteringPolicy filteringPolicy) {
     RootedPath rootedPath = RootedPath.toRootedPath(root, rootRelativePath);
     return PrepareDepsOfTargetsUnderDirectoryValue.key(
-        PackageIdentifier.DEFAULT_REPOSITORY_NAME, rootedPath, excludedPaths, filteringPolicy);
+        PackageIdentifier.MAIN_REPOSITORY_NAME, rootedPath, excludedPaths, filteringPolicy);
   }
 
   private EvaluationResult<?> getEvaluationResult(SkyKey... keys) throws InterruptedException {
@@ -102,14 +102,14 @@
     EvaluationResult<?> evaluationResult = getEvaluationResult(key);
     WalkableGraph graph = Preconditions.checkNotNull(evaluationResult.getWalkableGraph());
 
-    // Then the TransitiveTraversalValue for "a:a" is evaluated,
-    SkyKey aaKey = TransitiveTraversalValue.key(Label.create("a", "a"));
+    // Then the TransitiveTraversalValue for "@//a:a" is evaluated,
+    SkyKey aaKey = TransitiveTraversalValue.key(Label.create("@//a", "a"));
     assertThat(graph.exists(aaKey)).isTrue();
 
-    // And that TransitiveTraversalValue depends on "b:b.txt".
+    // And that TransitiveTraversalValue depends on "@//b:b.txt".
     Iterable<SkyKey> depsOfAa =
         Iterables.getOnlyElement(graph.getDirectDeps(ImmutableList.of(aaKey)).values());
-    SkyKey bTxtKey = TransitiveTraversalValue.key(Label.create("b", "b.txt"));
+    SkyKey bTxtKey = TransitiveTraversalValue.key(Label.create("@//b", "b.txt"));
     assertThat(depsOfAa).contains(bTxtKey);
 
     // And the TransitiveTraversalValue for "b:b.txt" is evaluated.
@@ -128,12 +128,12 @@
     EvaluationResult<?> evaluationResult = getEvaluationResult(key);
     WalkableGraph graph = Preconditions.checkNotNull(evaluationResult.getWalkableGraph());
 
-    // Then the TransitiveTraversalValue for "a:a" is not evaluated,
-    SkyKey aaKey = TransitiveTraversalValue.key(Label.create("a", "a"));
+    // Then the TransitiveTraversalValue for "@//a:a" is not evaluated,
+    SkyKey aaKey = TransitiveTraversalValue.key(Label.create("@//a", "a"));
     assertThat(graph.exists(aaKey)).isFalse();
 
-    // But the TransitiveTraversalValue for "a:aTest" is.
-    SkyKey aaTestKey = TransitiveTraversalValue.key(Label.create("a", "aTest"));
+    // But the TransitiveTraversalValue for "@//a:aTest" is.
+    SkyKey aaTestKey = TransitiveTraversalValue.key(Label.create("@//a", "aTest"));
     assertThat(graph.exists(aaTestKey)).isTrue();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
index 4b2e1ab..5a16bc3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
@@ -60,7 +60,7 @@
       Path root, PathFragment rootRelativePath, ImmutableSet<PathFragment> excludedPaths) {
     RootedPath rootedPath = RootedPath.toRootedPath(root, rootRelativePath);
     return RecursivePkgValue.key(
-        PackageIdentifier.DEFAULT_REPOSITORY_NAME, rootedPath, excludedPaths);
+        PackageIdentifier.MAIN_REPOSITORY_NAME, rootedPath, excludedPaths);
   }
 
   private RecursivePkgValue buildRecursivePkgValue(Path root, PathFragment rootRelativePath)
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java
index 2b264e3..6ee4ac0 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java
@@ -44,7 +44,7 @@
       PathFragment rootRelativePath, ImmutableSet<PathFragment> excludedPaths) {
     try {
       buildRecursivePkgKey(
-          PackageIdentifier.DEFAULT_REPOSITORY_NAME, rootRelativePath, excludedPaths);
+          PackageIdentifier.MAIN_REPOSITORY_NAME, rootRelativePath, excludedPaths);
       fail();
     } catch (IllegalArgumentException expected) {
     }
@@ -53,29 +53,29 @@
   @Test
   public void testValidRecursivePkgKeys() throws Exception {
     buildRecursivePkgKey(
-        PackageIdentifier.DEFAULT_REPOSITORY_NAME,
+        PackageIdentifier.MAIN_REPOSITORY_NAME,
         new PathFragment(""),
         ImmutableSet.<PathFragment>of());
     buildRecursivePkgKey(
-        PackageIdentifier.DEFAULT_REPOSITORY_NAME,
+        PackageIdentifier.MAIN_REPOSITORY_NAME,
         new PathFragment(""),
         ImmutableSet.of(new PathFragment("a")));
 
     buildRecursivePkgKey(
-        PackageIdentifier.DEFAULT_REPOSITORY_NAME,
+        PackageIdentifier.MAIN_REPOSITORY_NAME,
         new PathFragment("a"),
         ImmutableSet.<PathFragment>of());
     buildRecursivePkgKey(
-        PackageIdentifier.DEFAULT_REPOSITORY_NAME,
+        PackageIdentifier.MAIN_REPOSITORY_NAME,
         new PathFragment("a"),
         ImmutableSet.of(new PathFragment("a/b")));
 
     buildRecursivePkgKey(
-        PackageIdentifier.DEFAULT_REPOSITORY_NAME,
+        PackageIdentifier.MAIN_REPOSITORY_NAME,
         new PathFragment("a/b"),
         ImmutableSet.<PathFragment>of());
     buildRecursivePkgKey(
-        PackageIdentifier.DEFAULT_REPOSITORY_NAME,
+        PackageIdentifier.MAIN_REPOSITORY_NAME,
         new PathFragment("a/b"),
         ImmutableSet.of(new PathFragment("a/b/c")));
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
index 606e140..4cdc8be 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
@@ -162,7 +162,7 @@
             7,
             "",
             UUID.randomUUID());
-    SkyKey pkgLookupKey = PackageValue.key(PackageIdentifier.parse(pkg));
+    SkyKey pkgLookupKey = PackageValue.key(PackageIdentifier.parse("@//" + pkg));
     EvaluationResult<PackageValue> result =
         SkyframeExecutorTestUtils.evaluate(
             getSkyframeExecutor(), pkgLookupKey, /*keepGoing=*/ false, reporter);
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java
index 1605916..d4dda9b 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java
@@ -109,7 +109,7 @@
     String labelName = "//no/such/package:target/withslash";
     BuildFileNotFoundException exn =
         (BuildFileNotFoundException) getErrorFromTargetValue(labelName);
-    assertEquals(PackageIdentifier.createInDefaultRepo("no/such/package"), exn.getPackageId());
+    assertEquals(PackageIdentifier.createInMainRepo("no/such/package"), exn.getPackageId());
     String expectedMessage =
         "no such package 'no/such/package': BUILD file not found on "
             + "package path for 'no/such/package'";
@@ -123,11 +123,10 @@
         "a/BUILD",
         "genrule(name = 'conflict1', cmd = '', srcs = [], outs = ['conflict'])",
         "genrule(name = 'conflict2', cmd = '', srcs = [], outs = ['conflict'])");
-    String labelName = "//a:conflict1";
-    NoSuchTargetException exn = (NoSuchTargetException) getErrorFromTargetValue(labelName);
+    NoSuchTargetException exn = (NoSuchTargetException) getErrorFromTargetValue("@//a:conflict1");
     assertThat(exn.getMessage())
         .contains("Target '//a:conflict1' contains an error and its package is in error");
-    assertEquals(labelName, exn.getLabel().toString());
+    assertEquals("//a:conflict1", exn.getLabel().toString());
     assertTrue(exn.hasTarget());
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index cd02b77..94c822b 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -240,7 +240,7 @@
     Pair<String, Descriptor> pair = Iterables.getOnlyElement(aspect.getAttributes());
     assertThat(pair.first).isEqualTo("$extra_deps");
     assertThat(pair.second.getAttributeBuilder().build("$extra_deps").getDefaultValue(null))
-        .isEqualTo(Label.parseAbsolute("//foo/bar:baz"));
+        .isEqualTo(Label.parseAbsolute("//foo/bar:baz", false));
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index 227e842..c47fdbe 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -772,19 +772,19 @@
         "BUILD", "filegroup(name='dep')", "load('/my_rule', 'my_rule')", "my_rule(name='r')");
 
     invalidatePackages();
-    SkylarkRuleContext context = createRuleContext("@//:r");
+    SkylarkRuleContext context = createRuleContext("//:r");
     Label explicitDepLabel =
         (Label) evalRuleContextCode(context, "ruleContext.attr.explicit_dep.label");
-    assertThat(explicitDepLabel).isEqualTo(Label.parseAbsolute("@//:dep"));
+    assertThat(explicitDepLabel).isEqualTo(Label.parseAbsolute("//:dep"));
     Label implicitDepLabel =
         (Label) evalRuleContextCode(context, "ruleContext.attr._implicit_dep.label");
-    assertThat(implicitDepLabel).isEqualTo(Label.parseAbsolute("@//:dep"));
+    assertThat(implicitDepLabel).isEqualTo(Label.parseAbsolute("//:dep"));
     Label explicitDepListLabel =
         (Label) evalRuleContextCode(context, "ruleContext.attr.explicit_dep_list[0].label");
-    assertThat(explicitDepListLabel).isEqualTo(Label.parseAbsolute("@//:dep"));
+    assertThat(explicitDepListLabel).isEqualTo(Label.parseAbsolute("//:dep"));
     Label implicitDepListLabel =
         (Label) evalRuleContextCode(context, "ruleContext.attr._implicit_dep_list[0].label");
-    assertThat(implicitDepListLabel).isEqualTo(Label.parseAbsolute("@//:dep"));
+    assertThat(implicitDepListLabel).isEqualTo(Label.parseAbsolute("//:dep"));
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/BlazeTestUtils.java b/src/test/java/com/google/devtools/build/lib/testutil/BlazeTestUtils.java
index 1315ac4..6c5b83f 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/BlazeTestUtils.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/BlazeTestUtils.java
@@ -14,9 +14,14 @@
 
 package com.google.devtools.build.lib.testutil;
 
+import com.google.common.base.Function;
 import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.config.BinTools;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
@@ -25,6 +30,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 /**
  * Some static utility functions for testing Blaze code. In contrast to {@link TestUtils}, these
@@ -117,4 +123,23 @@
       path.setLastModifiedTime(newMtime);
     } while (path.getLastModifiedTime() == prevMtime);
   }
+
+  public static Label convertLabel(Label label) {
+    try {
+      return label.getPackageIdentifier().getRepository().isDefault()
+          ? Label.create(label.getPackageIdentifier().makeAbsolute(), label.getName())
+          : label;
+    } catch (LabelSyntaxException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  public static List<Label> convertLabels(Iterable<Label> labels) {
+    return ImmutableList.copyOf(Iterables.transform(labels, new Function<Label, Label>() {
+      @Override
+      public Label apply(Label label) {
+        return convertLabel(label);
+      }
+    }));
+  }
 }
diff --git a/src/test/shell/bazel/external_skylark_load_test.sh b/src/test/shell/bazel/external_skylark_load_test.sh
index 03b08ef..5f221c0 100755
--- a/src/test/shell/bazel/external_skylark_load_test.sh
+++ b/src/test/shell/bazel/external_skylark_load_test.sh
@@ -23,7 +23,7 @@
 
 # The following tests build an instance of a Skylark macro loaded from a
 # local_repository, which in turns loads another Skylark file either from
-# the external repo or the default repo, depending on the test parameters.
+# the external repo or the main repo, depending on the test parameters.
 # The tests cover all the valid syntactic variants of the second load. The
 # package structure used for the tests is as follows:
 #