diff --git a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
index c5458159329862f4a4a9ea1012a6e40659d46e46..8a2c513fa0570b839410fa3f1e0a535a3c290274 100644
--- a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
+++ b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
@@ -392,6 +392,12 @@ int main(int argc, char *argv[])
                 Info<< "Using existing processor directories" << nl;
             }
 
+            if (args.optionFound("region"))
+            {
+                procDirsProblem = false;
+                forceOverwrite = false;
+            }
+
             if (forceOverwrite)
             {
                 Info<< "Removing " << nProcs
diff --git a/src/OSspecific/POSIX/POSIX.C b/src/OSspecific/POSIX/POSIX.C
index 9fa15a2e524a92ff70183d6b81a756bece1f5b9a..708375bfadd8a8ce87dd64e8aa48943d983d222a 100644
--- a/src/OSspecific/POSIX/POSIX.C
+++ b/src/OSspecific/POSIX/POSIX.C
@@ -884,6 +884,32 @@ bool Foam::cp(const fileName& src, const fileName& dest, const bool followLink)
             return false;
         }
 
+        char* realSrcPath = realpath(src.c_str(), nullptr);
+        char* realDestPath = realpath(destFile.c_str(), nullptr);
+        const bool samePath = strcmp(realSrcPath, realDestPath) == 0;
+
+        if (POSIX::debug && samePath)
+        {
+            InfoInFunction
+                << "Attempt to copy " << realSrcPath << " to itself" << endl;
+        }
+
+        if (realSrcPath)
+        {
+            free(realSrcPath);
+        }
+
+        if (realDestPath)
+        {
+            free(realDestPath);
+        }
+
+        // Do not copy over self when src is actually a link to dest
+        if (samePath)
+        {
+            return false;
+        }
+
         // Copy files
         fileNameList contents = readDir(src, fileName::FILE, false, followLink);
         forAll(contents, i)
diff --git a/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C b/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C
index 5949754fe75fb7936dc8cdb0f1d0811dde88906e..110849d575906b4cb34183c6eb1abf12988af3a3 100644
--- a/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C
+++ b/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C
@@ -591,14 +591,7 @@ Foam::label Foam::fileOperation::nProcs
     label nProcs = 0;
     while
     (
-        isDir
-        (
-            dir
-           /(word("processor") + name(nProcs))
-           /"constant"
-           /local
-           /polyMesh::meshSubDir
-        )
+        isDir(dir/(word("processor") + name(nProcs)))
     )
     {
         ++nProcs;