diff --git a/applications/utilities/mesh/manipulation/topoSet/topoSet.C b/applications/utilities/mesh/manipulation/topoSet/topoSet.C
index 5e5c15426c8742f8bd5ee9b7769618c9339a851c..5aedbdc775083ba7178456dc9d5ec955bda544b5 100644
--- a/applications/utilities/mesh/manipulation/topoSet/topoSet.C
+++ b/applications/utilities/mesh/manipulation/topoSet/topoSet.C
@@ -35,6 +35,10 @@ Description
 #include "pointSet.H"
 #include "globalMeshData.H"
 #include "timeSelector.H"
+#include "IOobjectList.H"
+#include "cellZoneSet.H"
+#include "faceZoneSet.H"
+#include "pointZoneSet.H"
 
 using namespace Foam;
 
@@ -51,6 +55,96 @@ void printMesh(const Time& runTime, const polyMesh& mesh)
 }
 
 
+template<class ZoneType>
+void removeZone
+(
+    ZoneMesh<ZoneType, polyMesh>& zones,
+    const word& setName
+)
+{
+    label zoneID = zones.findZoneID(setName);
+
+    if (zoneID != -1)
+    {
+        Info<< "Removing zone " << setName << " at index " << zoneID << endl;
+        // Shuffle to last position
+        labelList oldToNew(zones.size());
+        label newI = 0;
+        forAll(oldToNew, i)
+        {
+            if (i != zoneID)
+            {
+                oldToNew[i] = newI++;
+            }
+        }
+        oldToNew[zoneID] = newI;
+        zones.reorder(oldToNew);
+        // Remove last element
+        zones.setSize(zones.size()-1);
+        zones.clearAddressing();
+        zones.write();
+    }
+}
+
+
+// Physically remove a set
+void removeSet
+(
+    const polyMesh& mesh,
+    const word& setType,
+    const word& setName
+)
+{
+    // Remove the file
+    IOobjectList objects
+    (
+        mesh,
+        mesh.time().findInstance
+        (
+            polyMesh::meshSubDir/"sets",
+            word::null,
+            IOobject::READ_IF_PRESENT,
+            mesh.facesInstance()
+        ),
+        polyMesh::meshSubDir/"sets"
+    );
+
+    if (objects.found(setName))
+    {
+        // Remove file
+        fileName object = objects[setName]->objectPath();
+        Info<< "Removing file " << object << endl;
+        rm(object);
+    }
+
+    // See if zone
+    if (setType == cellZoneSet::typeName)
+    {
+        removeZone
+        (
+            const_cast<cellZoneMesh&>(mesh.cellZones()),
+            setName
+        );
+    }
+    else if (setType == faceZoneSet::typeName)
+    {
+        removeZone
+        (
+            const_cast<faceZoneMesh&>(mesh.faceZones()),
+            setName
+        );
+    }
+    else if (setType == pointZoneSet::typeName)
+    {
+        removeZone
+        (
+            const_cast<pointZoneMesh&>(mesh.pointZones()),
+            setName
+        );
+    }
+}
+
+
 polyMesh::readUpdateState meshReadUpdate(polyMesh& mesh)
 {
     polyMesh::readUpdateState stat = mesh.readUpdate();
@@ -284,6 +378,12 @@ int main(int argc, char *argv[])
                     currentSet().write();
                 break;
 
+                case topoSetSource::REMOVE:
+                    Info<< "    Removing set" << endl;
+                    removeSet(mesh, setType, setName);
+                break;
+
+
                 default:
                     WarningIn(args.executable())
                         << "Unhandled action " << action << endl;
diff --git a/applications/utilities/mesh/manipulation/topoSet/topoSetDict b/applications/utilities/mesh/manipulation/topoSet/topoSetDict
index 86e5b98f1c1cc0d2e7e9187458354428d176fbe0..9c910aa7ec9c26643114cc28a8b3449a2d4963b1 100644
--- a/applications/utilities/mesh/manipulation/topoSet/topoSetDict
+++ b/applications/utilities/mesh/manipulation/topoSet/topoSetDict
@@ -22,8 +22,15 @@ FoamFile
 //     type    cellSet;
 //
 //     // action to perform on set. Two types:
-//     // - require no source : clear/invert
+//     // - require no source : clear/invert/remove
+//     //       clear  : clears set or zone
+//     //       invert : select all currently non-selected elements
+//     //       remove : removes set or zone
 //     // - require source    : new/add/delete/subset
+//     //       new    : create new set or zone from source
+//     //       add    : add source to contents
+//     //       delete : deletes source from contents
+//     //       subset : keeps elements both in contents and source
 //     action  new;
 //
 // The source entry varies according to the type of set:
@@ -329,6 +336,7 @@ FoamFile
 //        faceSet f0;       // name of faceSet
 //        cellSet c0;       // name of cellSet of slave side
 //    }
+//
 
 actions
 (