diff --git a/src/com/facebook/buck/event/listener/JavaUtilsLoggingBuildListener.java b/src/com/facebook/buck/event/listener/JavaUtilsLoggingBuildListener.java
index 0c80db1..9140f65 100644
--- a/src/com/facebook/buck/event/listener/JavaUtilsLoggingBuildListener.java
+++ b/src/com/facebook/buck/event/listener/JavaUtilsLoggingBuildListener.java
@@ -24,8 +24,10 @@
 import com.google.common.base.Throwables;
 import com.google.common.eventbus.Subscribe;
 
-import java.io.File;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.TimeZone;
@@ -46,9 +48,12 @@
 
   public static void ensureLogFileIsWritten() {
     try {
-      File dir = new File(BuckConstant.BIN_DIR);
-      if (!dir.exists() && !dir.mkdirs()) {
-        throw new HumanReadableException("Unable to create output directory: " + dir);
+      Path dir = Paths.get(BuckConstant.BIN_DIR);
+
+      try {
+        Files.createDirectories(dir);
+      } catch (IOException e) {
+        throw new HumanReadableException(e, "Unable to create output directory: " + dir);
       }
 
       FileHandler handler = new FileHandler(
diff --git a/src/com/facebook/buck/rules/DirArtifactCache.java b/src/com/facebook/buck/rules/DirArtifactCache.java
index f41a60a..e244e25 100644
--- a/src/com/facebook/buck/rules/DirArtifactCache.java
+++ b/src/com/facebook/buck/rules/DirArtifactCache.java
@@ -16,11 +16,15 @@
 
 package com.facebook.buck.rules;
 
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+
 import com.google.common.base.Preconditions;
-import com.google.common.io.Files;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.logging.Level;
 import java.util.logging.Logger;
 
 public class DirArtifactCache implements ArtifactCache {
@@ -30,11 +34,7 @@
 
   public DirArtifactCache(File cacheDir) throws IOException {
     this.cacheDir = Preconditions.checkNotNull(cacheDir);
-    Files.createParentDirs(cacheDir);
-    if (!cacheDir.mkdir() && !cacheDir.exists()) {
-      throw new IOException(String.format("Failed to create cache directory: \"%s\"",
-          cacheDir.getPath()));
-    }
+    Files.createDirectories(cacheDir.toPath());
   }
 
   @Override
@@ -43,8 +43,8 @@
     File cacheEntry = new File(cacheDir, ruleKey.toString());
     if (cacheEntry.exists()) {
       try {
-        Files.createParentDirs(output);
-        Files.copy(cacheEntry, output);
+        Files.createDirectories(output.toPath().getParent());
+        Files.copy(cacheEntry.toPath(), output.toPath(), REPLACE_EXISTING);
         success = CacheResult.DIR_HIT;
       } catch (IOException e) {
         logger.warning(String.format("Artifact fetch(%s, %s) error: %s",
@@ -63,21 +63,26 @@
   @Override
   public void store(RuleKey ruleKey, File output) {
     File cacheEntry = new File(cacheDir, ruleKey.toString());
-    File tmpCacheEntry = null;
+    Path tmpCacheEntry = null;
     try {
       // Write to a temporary file and move the file to its final location atomically to protect
       // against partial artifacts (whether due to buck interruption or filesystem failure) posing
       // as valid artifacts during subsequent buck runs.
-      tmpCacheEntry = File.createTempFile(ruleKey.toString(), ".tmp", cacheDir);
-      Files.copy(output, tmpCacheEntry);
-      Files.move(tmpCacheEntry, cacheEntry);
+      tmpCacheEntry = File.createTempFile(ruleKey.toString(), ".tmp", cacheDir).toPath();
+      Files.copy(output.toPath(), tmpCacheEntry, REPLACE_EXISTING);
+      Files.move(tmpCacheEntry, cacheEntry.toPath());
     } catch (IOException e) {
       logger.warning(String.format("Artifact store(%s, %s) error: %s",
           ruleKey,
           output.getPath(),
           e.getMessage()));
       if (tmpCacheEntry != null) {
-        tmpCacheEntry.delete();
+        try {
+          Files.deleteIfExists(tmpCacheEntry);
+        } catch (IOException ignored) {
+          // Unable to delete a temporary file. Nothing sane to do.
+          logger.log(Level.INFO, "Unable to delete temp cache file", ignored);
+        }
       }
     }
   }
diff --git a/src/com/facebook/buck/util/DefaultFilteredDirectoryCopier.java b/src/com/facebook/buck/util/DefaultFilteredDirectoryCopier.java
index 0da9e28..4a103c0 100644
--- a/src/com/facebook/buck/util/DefaultFilteredDirectoryCopier.java
+++ b/src/com/facebook/buck/util/DefaultFilteredDirectoryCopier.java
@@ -17,10 +17,11 @@
 package com.facebook.buck.util;
 
 import com.google.common.base.Predicate;
-import com.google.common.io.Files;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.Map;
 
 /**
@@ -58,22 +59,22 @@
       String srcDir,
       String destDir,
       final Predicate<File> pred) throws IOException {
-    final File dest = new File(destDir);
+    final Path dest = MorePaths.absolutify(MorePaths.newPathInstance(destDir));
 
     // Remove existing contents if any.
-    if (dest.exists()) {
-      MoreFiles.rmdir(java.nio.file.Paths.get(dest.getAbsolutePath()));
+    if (dest.toFile().exists()) {
+      MoreFiles.rmdir(dest);
     }
-    dest.mkdirs();
+    Files.createDirectories(dest);
 
     // Copy filtered contents.
     new DirectoryTraversal(new File(srcDir)) {
       @Override
       public void visit(File srcFile, String relativePath) throws IOException {
         if (pred.apply(srcFile)) {
-          File destFile = new File(dest, relativePath);
-          Files.createParentDirs(destFile);
-          Files.copy(srcFile, destFile);
+          Path destPath = dest.resolve(relativePath);
+          Files.createDirectories(destPath.getParent());
+          Files.copy(srcFile.toPath(), destPath);
         }
       }
     }.traverse();
diff --git a/src/com/facebook/buck/util/ProjectFilesystem.java b/src/com/facebook/buck/util/ProjectFilesystem.java
index bc98a7a..f80ab68 100644
--- a/src/com/facebook/buck/util/ProjectFilesystem.java
+++ b/src/com/facebook/buck/util/ProjectFilesystem.java
@@ -184,7 +184,8 @@
   }
 
   /**
-   * Resolves the relative path against the project root and then calls {@link File#mkdirs()}.
+   * Resolves the relative path against the project root and then calls
+   * {@link java.nio.file.Files#createDirectories(java.nio.file.Path, java.nio.file.attribute.FileAttribute[])}
    */
   public void mkdirs(Path pathRelativeToProjectRoot) throws IOException {
     java.nio.file.Files.createDirectories(resolve(pathRelativeToProjectRoot));
diff --git a/src/com/facebook/buck/zip/UnzipStep.java b/src/com/facebook/buck/zip/UnzipStep.java
index 5a521da..2f1c610 100644
--- a/src/com/facebook/buck/zip/UnzipStep.java
+++ b/src/com/facebook/buck/zip/UnzipStep.java
@@ -30,6 +30,7 @@
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.nio.file.Files;
 import java.util.Set;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
@@ -137,12 +138,10 @@
                              String destination,
                              ImmutableSet<String> filesToExtract,
                              boolean overwriteExistingFiles) throws IOException {
-    // Create output directory is not exists
+    // Create output directory if it does not exist
     File folder = new File(destination);
     // TODO UnzipStep could be a CompositeStep with a MakeCleanDirectoryStep for the output dir.
-    if (!folder.exists() && !folder.mkdirs()) {
-      throw new IOException(String.format("Folder %s could not be created.", folder.toString()));
-    }
+    Files.createDirectories(folder.toPath());
 
     try (ZipInputStream zip = new ZipInputStream(new FileInputStream(zipFile))) {
       for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
@@ -157,17 +156,10 @@
         }
         if (entry.isDirectory()) {
           // Create the directory and all its parent directories
-          if (!target.mkdirs()) {
-            throw new IOException(String.format("Folder %s could not be created.",
-                target.toString()));
-          }
+          Files.createDirectories(target.toPath());
         } else {
           // Create parent folder
-          File parentFolder = target.getParentFile();
-          if (!parentFolder.exists() && !parentFolder.mkdirs()) {
-            throw new IOException(String.format("Folder %s could not be created.",
-                parentFolder.toString()));
-          }
+          Files.createDirectories(target.toPath().getParent());
           // Write file
           try (FileOutputStream out = new FileOutputStream(target)) {
             ByteStreams.copy(zip, out);
