diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict
index e9aa8f189d9d748994d1f564cabedb37c55a30ec..4e71557fdbca0a308353f5e522acd949d1ba5f71 100644
--- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict
+++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict
@@ -22,161 +22,171 @@ FoamFile
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-// Which phases to run.
-doRefine true;
-doSnap   true;
-doLayers true; // includes autoMergeFaces
-
-
-// Whether to dump intermediate meshes and print lots
-// 1 : write mesh
-// 2 : write volScalarField with cellLevel for postprocessing
-// 4 : write current intersections as .obj files
-debug 0;
-
-refineDict
+// Which of the steps to run
+castellatedMesh true;
+snap            true;
+addLayers       false;
+
+
+// Geometry. Definition of all surfaces. All surfaces are of class
+// searchableSurface.
+// Surfaces are used
+// - to specify refinement for any mesh cell intersecting it
+// - to specify refinement for any mesh cell inside/outside/near
+// - to 'snap' the mesh boundary to the surface
+geometry
+{
+//    box1x1x1
+//    {
+//        type searchableBox;
+//        min (1.5 1 -0.5);
+//        max (3.5 2 0.5);
+//    }
+//
+//    sphere.stl
+//    {
+//        type triSurfaceMesh;
+//
+//        // Per region the patchname. If not provided will be <name>_<region>.
+//        regions
+//        {
+//            secondSolid
+//            {
+//                name mySecondPatch;
+//            }
+//        }
+//    }
+
+    sphere2
+    {
+        type searchableSphere;
+        centre  (1.5 1.5 1.5);
+        radius  1.03;
+    }
+};
+
+
+
+// Settings for the castellatedMesh generation.
+castellatedMeshControls
 {
-    // Which part to keep.
-    // NOTE: This point should never be on a face, always inside a cell, even
-    // after refinement.
-    keepPoints ((3 0.28 0.43));
-
-    // Whether to remove/split cells likely to give problems when snapping
-    handleSnapProblems on;
 
-    // Merge tolerance. Is fraction of overall bounding box of initial mesh
-    mergeTolerance 1E-6;
+    // Refinement parameters
+    // ~~~~~~~~~~~~~~~~~~~~~
 
     // While refining maximum number of cells per processor. This is basically
     // the number of cells that fit on a processor. If you choose this too small
     // it will do just more refinement iterations to obtain a similar mesh.
-    procCellLimit 1000000;
-
+    maxLocalCells 1000000;
 
     // Overall cell limit (approximately). Refinement will stop immediately
     // upon reaching this number so a refinement level might not complete.
     // Note that this is the number of cells before removing the part which
-    // is not 'visible' from the keepPoint. The final number of cells might actually
-    // be a lot less.
-    cellLimit 2000000;
-
+    // is not 'visible' from the keepPoint. The final number of cells might
+    // actually be a lot less.
+    maxGlobalCells 2000000;
 
     // The surface refinement loop might spend lots of iterations refining just a
     // few cells. This setting will cause refinement to stop if <= minimumRefine
     // are selected for refinement. Note: it will at least do one iteration
     // (unless the number of cells to refine is 0)
-    minimumRefine 0;
-
-
-
+    minRefinementCells 0;
 
     // Number of buffer layers between different levels.
     // 1 means normal 2:1 refinement restriction, larger means slower
     // refinement.
-    nBufferLayers 1;
+    nCellsBetweenLevels 1;
+
 
 
-    // Feature Edge Refinement
-    // ~~~~~~~~~~~~~~~~~~~~~~~
+    // Explicit feature edge refinement
+    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-    // External feature file. Read from constant/triSurface for now.
-    // Limitations:
-    // - either start or edge of any feature line has to be inside domain
-    //   and be visible from keepPoint on starting mesh.
-    // - refining cells containing features is separate phase before refining
-    //   based on surface.
-    // - no load balancing, no check for cellLimit is done while doing this.
+    // Specifies a level for any cell intersected by its edges.
+    // This is a featureEdgeMesh, read from constant/triSurface for now.
     features
     (
-    //    {
-    //        file "someLine.eMesh";
-    //        level 2;
-    //    }
+        //{
+        //    file "someLine.eMesh";
+        //    level 2;
+        //}
     );
 
 
-    // Internal Mesh Refinement
-    // ~~~~~~~~~~~~~~~~~~~~~~~~
-
-    // Specifies the areas where the refinement has to be a certain level.
-    // These surfaces have to be closed. Refinement is either inside
-    // (refineInside = true) or outside. (note:insideness or outsideness
-    // is with respect to far away)
-    // Note:that even using these the transition can never be faster than
-    // nBufferLayers!
-    // Note:the refinement level can never be higher than any of the surfaces
-    // they overlap with. See below for the surface refinement level specification.
-    refinementShells
-    (
-        {
-            //type triSurfaceMesh;
-            //name cube1x1x1.stl;
-            type searchableBox;
-            name box1x1x1;
-            min (2.5 -0.5 -0.5);
-            max (3.5 0.5 0.5);
-
-            level 4;
-            refineInside true;
-        }
-    );
-
 
     // Surface based refinement
     // ~~~~~~~~~~~~~~~~~~~~~~~~
 
-    // Curvature. Cosine of angle between two neighbouring surface intersections.
-    // Only used if cell level > minLevel and < maxLevel.
-    curvature 0.5;
+    // Specifies two levels for every surface. The first is the minimum level,
+    // every cell intersecting a surface gets refined up to the minimum level.
+    // The second level is the maximum level. Cells that 'see' multiple
+    // intersections where the intersections make an
+    // angle > resolveFeatureAngle get refined up to the maximum level.
 
-
-    // Overall the refinement is according to the following rules:
-    // - if the cell-cell vector intersects a surface any cell that
-    //   is less refined than the minRefinementLevel of the surface gets refined.
-    // - else if the refinement level of the cell is between the
-    //   minRefinementLevel and maxRefinementLevel the cell gets refined if
-    //      - the normal of neighbouring surface intersections differ by more
-    //        than above curvature
-    //      - or if neighbouring surface intersections are on different surfaces or
-    //        different surface regions.
-
-
-    // surfaces
-    surfaces
-    (
+    refinementSurfaces
+    {
+        sphere.stl
         {
-            name    sphere;
-            file    "sphere.stl";
-
-            // Surface wide refinement level
-            minRefinementLevel 1;
-            maxRefinementLevel 1;
-
-            // Layers
-            surfaceLayers 1;
-
-            // Region specific refinement level
+            // Surface-wise min and max refinement level
+            level (2 2);
+        
+            // Optional region-wise level specification
             regions
-            (
-                {
-                    name firstSolid;
-                    minRefinementLevel 3;
-                    maxRefinementLevel 3;
-                    surfaceLayers 2;
-                }
+            {
+                secondSolid
                 {
-                    name secondSolid;
-                    minRefinementLevel 1;
-                    maxRefinementLevel 1;
-                    surfaceLayers 1;
+                    level (3 3);
                 }
-            );
+            }
         }
-    );
+    }
+
+    resolveFeatureAngle 30;
+
+
+    // Region-wise refinement
+    // ~~~~~~~~~~~~~~~~~~~~~~
+
+    // Specifies refinement level for cells in relation to a surface. One of
+    // three modes
+    // - distance. 'levels' specifies per distance to the surface the
+    //   wanted refinement level. The distances need to be specified in
+    //   descending order.
+    // - inside. 'levels' is only one entry and only the level is used. All
+    //   cells inside the surface get refined up to the level. The surface
+    //   needs to be closed for this to be possible.
+    // - outside. Same but cells outside.
+
+    refinementRegions
+    {
+        //box1x1x1
+        //{
+        //    mode inside;
+        //    levels ((1.0 4));
+        //}
+        //sphere.stl
+        //{
+        //    mode distance;
+        //    levels ((1.0 5) (2.0 3));
+        //}
+    }
+
+
+    // Mesh selection
+    // ~~~~~~~~~~~~~~
+
+    // After refinement patches get added for all refinementSurfaces and
+    // all cells intersecting the surfaces get put into these patches. The
+    // section reachable from the locationInMesh is kept.
+    // NOTE: This point should never be on a face, always inside a cell, even
+    // after refinement.
+    locationInMesh (5 0.28 0.43);
 }
 
-// For snapping
-snapDict
+
+
+// Settings for the snapping.
+snapControls
 {
     //- Number of patch smoothing iterations before finding correspondence
     //  to surface
@@ -185,47 +195,64 @@ snapDict
     //- Relative distance for points to be attracted by surface feature point
     //  or edge. True distance is this factor times local
     //  maximum edge length.
-    snapTol 4.0;
-
-    //- Whether to move internal mesh as well as boundary
-    smoothMesh true;
+    tolerance 4.0;
 
-    //- Number of mesh displacement smoothing iterations.
-    nSmoothDispl 30;
+    //- Number of mesh displacement relaxation iterations.
+    nSolveIter 30;
 
     //- Maximum number of snapping relaxation iterations. Should stop
     //  before upon reaching a correct mesh.
-    nSnap 5;
+    nRelaxIter 5;
 }
 
 
-// For cell layers
-layerDict
+
+// Settings for the layer addition.
+addLayersControls
 {
-    //- When not to extrude surface. 0 is flat surface, 90 is when two faces
-    //  make straight angle.
-    featureAngle 60;
+    // Per final patch (so not geometry!) the layer information
+    layers
+    {
+        sphere.stl_firstSolid
+        {
+            nSurfaceLayers 1;
 
-    //- Maximum number of snapping relaxation iterations. Should stop
-    //  before upon reaching a correct mesh.
-    nSnap 5;
+        }
+        maxY
+        {
+            nSurfaceLayers 1;
+        }
+    }
+
+    // Expansion factor for layer mesh
+    expansionRatio 1.0;
 
+    //- Wanted thickness of final added cell layer. If multiple layers
+    //  is the
+    //  thickness of the layer furthest away from the wall.
+    //  Relative to undistorted size of cell outside layer.
+    finalLayerRatio 0.3; 
 
-    //- Minimum thickness of cell layer. If for any reason layer cannot be
-    //  above minThickness do not add layer if thickness below minThickNess.
-    //  Relative to undistorted cell size
+    //- Minimum thickness of cell layer. If for any reason layer
+    //  cannot be above minThickness do not add layer.
+    //  Relative to undistorted size of cell outside layer.
     minThickness 0.25;
 
     //- If points get not extruded do nGrow layers of connected faces that are
-    //  not grown. Is used to not do layers at all close to features.
+    //  also not grown. This helps convergence of the layer addition process
+    //  close to features.
     nGrow 1;
 
-    // Expansion factor for layer mesh
-    expansionRatio 1.3;	
 
-    // Ratio of cell size in final added cell layer to cell size 
-    // outside layer 
-    finalLayerRatio 0.3;
+    // Advanced settings
+
+    //- When not to extrude surface. 0 is flat surface, 90 is when two faces
+    //  make straight angle.
+    featureAngle 60;
+
+    //- Maximum number of snapping relaxation iterations. Should stop
+    //  before upon reaching a correct mesh.
+    nRelaxIter 5;
 
     // Number of smoothing iterations of surface normals 
     nSmoothSurfaceNormals 1;
@@ -248,20 +275,14 @@ layerDict
 
     // Create buffer region for new layer terminations
     nBufferCellsNoExtrude 0;
-
-    thickness 0.5;
-    nSmoothDispl 4;
 }
 
 
-// For mesh motion
-motionDict
-{
-    //
-    // Mesh Quality Parameters. Decide when mesh is good enough to stop
-    // smoothing.
-    //
 
+// Generic mesh quality settings. At any undoable phase these determine
+// where to undo.
+meshQualityControls
+{
     //- Maximum non-orthogonality allowed. Set to 180 to disable.
     maxNonOrtho 65;
 
@@ -298,10 +319,10 @@ motionDict
     //- minVolRatio (0 -> 1)
     minVolRatio 0.01;
 
-
     //must be >0 for Fluent compatibility
     minTriangleTwist -1;
 
+
     // Advanced
 
     //- Number of error distribution iterations
@@ -311,4 +332,19 @@ motionDict
 }
 
 
+// Advanced
+
+// Flags for optional output
+// 0 : only write final meshes
+// 1 : write intermediate meshes
+// 2 : write volScalarField with cellLevel for postprocessing
+// 4 : write current intersections as .obj files
+debug 0;
+
+
+// Merge tolerance. Is fraction of overall bounding box of initial mesh.
+// Note: the write tolerance needs to be higher than this.
+mergeTolerance 1E-6;
+
+
 // ************************************************************************* //