diff --git a/tutorials/mesh/cvMesh/simpleShapes/system/cvMeshDict b/tutorials/mesh/cvMesh/simpleShapes/system/cvMeshDict
index f774b1a7530ace167c8911ae0cedcecc1a34e847..7e75ea51d342a519deba705e8c1f535f0a74445a 100644
--- a/tutorials/mesh/cvMesh/simpleShapes/system/cvMeshDict
+++ b/tutorials/mesh/cvMesh/simpleShapes/system/cvMeshDict
@@ -10,12 +10,6 @@ FoamFile
 {
     version         2.0;
     format          ascii;
-
-    root            "";
-    case            "";
-    instance        "";
-    local           "";
-
     class           dictionary;
     object          cvMeshDict;
 }
@@ -23,6 +17,31 @@ FoamFile
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 
+/*
+
+Control dictionary for cvMesh - polyhedral mesh generator.
+
+cvMesh phases:
+1. fill volume with initial points (initialPoints subdictionary). An option
+   is to reread from previous set of points.
+
+2. internal point motion (motionControl subdictionary)
+
+3. every once in a while add point duplets/triplets to conform to
+   surfaces and features (surfaceConformation subdictionary)
+
+4. back to 2
+
+5. construct polyMesh.
+    - filter (polyMeshFiltering subdictionary)
+    - check (meshQualityControls subdictionary) and undo filtering
+
+
+See also cvControls.H in the conformalVoronoiMesh library
+
+*/
+
+
 // Important:
 // ----------
 // Any scalar with a name <name>Coeff specifies a value that will be implemented
@@ -39,75 +58,105 @@ FoamFile
 geometry
 {
     // Internal shape
-    coneAndSphere.obj
+    coneAndSphere_clean_orient.obj
     {
         name coneAndSphere;
         type triSurfaceMesh;
-        tolerance 0.00001;
     }
 
-//    // Internal shape
-//    coneAndSphere
-//    {
-//        type searchableSurfaceWithGaps;
-//        surface coneAndSphere.obj;
-//        gap 0.001;
-//    }
-
-    // Bounds of domain
-    domain.stl
+    // Outside of domain
+    domain_clean_orient.stl
     {
+        name domain;
         type triSurfaceMesh;
     }
 
 }
 
 
+// Controls for conforming to the surfaces.
 surfaceConformation
 {
-    // Point that is inside wanted part of geometry.
+    // A point inside surfaces that is inside mesh.
     locationInMesh (0 -0.5 0);
 
-    // Balance this between
+    // How far apart are point-duplets generated. Balance this between
     // - very low distance: little chance of interference from other
     //   surfaces
     // - largish distance: less non-orthogonality in final cell
     //   (circumcentre far away from centroid)
     pointPairDistanceCoeff      0.1;
 
+    // Mixed feature edges - both inside and outside edges. Recreated
+    // by inserting triplets of points to recreate a single edge. Done for
+    // all edges emanating from point. triplets of points get inserted
+    // mixedFeaturePointPPDistanceCoeff distance away from feature point.
     mixedFeaturePointPPDistanceCoeff    5.0;
 
+    // Distance to a feature point within which surface and edge
+    // conformation points are excluded - fraction of the local target
+    // cell size
     featurePointExclusionDistanceCoeff  0.4;
 
+    // Distance to an existing feature edge conformation location
+    // within which other edge conformation location are excluded -
+    // fraction of the local target cell size
     featureEdgeExclusionDistanceCoeff   0.2;
 
+    // Optimisation: do not check for surface intersection (of dual edges)
+    // for points near to surface.
     surfaceSearchDistanceCoeff  2.5;
 
+    // Maximum allowable protrusion through the surface before
+    // conformation points are added - fraction of the local target
+    // cell size. These small protusions are (hopefully) done by mesh filtering
+    // instead.
     maxSurfaceProtrusionCoeff   0.1;
 
+    // If feature edge with large angle (so more than 125 degrees) introduce
+    // additional points to create two half angled cells (= mitering).
     maxQuadAngle 125;
 
+    // Frequency to redo surface conformation (expensive).
     surfaceConformationRebuildFrequency 10;
 
+    // Initial and intermediate controls
     coarseConformationControls
     {
+        // Initial conformation
         initial
         {
+            // We've got a point poking through the surface. Don't do any
+            // surface conformation if near feature edge (since feature edge
+            // conformation should have priority)
+
+            // distance to search for near feature edges
             edgeSearchDistCoeff         1.1;
+
+            // Proximity to a feature edge where a surface hit is
+            //  not created, only the edge conformation is created
+            // - fraction of the local target cell size. Coarse
+            // conformation, initial protrusion tests.
             surfacePtReplaceDistCoeff   0.5;
         }
 
+        // Same for iterations
         iteration
         {
             edgeSearchDistCoeff         1.25;
             surfacePtReplaceDistCoeff   0.7;
         }
 
+        // Stop either at maxIterations or if the number of surface pokes
+        // is very small (iterationToInitialHitRatioLimit * initial number)
+        // Note: perhaps iterationToInitialHitRatioLimit should be absolute
+        // count?
         maxIterations 15;
 
         iterationToInitialHitRatioLimit 0.001;
     }
 
+    // Final (at endTime) controls
     fineConformationControls
     {
         initial
@@ -127,45 +176,49 @@ surfaceConformation
         iterationToInitialHitRatioLimit 0.001;
     }
 
+    // Geometry to mesh to
     geometryToConformTo
     {
         coneAndSphere
         {
             featureMethod extendedFeatureEdgeMesh;
-            extendedFeatureEdgeMesh "coneAndSphere.extendedFeatureEdgeMesh";
+            extendedFeatureEdgeMesh "coneAndSphere_clean_orient.extendedFeatureEdgeMesh";
         }
 
-        domain.stl
+        domain
         {
             featureMethod extendedFeatureEdgeMesh;
-            extendedFeatureEdgeMesh "domain.extendedFeatureEdgeMesh";
+            extendedFeatureEdgeMesh "domain_clean_orient.extendedFeatureEdgeMesh";
         }
-
     }
 
     additionalFeatures {}
 }
 
 
+// Controls for seeding initial points and general control of the target
+// cell size (used everywhere)
 initialPoints
 {
     // Do not place point closer than minimumSurfaceDistanceCoeff
     // to the surface. Is fraction of local target cell size (see below)
     minimumSurfaceDistanceCoeff 0.55;
 
-    initialPointsMethod         autoDensity;
-    // initialPointsMethod         uniformGrid;
-    // initialPointsMethod         bodyCentredCubic;
-    // initialPointsMethod         pointFile;
+    initialPointsMethod             autoDensity;
+    // initialPointsMethod          uniformGrid;
+    // initialPointsMethod          bodyCentredCubic;
+    // initialPointsMethod          pointFile;
 
-    // Take boundbox of all geometry. Samples with this box. If too much
-    // samples (due to target cell size) in box split box.
+
+    // Take boundbox of all geometry. Sample with this box. If too much
+    // samples in box (due to target cell size) split box.
     autoDensityDetails
     {
-        // Number of refinement levels. Needs to be enough to pick up features
-        // due to size ratio.
-        minLevels 2;
-        // Split box if ratio of min to max size larger than maxSizeRatio
+        // Initial number of refinement levels. Needs to be enough to pick
+        // up features due to size ratio. If not enough it will take longer
+        // to determine point seeding.
+        minLevels 4;
+        // Split box if ratio of min to max cell size larger than maxSizeRatio
         maxSizeRatio 5.0;
         // Per box sample 3x3x3 internally
         sampleResolution 3;
@@ -175,6 +228,7 @@ initialPoints
 
     uniformGridDetails
     {
+        // Absolute cell size.
         initialCellSize         0.0015;
         randomiseInitialGrid    yes;
         randomPerturbationCoeff 0.02;
@@ -189,13 +243,25 @@ initialPoints
 
     pointFileDetails
     {
+        // Reads points from file. Still rejects points that are too
+        // close to the surface (minimumSurfaceDistanceCoeff) or on the
+        // wrong side of the surfaces.
         pointFile              "constant/internalDelaunayVertices";
     }
 }
 
 
+// Control size of voronoi cells i.e. distance between points. This
+// determines the target cell size which is used everywhere.
+// It determines the cell size given a location. It then uses all
+// the rules
+// - defaultCellSize
+// - cellSizeControlGeometry
+// to determine target cell size. Rule with highest priority wins. If same
+// priority smallest cell size wins.
 motionControl
 {
+    // Absolute cell size of back ground mesh. This is the maximum cell size.
     defaultCellSize     0.1;
 
     // Assign a priority to all requests for cell sizes, the highest overrules.
@@ -205,7 +271,11 @@ motionControl
     {
     }
 
-    relaxationModel     adaptiveLinear;
+    // Underrelaxation for point motion. Simulated annealing: starts off at 1
+    // and lowers to 0 (at simulation endTime) to converge points.
+    // adaptiveLinear is preferred choice.
+    // Points move by e.g. 10% of tet size.
+    relaxationModel     adaptiveLinear; //rampHoldFall
 
     adaptiveLinearCoeffs
     {
@@ -213,28 +283,57 @@ motionControl
         relaxationEnd   0.0;
     }
 
+    // Output lots and lots of .obj files
     objOutput                   no;
 
+    // Timing and memory usage.
     timeChecks                  yes;
 
+    // Number of rays in plane parallel to nearest surface. Used to detect
+    // next closest surfaces. Used to work out alignment (three vectors)
+    // to surface.
+    // Note that only the initial points (from the seeding) calculate this
+    // information so if these are not fine enough the alignment will
+    // not be correct. (any points added during the running will lookup
+    // this information from the nearest initial point since it is
+    // expensive)
     alignmentSearchSpokes       36;
 
+    // For each delaunay edge (between two vertices, becomes
+    // the Voronoi face normal) snap to the alignment direction if within
+    // alignmentAcceptanceAngle. Slightly > 45 is a good choice - prevents
+    // flipping.
     alignmentAcceptanceAngle    48;
 
+    // How often to rebuild the alignment info (expensive)
     sizeAndAlignmentRebuildFrequency 20;
 
+    // When to insert points. Not advisable change to
+    // these settings.
     pointInsertionCriteria
     {
+        // If edge larger than 1.75 target cell size
+        // (so tets too large/stretched) insert point
         cellCentreDistCoeff     1.75;
+        // Do not insert point if voronoi face (on edge) very small.
         faceAreaRatioCoeff      0.0025;
+        // Insert point only if edge closely aligned to local alignment
+        // direction.
         acceptanceAngle         21.5;
     }
 
+    // Opposite: remove point if mesh too compressed. Do not change these
+    // settings.
     pointRemovalCriteria
     {
         cellCentreDistCoeff  0.65;
     }
 
+    // How to determine the point motion. All edges got some direction.
+    // Sum all edge contributions to determine point motion. Weigh by
+    // face area so motion is preferentially determined by large faces
+    // (or more importantly ignore contribution from small faces).
+    // Do not change these settings.
     faceAreaWeightModel piecewiseLinearRamp;
 
     piecewiseLinearRampCoeffs
@@ -245,34 +344,95 @@ motionControl
 }
 
 
+// After simulation, when converting to polyMesh, filter out small faces/edges.
+// Do not change. See cvControls.H
 polyMeshFiltering
 {
+    // Upper limit on the size of faces to be filtered.
+    // fraction of the local target cell size
     filterSizeCoeff                         0.2;
-    mergeClosenessCoeff                     1e-4;
+
+    // Upper limit on how close two dual vertices can be before
+    // being merged, fraction of the local target cell size
+    mergeClosenessCoeff                     1e-9;
+
+    // To not filter: set maxNonOrtho to 1 (so check fails) and then
+    // set continueFilteringOnBadInitialPolyMesh to false.
     continueFilteringOnBadInitialPolyMesh   true;
+
+    // When a face is "bad", what fraction should the filterSizeCoeff be
+    // reduced by.  Recursive, so for a filterCount value of fC, the
+    // filterSizeCoeff is reduced by pow(filterErrorReductionCoeff, fC)
     filterErrorReductionCoeff               0.5;
+
+    // Maximum number of filterCount applications before a face
+    // is not attempted to be filtered
     filterCountSkipThreshold                4;
+
+    // Maximum number of permissible iterations of the face collapse
+    // algorithm.  The value to choose will be related the maximum number
+    // of points on a face that is to be collapsed and how many faces
+    // around it need to be collapsed.
     maxCollapseIterations                   25;
+
+    // Maximum number of times an to allow an equal faceSet to be
+    // returned from the face quality assessment before stopping iterations
+    // to break an infinitie loop.
     maxConsecutiveEqualFaceSets             5;
+    // Remove little steps (almost perp to surface) by collapsing face.
     surfaceStepFaceAngle                    80;
+    // Do not collapse face to edge if should become edges
     edgeCollapseGuardFraction               0.3;
+    // Only collapse face to point if high aspect ratio
     maxCollapseFaceToPointSideLengthCoeff   0.35;
 }
 
 
+// Generic mesh quality settings. At any undoable phase these determine
+// where to undo. Same as in snappyHexMeshDict
 meshQualityControls
 {
+    //- Maximum non-orthogonality allowed. Set to 180 to disable.
     maxNonOrtho 65;
+
+    //- Max skewness allowed. Set to <0 to disable.
     maxBoundarySkewness 50;
     maxInternalSkewness 10;
+
+    //- Max concaveness allowed. Is angle (in degrees) below which concavity
+    //  is allowed. 0 is straight face, <0 would be convex face.
+    //  Set to 180 to disable.
     maxConcave 80;
+
+    //- Minimum quality of the tet formed by the
+    //  variable base point minimum decomposition triangles and
+    //  the cell centre (so not face-centre decomposition).
+    //  This has to be a positive number for tracking
+    //  to work. Set to very negative number (e.g. -1E30) to
+    //  disable.
+    //     <0 = inside out tet,
+    //      0 = flat tet
+    //      1 = regular tet
     minTetQuality 1e-30;
-    minVol 0;
+
+    //- Minimum absolute face area. Set to <0 to disable.
     minArea -1;
-    minTwist 0.02;
+
+    //- Minimum face twist. Set to <-1 to disable. dot product of face normal
+    //- and face centre triangles normal
+    minTwist 0.001;
+
+    //- minimum normalised cell determinant
+    //- 1 = hex, <= 0 = folded or flattened illegal cell
     minDeterminant 0.001;
+
+    //- minFaceWeight (0 -> 0.5)
     minFaceWeight 0.02;
+
+    //- minVolRatio (0 -> 1)
     minVolRatio 0.01;
+
+    //must be >0 for Fluent compatibility
     minTriangleTwist -1;
 }