diff --git a/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C b/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C
index 665d16d89afebd81a569c6da2c25338d32f0c234..a330fbd96a51edb589068ffe8eba870e1808d49e 100644
--- a/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C
+++ b/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C
@@ -50,11 +50,14 @@ Description
 
     Note:
 
-    - multiple cellZones can be combined into a single cellZone (cluster)
-    for further analysis using the 'combineZones' option:
+    - multiple cellZones can be combined into a single region (cluster)
+    for further analysis using the 'addZones' or 'combineZones' option:
+        -addZones '((allSolids zoneA "zoneB.*")(allFluids none otherZone))'
+    or
         -combineZones '((zoneA "zoneB.*")(none otherZone))
     This can be combined with e.g. 'cellZones' or 'cellZonesOnly'. The
-    corresponding region name will be the names of the cellZones combined e.g.
+    addZones option supplies the destination region name as first element in
+    the list. The combineZones option synthesises the region name e.g. 
         zoneA_zoneB0_zoneB1
 
     - cellZonesOnly does not do a walk and uses the cellZones only. Use
@@ -1204,8 +1207,10 @@ word makeRegionName
     }
     else
     {
-        // Synthesize name from appended cellZone names
+        // Zone indices are in cellZone order ...
         word regionName(czs[zoneIDs[0]].name());
+
+        // Synthesize name from appended cellZone names
         for (label i = 1; i < zoneIDs.size(); i++)
         {
             regionName += "_" + czs[zoneIDs[i]].name();
@@ -1218,6 +1223,7 @@ word makeRegionName
 void makeClusters
 (
     const List<wordRes>& zoneClusters,
+    const wordList& zoneClusterNames,
     const cellZoneMesh& cellZones,
     wordList& clusterNames,
     labelListList& clusterToZones,
@@ -1238,7 +1244,17 @@ void makeClusters
         {
             const labelList zoneIDs(cellZones.indices(zoneClusters[clusteri]));
             UIndirectList<label>(zoneToCluster, zoneIDs) = clusteri;
-            clusterNames.append(makeRegionName(cellZones, clusteri, zoneIDs));
+            clusterNames.append
+            (
+                zoneClusterNames[clusteri].size()
+              ? zoneClusterNames[clusteri]
+              : makeRegionName
+                (
+                    cellZones,
+                    clusteri,
+                    zoneIDs
+                )
+            );
             clusterToZones.append(std::move(zoneIDs));
         }
 
@@ -1366,12 +1382,15 @@ void matchRegions
     // Allocate region names for unmatched regions.
     forAll(regionNames, regionI)
     {
-        regionNames[regionI] = makeRegionName
-        (
-            cellZones,
-            regionI,
-            regionToZones[regionI]
-        );
+        if (regionNames[regionI].empty())
+        {
+            regionNames[regionI] = makeRegionName
+            (
+                cellZones,
+                regionI,
+                regionToZones[regionI]
+            );
+        }
     }
 }
 
@@ -1460,6 +1479,12 @@ int main(int argc, char *argv[])
         "Combine zones in follow-on analysis"
     );
     argList::addOption
+    (
+        "addZones",
+        "lists of zones",
+        "Combine zones in follow-on analysis"
+    );
+    argList::addOption
     (
         "blockedFaces",
         "faceSet",
@@ -1524,6 +1549,7 @@ int main(int argc, char *argv[])
     const bool useCellZonesOnly = args.found("cellZonesOnly");
     const bool useCellZonesFile = args.found("cellZonesFileOnly");
     const bool combineZones     = args.found("combineZones");
+    const bool addZones         = args.found("addZones");
     const bool overwrite        = args.found("overwrite");
     const bool detectOnly       = args.found("detectOnly");
     const bool sloppyCellZones  = args.found("sloppyCellZones");
@@ -1574,9 +1600,36 @@ int main(int argc, char *argv[])
     mesh.cellZones().checkParallelSync(true);
 
     List<wordRes> zoneClusters;
+    wordList zoneClusterNames;
     if (combineZones)
     {
+        if (addZones)
+        {
+            FatalErrorInFunction
+                << "Cannot specify both combineZones and addZones"
+                << exit(FatalError);
+        }
         zoneClusters = args.get<List<wordRes>>("combineZones");
+        zoneClusterNames.setSize(zoneClusters.size());
+    }
+    else if (addZones)
+    {
+        zoneClusters = args.get<List<wordRes>>("addZones");
+        zoneClusterNames.setSize(zoneClusters.size());
+        forAll(zoneClusters, clusteri)
+        {
+            // Pop of front - is name
+
+            wordRes& wrs = zoneClusters[clusteri];
+
+            zoneClusterNames[clusteri] = wrs[0];
+
+            for (label i = 1; i < wrs.size(); i++)
+            {
+                wrs[i-1] = wrs[i];
+            }
+            wrs.setSize(wrs.size()-1);
+        }
     }
 
 
@@ -1607,6 +1660,7 @@ int main(int argc, char *argv[])
         makeClusters
         (
             zoneClusters,
+            zoneClusterNames,
             mesh.cellZones(),
             clusterNames,
             clusterToZones,
@@ -1672,6 +1726,7 @@ int main(int argc, char *argv[])
         makeClusters
         (
             zoneClusters,
+            zoneClusterNames,
             newCellZones,
             clusterNames,
             clusterToZones,
@@ -1743,6 +1798,7 @@ int main(int argc, char *argv[])
         makeClusters
         (
             zoneClusters,
+            zoneClusterNames,
             mesh.cellZones(),
             clusterNames,
             clusterToZones,