diff --git a/meshLibrary/utilities/octrees/meshOctree/meshOctreeCreator/meshOctreeCreatorAdjustOctreeToSurface.C b/meshLibrary/utilities/octrees/meshOctree/meshOctreeCreator/meshOctreeCreatorAdjustOctreeToSurface.C
index f0ae4e57c2e3e689a209a4c28fbc781229d46bf2..440771498c8a5a6506770a68b76ed949136fdb74 100644
--- a/meshLibrary/utilities/octrees/meshOctree/meshOctreeCreator/meshOctreeCreatorAdjustOctreeToSurface.C
+++ b/meshLibrary/utilities/octrees/meshOctree/meshOctreeCreator/meshOctreeCreatorAdjustOctreeToSurface.C
@@ -73,7 +73,6 @@ void meshOctreeCreator::refineBoundary()
 
         labelList refineCubes(leaves.size(), 0);
         scalarList rThickness(leaves.size(), 0.0);
-        List<direction> targetLevel(leaves.size(), direction(0));
         bool useNLayers(false);
 
         //- select boxes which need to be refined
@@ -114,9 +113,6 @@ void meshOctreeCreator::refineBoundary()
                                 rThickness[leafI],
                                 surfRefThickness_[triI]
                             );
-
-                        targetLevel[leafI] =
-                            Foam::max(targetLevel[leafI], surfRefLevel_[triI]);
                     }
                 }
 
@@ -137,8 +133,7 @@ void meshOctreeCreator::refineBoundary()
             octreeModifier.refineSelectedBoxesAndAdditionalLayers
             (
                 refineCubes,
-                rThickness,
-                targetLevel
+                rThickness
             );
         }
         else if( changed )
@@ -296,7 +291,6 @@ void meshOctreeCreator::refineBoxesContainedInObjects()
 
         labelList refineCubes(leaves.size(), 0);
         scalarList rThickness(leaves.size(), 0.0);
-        List<direction> targetRefLevel(leaves.size(), direction(0));
         bool useNLayers(false);
 
         //- select boxes which need to be refined
@@ -339,8 +333,6 @@ void meshOctreeCreator::refineBoxesContainedInObjects()
                         rThickness[leafI] =
                             Foam::max(rThickness[leafI], refThickness[oI]);
 
-                        targetRefLevel[leafI] =
-                            Foam::max(targetRefLevel[leafI], refLevels[oI]);
                         useNLayers = true;
                     }
                 }
@@ -362,8 +354,7 @@ void meshOctreeCreator::refineBoxesContainedInObjects()
             octreeModifier.refineSelectedBoxesAndAdditionalLayers
             (
                 refineCubes,
-                rThickness,
-                targetRefLevel
+                rThickness
             );
         }
         else if( changed )
@@ -509,7 +500,6 @@ void meshOctreeCreator::refineBoxesIntersectingSurfaces()
 
         labelList refineCubes(leaves.size(), 0);
         labelList nLayers(leaves.size(), 0);
-        List<direction> targetRefLevel(leaves.size(), direction(0));
         scalarField rThickness(leaves.size(), 0.0);
         bool useNLayers(false);
 
@@ -582,14 +572,9 @@ void meshOctreeCreator::refineBoxesIntersectingSurfaces()
                                     Foam::max(numLayers, 1)
                                 );
 
-                            rThickness[leafI] = max(rThickness[leafI], sThickness);
+                            rThickness[leafI] =
+                                max(rThickness[leafI], sThickness);
 
-                            targetRefLevel[leafI] =
-                                Foam::max
-                                (
-                                    targetRefLevel[leafI],
-                                    surfLevel
-                                );
                         }
                     }
                 }
@@ -606,12 +591,8 @@ void meshOctreeCreator::refineBoxesIntersectingSurfaces()
             octreeModifier.refineSelectedBoxesAndAdditionalLayers
             (
                 refineCubes,
-                rThickness,
-                targetRefLevel
+                rThickness
             );
-
-            if( nMarked != 0 )
-                changed = true;
         }
         else if( changed )
         {
@@ -750,7 +731,6 @@ void meshOctreeCreator::refineBoxesIntersectingEdgeMeshes()
 
         labelList refineCubes(leaves.size(), 0);
         scalarList rThickness(leaves.size(), 0.0);
-        List<direction> targetRefLevel(leaves.size(), direction(0));
         bool useNLayers(false);
 
         //- select boxes which need to be refined
@@ -817,13 +797,6 @@ void meshOctreeCreator::refineBoxesIntersectingEdgeMeshes()
 
                         rThickness[leafI] =
                             Foam::max(rThickness[leafI], refThickness[emI]);
-
-                        targetRefLevel[leafI] =
-                            Foam::max
-                            (
-                                targetRefLevel[leafI],
-                                refLevels[emI]
-                            );
                     }
                 }
             }
@@ -838,8 +811,7 @@ void meshOctreeCreator::refineBoxesIntersectingEdgeMeshes()
             octreeModifier.refineSelectedBoxesAndAdditionalLayers
             (
                 refineCubes,
-                rThickness,
-                targetRefLevel
+                rThickness
             );
         }
         else if( changed )
diff --git a/meshLibrary/utilities/octrees/meshOctree/meshOctreeModifier/meshOctreeModifier.H b/meshLibrary/utilities/octrees/meshOctree/meshOctreeModifier/meshOctreeModifier.H
index e28ac0a5e6fa83628b786ec5db7d22854f47dc89..c5bdce750005042429bf1d87d9bc554747e7838d 100644
--- a/meshLibrary/utilities/octrees/meshOctree/meshOctreeModifier/meshOctreeModifier.H
+++ b/meshLibrary/utilities/octrees/meshOctree/meshOctreeModifier/meshOctreeModifier.H
@@ -160,8 +160,7 @@ public:
         void refineSelectedBoxesAndAdditionalLayers
         (
             labelList& refineBox,
-            const scalarList& refThickness,
-            const List<direction>& targetRefLevel
+            const scalarList& refThickness
         );
 
     // functions for parallel runs
diff --git a/meshLibrary/utilities/octrees/meshOctree/meshOctreeModifier/meshOctreeModifierRefineSelectedBoxes.C b/meshLibrary/utilities/octrees/meshOctree/meshOctreeModifier/meshOctreeModifierRefineSelectedBoxes.C
index 9055f25f361731b0bb6fa068c7e4abe53ff139f5..ae535b65f1c4a1f5bc3ab68d4473941d84853236 100644
--- a/meshLibrary/utilities/octrees/meshOctree/meshOctreeModifier/meshOctreeModifierRefineSelectedBoxes.C
+++ b/meshLibrary/utilities/octrees/meshOctree/meshOctreeModifier/meshOctreeModifierRefineSelectedBoxes.C
@@ -499,8 +499,7 @@ void meshOctreeModifier::refineSelectedBoxes
 void meshOctreeModifier::refineSelectedBoxesAndAdditionalLayers
 (
     labelList& refineBox,
-    const scalarList& refThickness,
-    const List<direction>& targetRefLevel
+    const scalarList& refThickness
 )
 {
     const LongList<meshOctreeCube*>& leaves = octree_.leaves_;
@@ -510,32 +509,46 @@ void meshOctreeModifier::refineSelectedBoxesAndAdditionalLayers
     lMap leavesMap;
 
     # ifdef DEBUGSearch
-    Info << "Marking additional layers " << endl;
+    Info << "Refining leaves and additional layers" << endl;
     # endif
 
-    LongList<meshOctreeCube*> refLeaves;
+    //- find the maximum refinement level of leaves marked for refinement
     direction maxLevel(0);
 
+    # ifdef USE_OMP
+    # pragma omp parallel
+    {
+        direction localMax(0);
+
+        forAll(refineBox, leafI)
+        {
+            if( refineBox[leafI] )
+                localMax = Foam::max(localMax, leaves[leafI]->level());
+        }
+
+        # pragma omp critical
+        maxLevel = Foam::max(maxLevel, localMax);
+    }
+    # else
     forAll(refineBox, leafI)
+    {
         if( refineBox[leafI] )
-        {
-            //const scalar cs = leaves[leafI]->size(octree_.rootBox());
             maxLevel = Foam::max(maxLevel, leaves[leafI]->level());
-            refLeaves.append(leaves[leafI]);
-            //refNLayers.append(Foam::max(ceil(refThickness[leafI]/cs), 1));
-        }
+    }
+    # endif
 
     label ml = maxLevel;
     reduce(ml, maxOp<label>());
     maxLevel = ml;
 
     //- sort leaves based on the current level
-    Info << "Max level " << ml << endl;
-
     List<labelLongList> leavesForLevel(maxLevel+1);
-    forAll(refLeaves, i)
+    forAll(refineBox, leafI)
     {
-        leavesForLevel[refLeaves[i]->level()].append(refLeaves[i]->cubeLabel());
+        if( !refineBox[leafI] )
+            continue;
+
+        leavesForLevel[leaves[leafI]->level()].append(leafI);
     }
 
     //- find leaves with the same number of additional layers
@@ -548,6 +561,27 @@ void meshOctreeModifier::refineSelectedBoxesAndAdditionalLayers
 
         labelLongList nLayersForActive(activeLeaves.size());
         label maxNLayers(0);
+        # ifdef USE_OMP
+        # pragma omp parallel
+        {
+            label localMaxNLayers(0);
+
+            forAll(activeLeaves, i)
+            {
+                const label leafI = activeLeaves[i];
+
+                const scalar cs = leaves[leafI]->size(octree_.rootBox());
+
+                nLayersForActive[i] = Foam::max(ceil(refThickness[leafI]/cs), 1);
+
+                localMaxNLayers =
+                    Foam::max(localMaxNLayers, nLayersForActive[i]);
+            }
+
+            # pragma omp critical
+            maxNLayers = Foam::max(maxNLayers, localMaxNLayers);
+        }
+        # else
         forAll(activeLeaves, i)
         {
             const label leafI = activeLeaves[i];
@@ -558,6 +592,7 @@ void meshOctreeModifier::refineSelectedBoxesAndAdditionalLayers
 
             maxNLayers = Foam::max(maxNLayers, nLayersForActive[i]);
         }
+        # endif
 
         for(label layerI=0;layerI<=maxNLayers;++layerI)
         {
@@ -584,9 +619,11 @@ void meshOctreeModifier::refineSelectedBoxesAndAdditionalLayers
         if( returnReduce(selectedLeaves.size(), sumOp<label>()) == 0 )
             continue;
 
+        # ifdef DEBUGSearch
         Info << "Target level " << label(levelI) << endl;
         Info << "Target num layer " << nLayers << endl;
         Info << "Num selected leaves " << selectedLeaves.size() << endl;
+        # endif
 
         label nMarked;
         do
@@ -603,8 +640,6 @@ void meshOctreeModifier::refineSelectedBoxesAndAdditionalLayers
             {
                 if( !selectedLeaves[i]->isLeaf() )
                     continue;
-                //if( selectedLeaves[i]->level() > levelI )
-                //    continue;
 
                 markedLeaves[selectedLeaves[i]->cubeLabel()] = 1;
                 ++nMarked;
@@ -635,11 +670,23 @@ void meshOctreeModifier::refineSelectedBoxesAndAdditionalLayers
             # endif
             forAll(activeLeaves, i)
             {
-                if( leaves[activeLeaves[i]]->level() < levelI )
+                const direction level = leaves[activeLeaves[i]]->level();
+                if( level < levelI )
+                {
+                    //- found a neighbour at a lower refinement level
                     hasLowerLevel = true;
+                }
+                else if( level > levelI )
+                {
+                    //- do not allow refinement of leaves at higher
+                    //- refinement level
+                    markedLeaves[activeLeaves[i]] = 0;
+                }
             }
 
-            //- deselect leaves at larger levels
+            reduce(hasLowerLevel, maxOp<bool>());
+
+            //- deselect leaves at the current level
             if( hasLowerLevel )
             {
                 # ifdef USE_OMP
@@ -653,12 +700,9 @@ void meshOctreeModifier::refineSelectedBoxesAndAdditionalLayers
             }
 
             //- refine selected octree boxes
-            Info << "Refining leaves" << endl;
             refineSelectedBoxes(markedLeaves);
         } while( nMarked );
     }
-
-    Info << "Finished refining leaves" << endl;
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //