diff --git a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java b/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java
index 089a293..b02dc00 100644
--- a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java
+++ b/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriteDescription.java
@@ -28,24 +28,23 @@
           "j$/nio/file/spi/FileTypeDetector",
           "j$/nio/file/Path",
           "j$/nio/file/WatchEvent",
-          "j$/nio/file/OpenOption");
+          "j$/nio/file/OpenOption",
+          "j$/nio/file/attribute/FileAttribute");
 
-  static Map<String, String> getJavaWrapConvertOwnerMap() {
-    return computeConvertOwnerMap("$Wrapper");
-  }
-
-  static Map<String, String> getJ$WrapConvertOwnerMap() {
-    return computeConvertOwnerMap("$VivifiedWrapper");
-  }
-
-  private static HashMap<String, String> computeConvertOwnerMap(String suffix) {
+  static Map<String, String> getWrapConvertOwnerMap() {
     HashMap<String, String> map = new HashMap<>();
     for (String theEnum : ENUM_WRAP_CONVERT_OWNER) {
       map.put(theEnum, theEnum + "$EnumConversion");
+      map.put(withJavaPrefix(theEnum), theEnum + "$EnumConversion");
     }
     for (String owner : WRAP_CONVERT_OWNER) {
-      map.put(owner, owner + suffix);
+      map.put(withJavaPrefix(owner), owner + "$Wrapper");
+      map.put(owner, owner + "$VivifiedWrapper");
     }
     return map;
   }
+
+  private static String withJavaPrefix(String descriptor) {
+    return "java" + descriptor.substring(2);
+  }
 }
diff --git a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriter.java b/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriter.java
index 0848c09..95a5ecc 100644
--- a/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriter.java
+++ b/buildSrc/src/main/java/desugaredlibrary/CustomConversionAsmRewriter.java
@@ -39,10 +39,8 @@
   }
 
   private final CustomConversionVersion legacy;
-  private final Map<String, String> javaWrapConvertOwnerMap =
-      CustomConversionAsmRewriteDescription.getJavaWrapConvertOwnerMap();
-  private final Map<String, String> j$WrapConvertOwnerMap =
-      CustomConversionAsmRewriteDescription.getJ$WrapConvertOwnerMap();
+  private final Map<String, String> wrapConvertOwnerMap =
+      CustomConversionAsmRewriteDescription.getWrapConvertOwnerMap();
 
   public static void generateJars(Path jar, Path outputDirectory) throws IOException {
     for (CustomConversionVersion version : CustomConversionVersion.values()) {
@@ -148,30 +146,14 @@
 
     private void convertInvoke(int opcode, String owner, String descriptor, boolean isInterface) {
       String firstArg = extractFirstArg(descriptor);
-      assert sameBaseName(firstArg, owner);
-      if (!javaWrapConvertOwnerMap.containsKey(owner)
-          || !j$WrapConvertOwnerMap.containsKey(owner)
+      if (!wrapConvertOwnerMap.containsKey(firstArg)
           || !(firstArg.startsWith("java") || firstArg.startsWith("j$"))) {
         throw new RuntimeException(
             "Cannot transform wrap_convert method for " + firstArg + " (owner: " + owner + ")");
       }
-      if (firstArg.startsWith("java")) {
-        String newOwner = javaWrapConvertOwnerMap.get(owner);
-        super.visitMethodInsn(opcode, newOwner, CONVERT, descriptor, isInterface);
-        return;
-      }
-      assert firstArg.startsWith("j$");
-      String newOwner = j$WrapConvertOwnerMap.get(owner);
+      String newOwner = wrapConvertOwnerMap.get(firstArg);
       super.visitMethodInsn(opcode, newOwner, CONVERT, descriptor, isInterface);
     }
 
-    private boolean sameBaseName(String firstArg, String owner) {
-      assert owner.startsWith("j$");
-      if (firstArg.equals(owner)) {
-        return true;
-      }
-      String javaName = owner.replace("j$", "java");
-      return firstArg.equals(javaName);
-    }
   }
 }
diff --git a/src/library_desugar/java/j$/nio/file/attribute/BasicFileAttributeView.java b/src/library_desugar/java/j$/nio/file/attribute/BasicFileAttributeView.java
index 774cf2c..7d2612f 100644
--- a/src/library_desugar/java/j$/nio/file/attribute/BasicFileAttributeView.java
+++ b/src/library_desugar/java/j$/nio/file/attribute/BasicFileAttributeView.java
@@ -5,13 +5,4 @@
 package j$.nio.file.attribute;
 
 public class BasicFileAttributeView extends FileAttributeView {
-  public static java.nio.file.attribute.BasicFileAttributeView wrap_convert(
-      j$.nio.file.attribute.BasicFileAttributeView fileAttributeView) {
-    return null;
-  }
-
-  public static j$.nio.file.attribute.BasicFileAttributeView wrap_convert(
-      java.nio.file.attribute.BasicFileAttributeView fileAttributeView) {
-    return null;
-  }
 }
diff --git a/src/library_desugar/java/j$/nio/file/attribute/BasicFileAttributes.java b/src/library_desugar/java/j$/nio/file/attribute/BasicFileAttributes.java
index dd91a95..69b0ca6 100644
--- a/src/library_desugar/java/j$/nio/file/attribute/BasicFileAttributes.java
+++ b/src/library_desugar/java/j$/nio/file/attribute/BasicFileAttributes.java
@@ -5,13 +5,4 @@
 package j$.nio.file.attribute;
 
 public class BasicFileAttributes {
-  public static java.nio.file.attribute.BasicFileAttributes wrap_convert(
-      j$.nio.file.attribute.BasicFileAttributes fileAttributes) {
-    return null;
-  }
-
-  public static j$.nio.file.attribute.BasicFileAttributes wrap_convert(
-      java.nio.file.attribute.BasicFileAttributes fileAttributes) {
-    return null;
-  }
 }
diff --git a/src/library_desugar/java/j$/nio/file/attribute/FileAttribute.java b/src/library_desugar/java/j$/nio/file/attribute/FileAttribute.java
new file mode 100644
index 0000000..b971b05
--- /dev/null
+++ b/src/library_desugar/java/j$/nio/file/attribute/FileAttribute.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package j$.nio.file.attribute;
+
+public interface FileAttribute<T> {
+
+  String name();
+
+  T value();
+}
diff --git a/src/library_desugar/java/j$/nio/file/attribute/FileAttributeView.java b/src/library_desugar/java/j$/nio/file/attribute/FileAttributeView.java
index 34046eb3..df33474 100644
--- a/src/library_desugar/java/j$/nio/file/attribute/FileAttributeView.java
+++ b/src/library_desugar/java/j$/nio/file/attribute/FileAttributeView.java
@@ -5,13 +5,4 @@
 package j$.nio.file.attribute;
 
 public class FileAttributeView {
-  public static java.nio.file.attribute.FileAttributeView wrap_convert(
-      j$.nio.file.attribute.FileAttributeView fileAttributeView) {
-    return null;
-  }
-
-  public static j$.nio.file.attribute.FileAttributeView wrap_convert(
-      java.nio.file.attribute.FileAttributeView fileAttributeView) {
-    return null;
-  }
 }
diff --git a/src/library_desugar/java/j$/nio/file/attribute/FileAttributeWrapperMethods.java b/src/library_desugar/java/j$/nio/file/attribute/FileAttributeWrapperMethods.java
new file mode 100644
index 0000000..dfff944
--- /dev/null
+++ b/src/library_desugar/java/j$/nio/file/attribute/FileAttributeWrapperMethods.java
@@ -0,0 +1,18 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package j$.nio.file.attribute;
+
+public class FileAttributeWrapperMethods {
+
+  public static java.nio.file.attribute.FileAttribute wrap_convert(
+      j$.nio.file.attribute.FileAttribute fileAttribute) {
+    return null;
+  }
+
+  public static j$.nio.file.attribute.FileAttribute wrap_convert(
+      java.nio.file.attribute.FileAttribute fileAttribute) {
+    return null;
+  }
+}
diff --git a/src/library_desugar/java/j$/nio/file/attribute/FileOwnerAttributeView.java b/src/library_desugar/java/j$/nio/file/attribute/FileOwnerAttributeView.java
index 34a637d..cbce1b4 100644
--- a/src/library_desugar/java/j$/nio/file/attribute/FileOwnerAttributeView.java
+++ b/src/library_desugar/java/j$/nio/file/attribute/FileOwnerAttributeView.java
@@ -5,13 +5,4 @@
 package j$.nio.file.attribute;
 
 public class FileOwnerAttributeView extends FileAttributeView {
-  public static java.nio.file.attribute.FileOwnerAttributeView wrap_convert(
-      j$.nio.file.attribute.FileOwnerAttributeView fileAttributeView) {
-    return null;
-  }
-
-  public static j$.nio.file.attribute.FileOwnerAttributeView wrap_convert(
-      java.nio.file.attribute.FileOwnerAttributeView fileAttributeView) {
-    return null;
-  }
 }
diff --git a/src/library_desugar/java/j$/nio/file/attribute/PosixFileAttributeView.java b/src/library_desugar/java/j$/nio/file/attribute/PosixFileAttributeView.java
index bb24cb7..04f4f04 100644
--- a/src/library_desugar/java/j$/nio/file/attribute/PosixFileAttributeView.java
+++ b/src/library_desugar/java/j$/nio/file/attribute/PosixFileAttributeView.java
@@ -5,13 +5,4 @@
 package j$.nio.file.attribute;
 
 public class PosixFileAttributeView extends FileAttributeView {
-  public static java.nio.file.attribute.PosixFileAttributeView wrap_convert(
-      j$.nio.file.attribute.PosixFileAttributeView fileAttributeView) {
-    return null;
-  }
-
-  public static j$.nio.file.attribute.PosixFileAttributeView wrap_convert(
-      java.nio.file.attribute.PosixFileAttributeView fileAttributeView) {
-    return null;
-  }
 }
diff --git a/src/library_desugar/java/j$/nio/file/attribute/PosixFileAttributes.java b/src/library_desugar/java/j$/nio/file/attribute/PosixFileAttributes.java
index 5e61814..d6e9796 100644
--- a/src/library_desugar/java/j$/nio/file/attribute/PosixFileAttributes.java
+++ b/src/library_desugar/java/j$/nio/file/attribute/PosixFileAttributes.java
@@ -5,13 +5,4 @@
 package j$.nio.file.attribute;
 
 public class PosixFileAttributes extends BasicFileAttributes {
-  public static java.nio.file.attribute.PosixFileAttributes wrap_convert(
-      j$.nio.file.attribute.PosixFileAttributes fileAttributes) {
-    return null;
-  }
-
-  public static j$.nio.file.attribute.PosixFileAttributes wrap_convert(
-      java.nio.file.attribute.PosixFileAttributes fileAttributes) {
-    return null;
-  }
 }
diff --git a/src/library_desugar/java/java/nio/file/attribute/FileAttributeConversions.java b/src/library_desugar/java/java/nio/file/attribute/FileAttributeConversions.java
index c895d52..18c575f 100644
--- a/src/library_desugar/java/java/nio/file/attribute/FileAttributeConversions.java
+++ b/src/library_desugar/java/java/nio/file/attribute/FileAttributeConversions.java
@@ -4,6 +4,10 @@
 
 package java.nio.file.attribute;
 
+import java.nio.file.FileApiFlips;
+import java.util.Collections;
+import java.util.Set;
+
 public class FileAttributeConversions {
 
   public static java.nio.file.attribute.FileTime convert(j$.nio.file.attribute.FileTime fileTime) {
@@ -20,4 +24,58 @@
     return j$.nio.file.attribute.FileTime.fromMillis(fileTime.toMillis());
   }
 
+  /** A FileAttribute usually holds an immutable set of non-null posix permissions. */
+  public static java.nio.file.attribute.FileAttribute<?> convert(
+      j$.nio.file.attribute.FileAttribute<?> attribute) {
+    if (attribute == null) {
+      return null;
+    }
+    if (isPosixPermissionAttributes(attribute.value())) {
+      return new java.nio.file.attribute.FileAttribute<Object>() {
+        public String name() {
+          return "posix:permissions";
+        }
+
+        public Object value() {
+          return Collections.unmodifiableSet(
+              FileApiFlips.flipPosixPermissionSet((Set<?>) attribute.value()));
+        }
+      };
+    }
+    return j$.nio.file.attribute.FileAttributeWrapperMethods.wrap_convert(attribute);
+  }
+
+  public static j$.nio.file.attribute.FileAttribute<?> convert(
+      java.nio.file.attribute.FileAttribute<?> attribute) {
+    if (attribute == null) {
+      return null;
+    }
+    if (isPosixPermissionAttributes(attribute.value())) {
+      return new j$.nio.file.attribute.FileAttribute<Object>() {
+        public String name() {
+          return "posix:permissions";
+        }
+
+        public Object value() {
+          return Collections.unmodifiableSet(
+              FileApiFlips.flipPosixPermissionSet((Set<?>) attribute.value()));
+        }
+      };
+    }
+    return j$.nio.file.attribute.FileAttributeWrapperMethods.wrap_convert(attribute);
+  }
+
+  private static boolean isPosixPermissionAttributes(Object value) {
+    if (value instanceof java.util.Set) {
+      Set<?> set = (java.util.Set<?>) value;
+      if (!set.isEmpty()) {
+        Object guineaPig = set.iterator().next();
+        if (guineaPig instanceof java.nio.file.attribute.PosixFilePermission
+            || guineaPig instanceof j$.nio.file.attribute.PosixFilePermission) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
 }
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
index c102e5e..dff0eac 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
@@ -257,7 +257,6 @@
         "java.nio.file.CopyOption",
         "java.nio.file.StandardCopyOption",
         "java.nio.file.attribute.GroupPrincipal",
-        "java.nio.file.attribute.FileAttribute",
         "java.nio.file.attribute.UserPrincipal",
         "java.nio.file.FileStore",
         "java.nio.file.attribute.FileStoreAttributeView",
@@ -265,6 +264,7 @@
         "java.nio.file.attribute.BasicFileAttributes",
         "java.nio.file.attribute.DosFileAttributes",
         "java.nio.file.attribute.PosixFileAttributes",
+        "java.nio.file.attribute.FileAttribute",
         "java.nio.file.attribute.FileAttributeView",
         "java.nio.file.attribute.FileOwnerAttributeView",
         "java.nio.file.attribute.DosFileAttributeView",
@@ -279,7 +279,8 @@
         ]
       },
       "custom_conversion": {
-        "java.nio.file.attribute.FileTime": "java.nio.file.attribute.FileAttributeConversions"
+        "java.nio.file.attribute.FileTime": "java.nio.file.attribute.FileAttributeConversions",
+        "java.nio.file.attribute.FileAttribute": "java.nio.file.attribute.FileAttributeConversions"
       }
     },
     {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
index 314d657..cae75f2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
@@ -15,13 +15,11 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
-import com.google.common.collect.Sets.SetView;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.IdentityHashMap;
 import java.util.Map;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 public class HumanRewritingFlags {
 
@@ -510,7 +508,6 @@
     }
 
     public HumanRewritingFlags build() {
-      validate();
       return new HumanRewritingFlags(
           ImmutableMap.copyOf(rewritePrefix),
           ImmutableSet.copyOf(dontRewritePrefix),
@@ -533,19 +530,5 @@
           ImmutableMap.copyOf(amendLibraryMethod),
           ImmutableMap.copyOf(amendLibraryField));
     }
-
-    private void validate() {
-      SetView<DexType> dups =
-          Sets.intersection(customConversions.keySet(), wrapperConversions.keySet());
-      if (!dups.isEmpty()) {
-        throw reporter.fatalError(
-            new StringDiagnostic(
-                "Invalid desugared library configuration. "
-                    + "Duplicate types in custom conversions and wrapper conversions: "
-                    + String.join(
-                        ", ", dups.stream().map(DexType::toString).collect(Collectors.toSet())),
-                origin));
-      }
-    }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesCreateTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesCreateTest.java
new file mode 100644
index 0000000..39d85b1
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesCreateTest.java
@@ -0,0 +1,203 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
+
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_PATH;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.ImmutableList;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.LinkOption;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileAttribute;
+import java.nio.file.attribute.PosixFilePermission;
+import java.nio.file.attribute.PosixFilePermissions;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import org.junit.Assume;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class FilesCreateTest extends DesugaredLibraryTestBase {
+
+  private static final String EXPECTED_RESULT =
+      StringUtils.lines(
+          "ind3f class java.nio.file.NoSuchFileException",
+          "ind4f class java.nio.file.NoSuchFileException",
+          "ind5f class java.nio.file.NoSuchFileException",
+          "ind6f class java.nio.file.NoSuchFileException",
+          "true",
+          "true",
+          "notExisting1class java.nio.file.NoSuchFileException",
+          "false",
+          "false");
+  private static final String EXPECTED_RESULT_DESUGARING =
+      StringUtils.lines(
+          "ind5f class java.io.FileNotFoundException",
+          "ind6f class java.io.FileNotFoundException",
+          "true",
+          "true",
+          "notExisting1class java.io.IOException",
+          "false",
+          "true",
+          "ind4f/dir",
+          "ind4f",
+          "ind3f/dir",
+          "ind3f");
+  private static final String EXPECTED_FILES =
+      StringUtils.lines(
+          "ind2s/dir", "ind2s", "ind1s/dir", "ind1s", "f4.txt", "f3.txt", "dir2s", "dir1s");
+
+  private final TestParameters parameters;
+  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
+  private final CompilationSpecification compilationSpecification;
+
+  @Parameters(name = "{0}, spec: {1}, {2}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        // Skip Android 4.4.4 due to missing libjavacrypto.
+        getTestParameters()
+            .withCfRuntime(CfVm.JDK11)
+            .withDexRuntime(Version.V4_0_4)
+            .withDexRuntimesStartingFromIncluding(Version.V5_1_1)
+            .withAllApiLevels()
+            .build(),
+        ImmutableList.of(JDK11_PATH),
+        DEFAULT_SPECIFICATIONS);
+  }
+
+  public FilesCreateTest(
+      TestParameters parameters,
+      LibraryDesugaringSpecification libraryDesugaringSpecification,
+      CompilationSpecification compilationSpecification) {
+    this.parameters = parameters;
+    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
+    this.compilationSpecification = compilationSpecification;
+  }
+
+  @Test
+  public void test() throws Throwable {
+    if (parameters.isCfRuntime()) {
+      // Reference runtime, we use Jdk 11 since this is Jdk 11 desugared library, not that Jdk 8
+      // behaves differently on this test.
+      Assume.assumeTrue(parameters.isCfRuntime(CfVm.JDK11));
+      testForJvm()
+          .addInnerClasses(getClass())
+          .run(parameters.getRuntime(), TestClass.class)
+          .assertSuccessWithOutput(getExpectedResult());
+      return;
+    }
+    Assume.assumeFalse(
+        "The command mkdir fails on Android 7.0, we need to investigate if this is an emulator"
+            + "issue or a real issue.",
+        parameters.getDexRuntimeVersion().equals(Version.V7_0_0));
+    testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
+        .addInnerClasses(getClass())
+        .addKeepMainRule(TestClass.class)
+        .compile()
+        .withArt6Plus64BitsLib()
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(getExpectedResult());
+  }
+
+  private String getExpectedResult() {
+    if (parameters.isCfRuntime()) {
+      return EXPECTED_RESULT + EXPECTED_FILES;
+    }
+    return (libraryDesugaringSpecification.usesPlatformFileSystem(parameters)
+            ? EXPECTED_RESULT
+            : EXPECTED_RESULT_DESUGARING)
+        // We cannot print on such devices due to conversions errors.
+        + ((libraryDesugaringSpecification.usesPlatformFileSystem(parameters)
+                && libraryDesugaringSpecification.hasNioFileDesugaring(parameters))
+            ? ""
+            : EXPECTED_FILES);
+  }
+
+  public static class TestClass {
+
+    public static void main(String[] args) throws Throwable {
+      Path root = Files.createTempDirectory("tmp_test");
+      Files.createDirectories(root.resolve("ind1s/dir"));
+      Files.createDirectories(root.resolve("ind2s/dir"), getFileAttribute());
+      try {
+        Files.createDirectory(root.resolve("ind3f/dir"));
+      } catch (Throwable t) {
+        System.out.println("ind3f " + t.getClass());
+      }
+      try {
+        Files.createDirectory(root.resolve("ind4f/dir"), getFileAttribute());
+      } catch (Throwable t) {
+        System.out.println("ind4f " + t.getClass());
+      }
+      Files.createDirectory(root.resolve("dir1s"));
+      Files.createDirectory(root.resolve("dir2s"), getFileAttribute());
+      try {
+        Files.createFile(root.resolve("ind5f/f.txt"));
+      } catch (Throwable t) {
+        System.out.println("ind5f " + t.getClass());
+      }
+      try {
+        Files.createFile(root.resolve("ind6f/f.txt"), getFileAttribute());
+      } catch (Throwable t) {
+        System.out.println("ind6f " + t.getClass());
+      }
+      Files.createFile(root.resolve("f1.txt"));
+      Files.createFile(root.resolve("f2.txt"), getFileAttribute());
+
+      System.out.println(Files.exists(root.resolve("f1.txt")));
+      System.out.println(Files.exists(root.resolve("f1.txt"), LinkOption.NOFOLLOW_LINKS));
+
+      Files.delete(root.resolve("f1.txt"));
+      try {
+        Files.delete(root.resolve("notExisting1.txt"));
+      } catch (Throwable t) {
+        System.out.println("notExisting1" + t.getClass());
+      }
+      Files.deleteIfExists(root.resolve("f2.txt"));
+      Files.deleteIfExists(root.resolve("notExisting2.txt"));
+
+      System.out.println(Files.exists(root.resolve("f1.txt")));
+      System.out.println(Files.exists(root.resolve("f1.txt"), LinkOption.NOFOLLOW_LINKS));
+
+      // Recreate for the final print.
+      Files.createFile(root.resolve("f3.txt"));
+      Files.createFile(root.resolve("f4.txt"), getFileAttribute());
+
+      // Clear the temp directory.
+      // We need to fix Files#walk on high Api levels.
+      try {
+        Files.walk(root)
+            .sorted(Comparator.reverseOrder())
+            .map(
+                f -> {
+                  if (f != root) {
+                    System.out.println(f.subpath(2, f.getNameCount()));
+                  }
+                  return f.toFile();
+                })
+            .forEach(File::delete);
+      } catch (Throwable t) {
+
+      }
+    }
+
+    public static FileAttribute<Set<PosixFilePermission>> getFileAttribute() {
+      return PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwxr-xr-x"));
+    }
+  }
+}
