diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
index 16f926a..b5d6c1c 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
@@ -340,7 +340,7 @@
     }
     List<PathFragment> inputExecPaths = new ArrayList<>();
     for (String path : entry.getPaths()) {
-      PathFragment execPath = new PathFragment(path);
+      PathFragment execPath = PathFragment.create(path);
       // Code assumes that action has only 1-2 outputs and ArrayList.contains() will be
       // most efficient.
       if (!outputs.contains(execPath)) {
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
index c63fd5b..c4567d8 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
@@ -81,7 +81,7 @@
 
     @Override
     public PathFragment getExecPath() {
-      return new PathFragment(path);
+      return PathFragment.create(path);
     }
 
     @Override
@@ -170,7 +170,7 @@
    * relative to that Artifact.
    */
   public static TreeFileArtifact treeFileArtifact(Artifact parent, String relativePath) {
-    return treeFileArtifact(parent, new PathFragment(relativePath));
+    return treeFileArtifact(parent, PathFragment.create(relativePath));
   }
 
   /** Returns an Iterable of TreeFileArtifacts with the given parent and parent relative paths. */
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
index a5b865f..7c6a870 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -547,7 +547,7 @@
         && relativePath.getSegment(0).equals(Label.EXTERNAL_PATH_PREFIX)) {
       // Turn external/repo/foo into ../repo/foo.
       relativePath = relativePath.relativeTo(Label.EXTERNAL_PATH_PREFIX);
-      relativePath = new PathFragment("..").getRelative(relativePath);
+      relativePath = PathFragment.create("..").getRelative(relativePath);
     }
     return relativePath;
   }
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 3f2f360..ddeb001 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
@@ -127,7 +127,7 @@
    */
   public ArtifactFactory(Path execRootParent, String derivedPathPrefix) {
     this.execRootParent = execRootParent;
-    this.derivedPathPrefix = new PathFragment(derivedPathPrefix);
+    this.derivedPathPrefix = PathFragment.create(derivedPathPrefix);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java
index 404b0de..2a19d03 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java
@@ -175,8 +175,8 @@
       PathFragment packageDirectory, String purpose, Iterable<Artifact> inputs, Root middlemanDir) {
     String escapedPackageDirectory = Actions.escapedPath(packageDirectory.getPathString());
     PathFragment stampName =
-        new PathFragment("_middlemen/" + (purpose.startsWith(escapedPackageDirectory)
-                                 ? purpose : (escapedPackageDirectory + purpose)));
+        PathFragment.create("_middlemen/" + (purpose.startsWith(escapedPackageDirectory)
+                             ? purpose : (escapedPackageDirectory + purpose)));
     Artifact stampFile = artifactFactory.getDerivedArtifact(stampName, middlemanDir,
         actionRegistry.getOwner());
     MiddlemanAction.create(
@@ -186,7 +186,7 @@
 
   private Artifact getStampFileArtifact(String middlemanName, String purpose, Root middlemanDir) {
     String escapedFilename = Actions.escapedPath(middlemanName);
-    PathFragment stampName = new PathFragment("_middlemen/" + escapedFilename + "-" + purpose);
+    PathFragment stampName = PathFragment.create("_middlemen/" + escapedFilename + "-" + purpose);
     Artifact stampFile = artifactFactory.getDerivedArtifact(stampName, middlemanDir,
         actionRegistry.getOwner());
     return stampFile;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index 7c18968..036e747 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -478,7 +478,7 @@
         String bzlFileLoadLikeString = aspect.substring(0, delimiterPosition);
         if (!bzlFileLoadLikeString.startsWith("//") && !bzlFileLoadLikeString.startsWith("@")) {
           // "Legacy" behavior of '--aspects' parameter.
-          bzlFileLoadLikeString = new PathFragment("/" + bzlFileLoadLikeString).toString();
+          bzlFileLoadLikeString = PathFragment.create("/" + bzlFileLoadLikeString).toString();
           if (bzlFileLoadLikeString.endsWith(".bzl")) {
             bzlFileLoadLikeString = bzlFileLoadLikeString.substring(0,
                 bzlFileLoadLikeString.length() - ".bzl".length());
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java b/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
index e38c3d9..ae8736c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CommandHelper.java
@@ -298,6 +298,6 @@
   private PathFragment shellPath(Map<String, String> executionInfo) {
     // Use vanilla /bin/bash for actions running on mac machines.
     return executionInfo.containsKey(ExecutionRequirements.REQUIRES_DARWIN)
-        ? new PathFragment("/bin/bash") : ruleContext.getConfiguration().getShellExecutable();
+        ? PathFragment.create("/bin/bash") : ruleContext.getConfiguration().getShellExecutable();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index a54befb..3ebdd78 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -554,7 +554,7 @@
    * thus guaranteeing that it never clashes with artifacts created by rules in other packages.
    */
   public Artifact getPackageRelativeArtifact(String relative, Root root) {
-    return getPackageRelativeArtifact(new PathFragment(relative), root);
+    return getPackageRelativeArtifact(PathFragment.create(relative), root);
   }
 
   /**
@@ -562,7 +562,7 @@
    * guaranteeing that it never clashes with artifacts created by rules in other packages.
    */
   public Artifact getBinArtifact(String relative) {
-    return getBinArtifact(new PathFragment(relative));
+    return getBinArtifact(PathFragment.create(relative));
   }
 
   public Artifact getBinArtifact(PathFragment relative) {
@@ -575,7 +575,7 @@
    * guaranteeing that it never clashes with artifacts created by rules in other packages.
    */
   public Artifact getGenfilesArtifact(String relative) {
-    return getGenfilesArtifact(new PathFragment(relative));
+    return getGenfilesArtifact(PathFragment.create(relative));
   }
 
   public Artifact getGenfilesArtifact(PathFragment relative) {
@@ -664,7 +664,7 @@
    */
   public Artifact getUniqueDirectoryArtifact(
       String uniqueDirectory, String relative, Root root) {
-    return getUniqueDirectoryArtifact(uniqueDirectory, new PathFragment(relative), root);
+    return getUniqueDirectoryArtifact(uniqueDirectory, PathFragment.create(relative), root);
   }
 
   /**
@@ -1235,7 +1235,7 @@
    * <p>For example "pkg/dir/name" -> "pkg/&lt;fragment>/rule/dir/name.
    */
   public final PathFragment getUniqueDirectory(String fragment) {
-    return AnalysisUtils.getUniqueDirectory(getLabel(), new PathFragment(fragment));
+    return AnalysisUtils.getUniqueDirectory(getLabel(), PathFragment.create(fragment));
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
index 2ef4c2c..33c5d0a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
@@ -785,7 +785,7 @@
      *     created.
      */
     public Builder(String workspace, boolean legacyExternalRunfiles) {
-      this(new PathFragment(workspace), legacyExternalRunfiles);
+      this(PathFragment.create(workspace), legacyExternalRunfiles);
     }
 
     /**
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactAction.java
index 67dae4d..26eeadc 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactAction.java
@@ -267,7 +267,7 @@
     for (String line :
         FileSystemUtils.iterateLinesAsLatin1(archiveManifest.getPath())) {
       if (!line.isEmpty()) {
-        PathFragment path = new PathFragment(line);
+        PathFragment path = PathFragment.create(line);
 
         if (!path.isNormalized() || path.isAbsolute()) {
           throw new IllegalManifestFileException(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
index ce1316f..664429e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
@@ -999,7 +999,7 @@
      * commands to be executed.
      */
     public Builder setShellCommand(Iterable<String> command) {
-      this.executable = new PathFragment(Iterables.getFirst(command, null));
+      this.executable = PathFragment.create(Iterables.getFirst(command, null));
       // The first item of the commands is the shell executable that should be used.
       this.executableArgs = ImmutableList.copyOf(Iterables.skip(command, 1));
       this.isShellCommand = true;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
index 73cc667..2dd779f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BinTools.java
@@ -139,7 +139,7 @@
     if (!embeddedTools.contains(embedPath)) {
       return null;
     }
-    return new PathFragment("_bin").getRelative(new PathFragment(embedPath).getBaseName());
+    return PathFragment.create("_bin").getRelative(PathFragment.create(embedPath).getBaseName());
   }
 
   public Artifact getEmbeddedArtifact(String embedPath, ArtifactFactory artifactFactory) {
@@ -174,7 +174,7 @@
 
   private void setupTool(String embeddedPath) throws ExecException {
     Path sourcePath = directories.getEmbeddedBinariesRoot().getRelative(embeddedPath);
-    Path linkPath = binDir.getRelative(new PathFragment(embeddedPath).getBaseName());
+    Path linkPath = binDir.getRelative(PathFragment.create(embeddedPath).getBaseName());
     linkTool(sourcePath, linkPath);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java
index 2f21d85..2dbc228 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java
@@ -300,9 +300,9 @@
       Root root = env.getDirectories().getBuildDataDirectory(workspaceName);
 
       Artifact stableArtifact = factory.getDerivedArtifact(
-          new PathFragment("stable-status.txt"), root, artifactOwner);
+          PathFragment.create("stable-status.txt"), root, artifactOwner);
       Artifact volatileArtifact = factory.getConstantMetadataArtifact(
-          new PathFragment("volatile-status.txt"), root, artifactOwner);
+          PathFragment.create("volatile-status.txt"), root, artifactOwner);
 
       return new BazelWorkspaceStatusAction(options, env.getClientEnv(),
           env.getDirectories().getWorkspace(), stableArtifact, volatileArtifact, getHostname());
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/CompressedTarFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/CompressedTarFunction.java
index 55cd813..2e245b4 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/CompressedTarFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/CompressedTarFunction.java
@@ -59,7 +59,7 @@
           FileSystemUtils.createDirectoryAndParents(filename);
         } else {
           if (entry.isSymbolicLink() || entry.isLink()) {
-            PathFragment linkName = new PathFragment(entry.getLinkName());
+            PathFragment linkName = PathFragment.create(entry.getLinkName());
             boolean wasAbsolute = linkName.isAbsolute();
             // Strip the prefix from the link path if set.
             linkName =
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java
index a25bc2c..76dc213 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java
@@ -98,8 +98,8 @@
         if (!mapper.isAttributeValueExplicitlySpecified("settings_file")) {
           settingsFiles = getDefaultSettingsFile(directories, env);
         } else {
-          PathFragment settingsFilePath = new PathFragment(
-              mapper.get("settings_file", Type.STRING));
+          PathFragment settingsFilePath =
+              PathFragment.create(mapper.get("settings_file", Type.STRING));
           RootedPath settingsPath = RootedPath.toRootedPath(
               directories.getWorkspace().getRelative(settingsFilePath),
               PathFragment.EMPTY_FRAGMENT);
@@ -183,7 +183,8 @@
     ImmutableList.Builder<SkyKey> settingsFilesBuilder = ImmutableList.builder();
     SkyKey systemKey = null;
     if (m2Home != null) {
-      PathFragment mavenInstallSettings = new PathFragment(m2Home).getRelative("conf/settings.xml");
+      PathFragment mavenInstallSettings =
+          PathFragment.create(m2Home).getRelative("conf/settings.xml");
       systemKey = FileValue.key(
           RootedPath.toRootedPath(directories.getWorkspace().getRelative(mavenInstallSettings),
               PathFragment.EMPTY_FRAGMENT));
@@ -194,7 +195,7 @@
     String userHome = System.getenv("HOME");
     SkyKey userKey = null;
     if (userHome != null) {
-      PathFragment userSettings = new PathFragment(userHome).getRelative(".m2/settings.xml");
+      PathFragment userSettings = PathFragment.create(userHome).getRelative(".m2/settings.xml");
       userKey = FileValue.key(RootedPath.toRootedPath(
           directories.getWorkspace().getRelative(userSettings),
           PathFragment.EMPTY_FRAGMENT));
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/StripPrefixedPath.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/StripPrefixedPath.java
index 46650d6..d26cd99 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/StripPrefixedPath.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/StripPrefixedPath.java
@@ -64,9 +64,9 @@
    * Normalize the path and, if it is absolute, make it relative (e.g., /foo/bar becomes foo/bar).
    */
   private static PathFragment relativize(String path) {
-    PathFragment entryPath = new PathFragment(path).normalize();
+    PathFragment entryPath = PathFragment.create(path).normalize();
     if (entryPath.isAbsolute()) {
-      entryPath = new PathFragment(entryPath.getSafePathString().substring(
+      entryPath = PathFragment.create(entryPath.getSafePathString().substring(
           entryPath.windowsVolume().length() + 1));
     }
     return entryPath;
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java
index d43a117..244e859 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java
@@ -124,7 +124,7 @@
       // For symlinks, the "compressed data" is actually the target name.
       int read = reader.getInputStream(entry).read(buffer);
       Preconditions.checkState(read == buffer.length);
-      PathFragment target = new PathFragment(new String(buffer, Charset.defaultCharset()))
+      PathFragment target = PathFragment.create(new String(buffer, Charset.defaultCharset()))
           .normalize();
       if (!target.isNormalized()) {
         throw new IOException("Zip entries cannot refer to files outside of their directory: "
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java
index 0af26ec..c35db98 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpDownloader.java
@@ -222,7 +222,7 @@
     }
     String basename =
         MoreObjects.firstNonNull(
-            Strings.emptyToNull(new PathFragment(url.getPath()).getBaseName()),
+            Strings.emptyToNull(PathFragment.create(url.getPath()).getBaseName()),
             "temp");
     if (!type.get().isEmpty()) {
       String suffix = "." + type.get();
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 deff590..7e382b2 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
@@ -152,7 +152,7 @@
   private SkylarkPath getPath(String method, Object path)
       throws EvalException, InterruptedException {
     if (path instanceof String) {
-      PathFragment pathFragment = new PathFragment(path.toString());
+      PathFragment pathFragment = PathFragment.create(path.toString());
       return new SkylarkPath(pathFragment.isAbsolute()
           ? outputDirectory.getFileSystem().getPath(path.toString())
           : outputDirectory.getRelative(pathFragment));
@@ -426,7 +426,7 @@
           "Program argument of which() may not contains a / or a \\ ('" + program + "' given)");
     }
     for (String p : getPathEnvironment()) {
-      PathFragment fragment = new PathFragment(p);
+      PathFragment fragment = PathFragment.create(p);
       if (fragment.isAbsolute()) {
         // We ignore relative path as they don't mean much here (relative to where? the workspace
         // root?).
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfiguration.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfiguration.java
index 4965687..54eccb7 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelConfiguration.java
@@ -61,20 +61,20 @@
     if (OS.getCurrent() == OS.WINDOWS) {
       String path = System.getenv("BAZEL_SH");
       if (path != null) {
-        return new PathFragment(path);
+        return PathFragment.create(path);
       } else {
-        return new PathFragment("c:/tools/msys64/usr/bin/bash.exe");
+        return PathFragment.create("c:/tools/msys64/usr/bin/bash.exe");
       }
     }
     if (OS.getCurrent() == OS.FREEBSD) {
       String path = System.getenv("BAZEL_SH");
       if (path != null) {
-        return  new PathFragment(path);
+        return  PathFragment.create(path);
       } else {
-        return new PathFragment("/usr/local/bin/bash");
+        return PathFragment.create("/usr/local/bin/bash");
       }
     }
-    return new PathFragment("/bin/bash");
+    return PathFragment.create("/bin/bash");
   }
 
   @Override
@@ -101,10 +101,10 @@
     String newPath = "";
     if (sh != null && sh.getParentDirectory() != null) {
       newPath = sh.getParentDirectory().getPathString();
-      if (sh.getParentDirectory().endsWith(new PathFragment("usr/bin"))) {
+      if (sh.getParentDirectory().endsWith(PathFragment.create("usr/bin"))) {
         newPath +=
             ";" + sh.getParentDirectory().getParentDirectory().replaceName("bin").getPathString();
-      } else if (sh.getParentDirectory().endsWith(new PathFragment("bin"))) {
+      } else if (sh.getParentDirectory().endsWith(PathFragment.create("bin"))) {
         newPath +=
             ";" + sh.getParentDirectory().replaceName("usr").getRelative("bin").getPathString();
       }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
index 6373eb6..acf6f78 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
@@ -61,7 +61,7 @@
 
   private static final String TOOLCHAIN_NAME_PREFIX = "toolchain-";
   private static final String PATH_ENV_VAR = "ANDROID_NDK_HOME";
-  private static final PathFragment PLATFORMS_DIR = new PathFragment("platforms");
+  private static final PathFragment PLATFORMS_DIR = PathFragment.create("platforms");
 
   private static final Iterable<String> PATH_ENV_VAR_AS_LIST = ImmutableList.of(PATH_ENV_VAR);
 
@@ -229,7 +229,7 @@
 
   private static PathFragment getAndroidNdkHomeEnvironmentVar(
       Path workspace, Map<String, String> env) {
-    return workspace.getRelative(new PathFragment(env.get(PATH_ENV_VAR))).asFragment();
+    return workspace.getRelative(PathFragment.create(env.get(PATH_ENV_VAR))).asFragment();
   }
 
   private static String createBuildFile(String ruleName, List<CrosstoolStlPair> crosstools) {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
index 0c98f90..14b0537 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
@@ -56,9 +56,9 @@
  * Implementation of the {@code android_sdk_repository} rule.
  */
 public class AndroidSdkRepositoryFunction extends RepositoryFunction {
-  private static final PathFragment BUILD_TOOLS_DIR = new PathFragment("build-tools");
-  private static final PathFragment PLATFORMS_DIR = new PathFragment("platforms");
-  private static final PathFragment SYSTEM_IMAGES_DIR = new PathFragment("system-images");
+  private static final PathFragment BUILD_TOOLS_DIR = PathFragment.create("build-tools");
+  private static final PathFragment PLATFORMS_DIR = PathFragment.create("platforms");
+  private static final PathFragment SYSTEM_IMAGES_DIR = PathFragment.create("system-images");
   private static final Revision MIN_BUILD_TOOLS_REVISION = new Revision(24, 0, 3);
   private static final String PATH_ENV_VAR = "ANDROID_HOME";
   private static final ImmutableList<String> PATH_ENV_VAR_AS_LIST = ImmutableList.of(PATH_ENV_VAR);
@@ -250,7 +250,7 @@
 
   private static PathFragment getAndroidHomeEnvironmentVar(
       Path workspace, Map<String, String> env) {
-    return workspace.getRelative(new PathFragment(env.get(PATH_ENV_VAR))).asFragment();
+    return workspace.getRelative(PathFragment.create(env.get(PATH_ENV_VAR))).asFragment();
   }
 
   private static String getStringResource(String name) {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
index 5f39856..293091f 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
@@ -226,7 +226,7 @@
         if (!isRunfilesEnabled) {
           buffer.append("$(rlocation ");
           PathFragment runfilePath =
-              new PathFragment(new PathFragment(workspacePrefix), artifact.getRunfilesPath());
+              PathFragment.create(PathFragment.create(workspacePrefix), artifact.getRunfilesPath());
           buffer.append(runfilePath.normalize().getPathString());
           buffer.append(")");
         } else {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
index a913927..e4b0262 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java
@@ -55,7 +55,7 @@
       FileTypeSet.of(BazelPyRuleClasses.PYTHON_SOURCE),
       "srcs", "deps", "data");
 
-  public static final PathFragment ZIP_RUNFILES_DIRECTORY_NAME = new PathFragment("runfiles");
+  public static final PathFragment ZIP_RUNFILES_DIRECTORY_NAME = PathFragment.create("runfiles");
 
   @Override
   public void validate(RuleContext ruleContext, PyCommon common) {
@@ -86,7 +86,7 @@
     PathFragment packageFragment = ruleContext.getLabel().getPackageIdentifier().getRunfilesPath();
     // Python scripts start with x.runfiles/ as the module space, so everything must be manually
     // adjusted to be relative to the workspace name.
-    packageFragment = new PathFragment(ruleContext.getWorkspaceName())
+    packageFragment = PathFragment.create(ruleContext.getWorkspaceName())
         .getRelative(packageFragment);
     for (String importsAttr : ruleContext.attributes().get("imports", Type.STRING_LIST)) {
       importsAttr = ruleContext.expandMakeVariables("includes", importsAttr);
@@ -201,7 +201,7 @@
   }
 
   private static boolean isUnderWorkspace(PathFragment path) {
-    return !path.startsWith(Label.EXTERNAL_PACKAGE_NAME);
+    return !path.startsWith(PathFragment.create(Label.EXTERNAL_PATH_PREFIX));
   }
 
   private static String getZipRunfilesPath(PathFragment path, PathFragment workspaceName) {
@@ -220,7 +220,7 @@
   }
 
   private static String getZipRunfilesPath(String path, PathFragment workspaceName) {
-    return getZipRunfilesPath(new PathFragment(path), workspaceName);
+    return getZipRunfilesPath(PathFragment.create(path), workspaceName);
   }
 
   private static void createPythonZipAction(
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java b/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
index 0ae420a..40d8d0f 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/OutputDirectoryLinksUtils.java
@@ -132,7 +132,7 @@
   // Helper to getPrettyPath.  Returns file, relativized w.r.t. the referent of
   // "linkname", or null if it was a not a child.
   private static PathFragment relativize(Path file, Path workspaceDirectory, String linkname) {
-    PathFragment link = new PathFragment(linkname);
+    PathFragment link = PathFragment.create(linkname);
     try {
       Path dir = workspaceDirectory.getRelative(link);
       PathFragment levelOneLinkTarget = dir.readSymbolicLink();
@@ -171,7 +171,7 @@
     removeLink(workspace, symlinkPrefix + "bin", failures);
     removeLink(workspace, symlinkPrefix + "testlogs", failures);
     removeLink(workspace, symlinkPrefix + "genfiles", failures);
-    FileSystemUtils.removeDirectoryAndParents(workspace, new PathFragment(symlinkPrefix));
+    FileSystemUtils.removeDirectoryAndParents(workspace, PathFragment.create(symlinkPrefix));
     if (!failures.isEmpty()) {
       eventHandler.handle(Event.warn(String.format(
           "failed to remove one or more convenience symlinks for prefix '%s':\n  %s", symlinkPrefix,
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 1d31f2e..4bc5a4c 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
@@ -51,8 +51,8 @@
 @Immutable
 @ThreadSafe
 public final class Label implements Comparable<Label>, Serializable, SkylarkPrintableValue {
-  public static final PathFragment EXTERNAL_PACKAGE_NAME = new PathFragment("external");
-  public static final PathFragment EXTERNAL_PACKAGE_FILE_NAME = new PathFragment("WORKSPACE");
+  public static final PathFragment EXTERNAL_PACKAGE_NAME = PathFragment.create("external");
+  public static final PathFragment EXTERNAL_PACKAGE_FILE_NAME = PathFragment.create("WORKSPACE");
   public static final String DEFAULT_REPOSITORY_DIRECTORY = "__main__";
 
   /**
@@ -61,11 +61,11 @@
    */
   public static final ImmutableSet<PathFragment> ABSOLUTE_PACKAGE_NAMES = ImmutableSet.of(
       // Used for select
-      new PathFragment("conditions"),
+      PathFragment.create("conditions"),
       // dependencies that are a function of the configuration
-      new PathFragment("tools/defaults"),
+      PathFragment.create("tools/defaults"),
       // Visibility is labels aren't actually targets
-      new PathFragment("visibility"),
+      PathFragment.create("visibility"),
       // There is only one //external package
       Label.EXTERNAL_PACKAGE_NAME);
 
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 5688a31..3c82f6c 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
@@ -49,7 +49,7 @@
       PathFragment.EMPTY_FRAGMENT);
 
   public static PackageIdentifier createInMainRepo(String name) {
-    return createInMainRepo(new PathFragment(name));
+    return createInMainRepo(PathFragment.create(name));
   }
 
   public static PackageIdentifier createInMainRepo(PathFragment name) {
@@ -79,7 +79,7 @@
         ? Preconditions.checkNotNull(
             execPath.getParentDirectory(), "Must pass in files, not root directory")
         : execPath;
-    if (tofind.startsWith(new PathFragment(Label.EXTERNAL_PATH_PREFIX))) {
+    if (tofind.startsWith(PathFragment.create(Label.EXTERNAL_PATH_PREFIX))) {
       // TODO(ulfjack): Remove this when kchodorow@'s exec root rearrangement has been rolled out.
       RepositoryName repository = RepositoryName.create("@" + tofind.getSegment(1));
       return PackageIdentifier.create(repository, tofind.subFragment(2, tofind.segmentCount()));
@@ -137,7 +137,7 @@
       throw new LabelSyntaxException(error);
     }
 
-    return create(repo, new PathFragment(packageName));
+    return create(repo, PathFragment.create(packageName));
   }
 
   public RepositoryName getRepository() {
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 ae1fe70..b9564e7 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
@@ -232,7 +232,7 @@
   public PathFragment getPathUnderExecRoot() {
     return isDefault() || isMain()
         ? PathFragment.EMPTY_FRAGMENT
-        : new PathFragment(Label.EXTERNAL_PATH_PREFIX).getRelative(strippedName());
+        : PathFragment.create(Label.EXTERNAL_PATH_PREFIX).getRelative(strippedName());
   }
 
   /**
@@ -241,7 +241,7 @@
   // TODO(kchodorow): remove once execroot is reorg-ed.
   public PathFragment getRunfilesPath() {
     return isDefault() || isMain()
-        ? PathFragment.EMPTY_FRAGMENT : new PathFragment("..").getRelative(strippedName());
+        ? PathFragment.EMPTY_FRAGMENT : PathFragment.create("..").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 f599ef3..be3bcaa 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
@@ -779,7 +779,7 @@
         try {
           PackageAndTarget packageAndTarget = LabelValidator.validateAbsoluteLabel(fullLabel);
           packageIdentifier = PackageIdentifier.create(repository,
-              new PathFragment(packageAndTarget.getPackageName()));
+              PathFragment.create(packageAndTarget.getPackageName()));
         } catch (BadLabelException e) {
           String error = "invalid target format '" + originalPattern + "': " + e.getMessage();
           throw new TargetParsingException(error);
diff --git a/src/main/java/com/google/devtools/build/lib/exec/SingleBuildFileCache.java b/src/main/java/com/google/devtools/build/lib/exec/SingleBuildFileCache.java
index 4099a8a..ec93068 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/SingleBuildFileCache.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/SingleBuildFileCache.java
@@ -130,7 +130,7 @@
    */
   private String fullPath(ActionInput input) {
     String relPath = input.getExecPathString();
-    return new PathFragment(relPath).isAbsolute() ? relPath : new File(cwd, relPath).getPath();
+    return PathFragment.create(relPath).isAbsolute() ? relPath : new File(cwd, relPath).getPath();
   }
 
   /** Container class for caching I/O around ActionInputs. */
diff --git a/src/main/java/com/google/devtools/build/lib/exec/SpawnInputExpander.java b/src/main/java/com/google/devtools/build/lib/exec/SpawnInputExpander.java
index f32d238..351f8c7 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/SpawnInputExpander.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/SpawnInputExpander.java
@@ -147,7 +147,7 @@
       PathFragment location;
       int pos = line.indexOf(' ');
       if (pos == -1) {
-        location = new PathFragment(line);
+        location = PathFragment.create(line);
         artifact = EMPTY_FILE;
       } else {
         String targetPath = line.substring(pos + 1);
@@ -156,7 +156,7 @@
         }
         artifact = targetPath.isEmpty() ? EMPTY_FILE : ActionInputHelper.fromPath(targetPath);
 
-        location = new PathFragment(line.substring(0, pos));
+        location = PathFragment.create(line.substring(0, pos));
         if (!workspaceName.isEmpty()) {
           if (!location.getSegment(0).equals(workspaceName)) {
             throw new IOException(
diff --git a/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java b/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java
index 9a99031..0a29b9f 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java
@@ -127,7 +127,7 @@
     }
   }
 
-  public static final PathFragment TEST_TMP_ROOT = new PathFragment("_tmp");
+  public static final PathFragment TEST_TMP_ROOT = PathFragment.create("_tmp");
 
   // Used for generating unique temporary directory names. Contains the next numeric index for every
   // executable base name.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java b/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java
index e55a4ed..d52db41 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java
@@ -140,7 +140,7 @@
     this.srcLabel = Preconditions.checkNotNull(srcLabel);
     this.files = files == null ? null : ImmutableList.copyOf(files);
     this.excludes = (excludes == null || excludes.isEmpty()) ? null : ImmutableSet.copyOf(excludes);
-    this.destDir = new PathFragment((destDir == null) ? "" : destDir);
+    this.destDir = PathFragment.create((destDir == null) ? "" : destDir);
     this.symlinkBehavior = symlinkBehavior == null ? DEFAULT_SYMLINK_BEHAVIOR : symlinkBehavior;
     this.stripPrefix = stripPrefix == null ? DEFAULT_STRIP_PREFIX : stripPrefix;
   }
@@ -225,7 +225,7 @@
     } else if (stripPrefix.startsWith("/")) {
       return "Cannot specify absolute strip prefix; perhaps you need to use \""
           + STRIP_PREFIX_WORKSPACE + "\"";
-    } else if (new PathFragment(stripPrefix).containsUplevelReferences()) {
+    } else if (PathFragment.create(stripPrefix).containsUplevelReferences()) {
       return "Strip prefix must not contain uplevel references";
     } else if (stripPrefix.startsWith("%") && !stripPrefix.startsWith(STRIP_PREFIX_WORKSPACE)) {
       return "If the strip_prefix starts with \"%\" then it must start with \""
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
index 9de8f76..8d7ed33 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
@@ -301,10 +301,10 @@
     if (attrName.equals("name")) {
       return singleton(rule.getName());
     } else if (attrName.equals("dirname")) {
-      PathFragment dir = new PathFragment(rule.getName()).getParentDirectory();
+      PathFragment dir = PathFragment.create(rule.getName()).getParentDirectory();
       return (dir.segmentCount() == 0) ? singleton("") : singleton(dir.getPathString() + "/");
     } else if (attrName.equals("basename")) {
-      return singleton(new PathFragment(rule.getName()).getBaseName());
+      return singleton(PathFragment.create(rule.getName()).getBaseName());
     }
 
     Type<?> attrType = rule.getAttributeType(attrName);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index e4f7261..1556dcb14 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -526,7 +526,7 @@
     // stat(2) is executed.
     Path filename = getPackageDirectory().getRelative(targetName);
     String suffix;
-    if (!new PathFragment(targetName).isNormalized()) {
+    if (!PathFragment.create(targetName).isNormalized()) {
       // Don't check for file existence in this case because the error message
       // would be confusing and wrong. If the targetName is "foo/bar/.", and
       // there is a directory "foo/bar", it doesn't mean that "//pkg:foo/bar/."
@@ -1242,7 +1242,7 @@
       // Now, modify the package:
       for (OutputFile outputFile : rule.getOutputFiles()) {
         targets.put(outputFile.getName(), outputFile);
-        PathFragment outputFileFragment = new PathFragment(outputFile.getName());
+        PathFragment outputFileFragment = PathFragment.create(outputFile.getName());
         for (int i = 1; i < outputFileFragment.segmentCount(); i++) {
           String prefix = outputFileFragment.subFragment(0, i).toString();
           if (!outputFilePrefixes.containsKey(prefix)) {
@@ -1430,7 +1430,7 @@
         }
 
         // Check if a prefix of this output file matches an already existing one
-        PathFragment outputFileFragment = new PathFragment(outputFileName);
+        PathFragment outputFileFragment = PathFragment.create(outputFileName);
         for (int i = 1; i < outputFileFragment.segmentCount(); i++) {
           String prefix = outputFileFragment.subFragment(0, i).toString();
           if (outputFiles.containsKey(prefix)) {
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 144dc89..b9be5a0 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
@@ -65,7 +65,7 @@
       relativePkg = pkg;
     }
 
-    PathFragment relative = new PathFragment(relativePkg);
+    PathFragment relative = PathFragment.create(relativePkg);
 
     if (discardBuild && relative.getBaseName().equals("BUILD")) {
       relative = relative.getParentDirectory();
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 37bc246..1324cce 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
@@ -107,7 +107,7 @@
   static final Function<? super Rule, Map<String, Label>> NO_EXTERNAL_BINDINGS =
       Functions.<Map<String, Label>>constant(ImmutableMap.<String, Label>of());
 
-  public static final PathFragment THIRD_PARTY_PREFIX = new PathFragment("third_party");
+  public static final PathFragment THIRD_PARTY_PREFIX = PathFragment.create("third_party");
 
   /**
    * A constraint for the package name of the Rule instances.
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 3ccbc1db..3060916 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
@@ -163,7 +163,7 @@
       // Replace "%workspace%" with the path of the enclosing workspace directory.
       pathElement = pathElement.replace(workspaceWildcard, workspace.getPathString());
 
-      PathFragment pathElementFragment = new PathFragment(pathElement);
+      PathFragment pathElementFragment = PathFragment.create(pathElement);
 
       // If the path string started with "%workspace%" or "/", it is already absolute,
       // so the following line is a no-op.
@@ -218,7 +218,7 @@
     AtomicReference<? extends UnixGlob.FilesystemCalls> cache = UnixGlob.DEFAULT_SYSCALLS_REF;
     // TODO(bazel-team): correctness in the presence of changes to the location of the WORKSPACE
     // file.
-    return getFilePath(new PathFragment("WORKSPACE"), cache);
+    return getFilePath(PathFragment.create("WORKSPACE"), cache);
   }
 
   private Path getFilePath(PathFragment suffix,
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 d8534ca..d12b3ac 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
@@ -69,7 +69,7 @@
   }
 
   public static PathFragment getPathFragment(String pathPrefix) throws TargetParsingException {
-    PathFragment directory = new PathFragment(pathPrefix);
+    PathFragment directory = PathFragment.create(pathPrefix);
     if (directory.containsUplevelReferences()) {
       throw new TargetParsingException("up-level references are not permitted: '"
           + directory.getPathString() + "'");
diff --git a/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java b/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java
index e2fb0e4..23a9560 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/RBuildFilesFunction.java
@@ -61,7 +61,7 @@
       new Function<Argument, PathFragment>() {
         @Override
         public PathFragment apply(Argument argument) {
-          return new PathFragment(argument.getWord());
+          return PathFragment.create(argument.getWord());
         }
       };
 
diff --git a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
index 89c61c2..0850fec 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
@@ -227,7 +227,7 @@
   public TreeNode buildFromActionInputs(Iterable<? extends ActionInput> inputs) {
     TreeMap<PathFragment, ActionInput> sortedMap = new TreeMap<>();
     for (ActionInput input : inputs) {
-      sortedMap.put(new PathFragment(input.getExecPathString()), input);
+      sortedMap.put(PathFragment.create(input.getExecPathString()), input);
     }
     return buildFromActionInputs(sortedMap);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
index 445716a..4352174 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
@@ -914,7 +914,7 @@
   public Artifact newDirectory(String name, Object siblingArtifactUnchecked) throws EvalException {
     checkMutable("experimental_new_directory");
     if (siblingArtifactUnchecked == Runtime.NONE) {
-      return ruleContext.getPackageRelativeTreeArtifact(new PathFragment(name), newFileRoot());
+      return ruleContext.getPackageRelativeTreeArtifact(PathFragment.create(name), newFileRoot());
     }
     Artifact siblingArtifact = (Artifact) siblingArtifactUnchecked;
     PathFragment original = siblingArtifact.getRootRelativePath();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
index cd6182a..9f5500f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
@@ -636,14 +636,14 @@
         checkConflicts = true;
         for (Map.Entry<String, Artifact> entry : symlinks.getContents(
             String.class, Artifact.class, "symlinks").entrySet()) {
-          builder.addSymlink(new PathFragment(entry.getKey()), entry.getValue());
+          builder.addSymlink(PathFragment.create(entry.getKey()), entry.getValue());
         }
       }
       if (!rootSymlinks.isEmpty()) {
         checkConflicts = true;
         for (Map.Entry<String, Artifact> entry : rootSymlinks.getContents(
             String.class, Artifact.class, "root_symlinks").entrySet()) {
-          builder.addRootSymlink(new PathFragment(entry.getKey()), entry.getValue());
+          builder.addRootSymlink(PathFragment.create(entry.getKey()), entry.getValue());
         }
       }
       Runfiles runfiles = builder.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java
index 55253a0..d3e3258 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java
@@ -90,7 +90,7 @@
   public void createGenerateResourceSymbolsAction(Artifact javaSourcesJar,
       Artifact rTxt, String javaPackage, boolean inlineConstants) {
     // java path from the provided package for the resources
-    PathFragment javaPath = new PathFragment(javaPackage.replace('.', '/'));
+    PathFragment javaPath = PathFragment.create(javaPackage.replace('.', '/'));
 
     PathFragment javaResourcesRoot = javaSourcesJar.getRoot().getExecPath().getRelative(
         ruleContext.getUniqueDirectory("_java_resources"));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index c917b5d..91a43c0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -772,7 +772,7 @@
   }
 
   public static PathFragment getAssetDir(RuleContext ruleContext) {
-    return new PathFragment(ruleContext.attributes().get(
+    return PathFragment.create(ruleContext.attributes().get(
         ResourceType.ASSETS.getAttribute() + "_dir",
         Type.STRING));
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
index 1f8b0b6..7326e17 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
@@ -256,7 +256,7 @@
       // Reconstruct the package tree under <rule>_aidl to avoid a name conflict
       // if the same AIDL files are used in multiple targets.
       PathFragment javaOutputPath = FileSystemUtils.replaceExtension(
-          new PathFragment(ruleName + "_aidl").getRelative(idl.getRootRelativePath()),
+          PathFragment.create(ruleName + "_aidl").getRelative(idl.getRootRelativePath()),
           ".java");
       Artifact output = ruleContext.getGenfilesArtifact(javaOutputPath.getPathString());
       outputJavaSources.put(idl, output);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
index d690366..1821c4b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
@@ -154,7 +154,7 @@
    */
   public static ApplicationManifest generatedManifest(RuleContext ruleContext) {
     Artifact generatedManifest = ruleContext.getUniqueDirectoryArtifact(
-        ruleContext.getRule().getName() + "_generated", new PathFragment("AndroidManifest.xml"),
+        ruleContext.getRule().getName() + "_generated", PathFragment.create("AndroidManifest.xml"),
         ruleContext.getBinOrGenfilesDirectory());
 
     String manifestPackage = AndroidCommon.getJavaPackage(ruleContext);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
index b5a8c5f..48783e6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java
@@ -139,7 +139,7 @@
     for (Map.Entry<String, Iterable<Artifact>> entry : nativeLibs.entrySet()) {
       String arch = entry.getKey();
       for (Artifact lib : entry.getValue()) {
-        symlinks.put(new PathFragment(arch + "/" + lib.getExecPath().getBaseName()), lib);
+        symlinks.put(PathFragment.create(arch + "/" + lib.getExecPath().getBaseName()), lib);
       }
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
index 950c800..9b9ae31 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
@@ -220,9 +220,9 @@
     // linkopt "-shared", which causes the result of linking to be a shared
     // library. In this case, the name of the executable target should end
     // in ".so" or "dylib" or ".dll".
-    PathFragment binaryPath = new PathFragment(ruleContext.getTarget().getName());
+    PathFragment binaryPath = PathFragment.create(ruleContext.getTarget().getName());
     if (!isLinkShared(ruleContext)) {
-      binaryPath = new PathFragment(binaryPath.getPathString() + OsUtils.executableExtension());
+      binaryPath = PathFragment.create(binaryPath.getPathString() + OsUtils.executableExtension());
     }
 
     Artifact binary = ruleContext.getBinArtifact(binaryPath);
@@ -676,7 +676,7 @@
     PathFragment intermediatePath =
         FileSystemUtils.appendWithoutExtension(outputPath, "-" + orderNumber);
     return ruleContext.getPackageRelativeArtifact(
-        new PathFragment(INTERMEDIATE_DWP_DIR + "/" + intermediatePath.getPathString()),
+        PathFragment.create(INTERMEDIATE_DWP_DIR + "/" + intermediatePath.getPathString()),
         dwpOutput.getRoot());
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcIncLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcIncLibrary.java
index e228852..e3b9b85 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcIncLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcIncLibrary.java
@@ -81,7 +81,7 @@
     // versions. Previous Blaze versions created a directory symlink; the new version does not
     // detect that the output directory isn't a directory, and tries to put the symlinks into what
     // is actually a symlink into the source tree.
-    PathFragment includeDirectory = new PathFragment("_")
+    PathFragment includeDirectory = PathFragment.create("_")
         .getRelative(ruleContext.getTarget().getName());
     Root configIncludeDirectory =
         ruleContext.getConfiguration().getIncludeDirectory(ruleContext.getRule().getRepository());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index e2c04b7..3d727ae 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -156,7 +156,7 @@
       if (outs.size() > 1) {
         ruleContext.attributeError("outs", "must be a singleton list");
       } else if (outs.size() == 1) {
-        PathFragment soImplFilename = new PathFragment(ruleContext.getLabel().getName());
+        PathFragment soImplFilename = PathFragment.create(ruleContext.getLabel().getName());
         soImplFilename = soImplFilename.replaceName(outs.get(0));
         if (!soImplFilename.getPathString().endsWith(".so")) { // Sanity check.
           ruleContext.attributeError("outs", "file name must end in '.so'");
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
index 248bcfd..83eb0ff 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
@@ -1197,13 +1197,13 @@
 
     PathFragment prefix =
         ruleContext.attributes().isAttributeValueExplicitlySpecified("include_prefix")
-            ? new PathFragment(ruleContext.attributes().get("include_prefix", Type.STRING))
+            ? PathFragment.create(ruleContext.attributes().get("include_prefix", Type.STRING))
             : null;
 
     PathFragment stripPrefix;
     if (ruleContext.attributes().isAttributeValueExplicitlySpecified("strip_include_prefix")) {
-      stripPrefix = new PathFragment(
-          ruleContext.attributes().get("strip_include_prefix", Type.STRING));
+      stripPrefix =
+          PathFragment.create(ruleContext.attributes().get("strip_include_prefix", Type.STRING));
       if (stripPrefix.isAbsolute()) {
         stripPrefix = ruleContext.getLabel().getPackageIdentifier().getRepository().getSourceRoot()
             .getRelative(stripPrefix.toRelative());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index 73060ef..9cb154f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -61,7 +61,7 @@
    * This file (found under the sysroot) may be unconditionally included in every C/C++ compilation.
    */
   private static final PathFragment BUILTIN_INCLUDE_FILE_SUFFIX =
-      new PathFragment("include/stdc-predef.h");
+      PathFragment.create("include/stdc-predef.h");
 
   @Override
   public ConfiguredTarget create(RuleContext ruleContext)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
index b5b1183..d63b01d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
@@ -2072,7 +2072,7 @@
    */
   String getArtifactNameForCategory(ArtifactCategory artifactCategory, String outputName)
       throws ExpansionException {
-    PathFragment output = new PathFragment(outputName);
+    PathFragment output = PathFragment.create(outputName);
 
     ArtifactNamePattern patternForCategory = null;
     for (ArtifactNamePattern artifactNamePattern : artifactNamePatterns) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java
index 30a5515..8e49f99 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java
@@ -34,13 +34,13 @@
   public static final BuildInfoKey KEY = new BuildInfoKey("C++");
 
   private static final PathFragment BUILD_INFO_NONVOLATILE_HEADER_NAME =
-      new PathFragment("build-info-nonvolatile.h");
+      PathFragment.create("build-info-nonvolatile.h");
   private static final PathFragment BUILD_INFO_VOLATILE_HEADER_NAME =
-      new PathFragment("build-info-volatile.h");
+      PathFragment.create("build-info-volatile.h");
   // TODO(bazel-team): (2011) Get rid of the redacted build info. We should try to make
   // the linkstamping process handle the case where those values are undefined.
   private static final PathFragment BUILD_INFO_REDACTED_HEADER_NAME =
-      new PathFragment("build-info-redacted.h");
+      PathFragment.create("build-info-redacted.h");
 
   @Override
   public BuildInfoCollection create(BuildInfoContext buildInfoContext, BuildConfiguration config,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
index 84b3c85..741ca59 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
@@ -614,7 +614,7 @@
     for (String opt : cppCompileCommandLine.copts) {
       if (opt.startsWith("-I") && opt.length() > 2) {
         // We insist on the combined form "-Idir".
-        result.add(new PathFragment(opt.substring(2)));
+        result.add(PathFragment.create(opt.substring(2)));
       }
     }
     return result.build();
@@ -634,10 +634,10 @@
       String opt = compilerOptions.get(i);
       if (opt.startsWith("-isystem")) {
         if (opt.length() > 8) {
-          result.add(new PathFragment(opt.substring(8).trim()));
+          result.add(PathFragment.create(opt.substring(8).trim()));
         } else if (i + 1 < compilerOptions.size()) {
           i++;
-          result.add(new PathFragment(compilerOptions.get(i)));
+          result.add(PathFragment.create(compilerOptions.get(i)));
         } else {
           System.err.println("WARNING: dangling -isystem flag in options for " + prettyPrint());
         }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
index 2646692..2b7669f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
@@ -474,7 +474,7 @@
         continue;
       }
       // One starting ../ is okay for getting to a sibling repository.
-      if (include.startsWith(new PathFragment(Label.EXTERNAL_PATH_PREFIX))) {
+      if (include.startsWith(PathFragment.create(Label.EXTERNAL_PATH_PREFIX))) {
         include = include.relativeTo(Label.EXTERNAL_PATH_PREFIX);
       }
       if (include.isAbsolute()
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java
index 8b80179..ea0697c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionTemplate.java
@@ -79,7 +79,7 @@
       String outputName = outputTreeFileArtifactName(inputTreeFileArtifact);
       TreeFileArtifact outputTreeFileArtifact = ActionInputHelper.treeFileArtifact(
           outputTreeArtifact,
-          new PathFragment(outputName),
+          PathFragment.create(outputName),
           artifactOwner);
 
       expandedActions.add(createAction(inputTreeFileArtifact, outputTreeFileArtifact));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index f658f67..843a72c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -190,7 +190,7 @@
       PathFragment defaultSysroot =
           toolchain.getBuiltinSysroot().length() == 0
               ? null
-              : new PathFragment(toolchain.getBuiltinSysroot());
+              : PathFragment.create(toolchain.getBuiltinSysroot());
       if ((defaultSysroot != null) && !defaultSysroot.isNormalized()) {
         throw new InvalidConfigurationException(
             "The built-in sysroot '" + defaultSysroot + "' is not normalized.");
@@ -502,7 +502,7 @@
 
     this.toolPaths = Maps.newHashMap();
     for (CrosstoolConfig.ToolPath tool : toolchain.getToolPathList()) {
-      PathFragment path = new PathFragment(tool.getPath());
+      PathFragment path = PathFragment.create(tool.getPath());
       if (!path.isNormalized()) {
         throw new IllegalArgumentException("The include path '" + tool.getPath()
             + "' is not normalized.");
@@ -604,7 +604,7 @@
     // The default value for optional string attributes is the empty string.
     PathFragment defaultSysroot = toolchain.getBuiltinSysroot().length() == 0
         ? null
-        : new PathFragment(toolchain.getBuiltinSysroot());
+        : PathFragment.create(toolchain.getBuiltinSysroot());
     if ((defaultSysroot != null) && !defaultSysroot.isNormalized()) {
       throw new IllegalArgumentException("The built-in sysroot '" + defaultSysroot
           + "' is not normalized.");
@@ -791,7 +791,7 @@
               gccToolPath = tool.getPath();
               linkerToolPath =
                   crosstoolTopPathFragment
-                      .getRelative(new PathFragment(tool.getPath()))
+                      .getRelative(PathFragment.create(tool.getPath()))
                       .getPathString();
             }
           }
@@ -1181,7 +1181,7 @@
       }
     }
 
-    PathFragment path = new PathFragment(pathString);
+    PathFragment path = PathFragment.create(pathString);
     if (!path.isNormalized()) {
       throw new InvalidConfigurationException("The include path '" + s + "' is not normalized.");
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index a94d10e..41afb81 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -283,7 +283,7 @@
    * Returns the directory where object files are created.
    */
   public static PathFragment getObjDirectory(Label ruleLabel) {
-    return AnalysisUtils.getUniqueDirectory(ruleLabel, new PathFragment("_objs"));
+    return AnalysisUtils.getUniqueDirectory(ruleLabel, PathFragment.create("_objs"));
   }
 
   /**
@@ -360,7 +360,7 @@
       BuildConfiguration config,
       LinkTargetType linkType,
       String linkedArtifactNameSuffix) {
-    PathFragment name = new PathFragment(ruleContext.getLabel().getName());
+    PathFragment name = PathFragment.create(ruleContext.getLabel().getName());
     if (linkType != LinkTargetType.EXECUTABLE) {
       name = name.replaceName(
           "lib" + name.getBaseName() + linkedArtifactNameSuffix  + linkType.getExtension());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
index bca504c..1acc9b4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
@@ -919,7 +919,7 @@
     builder
         .setPicMode(usePic)
         .setOutputs(ruleContext, outputCategory, outputNameBase, generateDotd)
-        .setTempOutputFile(new PathFragment(tempOutputName));
+        .setTempOutputFile(PathFragment.create(tempOutputName));
 
     setupCompileBuildVariables(
         builder,
@@ -969,7 +969,7 @@
       }
       String linkedName = CppHelper.getArtifactNameForCategory(
           ruleContext, ccToolchain, linkTargetType.getLinkerOutput(), maybePicName);
-      PathFragment artifactFragment = new PathFragment(ruleContext.getLabel().getName())
+      PathFragment artifactFragment = PathFragment.create(ruleContext.getLabel().getName())
           .getParentDirectory().getRelative(linkedName);
 
       result = ruleContext.getPackageRelativeArtifact(
@@ -1042,7 +1042,7 @@
     // If the crosstool is configured to select an output artifact, we use that selection.
     // Otherwise, we use linux defaults.
     Artifact linkedArtifact = getLinkedArtifact(linkType);
-    PathFragment labelName = new PathFragment(ruleContext.getLabel().getName());
+    PathFragment labelName = PathFragment.create(ruleContext.getLabel().getName());
     String libraryIdentifier = ruleContext.getPackageDirectory().getRelative(
         labelName.replaceName("lib" + labelName.getBaseName())).getPathString();
     CppLinkAction maybePicAction =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java
index 77e653c..9930e35 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java
@@ -127,7 +127,7 @@
    * Path within profile data .zip files that is considered the root of the
    * profile information directory tree.
    */
-  private static final PathFragment ZIP_ROOT = new PathFragment("/");
+  private static final PathFragment ZIP_ROOT = PathFragment.create("/");
 
   /**
    * Returns true if the given fdoFile represents an AutoFdo profile.
@@ -220,7 +220,7 @@
     this.fdoRootExecPath = fdoRootExecPath;
     this.fdoPath = fdoProfile == null
         ? null
-        : FileSystemUtils.removeExtension(new PathFragment("_fdo").getChild(
+        : FileSystemUtils.removeExtension(PathFragment.create("_fdo").getChild(
             fdoProfile.getBaseName()));
     this.lipoMode = lipoMode;
     this.fdoMode = fdoMode;
@@ -264,7 +264,7 @@
     PathFragment fdoRootExecPath = fdoProfile == null
         ? null
         : fdoRoot.getExecPath().getRelative(FileSystemUtils.removeExtension(
-            new PathFragment("_fdo").getChild(fdoProfile.getBaseName())));
+            PathFragment.create("_fdo").getChild(fdoProfile.getBaseName())));
 
     if (fdoProfile != null) {
       if (lipoMode != LipoMode.OFF) {
@@ -413,12 +413,12 @@
       if (!line.isEmpty()) {
         // We can't yet fully check the validity of a line. this is done later
         // when we actually parse the contained paths.
-        PathFragment execPath = new PathFragment(line);
+        PathFragment execPath = PathFragment.create(line);
         if (execPath.isAbsolute()) {
           throw new FdoException("Absolute paths not allowed in gcda imports file " + importsFile
               + ": " + execPath);
         }
-        importsBuilder.put(key, new PathFragment(line));
+        importsBuilder.put(key, PathFragment.create(line));
       }
     }
   }
@@ -440,7 +440,7 @@
       if (colonIndex < 0) {
         continue;
       }
-      PathFragment key = new PathFragment(line.substring(0, colonIndex));
+      PathFragment key = PathFragment.create(line.substring(0, colonIndex));
       if (key.isAbsolute()) {
         throw new FdoException("Absolute paths not allowed in afdo imports file " + importsFile
             + ": " + key);
@@ -450,7 +450,7 @@
           continue;
         }
 
-        importBuilder.put(key, new PathFragment(auxFile));
+        importBuilder.put(key, PathFragment.create(auxFile));
       }
     }
     return importBuilder.build();
@@ -665,7 +665,7 @@
   }
 
   private static PathFragment getAutoProfileRootRelativePath(Path fdoProfile) {
-    return new PathFragment(fdoProfile.getBaseName());
+    return PathFragment.create(fdoProfile.getBaseName());
   }
 
 
@@ -674,7 +674,7 @@
   }
 
   private static PathFragment getLLVMProfileRootRelativePath(Path fdoProfile) {
-    return new PathFragment(fdoProfile.getBaseName());
+    return PathFragment.create(fdoProfile.getBaseName());
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendAction.java
index 9af100f..4fa0a82 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendAction.java
@@ -117,14 +117,14 @@
     try {
       for (String line : FileSystemUtils.iterateLinesAsLatin1(imports.getPath())) {
         if (!line.isEmpty()) {
-          PathFragment execPath = new PathFragment(line);
+          PathFragment execPath = PathFragment.create(line);
           if (execPath.isAbsolute()) {
             throw new ActionExecutionException(
                 "Absolute paths not allowed in imports file " + imports.getPath() + ": " + execPath,
                 this,
                 false);
           }
-          importSet.add(new PathFragment(line));
+          importSet.add(PathFragment.create(line));
         }
       }
     } catch (IOException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java
index c2bca35..e524b1e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java
@@ -139,7 +139,7 @@
    */
   public static Artifact getCppRuntimeSymlink(RuleContext ruleContext, Artifact library,
       String solibDirOverride, BuildConfiguration configuration) {
-    PathFragment solibDir = new PathFragment(solibDirOverride != null
+    PathFragment solibDir = PathFragment.create(solibDirOverride != null
         ? solibDirOverride
         : configuration.getFragment(CppConfiguration.class).getSolibDirectory());
     PathFragment symlinkName = solibDir.getRelative(library.getRootRelativePath().getBaseName());
@@ -181,7 +181,7 @@
     String escapedRulePath = Actions.escapedPath(
         "_" + ruleContext.getLabel());
     String soname = getDynamicLibrarySoname(libraryPath, preserveName);
-    PathFragment solibDir = new PathFragment(cppConfiguration.getSolibDirectory());
+    PathFragment solibDir = PathFragment.create(cppConfiguration.getSolibDirectory());
     if (preserveName) {
       String escapedLibraryPath =
           Actions.escapedPath("_" + libraryPath.getParentDirectory().getPathString());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionSpec.java b/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionSpec.java
index db3569a..90de182 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionSpec.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionSpec.java
@@ -204,7 +204,7 @@
   private Artifact getRootRelativePath(String template, RuleContext ruleContext) {
     PathFragment extraActionPackageFragment = label.getPackageIdentifier().getSourceRoot();
     PathFragment extraActionPrefix = extraActionPackageFragment.getRelative(label.getName());
-    PathFragment rootRelativePath = new PathFragment("extra_actions")
+    PathFragment rootRelativePath = PathFragment.create("extra_actions")
         .getRelative(extraActionPrefix)
         .getRelative(ruleContext.getPackageDirectory())
         .getRelative(template);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index e6bc558..60aa028 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -58,7 +58,7 @@
  * An implementation of java_binary.
  */
 public class JavaBinary implements RuleConfiguredTargetFactory {
-  private static final PathFragment CPP_RUNTIMES = new PathFragment("_cpp_runtimes");
+  private static final PathFragment CPP_RUNTIMES = PathFragment.create("_cpp_runtimes");
 
   private final JavaSemantics semantics;
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
index 95e1cc5..7adaea6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
@@ -39,11 +39,11 @@
   public static final BuildInfoKey KEY = new BuildInfoKey("Java");
 
   static final PathFragment BUILD_INFO_NONVOLATILE_PROPERTIES_NAME =
-      new PathFragment("build-info-nonvolatile.properties");
+      PathFragment.create("build-info-nonvolatile.properties");
   static final PathFragment BUILD_INFO_VOLATILE_PROPERTIES_NAME =
-      new PathFragment("build-info-volatile.properties");
+      PathFragment.create("build-info-volatile.properties");
   static final PathFragment BUILD_INFO_REDACTED_PROPERTIES_NAME =
-      new PathFragment("build-info-redacted.properties");
+      PathFragment.create("build-info-redacted.properties");
 
   private static final DateTimeFormatter DEFAULT_TIME_FORMAT =
       DateTimeFormat.forPattern("EEE MMM d HH:mm:ss yyyy");
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index b5ab681..1712d02 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -502,7 +502,7 @@
 
     if (!javaExecutable.isAbsolute()) {
       javaExecutable =
-          new PathFragment(new PathFragment(ruleContext.getWorkspaceName()), javaExecutable);
+          PathFragment.create(PathFragment.create(ruleContext.getWorkspaceName()), javaExecutable);
     }
     javaExecutable = javaExecutable.normalize();
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java
index b115dee..fc44f09 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHelper.java
@@ -116,7 +116,7 @@
     PathFragment rootRelativePath = resource.getRootRelativePath();
 
     if (!resource.getOwner().getWorkspaceRoot().isEmpty()) {
-      PathFragment workspace = new PathFragment(resource.getOwner().getWorkspaceRoot());
+      PathFragment workspace = PathFragment.create(resource.getOwner().getWorkspaceRoot());
       rootRelativePath = rootRelativePath.relativeTo(workspace);
     }
 
@@ -125,8 +125,8 @@
       return semantics.getDefaultJavaResourcePath(rootRelativePath);
     }
 
-    PathFragment prefix = new PathFragment(
-        ruleContext.attributes().get("resource_strip_prefix", Type.STRING));
+    PathFragment prefix =
+        PathFragment.create(ruleContext.attributes().get("resource_strip_prefix", Type.STRING));
 
     if (!rootRelativePath.startsWith(prefix)) {
       ruleContext.attributeError("resource_strip_prefix", String.format(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
index 6501b31..4006bc8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
@@ -153,7 +153,7 @@
   }
 
   private static Jvm createLegacy(String javaHome) throws InvalidConfigurationException {
-    PathFragment javaHomePathFrag = new PathFragment(javaHome);
+    PathFragment javaHomePathFrag = PathFragment.create(javaHome);
     if (!javaHomePathFrag.isAbsolute()) {
       throw new InvalidConfigurationException(
           "Illegal javabase value '" + javaHome + "', javabase must be an absolute path or label");
diff --git a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
index 6ec5120..dc9e9e8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
@@ -107,7 +107,7 @@
       return null;
     }
 
-    PathFragment labelName = new PathFragment(ruleContext.getLabel().getName());
+    PathFragment labelName = PathFragment.create(ruleContext.getLabel().getName());
     String libraryIdentifier = ruleContext.getUniqueDirectory(ANDROID_UNIQUE_DIR)
         .getRelative(labelName.replaceName("lib" + labelName.getBaseName()))
         .getPathString();
@@ -260,11 +260,11 @@
    * symlink for the native library for the specified rule.
    */
   private static PathFragment getRuntimeLibraryPath(RuleContext ruleContext, Artifact lib) {
-    PathFragment relativePath = new PathFragment(ruleContext.getLabel().getName());
+    PathFragment relativePath = PathFragment.create(ruleContext.getLabel().getName());
     PathFragment libParentDir =
         relativePath.replaceName(lib.getExecPath().getParentDirectory().getBaseName());
     String libName = lib.getExecPath().getBaseName();
-    return new PathFragment(libParentDir, new PathFragment(libName));
+    return PathFragment.create(libParentDir, PathFragment.create(libName));
   }
 
   /**
@@ -305,6 +305,6 @@
     for (String feature : features) {
       fp.addString(feature);
     }
-    return new PathFragment("_nativedeps/" + fp.hexDigestAndReset());
+    return PathFragment.create("_nativedeps/" + fp.hexDigestAndReset());
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java
index ab2bc95..9d0e3c2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java
@@ -345,7 +345,7 @@
       ruleContext.registerAction(
           ObjcRuleClasses.spawnAppleEnvActionBuilder(appleConfiguration, platform)
               .setMnemonic("ConvertStringsPlist")
-              .setExecutable(new PathFragment("/usr/bin/plutil"))
+              .setExecutable(PathFragment.create("/usr/bin/plutil"))
               .setCommandLine(CustomCommandLine.builder()
                   .add("-convert").add("binary1")
                   .addExecPath("-o", bundled)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/Bundling.java b/src/main/java/com/google/devtools/build/lib/rules/objc/Bundling.java
index 13bc0d9..39b05cb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/Bundling.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/Bundling.java
@@ -590,7 +590,7 @@
   public Map<String, String> variableSubstitutions() {
     return ImmutableMap.of(
         "EXECUTABLE_NAME", Strings.nullToEmpty(executableName),
-        "BUNDLE_NAME", new PathFragment(getBundleDir()).getBaseName(),
+        "BUNDLE_NAME", PathFragment.create(getBundleDir()).getBaseName(),
         "PRODUCT_NAME", name);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
index c085904..6532052 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
@@ -663,7 +663,7 @@
     ImmutableList.Builder<PathFragment> nonPropagatedHeaderSearchPaths =
         new ImmutableList.Builder<>();
     for (String includeDirOption : includeDirOptions) {
-      nonPropagatedHeaderSearchPaths.add(new PathFragment(includeDirOption.substring(2)));
+      nonPropagatedHeaderSearchPaths.add(PathFragment.create(includeDirOption.substring(2)));
     }
 
     // We also need to add the -isystem directories from the CC header providers. ObjCommon
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java
index f001f95..b2642f1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java
@@ -190,7 +190,7 @@
       throws InterruptedException {
     Preconditions.checkNotNull(ccToolchain);
     Preconditions.checkNotNull(fdoSupport);
-    PathFragment labelName = new PathFragment(ruleContext.getLabel().getName());
+    PathFragment labelName = PathFragment.create(ruleContext.getLabel().getName());
     String libraryIdentifier =
         ruleContext
             .getPackageDirectory()
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/HeaderThinning.java b/src/main/java/com/google/devtools/build/lib/rules/objc/HeaderThinning.java
index ad52864..dcd8bca 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/HeaderThinning.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/HeaderThinning.java
@@ -104,7 +104,7 @@
           continue;
         }
 
-        PathFragment headerPath = new PathFragment(line);
+        PathFragment headerPath = PathFragment.create(line);
         Artifact header = inputArtifactsMap.get(headerPath);
         if (header == null) {
           missing.add(headerPath);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
index 620010e..337ee96 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
@@ -117,7 +117,7 @@
    * of the {@link PathFragment} corresponding to the owner {@link Label}.
    */
   private Artifact appendExtension(String extension) {
-    PathFragment name = new PathFragment(ruleContext.getLabel().getName());
+    PathFragment name = PathFragment.create(ruleContext.getLabel().getName());
     return scopedArtifact(name.replaceName(addOutputPrefix(name.getBaseName(), extension)));
   }
 
@@ -135,7 +135,7 @@
    * the end of the {@link PathFragment} corresponding to the owner {@link Label}.
    */
   private Artifact appendExtensionInGenfiles(String extension) {
-    PathFragment name = new PathFragment(ruleContext.getLabel().getName());
+    PathFragment name = PathFragment.create(ruleContext.getLabel().getName());
     return scopedArtifact(
         name.replaceName(addOutputPrefix(name.getBaseName(), extension)), /* inGenfiles = */ true);
   }
@@ -252,14 +252,14 @@
    */
   public Artifact archive() {
     // The path will be {RULE_PACKAGE}/lib{RULEBASENAME}{SUFFIX}.a
-    String basename = new PathFragment(ruleContext.getLabel().getName()).getBaseName();
-    return scopedArtifact(new PathFragment(String.format(
+    String basename = PathFragment.create(ruleContext.getLabel().getName()).getBaseName();
+    return scopedArtifact(PathFragment.create(String.format(
         "lib%s%s.a", basename, archiveFileNameSuffix)));
   }
 
   private Artifact inUniqueObjsDir(Artifact source, String extension) {
     PathFragment uniqueDir =
-        new PathFragment("_objs").getRelative(ruleContext.getLabel().getName());
+        PathFragment.create("_objs").getRelative(ruleContext.getLabel().getName());
     PathFragment sourceFile = uniqueDir.getRelative(source.getRootRelativePath());
     PathFragment scopeRelativePath = FileSystemUtils.replaceExtension(sourceFile, extension);
     return scopedArtifact(scopeRelativePath);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFramework.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFramework.java
index ee9b83b..60bfec1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFramework.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFramework.java
@@ -94,13 +94,13 @@
 
     // Create framework binary
     Artifact frameworkBinary =
-        outputArtifact(ruleContext, new PathFragment(bundleName(ruleContext)));
+        outputArtifact(ruleContext, PathFragment.create(bundleName(ruleContext)));
     builder.put(intermediateArtifacts.combinedArchitectureBinary(), frameworkBinary);
 
     // Create framework headers
     for (Pair<Artifact, Label> header : headers) {
       Artifact frameworkHeader =
-          outputArtifact(ruleContext, new PathFragment("Headers/" + header.first.getFilename()));
+          outputArtifact(ruleContext, PathFragment.create("Headers/" + header.first.getFilename()));
 
       builder.put(header.first, frameworkHeader);
     }
@@ -160,9 +160,9 @@
    */
   private Artifact outputArtifact(RuleContext ruleContext, PathFragment path) {
     PathFragment frameworkRoot =
-        new PathFragment(
-            new PathFragment("_frameworks"),
-            new PathFragment(bundleName(ruleContext) + ".framework"),
+        PathFragment.create(
+            PathFragment.create("_frameworks"),
+            PathFragment.create(bundleName(ruleContext) + ".framework"),
             path);
 
     return ruleContext.getPackageRelativeArtifact(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
index 451af68..2b14cca 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
@@ -111,7 +111,7 @@
     // We add another header search path with gen root if we have generated sources to translate.
     for (Artifact sourceToTranslate : sourcesToTranslate) {
       if (!sourceToTranslate.isSourceArtifact()) {
-        headerSearchPaths.add(new PathFragment(objcFileRootExecPath, genRoot));
+        headerSearchPaths.add(PathFragment.create(objcFileRootExecPath, genRoot));
         return headerSearchPaths.build();
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
index ad677f6..3480cfc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
@@ -686,7 +686,7 @@
   static ImmutableSet<PathFragment> userHeaderSearchPaths(
       ObjcProvider provider, BuildConfiguration config) {
     return ImmutableSet.<PathFragment>builder()
-        .add(new PathFragment("."))
+        .add(PathFragment.create("."))
         .add(config.getGenfilesFragment())
         .addAll(provider.get(IQUOTE))
         .build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.java
index 4666590..03c2ae2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProviderSkylarkConverters.java
@@ -119,7 +119,7 @@
       validateTypes(skylarkValue, String.class, javaKey.getSkylarkKeyName());
       NestedSetBuilder<PathFragment> result = NestedSetBuilder.stableOrder();
       for (String path : ((SkylarkNestedSet) skylarkValue).toCollection(String.class)) {
-        result.add(new PathFragment(path));
+        result.add(PathFragment.create(path));
       }
       return result.build();
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
index 455ee70..25058351 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
@@ -551,7 +551,7 @@
     // of dependers.
     PathFragment rootRelativeOutputDir = ruleContext.getUniqueDirectory(UNIQUE_DIRECTORY_NAME);
 
-    return new PathFragment(
+    return PathFragment.create(
         buildConfiguration.getBinDirectory().getExecPath(), rootRelativeOutputDir);
   }
 
@@ -562,10 +562,9 @@
       String protoFileName = FileSystemUtils.removeExtension(protoFile.getFilename());
       String generatedOutputName = attributes.getGeneratedProtoFilename(protoFileName, true);
 
-      PathFragment generatedFilePath =
-          new PathFragment(
-              protoFile.getRootRelativePath().getParentDirectory(),
-              new PathFragment(generatedOutputName));
+      PathFragment generatedFilePath = PathFragment.create(
+          protoFile.getRootRelativePath().getParentDirectory(),
+          PathFragment.create(generatedOutputName));
 
       PathFragment outputFile = FileSystemUtils.appendExtension(generatedFilePath, extension);
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java
index 54d8904..0a19cb1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtocolBuffers2Support.java
@@ -86,7 +86,7 @@
             .addInputs(attributes.getOptionsFile().asSet())
             .addOutputs(getGeneratedProtoOutputs(getHeaderExtension()))
             .addOutputs(getGeneratedProtoOutputs(getSourceExtension()))
-            .setExecutable(new PathFragment("/usr/bin/python"))
+            .setExecutable(PathFragment.create("/usr/bin/python"))
             .setCommandLine(getGenerationCommandLine())
             .build(ruleContext));
     return this;
@@ -203,9 +203,8 @@
         new ImmutableSet.Builder<PathFragment>().add(getWorkspaceRelativeOutputDir());
 
     if (attributes.needsPerProtoIncludes()) {
-      PathFragment generatedProtoDir =
-          new PathFragment(
-              getWorkspaceRelativeOutputDir(), ruleContext.getLabel().getPackageFragment());
+      PathFragment generatedProtoDir = PathFragment.create(
+          getWorkspaceRelativeOutputDir(), ruleContext.getLabel().getPackageFragment());
 
       searchPathEntriesBuilder
           .add(generatedProtoDir)
@@ -223,7 +222,7 @@
     // of dependers.
     PathFragment rootRelativeOutputDir = ruleContext.getUniqueDirectory(UNIQUE_DIRECTORY_NAME);
 
-    return new PathFragment(
+    return PathFragment.create(
         ruleContext.getBinOrGenfilesDirectory().getExecPath(), rootRelativeOutputDir);
   }
 
@@ -233,10 +232,9 @@
       String protoFileName = FileSystemUtils.removeExtension(protoFile.getFilename());
       String generatedOutputName = attributes.getGeneratedProtoFilename(protoFileName, false);
 
-      PathFragment generatedFilePath =
-          new PathFragment(
-              protoFile.getRootRelativePath().getParentDirectory(),
-              new PathFragment(generatedOutputName));
+      PathFragment generatedFilePath = PathFragment.create(
+          protoFile.getRootRelativePath().getParentDirectory(),
+          PathFragment.create(generatedOutputName));
 
       PathFragment outputFile = FileSystemUtils.appendExtension(generatedFilePath, extension);
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoSourceFileBlacklist.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoSourceFileBlacklist.java
index 6ba9517..7f38142 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoSourceFileBlacklist.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoSourceFileBlacklist.java
@@ -41,7 +41,8 @@
  * to identify these proto files and avoid linking in their associated generated files.
  */
 public class ProtoSourceFileBlacklist {
-  private static final PathFragment BAZEL_TOOLS_PREFIX = new PathFragment("external/bazel_tools/");
+  private static final PathFragment BAZEL_TOOLS_PREFIX =
+      PathFragment.create("external/bazel_tools/");
   private final RuleContext ruleContext;
   private final ImmutableSet<PathFragment> blacklistProtoFilePaths;
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
index a343883..2036401 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
@@ -410,7 +410,7 @@
       }
       mainSourceName = ruleName + ".py";
     }
-    PathFragment mainSourcePath = new PathFragment(mainSourceName);
+    PathFragment mainSourcePath = PathFragment.create(mainSourceName);
 
     Artifact mainArtifact = null;
     for (Artifact outItem : ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list()) {
@@ -433,8 +433,8 @@
     if (!withWorkspaceName) {
       return mainArtifact.getRunfilesPath().getPathString();
     }
-    PathFragment workspaceName = new PathFragment(
-        ruleContext.getRule().getPackage().getWorkspaceName());
+    PathFragment workspaceName =
+        PathFragment.create(ruleContext.getRule().getPackage().getWorkspaceName());
     return workspaceName.getRelative(mainArtifact.getRunfilesPath()).getPathString();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PythonUtils.java b/src/main/java/com/google/devtools/build/lib/rules/python/PythonUtils.java
index c2508c2..ebe030f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PythonUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PythonUtils.java
@@ -35,8 +35,8 @@
  * Various utility methods for Python support.
  */
 public final class PythonUtils {
-  public static final PathFragment INIT_PY = new PathFragment("__init__.py");
-  public static final PathFragment INIT_PYC = new PathFragment("__init__.pyc");
+  public static final PathFragment INIT_PY = PathFragment.create("__init__.py");
+  public static final PathFragment INIT_PYC = PathFragment.create("__init__.pyc");
 
   private static final FileType REQUIRES_INIT_PY = FileType.of(".py", ".so", ".pyc");
 
@@ -86,7 +86,7 @@
   private static Artifact get2to3OutputArtifact(RuleContext ruleContext, Artifact input) {
     Root root = ruleContext.getConfiguration().getGenfilesDirectory(
         ruleContext.getRule().getRepository());
-    PathFragment path = new PathFragment("python3").getRelative(input.getRootRelativePath());
+    PathFragment path = PathFragment.create("python3").getRelative(input.getRootRelativePath());
     return ruleContext.getShareableArtifact(path, root);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java b/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java
index 29efc78..64c4502 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java
@@ -195,7 +195,7 @@
         }
       } else {
         // TODO(dmarting): deprecate using a path for the workspace_file attribute.
-        PathFragment file = new PathFragment(fileAttribute);
+        PathFragment file = PathFragment.create(fileAttribute);
         Path fileTarget = workspacePath.getRelative(file);
         if (!fileTarget.exists()) {
           throw new RepositoryFunctionException(
@@ -211,7 +211,7 @@
         if (file.isAbsolute()) {
           rootedFile =
               RootedPath.toRootedPath(
-                  fileTarget.getParentDirectory(), new PathFragment(fileTarget.getBaseName()));
+                  fileTarget.getParentDirectory(), PathFragment.create(fileTarget.getBaseName()));
         } else {
           rootedFile = RootedPath.toRootedPath(workspacePath, file);
         }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
index 0b92f0a..51486ed 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
@@ -298,7 +298,7 @@
     } catch (EvalException e) {
       throw new RepositoryFunctionException(e, Transience.PERSISTENT);
     }
-    PathFragment pathFragment = new PathFragment(path);
+    PathFragment pathFragment = PathFragment.create(path);
     return workspace.getRelative(pathFragment).asFragment();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryLoaderFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryLoaderFunction.java
index 19af038..c6040de 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryLoaderFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryLoaderFunction.java
@@ -52,7 +52,7 @@
 
     SkyKey workspaceKey =
         WorkspaceFileValue.key(
-            RootedPath.toRootedPath(repository.getPath(), new PathFragment("WORKSPACE")));
+            RootedPath.toRootedPath(repository.getPath(), PathFragment.create("WORKSPACE")));
     WorkspaceFileValue workspacePackage = (WorkspaceFileValue) env.getValue(workspaceKey);
     if (workspacePackage == null) {
       return null;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java b/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java
index 8b7dea8..7f42c03 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java
@@ -116,7 +116,7 @@
       RuleContext ruleContext, NestedSet<Artifact> instrumentedFiles) {
     // Baseline coverage artifacts will still go into "testlogs" directory.
     Artifact coverageData = ruleContext.getPackageRelativeArtifact(
-        new PathFragment(ruleContext.getTarget().getName()).getChild("baseline_coverage.dat"),
+        PathFragment.create(ruleContext.getTarget().getName()).getChild("baseline_coverage.dat"),
         ruleContext.getConfiguration().getTestLogsDirectory(
             ruleContext.getRule().getRepository()));
     ruleContext.registerAction(new BaselineCoverageAction(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestActionBuilder.java
index da79635..5624b2b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/TestActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestActionBuilder.java
@@ -88,7 +88,7 @@
     // heuristically sharding is currently experimental. Also, we do detect
     // false-positive cases and return an error.
     return runfilesSupport.getRunfilesSymlinkNames().contains(
-        new PathFragment("tools/test_sharding_compliant"));
+        PathFragment.create("tools/test_sharding_compliant"));
   }
 
   /**
@@ -180,7 +180,7 @@
    *    TestResultAnalyzer to keep track of completed and pending test runs.
    */
   private TestParams createTestAction(int shards) {
-    PathFragment targetName = new PathFragment(ruleContext.getLabel().getName());
+    PathFragment targetName = PathFragment.create(ruleContext.getLabel().getName());
     BuildConfiguration config = ruleContext.getConfiguration();
     AnalysisEnvironment env = ruleContext.getAnalysisEnvironment();
     Root root = config.getTestLogsDirectory(ruleContext.getRule().getRepository());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java
index 01ea451..d6c4d45 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java
@@ -58,7 +58,7 @@
  */
 // Not final so that we can mock it in tests.
 public class TestRunnerAction extends AbstractAction implements NotifyOnActionCacheHit {
-  public static final PathFragment COVERAGE_TMP_ROOT = new PathFragment("_coverage");
+  public static final PathFragment COVERAGE_TMP_ROOT = PathFragment.create("_coverage");
 
   // Used for selecting subset of testcase / testmethods.
   private static final String TEST_BRIDGE_TEST_FILTER_ENV = "TESTBRIDGE_TEST_ONLY";
@@ -134,7 +134,7 @@
       boolean useTestRunner) {
     super(owner, inputs,
         // Note that this action only cares about the runfiles, not the mapping.
-        new RunfilesSupplierImpl(new PathFragment("runfiles"), executionSettings.getRunfiles()),
+        new RunfilesSupplierImpl(PathFragment.create("runfiles"), executionSettings.getRunfiles()),
         list(testLog, cacheStatus, coverageArtifact, microCoverageArtifact));
     this.runtime = runtime;
     this.configuration = Preconditions.checkNotNull(configuration);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java
index 2e9e9de..833e011 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/CoverageCommand.java
@@ -289,7 +289,7 @@
       // filter value much more user-friendly - especially in case of /my/package/... wildcards.
       Set<String> parentFilters = Sets.newTreeSet();
       String filterString = iterator.next();
-      PathFragment parent = new PathFragment(filterString).getParentDirectory();
+      PathFragment parent = PathFragment.create(filterString).getParentDirectory();
       while (iterator.hasNext()) {
         String current = iterator.next();
         if (parent != null && parent.getPathString().length() > 0
@@ -297,7 +297,7 @@
           parentFilters.add(parent.getPathString());
         } else {
           filterString = current;
-          parent = new PathFragment(filterString).getParentDirectory();
+          parent = PathFragment.create(filterString).getParentDirectory();
         }
       }
       packageFilters.addAll(parentFilters);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
index 3d3a9b0..4f738c7 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/ProjectFileSupport.java
@@ -58,7 +58,7 @@
       // TODO(bazel-team): This is currently treated as a path relative to the workspace - if the
       // cwd is a subdirectory of the workspace, that will be surprising, and we should interpret it
       // relative to the cwd instead.
-      PathFragment projectFilePath = new PathFragment(targets.get(0).substring(1));
+      PathFragment projectFilePath = PathFragment.create(targets.get(0).substring(1));
       List<Path> packagePath = PathPackageLocator.create(
           env.getOutputBase(),
           optionsParser.getOptions(PackageCacheOptions.class).packagePath,
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java b/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java
index 2eff7c4..0a649e9 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/DarwinSandboxedStrategy.java
@@ -324,7 +324,7 @@
       TestRunnerAction testRunnerAction = ((TestRunnerAction) spawn.getResourceOwner());
       RunUnder runUnder = testRunnerAction.getExecutionSettings().getRunUnder();
       if (runUnder != null && runUnder.getCommand() != null) {
-        PathFragment sourceFragment = new PathFragment(runUnder.getCommand());
+        PathFragment sourceFragment = PathFragment.create(runUnder.getCommand());
         Path mount;
         if (sourceFragment.isAbsolute()) {
           mount = blazeDirs.getFileSystem().getPath(sourceFragment);
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java
index e30008e..26fd236 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SandboxHelpers.java
@@ -51,7 +51,7 @@
   public static ImmutableSet<PathFragment> getOutputFiles(Spawn spawn) {
     Builder<PathFragment> outputFiles = ImmutableSet.builder();
     for (ActionInput output : spawn.getOutputFiles()) {
-      outputFiles.add(new PathFragment(output.getExecPathString()));
+      outputFiles.add(PathFragment.create(output.getExecPathString()));
     }
     return outputFiles.build();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java b/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
index d8bb0a7..b6bd3c0 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
@@ -108,7 +108,7 @@
       // symlink referring to "source" has to be created (see below).
       PathFragment targetPath;
       if (isFilesetManifest) {
-        PathFragment targetPathFragment = new PathFragment(fields[0]);
+        PathFragment targetPathFragment = PathFragment.create(fields[0]);
         if (!workspaceName.isEmpty()) {
           Preconditions.checkState(
               targetPathFragment.getSegment(0).equals(workspaceName),
@@ -176,7 +176,7 @@
         // Attempting to mount a non-empty directory results in ERR_DIRECTORY_NOT_EMPTY, so we only
         // mount empty TreeArtifacts as directories.
         if (containedArtifacts.isEmpty()) {
-          PathFragment mount = new PathFragment(input.getExecPathString());
+          PathFragment mount = PathFragment.create(input.getExecPathString());
           mounts.put(mount, execRoot.getRelative(mount));
         }
       }
@@ -186,7 +186,7 @@
       if (input.getExecPathString().contains("internal/_middlemen/")) {
         continue;
       }
-      PathFragment mount = new PathFragment(input.getExecPathString());
+      PathFragment mount = PathFragment.create(input.getExecPathString());
       mounts.put(mount, execRoot.getRelative(mount));
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesFunction.java
index 11c78ae..a3c6768 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesFunction.java
@@ -85,7 +85,7 @@
     @Override
     public boolean processLine(String line) throws IOException {
       if (!line.isEmpty()) {
-        fragments.add(new PathFragment(line));
+        fragments.add(PathFragment.create(line));
       }
       return true;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java
index f06be6b..aa91104 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java
@@ -128,7 +128,7 @@
       if (parentFileValue == null) {
         return null;
       }
-      PathFragment baseName = new PathFragment(relativePath.getBaseName());
+      PathFragment baseName = PathFragment.create(relativePath.getBaseName());
       RootedPath parentRealRootedPath = parentFileValue.realRootedPath();
       realRootedPath = RootedPath.toRootedPath(parentRealRootedPath.getRoot(),
           parentRealRootedPath.getRelativePath().getRelative(baseName));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java
index f95274c..fe23f37 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java
@@ -217,7 +217,7 @@
       public boolean apply(String e) {
         // Keep the top-level exclusions only. Do not look for "/" but count the path segments
         // instead, in anticipation of future Windows support.
-        return new PathFragment(e).segmentCount() == 1;
+        return PathFragment.create(e).segmentCount() == 1;
       }
     });
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java b/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java
index 753f920..4874d89 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java
@@ -79,7 +79,7 @@
       // There's no good way to automatically detect network file systems. We rely on a blacklist
       // for now (and maybe add a command-line option in the future?).
       for (String prefix : prefixBlacklist) {
-        if (resolvedPathEntryFragment.startsWith(new PathFragment(prefix))) {
+        if (resolvedPathEntryFragment.startsWith(PathFragment.create(prefix))) {
           return null;
         }
       }
@@ -188,7 +188,7 @@
         public PathFragment apply(Path input) {
           Preconditions.checkArgument(
               input.startsWith(watchRootPath), "%s %s", input, watchRootPath);
-          return new PathFragment(watchRootPath.relativize(input).toString());
+          return PathFragment.create(watchRootPath.relativize(input).toString());
         }
       };
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunction.java
index e134350..ae4b250 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunction.java
@@ -208,7 +208,7 @@
                 @Override
                 public boolean apply(@Nullable Rule rule) {
                   AggregatingAttributeMapper mapper = AggregatingAttributeMapper.of(rule);
-                  PathFragment pathAttr = new PathFragment(mapper.get("path", Type.STRING));
+                  PathFragment pathAttr = PathFragment.create(mapper.get("path", Type.STRING));
                   return directory.getRelativePath().equals(pathAttr);
                 }
               },
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 1941489..23eccce 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
@@ -101,7 +101,7 @@
   // Not final only for testing.
   @Nullable private SkylarkImportLookupFunction skylarkImportLookupFunctionForInlining;
 
-  static final PathFragment DEFAULTS_PACKAGE_NAME = new PathFragment("tools/defaults");
+  static final PathFragment DEFAULTS_PACKAGE_NAME = PathFragment.create("tools/defaults");
 
   public PackageFunction(
       PackageFactory packageFactory,
@@ -819,7 +819,7 @@
       // exceptions), it reaches here, and we tolerate it.
       return false;
     }
-    PathFragment labelNameFragment = new PathFragment(label.getName());
+    PathFragment labelNameFragment = PathFragment.create(label.getName());
     String message = String.format("Label '%s' crosses boundary of subpackage '%s'",
         label, containingPkg);
     Path containingRoot = containingPkgLookupValue.getContainingPackageRoot();
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 32d1e90..7db3a2a 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
@@ -43,7 +43,7 @@
     WORKSPACE("WORKSPACE") {
       @Override
       public PathFragment getBuildFileFragment(PackageIdentifier packageIdentifier) {
-        return new PathFragment(BuildFileName.WORKSPACE.getFilename());
+        return PathFragment.create(BuildFileName.WORKSPACE.getFilename());
       }
     },
     BUILD("BUILD") {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
index 8cc2d81..4160214 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
@@ -56,7 +56,7 @@
     try {
       BuildFileAST ast = BuildFileAST.parseBuildFile(
           ParserInputSource.create(ruleClassProvider.getDefaultWorkspacePrefix(),
-              new PathFragment("/DEFAULT.WORKSPACE")),
+              PathFragment.create("/DEFAULT.WORKSPACE")),
           env.getListener());
       if (ast.containsErrors()) {
         throw new WorkspaceASTFunctionException(
@@ -76,7 +76,7 @@
       }
       ast = BuildFileAST.parseBuildFile(
           ParserInputSource.create(ruleClassProvider.getDefaultWorkspaceSuffix(),
-              new PathFragment("/DEFAULT.WORKSPACE.SUFFIX")),
+              PathFragment.create("/DEFAULT.WORKSPACE.SUFFIX")),
           ast.getStatements(),
           env.getListener());
       if (ast.containsErrors()) {
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 44d4a9b..9d28ee8 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
@@ -119,7 +119,7 @@
 
     @Override
     public PathFragment asPathFragment() {
-      return new PathFragment(importFile);
+      return PathFragment.create(importFile);
     }
 
     @Override
@@ -128,7 +128,7 @@
       // a subdirectory of the package that contains it. We need to construct a Label with
       // the imported file in the same subdirectory of the package.
       PathFragment containingDirInPkg =
-          (new PathFragment(containingFileLabel.getName())).getParentDirectory();
+          PathFragment.create(containingFileLabel.getName()).getParentDirectory();
       String targetNameForImport = containingDirInPkg.getRelative(importFile).toString();
       try {
         return containingFileLabel.getRelative(targetNameForImport);
@@ -151,7 +151,7 @@
 
     @Override
     public PathFragment asPathFragment() {
-      return new PathFragment(PathFragment.ROOT_DIR).getRelative(importLabel.toPathFragment());
+      return PathFragment.create(PathFragment.ROOT_DIR).getRelative(importLabel.toPathFragment());
     }
 
     @Override
@@ -173,7 +173,7 @@
 
     @Override
     public PathFragment asPathFragment() {
-      return new PathFragment(importTarget);
+      return PathFragment.create(importTarget);
     }
 
     @Override
@@ -253,7 +253,7 @@
       if (importString.endsWith(".bzl")) {
         throw new SkylarkImportSyntaxException(INVALID_PATH_SYNTAX);
       }
-      PathFragment importPath = new PathFragment(importString + ".bzl");
+      PathFragment importPath = PathFragment.create(importString + ".bzl");
       return new AbsolutePathImport(importString, importPath);
     } else if (importString.startsWith(":")) {
       // Relative label. We require that relative labels use an explicit ':' prefix to distinguish
diff --git a/src/main/java/com/google/devtools/build/lib/unix/UnixFileSystem.java b/src/main/java/com/google/devtools/build/lib/unix/UnixFileSystem.java
index c21848a..c70420b 100644
--- a/src/main/java/com/google/devtools/build/lib/unix/UnixFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/unix/UnixFileSystem.java
@@ -334,7 +334,7 @@
     String name = path.toString();
     long startTime = Profiler.nanoTimeMaybe();
     try {
-      return new PathFragment(NativePosixFiles.readlink(name));
+      return PathFragment.create(NativePosixFiles.readlink(name));
     } catch (IOException e) {
       // EINVAL => not a symbolic link.  Anything else is a real error.
       throw e.getMessage().endsWith("(Invalid argument)") ? new NotASymlinkException(path) : e;
diff --git a/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java b/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java
index 5ad34d7..3013f3e 100644
--- a/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/util/OptionsUtils.java
@@ -135,7 +135,7 @@
 
     @Override
     public PathFragment convert(String input) {
-      return new PathFragment(input);
+      return PathFragment.create(input);
     }
 
     @Override
@@ -155,7 +155,7 @@
       List<PathFragment> list = new ArrayList<>();
       for (String piece : input.split(":")) {
         if (!piece.isEmpty()) {
-          list.add(new PathFragment(piece));
+          list.add(PathFragment.create(piece));
         }
       }
       return Collections.unmodifiableList(list);
diff --git a/src/main/java/com/google/devtools/build/lib/util/PathFragmentFilter.java b/src/main/java/com/google/devtools/build/lib/util/PathFragmentFilter.java
index d4eb7d7..8262c75 100644
--- a/src/main/java/com/google/devtools/build/lib/util/PathFragmentFilter.java
+++ b/src/main/java/com/google/devtools/build/lib/util/PathFragmentFilter.java
@@ -51,9 +51,9 @@
 
       for (String piece : Splitter.on(',').split(input)) {
         if (piece.length() > 1 && piece.startsWith("-")) {
-          exclusionList.add(new PathFragment(piece.substring(1)));
+          exclusionList.add(PathFragment.create(piece.substring(1)));
         } else if (piece.length() > 0) {
-          inclusionList.add(new PathFragment(piece));
+          inclusionList.add(PathFragment.create(piece));
         }
       }
 
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java
index bce290e..d77c1d7 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/FileSystem.java
@@ -131,7 +131,7 @@
    * file system.
    */
   public Path getPath(String pathName) {
-    return getPath(new PathFragment(pathName));
+    return getPath(PathFragment.create(pathName));
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java b/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java
index 9cc3dc7..5b3bc1e 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/FileSystemUtils.java
@@ -109,7 +109,7 @@
    */
   public static PathFragment relativePath(PathFragment fromDir, PathFragment to) {
     if (to.equals(fromDir)) {
-      return new PathFragment(".");  // same dir, just return '.'
+      return PathFragment.create(".");  // same dir, just return '.'
     }
     if (to.startsWith(fromDir)) {
       return to.relativeTo(fromDir);  // easy case--it's a descendant
@@ -123,7 +123,7 @@
     for (int i = 0; i < levels; i++) {
       dotdots.append("../");
     }
-    return new PathFragment(dotdots.toString()).getRelative(to.relativeTo(ancestor));
+    return PathFragment.create(dotdots.toString()).getRelative(to.relativeTo(ancestor));
   }
 
   /**
@@ -229,9 +229,10 @@
     int count = path.segmentCount();
     for (int i = 0; i < count; i++) {
       if (path.getSegment(i).equals(oldSegment)) {
-        path = new PathFragment(path.subFragment(0, i),
-                                new PathFragment(newSegment),
-                                path.subFragment(i+1, count));
+        path = PathFragment.create(
+            path.subFragment(0, i),
+            PathFragment.create(newSegment),
+            path.subFragment(i+1, count));
         if (!replaceAll) {
           return path;
         }
@@ -287,7 +288,7 @@
    * 'user.dir'. This version does not require a {@link FileSystem}.
    */
   public static PathFragment getWorkingDirectory() {
-    return new PathFragment(System.getProperty("user.dir", "/"));
+    return PathFragment.create(System.getProperty("user.dir", "/"));
   }
 
   /****************************************************************************
@@ -356,7 +357,7 @@
    */
   @ThreadSafe  // but not atomic
   public static void ensureSymbolicLink(Path link, String target) throws IOException {
-    ensureSymbolicLink(link, new PathFragment(target));
+    ensureSymbolicLink(link, PathFragment.create(target));
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/JavaIoFileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/JavaIoFileSystem.java
index e409969..2512308 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/JavaIoFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/JavaIoFileSystem.java
@@ -279,7 +279,7 @@
     long startTime = Profiler.nanoTimeMaybe();
     try {
       String link = Files.readSymbolicLink(file.toPath()).toString();
-      return new PathFragment(link);
+      return PathFragment.create(link);
     } catch (java.nio.file.NotLinkException e) {
       throw new NotASymlinkException(path);
     } catch (java.nio.file.NoSuchFileException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Path.java b/src/main/java/com/google/devtools/build/lib/vfs/Path.java
index e408841..ac8b756 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/Path.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/Path.java
@@ -223,7 +223,7 @@
   private void readObject(ObjectInputStream in) throws IOException {
     fileSystem = fileSystemForSerialization;
     String p = in.readUTF();
-    PathFragment pf = new PathFragment(p);
+    PathFragment pf = PathFragment.create(p);
     PathFragment parentDir = pf.getParentDirectory();
     if (parentDir == null) {
       this.name = "/";
@@ -725,9 +725,9 @@
     } else if (path.equals("..")) {
       return isTopLevelDirectory() ? this : parent;
     } else if (path.indexOf('/') != -1) {
-      return getRelative(new PathFragment(path));
+      return getRelative(PathFragment.create(path));
     } else if (path.indexOf(PathFragment.EXTRA_SEPARATOR_CHAR) != -1) {
-      return getRelative(new PathFragment(path));
+      return getRelative(PathFragment.create(path));
     } else {
       return getCachedChildPath(path);
     }
@@ -745,7 +745,7 @@
 
   /** Returns an absolute PathFragment representing this path. */
   public PathFragment asFragment() {
-    return new PathFragment('\0', true, getSegments());
+    return PathFragment.createNoClone('\0', true, getSegments());
   }
 
   /**
@@ -777,7 +777,7 @@
           currentPath = currentPath.getParentDirectory();
         }
         if (ancestorPath.equals(currentPath)) {
-          return new PathFragment('\0', false, resultSegments);
+          return PathFragment.createNoClone('\0', false, resultSegments);
         }
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
index b466fc9..5a324be 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
@@ -57,13 +57,13 @@
   public static final String ROOT_DIR = "/";
 
   /** An empty path fragment. */
-  public static final PathFragment EMPTY_FRAGMENT = new PathFragment("");
+  public static final PathFragment EMPTY_FRAGMENT = create("");
 
   public static final Function<String, PathFragment> TO_PATH_FRAGMENT =
       new Function<String, PathFragment>() {
         @Override
         public PathFragment apply(String str) {
-          return new PathFragment(str);
+          return create(str);
         }
       };
 
@@ -89,7 +89,7 @@
     for (int i = 0; i < segments.length; i++) {
       internedSegments[i] = StringCanonicalizer.intern(segments[i]);
     }
-    return new PathFragment(driveLetter, isAbsolute, internedSegments);
+    return createNoClone(driveLetter, isAbsolute, internedSegments);
   }
 
   /** Same as {@link #create(char, boolean, String[])}, except for {@link List}s of segments. */
@@ -98,7 +98,40 @@
     for (int i = 0; i < segments.size(); i++) {
       internedSegments[i] = StringCanonicalizer.intern(segments.get(i));
     }
-    return new PathFragment(driveLetter, isAbsolute, internedSegments);
+    return createNoClone(driveLetter, isAbsolute, internedSegments);
+  }
+
+  /**
+   * Construct a PathFragment from a java.io.File, which is an absolute or
+   * relative UNIX path.  Does not support Windows-style Files.
+   */
+  public static PathFragment create(File path) {
+    return new PathFragment(path);
+  }
+
+  /**
+   * Construct a PathFragment from a string, which is an absolute or relative UNIX or Windows path.
+   */
+  public static PathFragment create(String path) {
+    return new PathFragment(path);
+  }
+
+  /**
+   * Constructs a PathFragment, taking ownership of segments. Package-private,
+   * because it does not perform a defensive clone of the segments array. Used
+   * here in PathFragment, and by Path.asFragment() and Path.relativeTo().
+   */
+  static PathFragment createNoClone(
+      char driveLetter, boolean isAbsolute, String[] segments) {
+    return new PathFragment(driveLetter, isAbsolute, segments);
+  }
+
+  /**
+   * Construct a PathFragment from a sequence of other PathFragments. The new
+   * fragment will be absolute iff the first fragment was absolute.
+   */
+  public static PathFragment create(PathFragment first, PathFragment second, PathFragment... more) {
+    return new PathFragment(first, second, more);
   }
 
   // We have 3 word-sized fields (segments, hashCode and path), and 2
@@ -121,9 +154,8 @@
   private int hashCode;
   private String path;
 
-  /**
-   * Construct a PathFragment from a string, which is an absolute or relative UNIX or Windows path.
-   */
+  /** Don't call this ctor; use {@link #create(String)} instead. */
+  @Deprecated
   public PathFragment(String path) {
     this.driveLetter =
         (OS.getCurrent() == OS.WINDOWS
@@ -145,20 +177,11 @@
     return c == SEPARATOR_CHAR || c == EXTRA_SEPARATOR_CHAR;
   }
 
-  /**
-   * Construct a PathFragment from a java.io.File, which is an absolute or
-   * relative UNIX path.  Does not support Windows-style Files.
-   */
-  public PathFragment(File path) {
+  private PathFragment(File path) {
     this(path.getPath());
   }
 
-  /**
-   * Constructs a PathFragment, taking ownership of segments. Package-private,
-   * because it does not perform a defensive clone of the segments array. Used
-   * here in PathFragment, and by Path.asFragment() and Path.relativeTo().
-   */
-  PathFragment(char driveLetter, boolean isAbsolute, String[] segments) {
+  private PathFragment(char driveLetter, boolean isAbsolute, String[] segments) {
     driveLetter = Character.toUpperCase(driveLetter);
     if (OS.getCurrent() == OS.WINDOWS
         && segments.length > 0
@@ -175,11 +198,7 @@
     this.segments = segments;
   }
 
-  /**
-   * Construct a PathFragment from a sequence of other PathFragments. The new
-   * fragment will be absolute iff the first fragment was absolute.
-   */
-  public PathFragment(PathFragment first, PathFragment second, PathFragment... more) {
+  private PathFragment(PathFragment first, PathFragment second, PathFragment... more) {
     // TODO(bazel-team): The handling of absolute path fragments in this constructor is unexpected.
     this.segments = new String[sumLengths(first, second, more)];
     int offset = 0;
@@ -420,8 +439,7 @@
       return this;
     }
 
-    return new PathFragment(driveLetter, isAbsolute,
-        subarray(scratchSegments, 0, segmentCount));
+    return createNoClone(driveLetter, isAbsolute, subarray(scratchSegments, 0, segmentCount));
   }
 
   /**
@@ -440,9 +458,9 @@
     if (otherFragment.isAbsolute()) {
       return this.driveLetter == '\0' || otherFragment.driveLetter != '\0'
           ? otherFragment
-          : new PathFragment(this.driveLetter, true, otherFragment.segments);
+          : createNoClone(this.driveLetter, true, otherFragment.segments);
     } else {
-      return new PathFragment(this, otherFragment);
+      return create(this, otherFragment);
     }
   }
 
@@ -455,7 +473,7 @@
    * with no path normalization or I/O performed.
    */
   public PathFragment getRelative(String path) {
-    return getRelative(new PathFragment(path));
+    return getRelative(create(path));
   }
 
   /**
@@ -474,7 +492,7 @@
     baseName = StringCanonicalizer.intern(baseName);
     String[] newSegments = Arrays.copyOf(segments, segments.length + 1);
     newSegments[newSegments.length - 1] = baseName;
-    return new PathFragment(driveLetter, isAbsolute, newSegments);
+    return createNoClone(driveLetter, isAbsolute, newSegments);
   }
 
   /**
@@ -525,14 +543,14 @@
 
     int length = segments.length - ancestorLength;
     String[] resultSegments = subarray(segments, ancestorLength, length);
-    return new PathFragment('\0', false, resultSegments);
+    return createNoClone('\0', false, resultSegments);
   }
 
   /**
    * Returns a relative path fragment to this path, relative to {@code path}.
    */
   public PathFragment relativeTo(String path) {
-    return relativeTo(new PathFragment(path));
+    return relativeTo(create(path));
   }
 
   /**
@@ -619,8 +637,11 @@
           toString(), beginIndex, endIndex));
     }
     boolean isAbsolute = (beginIndex == 0) && this.isAbsolute;
-    return ((beginIndex == 0) && (endIndex == count)) ? this :
-        new PathFragment(driveLetter, isAbsolute,
+    return ((beginIndex == 0) && (endIndex == count))
+        ? this
+        : createNoClone(
+            driveLetter,
+            isAbsolute,
             subarray(segments, beginIndex, endIndex - beginIndex));
   }
 
@@ -698,7 +719,7 @@
    */
   public PathFragment toRelative() {
     Preconditions.checkArgument(isAbsolute);
-    return new PathFragment(driveLetter, false, segments);
+    return createNoClone(driveLetter, false, segments);
   }
 
   private boolean isEmpty() {
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragmentSerializationProxy.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragmentSerializationProxy.java
index 7e4a1f0..39aefd1 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragmentSerializationProxy.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragmentSerializationProxy.java
@@ -44,7 +44,7 @@
   }
 
   private Object readResolve() {
-    return new PathFragment(pathFragmentString);
+    return PathFragment.create(pathFragmentString);
   }
 }
 
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java b/src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java
index 7f7d8c7..764ed0d 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/SearchPath.java
@@ -37,7 +37,7 @@
       return paths;
     }
     for (String p : SEPARATOR.split(searchPath)) {
-      PathFragment pf = new PathFragment(p);
+      PathFragment pf = PathFragment.create(p);
 
       if (pf.isAbsolute()) {
         paths.add(fs.getPath(pf));
@@ -53,7 +53,7 @@
    */
   @Nullable
   public static Path which(List<Path> searchPath, String exe) {
-    PathFragment fragment = new PathFragment(exe);
+    PathFragment fragment = PathFragment.create(exe);
     if (fragment.segmentCount() != 1 || fragment.isAbsolute()) {
       return null;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/ZipFileSystem.java b/src/main/java/com/google/devtools/build/lib/vfs/ZipFileSystem.java
index d7ad308..353a684 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/ZipFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/ZipFileSystem.java
@@ -160,7 +160,7 @@
   private Collection<Path> populatePathTree() {
     Collection<Path> paths = new ArrayList<>();
     for (ZipEntry entry : Collections.list(zipFile.entries())) {
-      PathFragment frag = new PathFragment(entry.getName());
+      PathFragment frag = PathFragment.create(entry.getName());
       Path path = rootPath.getRelative(frag);
       paths.add(path);
       ((ZipPath) path).setZipEntry(entry);
diff --git a/src/main/java/com/google/devtools/build/lib/windows/WindowsFileSystem.java b/src/main/java/com/google/devtools/build/lib/windows/WindowsFileSystem.java
index 710319f..77197d7 100644
--- a/src/main/java/com/google/devtools/build/lib/windows/WindowsFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/windows/WindowsFileSystem.java
@@ -80,7 +80,7 @@
             // the path, except the last one, is already canonicalized, so we can return just that.
             // Plus the returned value is passed to Path.getChild so we must not return a full
             // path here.
-            return new PathFragment(WindowsFileOperations.getLongPath(path)).getBaseName();
+            return PathFragment.create(WindowsFileOperations.getLongPath(path)).getBaseName();
           } catch (IOException e) {
             return null;
           }
@@ -523,7 +523,7 @@
     }
 
     path = path.trim();
-    PathFragment result = new PathFragment(path);
+    PathFragment result = PathFragment.create(path);
     if (path.isEmpty() || result.getDriveLetter() == '\0' || !result.isAbsolute()) {
       return null;
     } else {
diff --git a/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java b/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java
index 0632bac..e85325d 100644
--- a/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java
@@ -76,7 +76,7 @@
     // Therefore if it's absolute, then normalize it also.
     // If it's not absolute, then it cannot be longer than MAX_PATH, since MAX_PATH also limits the
     // length of file names.
-    PathFragment argv0fragment = new PathFragment(argv0);
+    PathFragment argv0fragment = PathFragment.create(argv0);
     return (argv0fragment.isAbsolute())
         ? argv0fragment.normalize().getPathString().replace('/', '\\')
         : argv0;
