diff --git a/applications/solvers/Lagrangian/kinematicParcelFoam/createFields.H b/applications/solvers/Lagrangian/kinematicParcelFoam/createFields.H
index 3854911dd91f6c21bf28ea86c9da1b28de654b8c..c76a81ca4666d882442b8c8f09663be378a134d0 100644
--- a/applications/solvers/Lagrangian/kinematicParcelFoam/createFields.H
+++ b/applications/solvers/Lagrangian/kinematicParcelFoam/createFields.H
@@ -47,11 +47,7 @@
     );
 
     word kinematicCloudName("kinematicCloud");
-
-    if (args.options().found("cloudName"))
-    {
-        kinematicCloudName = args.options()["cloudName"];
-    }
+    args.optionReadIfPresent("cloudName", kinematicCloudName);
 
     Info<< "Constructing kinematicCloud " << kinematicCloudName << endl;
     basicKinematicCloud kinematicCloud
diff --git a/applications/solvers/basic/potentialFoam/potentialFoam.C b/applications/solvers/basic/potentialFoam/potentialFoam.C
index 9d2073bf2e3cf324d45b1d5cb6fffbe6fce4b531..49188fcf0086fd314654d0b74c5768ae90c4db37 100644
--- a/applications/solvers/basic/potentialFoam/potentialFoam.C
+++ b/applications/solvers/basic/potentialFoam/potentialFoam.C
@@ -97,7 +97,7 @@ int main(int argc, char *argv[])
     U.write();
     phi.write();
 
-    if (args.options().found("writep"))
+    if (args.optionFound("writep"))
     {
         p.write();
     }
diff --git a/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C b/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C
index e87078cc397294edf650a2fa371d7bb49bdd43ce..d4d6d11539cee0aaa35b20200a3471fb85e01f91 100644
--- a/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C
+++ b/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C
@@ -465,7 +465,7 @@ int main(int argc, char *argv[])
 
     scalar minLen(readScalar(IStringStream(args.additionalArgs()[0])()));
     scalar angle(readScalar(IStringStream(args.additionalArgs()[1])()));
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
     scalar maxCos = Foam::cos(angle*180/mathematicalConstant::pi);
 
diff --git a/applications/utilities/mesh/advanced/combinePatchFaces/combinePatchFaces.C b/applications/utilities/mesh/advanced/combinePatchFaces/combinePatchFaces.C
index fa244430f6b474da5c561052f81b6e7ff0aaac93..60c94395614766a61d1e1ff49e6b039b5194846d 100644
--- a/applications/utilities/mesh/advanced/combinePatchFaces/combinePatchFaces.C
+++ b/applications/utilities/mesh/advanced/combinePatchFaces/combinePatchFaces.C
@@ -448,19 +448,12 @@ int main(int argc, char *argv[])
     scalar minCos = Foam::cos(featureAngle*mathematicalConstant::pi/180.0);
 
     scalar concaveAngle = defaultConcaveAngle;
-
-    if (args.options().found("concaveAngle"))
-    {
-        concaveAngle = readScalar
-        (
-            IStringStream(args.options()["concaveAngle"])()
-        );
-    }
+    args.optionReadIfPresent("concaveAngle", concaveAngle);
 
     scalar concaveSin = Foam::sin(concaveAngle*mathematicalConstant::pi/180.0);
 
-    bool snapMeshDict = args.options().found("snapMesh");
-    bool overwrite = args.options().found("overwrite");
+    bool snapMeshDict = args.optionFound("snapMesh");
+    bool overwrite = args.optionFound("overwrite");
 
     Info<< "Merging all faces of a cell" << nl
         << "    - which are on the same patch" << nl
diff --git a/applications/utilities/mesh/advanced/modifyMesh/modifyMesh.C b/applications/utilities/mesh/advanced/modifyMesh/modifyMesh.C
index 0011d750e5613785d69f54d2a8dff9944b596b23..a78ade8d6d42231a9514b922b821bec35cd75c19 100644
--- a/applications/utilities/mesh/advanced/modifyMesh/modifyMesh.C
+++ b/applications/utilities/mesh/advanced/modifyMesh/modifyMesh.C
@@ -336,7 +336,7 @@ int main(int argc, char *argv[])
 #   include "createPolyMesh.H"
     const word oldInstance = mesh.pointsInstance();
 
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
     Info<< "Reading modifyMeshDict\n" << endl;
 
diff --git a/applications/utilities/mesh/advanced/refineHexMesh/refineHexMesh.C b/applications/utilities/mesh/advanced/refineHexMesh/refineHexMesh.C
index c18e0af978a147ca1b9b2dc522f6d8773f85b947..77a09ff7b95cf233a65dda49db1d68b539409db5 100644
--- a/applications/utilities/mesh/advanced/refineHexMesh/refineHexMesh.C
+++ b/applications/utilities/mesh/advanced/refineHexMesh/refineHexMesh.C
@@ -63,7 +63,7 @@ int main(int argc, char *argv[])
     pointMesh pMesh(mesh);
 
     word cellSetName(args.args()[1]);
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
     Info<< "Reading cells to refine from cellSet " << cellSetName
         << nl << endl;
diff --git a/applications/utilities/mesh/advanced/refineWallLayer/refineWallLayer.C b/applications/utilities/mesh/advanced/refineWallLayer/refineWallLayer.C
index 9c608366aae814d6e48c8c331ad76581b25a7ede..a78dade6fd77be41c6f95577118b7c236b75c239 100644
--- a/applications/utilities/mesh/advanced/refineWallLayer/refineWallLayer.C
+++ b/applications/utilities/mesh/advanced/refineWallLayer/refineWallLayer.C
@@ -61,7 +61,7 @@ int main(int argc, char *argv[])
     word patchName(args.additionalArgs()[0]);
 
     scalar weight(readScalar(IStringStream(args.additionalArgs()[1])()));
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
 
     label patchID = mesh.boundaryMesh().findPatchID(patchName);
@@ -101,11 +101,11 @@ int main(int argc, char *argv[])
     // List of cells to refine
     //
 
-    bool useSet = args.options().found("useSet");
+    bool useSet = args.optionFound("useSet");
 
     if (useSet)
     {
-        word setName(args.options()["useSet"]);
+        word setName(args.option("useSet"));
 
         Info<< "Subsetting cells to cut based on cellSet" << setName << endl
             << endl;
diff --git a/applications/utilities/mesh/advanced/refinementLevel/refinementLevel.C b/applications/utilities/mesh/advanced/refinementLevel/refinementLevel.C
index 25b13eba8889f021551daa940dd17cbeb81ff48d..7732c985b8484a2c822c846c3a5b554da162aa80 100644
--- a/applications/utilities/mesh/advanced/refinementLevel/refinementLevel.C
+++ b/applications/utilities/mesh/advanced/refinementLevel/refinementLevel.C
@@ -110,7 +110,7 @@ int main(int argc, char *argv[])
         << " to allow for some truncation error."
         << nl << endl;
 
-    bool readLevel = args.options().found("readLevel");
+    bool readLevel = args.optionFound("readLevel");
 
     const scalarField& vols = mesh.cellVolumes();
 
diff --git a/applications/utilities/mesh/advanced/removeFaces/removeFaces.C b/applications/utilities/mesh/advanced/removeFaces/removeFaces.C
index 26ee404fe8d79809c9519d27d52b825d3e45fe28..c3fcc727d2087f05a8cc8e0beff782a063a0e30b 100644
--- a/applications/utilities/mesh/advanced/removeFaces/removeFaces.C
+++ b/applications/utilities/mesh/advanced/removeFaces/removeFaces.C
@@ -57,7 +57,7 @@ int main(int argc, char *argv[])
 #   include "createMesh.H"
     const word oldInstance = mesh.pointsInstance();
 
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
     word setName(args.additionalArgs()[0]);
 
diff --git a/applications/utilities/mesh/advanced/splitCells/splitCells.C b/applications/utilities/mesh/advanced/splitCells/splitCells.C
index 6424745e9ad8df6cbcbc1228edbcb2a21fda4f21..3aa649ee8be4314f01e6e10789b880f59fad5435 100644
--- a/applications/utilities/mesh/advanced/splitCells/splitCells.C
+++ b/applications/utilities/mesh/advanced/splitCells/splitCells.C
@@ -542,23 +542,19 @@ int main(int argc, char *argv[])
     scalar minCos = Foam::cos(radAngle);
     scalar minSin = Foam::sin(radAngle);
 
-    bool readSet = args.options().found("set");
-    bool geometry = args.options().found("geometry");
-    bool overwrite = args.options().found("overwrite");
+    bool readSet   = args.optionFound("set");
+    bool geometry  = args.optionFound("geometry");
+    bool overwrite = args.optionFound("overwrite");
 
     scalar edgeTol = 0.2;
-
-    if (args.options().found("tol"))
-    {
-        edgeTol = readScalar(IStringStream(args.options()["tol"])());
-    }
+    args.optionReadIfPresent("tol", edgeTol);
 
     Info<< "Trying to split cells with internal angles > feature angle\n" << nl
         << "featureAngle      : " << featureAngle << nl
         << "edge snapping tol : " << edgeTol << nl;
     if (readSet)
     {
-        Info<< "candidate cells   : cellSet " << args.options()["set"] << nl;
+        Info<< "candidate cells   : cellSet " << args.option("set") << nl;
     }
     else
     {
@@ -586,7 +582,7 @@ int main(int argc, char *argv[])
     if (readSet)
     {
         // Read cells to cut from cellSet
-        cellSet cells(mesh, args.options()["set"]);
+        cellSet cells(mesh, args.option("set"));
 
         cellsToCut = cells;
     }
diff --git a/applications/utilities/mesh/conversion/ansysToFoam/ansysToFoam.L b/applications/utilities/mesh/conversion/ansysToFoam/ansysToFoam.L
index 149d9af19b9650891a33b36b2585a97cd9060037..2fffcaa813f65749989388733813571eaa9bdcdf 100644
--- a/applications/utilities/mesh/conversion/ansysToFoam/ansysToFoam.L
+++ b/applications/utilities/mesh/conversion/ansysToFoam/ansysToFoam.L
@@ -1,4 +1,4 @@
-/*---------------------------------------------------------------------------*\
+/*--------------------------------*- C++ -*----------------------------------*\
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
@@ -246,10 +246,7 @@ int main(int argc, char *argv[])
     }
 
     scalar scaleFactor = 1.0;
-    if (args.options().found("scale"))
-    {
-        scaleFactor = atof(args.options()["scale"].c_str());
-    }
+    args.optionReadIfPresent("scale", scaleFactor);
 
 #   include "createTime.H"
 
diff --git a/applications/utilities/mesh/conversion/cfx4ToFoam/cfx4ToFoam.C b/applications/utilities/mesh/conversion/cfx4ToFoam/cfx4ToFoam.C
index df84d13a79cff7c21c9e16742a95f60b5130d492..d193a481330205b146f4c3afe20ec4fab7ea1a25 100644
--- a/applications/utilities/mesh/conversion/cfx4ToFoam/cfx4ToFoam.C
+++ b/applications/utilities/mesh/conversion/cfx4ToFoam/cfx4ToFoam.C
@@ -60,10 +60,7 @@ int main(int argc, char *argv[])
     }
 
     scalar scaleFactor = 1.0;
-    if (args.options().found("scale"))
-    {
-        scaleFactor = atof(args.options()["scale"].c_str());
-    }
+    args.optionReadIfPresent("scale", scaleFactor);
 
 #   include "createTime.H"
 
diff --git a/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L b/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L
index a8606e0df962c51b1de0389facd8f764b3e36751..bbaab8b01d5aaa463e01049c03dab2306326ce9f 100644
--- a/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L
+++ b/applications/utilities/mesh/conversion/fluent3DMeshToFoam/fluent3DMeshToFoam.L
@@ -1,4 +1,4 @@
-/*---------------------------------------------------------------------------*\
+/*--------------------------------*- C++ -*----------------------------------*\
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
@@ -760,21 +760,18 @@ int main(int argc, char *argv[])
         FatalError.exit();
     }
 
-    if (args.options().found("scale"))
-    {
-        scaleFactor = atof(args.options()["scale"].c_str());
-    }
+    args.optionReadIfPresent("scale", scaleFactor);
 
     HashSet<word> ignoreCellGroups;
-    if (args.options().found("ignoreCellGroups"))
+    if (args.optionFound("ignoreCellGroups"))
     {
-        IStringStream(args.options()["ignoreCellGroups"])() >> ignoreCellGroups;
+        args.optionLookup("ignoreCellGroups")() >> ignoreCellGroups;
     }
 
     HashSet<word> ignoreFaceGroups;
-    if (args.options().found("ignoreFaceGroups"))
+    if (args.optionFound("ignoreFaceGroups"))
     {
-        IStringStream(args.options()["ignoreFaceGroups"])() >> ignoreFaceGroups;
+        args.optionLookup("ignoreFaceGroups")() >> ignoreFaceGroups;
     }
 
 #   include "createTime.H"
diff --git a/applications/utilities/mesh/conversion/fluentMeshToFoam/fluentMeshToFoam.L b/applications/utilities/mesh/conversion/fluentMeshToFoam/fluentMeshToFoam.L
index 7b385bfe0615ab2cec06838f4ca6fe0992647c58..d1afc4523a5e0ba97cacaa6abd9a4eeecdeebfa7 100644
--- a/applications/utilities/mesh/conversion/fluentMeshToFoam/fluentMeshToFoam.L
+++ b/applications/utilities/mesh/conversion/fluentMeshToFoam/fluentMeshToFoam.L
@@ -879,13 +879,10 @@ int main(int argc, char *argv[])
     }
 
     scalar scaleFactor = 1.0;
-    if (args.options().found("scale"))
-    {
-        scaleFactor = atof(args.options()["scale"].c_str());
-    }
+    args.optionReadIfPresent("scale", scaleFactor);
 
-    bool writeSets = args.options().found("writeSets");
-    bool writeZones = args.options().found("writeZones");
+    bool writeSets  = args.optionFound("writeSets");
+    bool writeZones = args.optionFound("writeZones");
 
 #   include "createTime.H"
 
diff --git a/applications/utilities/mesh/conversion/foamToStarMesh/foamToStarMesh.C b/applications/utilities/mesh/conversion/foamToStarMesh/foamToStarMesh.C
index 5cdbcb77e89f0d4a47aefdc6e2a80b90fc217492..b36ec777694b35d4a640212171062ad026020254 100644
--- a/applications/utilities/mesh/conversion/foamToStarMesh/foamToStarMesh.C
+++ b/applications/utilities/mesh/conversion/foamToStarMesh/foamToStarMesh.C
@@ -87,7 +87,7 @@ int main(int argc, char *argv[])
     instantList timeDirs = timeSelector::select0(runTime, args);
 
     bool surfaceOnly = false;
-    if (args.options().found("surface") or args.options().found("tri"))
+    if (args.optionFound("surface") || args.optionFound("tri"))
     {
         surfaceOnly = true;
     }
@@ -98,16 +98,15 @@ int main(int argc, char *argv[])
         exportName = meshWriter::defaultSurfaceName;
     }
 
-    if (args.options().found("case"))
+    if (args.optionFound("case"))
     {
         exportName += '-' + args.globalCaseName();
     }
 
     // default: rescale from [m] to [mm]
     scalar scaleFactor = 1000;
-    if (args.options().found("scale"))
+    if (args.optionReadIfPresent("scale", scaleFactor))
     {
-        scaleFactor = readScalar(IStringStream(args.options()["scale"])());
         if (scaleFactor <= 0)
         {
             scaleFactor = 1;
@@ -129,7 +128,7 @@ int main(int argc, char *argv[])
         {
             meshWriters::STARCD writer(mesh, scaleFactor);
 
-            if (args.options().found("noBnd"))
+            if (args.optionFound("noBnd"))
             {
                 writer.noBoundary();
             }
@@ -142,7 +141,7 @@ int main(int argc, char *argv[])
 
             if (surfaceOnly)
             {
-                if (args.options().found("tri"))
+                if (args.optionFound("tri"))
                 {
                     writer.writeSurface(meshName, true);
                 }
diff --git a/applications/utilities/mesh/conversion/gambitToFoam/gambitToFoam.L b/applications/utilities/mesh/conversion/gambitToFoam/gambitToFoam.L
index 6c61a219f3996458a72bd57ae7c4b307a6a70b9e..f815e81b5327c2a86fc4407831a48603c995130b 100644
--- a/applications/utilities/mesh/conversion/gambitToFoam/gambitToFoam.L
+++ b/applications/utilities/mesh/conversion/gambitToFoam/gambitToFoam.L
@@ -1,4 +1,4 @@
-/*---------------------------------------------------------------------------*\
+/*--------------------------------*- C++ -*----------------------------------*\
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
@@ -646,10 +646,7 @@ int main(int argc, char *argv[])
     }
 
     scalar scaleFactor = 1.0;
-    if (args.options().found("scale"))
-    {
-        scaleFactor = atof(args.options()["scale"].c_str());
-    }
+    args.optionReadIfPresent("scale", scaleFactor);
 
 #   include "createTime.H"
 
diff --git a/applications/utilities/mesh/conversion/gmshToFoam/gmshToFoam.C b/applications/utilities/mesh/conversion/gmshToFoam/gmshToFoam.C
index 62edc15af03dd7db103ff4fae7be2a5f184ca6eb..68eb9c46cfc2cb6b3d22b26e1d4c960382cee03e 100644
--- a/applications/utilities/mesh/conversion/gmshToFoam/gmshToFoam.C
+++ b/applications/utilities/mesh/conversion/gmshToFoam/gmshToFoam.C
@@ -689,7 +689,7 @@ int main(int argc, char *argv[])
 
     fileName mshName(args.additionalArgs()[0]);
 
-    bool keepOrientation = args.options().found("keepOrientation");
+    bool keepOrientation = args.optionFound("keepOrientation");
 
     // Storage for points
     pointField points;
diff --git a/applications/utilities/mesh/conversion/ideasUnvToFoam/ideasUnvToFoam.C b/applications/utilities/mesh/conversion/ideasUnvToFoam/ideasUnvToFoam.C
index 520be5b1463205fceef61a57facf1ea2c36a6c79..6a9d85ba301b115c2a4d02f1fa19895598e1a373 100644
--- a/applications/utilities/mesh/conversion/ideasUnvToFoam/ideasUnvToFoam.C
+++ b/applications/utilities/mesh/conversion/ideasUnvToFoam/ideasUnvToFoam.C
@@ -852,7 +852,7 @@ int main(int argc, char *argv[])
 
 
     // For debugging: dump boundary faces as triSurface
-    if (args.options().found("dump"))
+    if (args.optionFound("dump"))
     {
         DynamicList<labelledTri> triangles(boundaryFaces.size());
 
diff --git a/applications/utilities/mesh/conversion/kivaToFoam/kivaToFoam.C b/applications/utilities/mesh/conversion/kivaToFoam/kivaToFoam.C
index 235f8986c601e0f4f849c6fb9587017f18f8a8e6..1da7ba049e4202ae5e2065fe3f9be3fd0a5502a6 100644
--- a/applications/utilities/mesh/conversion/kivaToFoam/kivaToFoam.C
+++ b/applications/utilities/mesh/conversion/kivaToFoam/kivaToFoam.C
@@ -68,15 +68,15 @@ int main(int argc, char *argv[])
 #   include "createTime.H"
 
     fileName kivaFileName("otape17");
-    if (args.options().found("file"))
+    if (args.optionFound("file"))
     {
-        kivaFileName = args.options()["file"];
+        kivaFileName = args.option("file");
     }
 
     kivaVersions kivaVersion = kiva3v;
-    if (args.options().found("version"))
+    if (args.optionFound("version"))
     {
-        word kivaVersionName = args.options()["version"];
+        word kivaVersionName = args.option("version");
 
         if (kivaVersionName == "kiva3")
         {
@@ -99,10 +99,7 @@ int main(int argc, char *argv[])
     }
 
     scalar zHeadMin = -GREAT;
-    if (args.options().found("zHeadMin"))
-    {
-        zHeadMin = atof(args.options()["zHeadMin"].c_str());
-    }
+    args.optionReadIfPresent("zHeadMin", zHeadMin);
 
 #   include "readKivaGrid.H"
 
diff --git a/applications/utilities/mesh/conversion/mshToFoam/mshToFoam.C b/applications/utilities/mesh/conversion/mshToFoam/mshToFoam.C
index 2a48971abd5740020e2b58b9910784ec6d33331a..df438b356651c8cdbb209eb9a521c2ade344369e 100644
--- a/applications/utilities/mesh/conversion/mshToFoam/mshToFoam.C
+++ b/applications/utilities/mesh/conversion/mshToFoam/mshToFoam.C
@@ -62,14 +62,12 @@ int main(int argc, char *argv[])
 #   include "setRootCase.H"
 #   include "createTime.H"
 
-    bool readHex(args.options().found("hex"));
+    bool readHex = args.optionFound("hex");
 
     fileName mshFile(args.additionalArgs()[0]);
-
     IFstream mshStream(mshFile);
 
     label nCells;
-
     mshStream >> nCells;
 
     if (readHex)
diff --git a/applications/utilities/mesh/conversion/plot3dToFoam/plot3dToFoam.C b/applications/utilities/mesh/conversion/plot3dToFoam/plot3dToFoam.C
index 644efa906c368e1efcd58f89f1c72427793cdcfb..b1ea5df43fb096dc70fcbf46c73643a42a494436 100644
--- a/applications/utilities/mesh/conversion/plot3dToFoam/plot3dToFoam.C
+++ b/applications/utilities/mesh/conversion/plot3dToFoam/plot3dToFoam.C
@@ -71,18 +71,14 @@ int main(int argc, char *argv[])
     }
 
     scalar scaleFactor = 1.0;
-    if (args.options().found("scale"))
-    {
-        scaleFactor = atof(args.options()["scale"].c_str());
-    }
+    args.optionReadIfPresent("scale", scaleFactor);
 
-    bool readBlank = !args.options().found("noBlank");
-    bool singleBlock = args.options().found("singleBlock");
-    scalar twoDThicknes = -1;
-    if (args.options().found("2D"))
+    bool readBlank = !args.optionFound("noBlank");
+    bool singleBlock = args.optionFound("singleBlock");
+    scalar twoDThickness = -1;
+    if (args.optionReadIfPresent("2D", twoDThickness))
     {
-        twoDThicknes = readScalar(IStringStream(args.options()["2D"])());
-        Info<< "Reading 2D case by extruding points by " << twoDThicknes
+        Info<< "Reading 2D case by extruding points by " << twoDThickness
             << " in z direction." << nl << endl;
     }
 
@@ -114,7 +110,7 @@ int main(int argc, char *argv[])
 
         forAll (blocks, blockI)
         {
-            if (twoDThicknes > 0)
+            if (twoDThickness > 0)
             {
                 // Fake second set of points (done in readPoints below)
                 plot3dFile >> nx >> ny;
@@ -139,7 +135,7 @@ int main(int argc, char *argv[])
     forAll (blocks, blockI)
     {
         Info<< "block " << blockI << ":" << nl;
-        blocks[blockI].readPoints(readBlank, twoDThicknes, plot3dFile);
+        blocks[blockI].readPoints(readBlank, twoDThickness, plot3dFile);
         sumPoints += blocks[blockI].nBlockPoints();
         nMeshCells += blocks[blockI].nBlockCells();
         Info<< nl;
diff --git a/applications/utilities/mesh/conversion/polyDualMesh/polyDualMeshApp.C b/applications/utilities/mesh/conversion/polyDualMesh/polyDualMeshApp.C
index ffb2cb7daae965e8b624ce720860fd36a0304a02..c7444c2be63250e5234a4b926ac77c51af1bb1f0 100644
--- a/applications/utilities/mesh/conversion/polyDualMesh/polyDualMeshApp.C
+++ b/applications/utilities/mesh/conversion/polyDualMesh/polyDualMeshApp.C
@@ -381,9 +381,9 @@ int main(int argc, char *argv[])
         << endl;
 
 
-    const bool splitAllFaces = args.options().found("splitAllFaces");
-    const bool overwrite = args.options().found("overwrite");
-    const bool doNotPreserveFaceZones = args.options().found
+    const bool splitAllFaces = args.optionFound("splitAllFaces");
+    const bool overwrite = args.optionFound("overwrite");
+    const bool doNotPreserveFaceZones = args.optionFound
     (
         "doNotPreserveFaceZones"
     );
diff --git a/applications/utilities/mesh/conversion/sammToFoam/sammToFoam.C b/applications/utilities/mesh/conversion/sammToFoam/sammToFoam.C
index d676581a576f2d47c6fbce09de18a0d9dd96a8ab..8095529d3270eeb39c7bbe16771b388aa50b0ced 100644
--- a/applications/utilities/mesh/conversion/sammToFoam/sammToFoam.C
+++ b/applications/utilities/mesh/conversion/sammToFoam/sammToFoam.C
@@ -51,10 +51,7 @@ int main(int argc, char *argv[])
     }
 
     scalar scaleFactor = 1.0;
-    if (args.options().found("scale"))
-    {
-        scaleFactor = atof(args.options()["scale"].c_str());
-    }
+    args.optionReadIfPresent("scale", scaleFactor);
 
 #   include "createTime.H"
 
diff --git a/applications/utilities/mesh/conversion/star4ToFoam/star4ToFoam.C b/applications/utilities/mesh/conversion/star4ToFoam/star4ToFoam.C
index c0d66dbb5872fc61686e8fa3a15ffa975de05232..c4f8d6efc6a72d4ab79e15442eaf2543d27b1caa 100644
--- a/applications/utilities/mesh/conversion/star4ToFoam/star4ToFoam.C
+++ b/applications/utilities/mesh/conversion/star4ToFoam/star4ToFoam.C
@@ -68,27 +68,26 @@ int main(int argc, char *argv[])
 
     argList args(argc, argv);
     Time runTime(args.rootPath(), args.caseName());
-    stringList const& params = args.additionalArgs();
+    const stringList& params = args.additionalArgs();
 
     // default rescale from [mm] to [m]
     scalar scaleFactor = 0.001;
-    if (args.options().found("scale"))
+    if (args.optionReadIfPresent("scale", scaleFactor))
     {
-        scaleFactor = readScalar(IStringStream(args.options()["scale"])());
         if (scaleFactor <= 0)
         {
             scaleFactor = 1;
         }
     }
-
-    if (args.options().found("solids"))
+    
+    if (args.optionFound("solids"))
     {
         meshReaders::STARCD::keepSolids = true;
     }
 
     // default to binary output, unless otherwise specified
     IOstream::streamFormat format = IOstream::BINARY;
-    if (args.options().found("ascii"))
+    if (args.optionFound("ascii"))
     {
         format = IOstream::ASCII;
     }
diff --git a/applications/utilities/mesh/conversion/starToFoam/starToFoam.C b/applications/utilities/mesh/conversion/starToFoam/starToFoam.C
index 2f7d9c89803261af1b70735996c97db74aa0c0f0..2c2aeaa76b5ba2cc2a3350c6ebe7075e21ff3f23 100644
--- a/applications/utilities/mesh/conversion/starToFoam/starToFoam.C
+++ b/applications/utilities/mesh/conversion/starToFoam/starToFoam.C
@@ -51,10 +51,7 @@ int main(int argc, char *argv[])
     }
 
     scalar scaleFactor = 1.0;
-    if (args.options().found("scale"))
-    {
-        scaleFactor = atof(args.options()["scale"].c_str());
-    }
+    args.optionReadIfPresent("scale", scaleFactor);
 
 #   include "createTime.H"
 
diff --git a/applications/utilities/mesh/conversion/tetgenToFoam/tetgenToFoam.C b/applications/utilities/mesh/conversion/tetgenToFoam/tetgenToFoam.C
index 486041c71457b39787121d453d06c3bc7fa52b98..9e9426d0852fe093410030730bee34659d2aaf79 100644
--- a/applications/utilities/mesh/conversion/tetgenToFoam/tetgenToFoam.C
+++ b/applications/utilities/mesh/conversion/tetgenToFoam/tetgenToFoam.C
@@ -103,7 +103,7 @@ int main(int argc, char *argv[])
 #   include "createTime.H"
 
 
-    bool readFaceFile = !args.options().found("noFaceFile");
+    bool readFaceFile = !args.optionFound("noFaceFile");
 
     fileName prefix(args.additionalArgs()[0]);
 
diff --git a/applications/utilities/mesh/conversion/writeMeshObj/writeMeshObj.C b/applications/utilities/mesh/conversion/writeMeshObj/writeMeshObj.C
index 9eaaf2c199ffb24ce064ab888d5739b8ec63160e..e1d571e0816f4f146decba57af55579348a03a2f 100644
--- a/applications/utilities/mesh/conversion/writeMeshObj/writeMeshObj.C
+++ b/applications/utilities/mesh/conversion/writeMeshObj/writeMeshObj.C
@@ -350,12 +350,12 @@ int main(int argc, char *argv[])
 #   include "createTime.H"
     runTime.functionObjects().off();
 
-    bool patchFaces = args.options().found("patchFaces");
-    bool doCell = args.options().found("cell");
-    bool doPoint = args.options().found("point");
-    bool doFace = args.options().found("face");
-    bool doCellSet = args.options().found("cellSet");
-    bool doFaceSet = args.options().found("faceSet");
+    bool patchFaces = args.optionFound("patchFaces");
+    bool doCell     = args.optionFound("cell");
+    bool doPoint    = args.optionFound("point");
+    bool doFace     = args.optionFound("face");
+    bool doCellSet  = args.optionFound("cellSet");
+    bool doFaceSet  = args.optionFound("faceSet");
 
 
     Info<< "Writing mesh objects as .obj files such that the object"
@@ -383,22 +383,19 @@ int main(int argc, char *argv[])
             }
             else if (doCell)
             {
-                label cellI =
-                    readLabel(IStringStream(args.options()["cell"])());
+                label cellI = args.optionRead<label>("cell");
 
                 writePoints(mesh, cellI, runTime.timeName());
             }
             else if (doPoint)
             {
-                label pointI =
-                    readLabel(IStringStream(args.options()["point"])());
+                label pointI = args.optionRead<label>("point");
 
                 writePointCells(mesh, pointI, runTime.timeName());
             }
             else if (doFace)
             {
-                label faceI =
-                    readLabel(IStringStream(args.options()["face"])());
+                label faceI = args.optionRead<label>("face");
 
                 fileName fName
                 (
@@ -420,7 +417,7 @@ int main(int argc, char *argv[])
             }
             else if (doCellSet)
             {
-                word setName(args.options()["cellSet"]);
+                word setName(args.option("cellSet"));
 
                 cellSet cells(mesh, setName);
 
@@ -432,7 +429,7 @@ int main(int argc, char *argv[])
             }
             else if (doFaceSet)
             {
-                word setName(args.options()["faceSet"]);
+                word setName(args.option("faceSet"));
 
                 faceSet faces(mesh, setName);
 
diff --git a/applications/utilities/mesh/generation/blockMesh/blockMeshApp.C b/applications/utilities/mesh/generation/blockMesh/blockMeshApp.C
index 815f082ec7dd179b6a1aba308a0c8c1d4c6c6b1a..1bcee69984d1f8b32fed33fc9be7b434e78f2954 100644
--- a/applications/utilities/mesh/generation/blockMesh/blockMeshApp.C
+++ b/applications/utilities/mesh/generation/blockMesh/blockMeshApp.C
@@ -83,10 +83,10 @@ int main(int argc, char *argv[])
     word regionName;
     fileName polyMeshDir;
 
-    if (args.options().found("region"))
+    if (args.optionFound("region"))
     {
         // constant/<region>/polyMesh/blockMeshDict
-        regionName  = args.options()["region"];
+        regionName  = args.option("region");
         polyMeshDir = regionName/polyMesh::meshSubDir;
 
         Info<< nl << "Generating mesh for region " << regionName << endl;
@@ -100,9 +100,9 @@ int main(int argc, char *argv[])
 
     autoPtr<IOobject> meshDictIoPtr;
 
-    if (args.options().found("dict"))
+    if (args.optionFound("dict"))
     {
-        fileName dictPath(args.options()["dict"]);
+        fileName dictPath(args.option("dict"));
 
         meshDictIoPtr.set
         (
@@ -110,7 +110,7 @@ int main(int argc, char *argv[])
             (
                 (
                     isDir(dictPath)
-                  ? dictPath/dictName 
+                  ? dictPath/dictName
                   : dictPath
                 ),
                 runTime,
@@ -153,7 +153,7 @@ int main(int argc, char *argv[])
     blockMesh blocks(meshDict);
 
 
-    if (args.options().found("blockTopology"))
+    if (args.optionFound("blockTopology"))
     {
         // Write mesh as edges.
         {
diff --git a/applications/utilities/mesh/generation/extrude2DMesh/doExtrude2DMesh.C b/applications/utilities/mesh/generation/extrude2DMesh/doExtrude2DMesh.C
index 2e0c16a5116843d70ddf5c3266900a09f4d13292..c71f91079c8cda68c77b86054a9d8cf01c2c4a27 100644
--- a/applications/utilities/mesh/generation/extrude2DMesh/doExtrude2DMesh.C
+++ b/applications/utilities/mesh/generation/extrude2DMesh/doExtrude2DMesh.C
@@ -66,7 +66,7 @@ int main(int argc, char *argv[])
     const word oldInstance = mesh.pointsInstance();
 
     scalar thickness(readScalar(IStringStream(args.additionalArgs()[0])()));
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
 
     // Check that mesh is 2D
diff --git a/applications/utilities/mesh/generation/extrudeMesh/extrudeMesh.C b/applications/utilities/mesh/generation/extrudeMesh/extrudeMesh.C
index 37860e27b25d217c4ddef3a765058fa6f7b1d8fb..95ec6c5b8ae8e12a02dd5df4b63cbefc9537eac2 100644
--- a/applications/utilities/mesh/generation/extrudeMesh/extrudeMesh.C
+++ b/applications/utilities/mesh/generation/extrudeMesh/extrudeMesh.C
@@ -55,7 +55,7 @@ int main(int argc, char *argv[])
     #include "setRoots.H"
     #include "createTimeExtruded.H"
 
-    if (args.options().found("sourceCase") == args.options().found("surface"))
+    if (args.optionFound("sourceCase") == args.optionFound("surface"))
     {
         FatalErrorIn(args.executable())
             << "Specify either -sourceCase and -sourcePatch"
@@ -83,12 +83,12 @@ int main(int argc, char *argv[])
         )
     );
 
-    if (args.options().found("sourceCase"))
+    if (args.optionFound("sourceCase"))
     {
-        fileName sourceCasePath(args.options()["sourceCase"]);
+        fileName sourceCasePath(args.option("sourceCase"));
         fileName sourceRootDir = sourceCasePath.path();
         fileName sourceCaseDir = sourceCasePath.name();
-        word patchName(args.options()["sourcePatch"]);
+        word patchName(args.option("sourcePatch"));
 
         Info<< "Extruding patch " << patchName
             << " on mesh " << sourceCasePath << nl
@@ -144,7 +144,7 @@ int main(int argc, char *argv[])
     else
     {
         // Read from surface
-        fileName surfName(args.options()["surface"]);
+        fileName surfName(args.option("surface"));
 
         Info<< "Extruding surfaceMesh read from file " << surfName << nl
             << endl;
@@ -250,7 +250,7 @@ int main(int argc, char *argv[])
     // Merging front and back patch faces
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-    if (args.options().found("mergeFaces"))
+    if (args.optionFound("mergeFaces"))
     {
         Info<< "Assuming full 360 degree axisymmetric case;"
             << " stitching faces on patches "
diff --git a/applications/utilities/mesh/manipulation/attachMesh/attachMesh.C b/applications/utilities/mesh/manipulation/attachMesh/attachMesh.C
index 52e0f2ae56ae8c0796890da6c7c17181c7500db6..341fc4eab67a8bb5b11134a72688d402aa9f9c00 100644
--- a/applications/utilities/mesh/manipulation/attachMesh/attachMesh.C
+++ b/applications/utilities/mesh/manipulation/attachMesh/attachMesh.C
@@ -50,7 +50,7 @@ int main(int argc, char *argv[])
 #   include "createPolyMesh.H"
     const word oldInstance = mesh.pointsInstance();
 
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
     if (!overwrite)
     {
diff --git a/applications/utilities/mesh/manipulation/autoPatch/autoPatch.C b/applications/utilities/mesh/manipulation/autoPatch/autoPatch.C
index 96a7ee5197381c694c0a084aa8d5dc4c6aca2a0e..758592590c4f632b8a09a0a8aba39c8bd816fdde 100644
--- a/applications/utilities/mesh/manipulation/autoPatch/autoPatch.C
+++ b/applications/utilities/mesh/manipulation/autoPatch/autoPatch.C
@@ -91,7 +91,7 @@ int main(int argc, char *argv[])
     boundaryMesh bMesh;
 
     scalar featureAngle(readScalar(IStringStream(args.additionalArgs()[0])()));
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
     scalar minCos = Foam::cos(featureAngle * mathematicalConstant::pi/180.0);
 
diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkMesh.C b/applications/utilities/mesh/manipulation/checkMesh/checkMesh.C
index d226008f5cd47b64772426b6ee2272c6a9e0a68c..2a589c1643dc95f63afc26e85223fa1283105a77 100644
--- a/applications/utilities/mesh/manipulation/checkMesh/checkMesh.C
+++ b/applications/utilities/mesh/manipulation/checkMesh/checkMesh.C
@@ -58,9 +58,9 @@ int main(int argc, char *argv[])
     instantList timeDirs = timeSelector::select0(runTime, args);
 #   include "createNamedPolyMesh.H"
 
-    const bool noTopology  = args.options().found("noTopology");
-    const bool allGeometry = args.options().found("allGeometry");
-    const bool allTopology = args.options().found("allTopology");
+    const bool noTopology  = args.optionFound("noTopology");
+    const bool allGeometry = args.optionFound("allGeometry");
+    const bool allTopology = args.optionFound("allTopology");
 
     forAll(timeDirs, timeI)
     {
diff --git a/applications/utilities/mesh/manipulation/createBaffles/createBaffles.C b/applications/utilities/mesh/manipulation/createBaffles/createBaffles.C
index ece5f4dde6206fdfdb3bbf8ba5d8e02110916ea7..1fb8cc64efe26da5a52ac4f31de7a293d6d7274f 100644
--- a/applications/utilities/mesh/manipulation/createBaffles/createBaffles.C
+++ b/applications/utilities/mesh/manipulation/createBaffles/createBaffles.C
@@ -93,11 +93,11 @@ int main(int argc, char *argv[])
 
 
     // Additional patches
-    if (args.options().found("additionalPatches"))
+    if (args.optionFound("additionalPatches"))
     {
         const wordList patchNames
         (
-            IStringStream(args.options()["additionalPatches"])()
+            args.optionLookup("additionalPatches")()
         );
 
         newPatches.reserve(patchNames.size() + 1);
@@ -120,7 +120,7 @@ int main(int argc, char *argv[])
     }
 
 
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
 
 
diff --git a/applications/utilities/mesh/manipulation/createPatch/createPatch.C b/applications/utilities/mesh/manipulation/createPatch/createPatch.C
index 7e0443a614666c63e1f13aa4766737cdc62757a8..3c799ca5a4b0a66d6017f956d53bdade480b7c0b 100644
--- a/applications/utilities/mesh/manipulation/createPatch/createPatch.C
+++ b/applications/utilities/mesh/manipulation/createPatch/createPatch.C
@@ -539,7 +539,7 @@ int main(int argc, char *argv[])
 #   include "createTime.H"
     runTime.functionObjects().off();
 
-    const bool overwrite = args.options().found("overwrite");
+    const bool overwrite = args.optionFound("overwrite");
 
     Info<< "Reading createPatchDict." << nl << endl;
 
diff --git a/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C b/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C
index f883c3138b31d87e6898a067d8375f9429b0a1b5..9d826194149f2f87639781d63780dd88a6ac9910 100644
--- a/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C
+++ b/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C
@@ -231,9 +231,9 @@ int main(int argc, char *argv[])
 #   include "createMesh.H"
     const word oldInstance = mesh.pointsInstance();
 
-    bool split = args.options().found("split");
-    bool overwrite = args.options().found("overwrite");
-    bool detectOnly = args.options().found("detectOnly");
+    bool split      = args.optionFound("split");
+    bool overwrite  = args.optionFound("overwrite");
+    bool detectOnly = args.optionFound("detectOnly");
 
     // Collect all boundary faces
     labelList boundaryFaces(mesh.nFaces() - mesh.nInternalFaces());
diff --git a/applications/utilities/mesh/manipulation/refineMesh/refineMesh.C b/applications/utilities/mesh/manipulation/refineMesh/refineMesh.C
index 7636801b51ea74524ea301ca9fb2374f9ebc2e1b..5760d48aaf898a1a1b02381de9ee1674ac25f041 100644
--- a/applications/utilities/mesh/manipulation/refineMesh/refineMesh.C
+++ b/applications/utilities/mesh/manipulation/refineMesh/refineMesh.C
@@ -309,8 +309,8 @@ int main(int argc, char *argv[])
     // Read/construct control dictionary
     //
 
-    bool readDict = args.options().found("dict");
-    bool overwrite = args.options().found("overwrite");
+    bool readDict = args.optionFound("dict");
+    bool overwrite = args.optionFound("overwrite");
 
     // List of cells to refine
     labelList refCells;
diff --git a/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C b/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C
index b066936f83a5122136cab69fe7f770498fd303ac..a2925210db9aee736308b147536d5b68a2d749fa 100644
--- a/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C
+++ b/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C
@@ -386,7 +386,7 @@ int main(int argc, char *argv[])
 #   include "createMesh.H"
     const word oldInstance = mesh.pointsInstance();
 
-    const bool blockOrder = args.options().found("blockOrder");
+    const bool blockOrder = args.optionFound("blockOrder");
 
     if (blockOrder)
     {
@@ -395,7 +395,7 @@ int main(int argc, char *argv[])
             << endl;
     }
 
-    const bool orderPoints = args.options().found("orderPoints");
+    const bool orderPoints = args.optionFound("orderPoints");
 
     if (orderPoints)
     {
@@ -403,7 +403,7 @@ int main(int argc, char *argv[])
             << endl;
     }
 
-    const bool writeMaps = args.options().found("writeMaps");
+    const bool writeMaps = args.optionFound("writeMaps");
 
     if (writeMaps)
     {
@@ -411,7 +411,7 @@ int main(int argc, char *argv[])
             << endl;
     }
 
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
     label band = getBand(mesh.faceOwner(), mesh.faceNeighbour());
 
diff --git a/applications/utilities/mesh/manipulation/setSet/setSet.C b/applications/utilities/mesh/manipulation/setSet/setSet.C
index ff6d576b0abb121cdc58bd7b4cd730e0431d9052..21b77ff842dd1d2850f8a0b2272aa4c3f66b9fe8 100644
--- a/applications/utilities/mesh/manipulation/setSet/setSet.C
+++ b/applications/utilities/mesh/manipulation/setSet/setSet.C
@@ -723,7 +723,7 @@ int main(int argc, char *argv[])
 #   include "setRootCase.H"
 #   include "createTime.H"
 
-    bool writeVTK = !args.options().found("noVTK");
+    bool writeVTK = !args.optionFound("noVTK");
 
     // Get times list
     instantList Times = runTime.times();
@@ -740,9 +740,9 @@ int main(int argc, char *argv[])
 
     std::ifstream* fileStreamPtr(NULL);
 
-    if (args.options().found("batch"))
+    if (args.optionFound("batch"))
     {
-        fileName batchFile(args.options()["batch"]);
+        fileName batchFile(args.option("batch"));
 
         Pout<< "Reading commands from file " << batchFile << endl;
 
diff --git a/applications/utilities/mesh/manipulation/setsToZones/setsToZones.C b/applications/utilities/mesh/manipulation/setsToZones/setsToZones.C
index ac32c1ccc9ad54a3bf20c043dc698d363080b643..9d27d8691b387ded455c75823454de3f0d553c4c 100644
--- a/applications/utilities/mesh/manipulation/setsToZones/setsToZones.C
+++ b/applications/utilities/mesh/manipulation/setsToZones/setsToZones.C
@@ -65,7 +65,7 @@ int main(int argc, char *argv[])
 #   include "createTime.H"
 
 
-    bool noFlipMap = args.options().found("noFlipMap");
+    bool noFlipMap = args.optionFound("noFlipMap");
 
     // Get times list
     instantList Times = runTime.times();
diff --git a/applications/utilities/mesh/manipulation/splitMesh/splitMesh.C b/applications/utilities/mesh/manipulation/splitMesh/splitMesh.C
index b865472dadf7c92bfc2a6d340d256914913c6494..65e4d33237df440e9b72236179b6d617645ca7db 100644
--- a/applications/utilities/mesh/manipulation/splitMesh/splitMesh.C
+++ b/applications/utilities/mesh/manipulation/splitMesh/splitMesh.C
@@ -126,7 +126,7 @@ int main(int argc, char *argv[])
     word setName(args.additionalArgs()[0]);
     word masterPatch(args.additionalArgs()[1]);
     word slavePatch(args.additionalArgs()[2]);
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
     // List of faces to split
     faceSet facesSet(mesh, setName);
diff --git a/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C b/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C
index e71a5f11c0b2ff259f3d3f6b0f997df0efd29f88..72c1fbd3500019a316f74a2be861bdcf0e2581c7 100644
--- a/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C
+++ b/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C
@@ -1239,20 +1239,20 @@ int main(int argc, char *argv[])
     const word oldInstance = mesh.pointsInstance();
 
     word blockedFacesName;
-    if (args.options().found("blockedFaces"))
+    if (args.optionFound("blockedFaces"))
     {
-        blockedFacesName = args.options()["blockedFaces"];
+        blockedFacesName = args.option("blockedFaces");
         Info<< "Reading blocked internal faces from faceSet "
             << blockedFacesName << nl << endl;
     }
 
-    bool makeCellZones = args.options().found("makeCellZones");
-    bool largestOnly = args.options().found("largestOnly");
-    bool insidePoint = args.options().found("insidePoint");
-    bool useCellZones = args.options().found("cellZones");
-    bool overwrite = args.options().found("overwrite");
-    bool detectOnly = args.options().found("detectOnly");
-    bool sloppyCellZones = args.options().found("sloppyCellZones");
+    bool makeCellZones   = args.optionFound("makeCellZones");
+    bool largestOnly     = args.optionFound("largestOnly");
+    bool insidePoint     = args.optionFound("insidePoint");
+    bool useCellZones    = args.optionFound("cellZones");
+    bool overwrite       = args.optionFound("overwrite");
+    bool detectOnly      = args.optionFound("detectOnly");
+    bool sloppyCellZones = args.optionFound("sloppyCellZones");
 
     if (insidePoint && largestOnly)
     {
@@ -1771,7 +1771,7 @@ int main(int argc, char *argv[])
 
         if (insidePoint)
         {
-            point insidePoint(IStringStream(args.options()["insidePoint"])());
+            point insidePoint(args.optionLookup("insidePoint")());
 
             label regionI = -1;
 
diff --git a/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C b/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C
index 2a9784980ac2ab9b4d4f193b3e27f99f06519827..e3536a5ad05862bd0370cf9e000992673797d944 100644
--- a/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C
+++ b/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C
@@ -142,9 +142,9 @@ int main(int argc, char *argv[])
     word masterPatchName(args.additionalArgs()[0]);
     word slavePatchName(args.additionalArgs()[1]);
 
-    bool partialCover = args.options().found("partial");
-    bool perfectCover = args.options().found("perfect");
-    bool overwrite = args.options().found("overwrite");
+    bool partialCover = args.optionFound("partial");
+    bool perfectCover = args.optionFound("perfect");
+    bool overwrite    = args.optionFound("overwrite");
 
     if (partialCover && perfectCover)
     {
diff --git a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
index 56b48a2dd2a9ce81259605e685c8c29f2f71d34b..338c8dbcb1c6ffd1da88073613122d3d85b1a39d 100644
--- a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
+++ b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
@@ -162,7 +162,7 @@ int main(int argc, char *argv[])
     const word oldInstance = mesh.pointsInstance();
 
     word setName(args.additionalArgs()[0]);
-    bool overwrite = args.options().found("overwrite");
+    bool overwrite = args.optionFound("overwrite");
 
 
     Info<< "Reading cell set from " << setName << endl << endl;
@@ -172,9 +172,9 @@ int main(int argc, char *argv[])
 
     label patchI = -1;
 
-    if (args.options().found("patch"))
+    if (args.optionFound("patch"))
     {
-        word patchName(args.options()["patch"]);
+        word patchName(args.option("patch"));
 
         patchI = mesh.boundaryMesh().findPatchID(patchName);
 
diff --git a/applications/utilities/mesh/manipulation/transformPoints/transformPoints.C b/applications/utilities/mesh/manipulation/transformPoints/transformPoints.C
index bc2b017a2cbf393ee677afdbf3a3054d89789923..630243e2ef2b465254108bb18354a59a65633281 100644
--- a/applications/utilities/mesh/manipulation/transformPoints/transformPoints.C
+++ b/applications/utilities/mesh/manipulation/transformPoints/transformPoints.C
@@ -144,7 +144,7 @@ int main(int argc, char *argv[])
     argList::validOptions.insert("yawPitchRoll", "(yaw pitch roll)");
     argList::validOptions.insert("rotateFields", "");
     argList::validOptions.insert("scale", "vector");
- 
+
 #   include "setRootCase.H"
 #   include "createTime.H"
 
@@ -171,18 +171,18 @@ int main(int argc, char *argv[])
             << exit(FatalError);
     }
 
-    if (args.options().found("translate"))
+    if (args.optionFound("translate"))
     {
-        vector transVector(IStringStream(args.options()["translate"])());
+        vector transVector(args.optionLookup("translate")());
 
         Info<< "Translating points by " << transVector << endl;
 
         points += transVector;
     }
 
-    if (args.options().found("rotate"))
+    if (args.optionFound("rotate"))
     {
-        Pair<vector> n1n2(IStringStream(args.options()["rotate"])());
+        Pair<vector> n1n2(args.optionLookup("rotate")());
         n1n2[0] /= mag(n1n2[0]);
         n1n2[1] /= mag(n1n2[1]);
         tensor T = rotationTensor(n1n2[0], n1n2[1]);
@@ -191,14 +191,14 @@ int main(int argc, char *argv[])
 
         points = transform(T, points);
 
-        if (args.options().found("rotateFields"))
+        if (args.optionFound("rotateFields"))
         {
             rotateFields(runTime, T);
         }
     }
-    else if (args.options().found("rollPitchYaw"))
+    else if (args.optionFound("rollPitchYaw"))
     {
-        vector v(IStringStream(args.options()["rollPitchYaw"])());
+        vector v(args.optionLookup("rollPitchYaw")());
 
         Info<< "Rotating points by" << nl
             << "    roll  " << v.x() << nl
@@ -214,14 +214,14 @@ int main(int argc, char *argv[])
         Info<< "Rotating points by quaternion " << R << endl;
         points = transform(R, points);
 
-        if (args.options().found("rotateFields"))
+        if (args.optionFound("rotateFields"))
         {
             rotateFields(runTime, R.R());
         }
     }
-    else if (args.options().found("yawPitchRoll"))
+    else if (args.optionFound("yawPitchRoll"))
     {
-        vector v(IStringStream(args.options()["yawPitchRoll"])());
+        vector v(args.optionLookup("yawPitchRoll")());
 
         Info<< "Rotating points by" << nl
             << "    yaw   " << v.x() << nl
@@ -243,15 +243,15 @@ int main(int argc, char *argv[])
         Info<< "Rotating points by quaternion " << R << endl;
         points = transform(R, points);
 
-        if (args.options().found("rotateFields"))
+        if (args.optionFound("rotateFields"))
         {
             rotateFields(runTime, R.R());
         }
     }
 
-    if (args.options().found("scale"))
+    if (args.optionFound("scale"))
     {
-        vector scaleVector(IStringStream(args.options()["scale"])());
+        vector scaleVector(args.optionLookup("scale")());
 
         Info<< "Scaling points by " << scaleVector << endl;
 
diff --git a/applications/utilities/miscellaneous/foamDebugSwitches/foamDebugSwitches.C b/applications/utilities/miscellaneous/foamDebugSwitches/foamDebugSwitches.C
index 6854ba0b8d53a0d08bce360e3cc1c2928267d6f2..d4eb9c3b63af51002d3cf4c136a9416c8bf01a5c 100644
--- a/applications/utilities/miscellaneous/foamDebugSwitches/foamDebugSwitches.C
+++ b/applications/utilities/miscellaneous/foamDebugSwitches/foamDebugSwitches.C
@@ -50,7 +50,7 @@ int main(int argc, char *argv[])
     wordList currInfo(debug::infoSwitches().toc());
     wordList currOpt(debug::optimisationSwitches().toc());
 
-    if (args.options().found("old") || args.options().found("new"))
+    if (args.optionFound("old") || args.optionFound("new"))
     {
         dictionary controlDict(IFstream(findEtcFile("controlDict", true))());
 
@@ -80,7 +80,7 @@ int main(int argc, char *argv[])
         //  1. run without any options (get complete list)
         //  2. comment out DebugSwitches, run again with -new to find new ones
         //     and do a diff
-        if (args.options().found("old"))
+        if (args.optionFound("old"))
         {
             IOobject::writeDivider(Info);
 
@@ -104,7 +104,7 @@ int main(int argc, char *argv[])
         }
 
         // list new switches
-        if (args.options().found("new"))
+        if (args.optionFound("new"))
         {
             IOobject::writeDivider(Info);
 
diff --git a/applications/utilities/miscellaneous/foamInfoExec/foamInfoExec.C b/applications/utilities/miscellaneous/foamInfoExec/foamInfoExec.C
index 3de53a2f22659e51012e2d005fe529b50408e3bd..b55e5b97013886395b11e200bc4c7661490d71ce 100644
--- a/applications/utilities/miscellaneous/foamInfoExec/foamInfoExec.C
+++ b/applications/utilities/miscellaneous/foamInfoExec/foamInfoExec.C
@@ -49,9 +49,9 @@ int main(int argc, char *argv[])
 
     Info<< endl;
 
-    if (args.options().found("times"))
+    if (args.optionFound("times"))
     {
-        instantList times 
+        instantList times
         (
             Foam::Time::findTimes(args.rootPath()/args.caseName())
         );
@@ -62,11 +62,11 @@ int main(int argc, char *argv[])
         }
     }
 
-    if (args.options().found("dictionary"))
+    if (args.optionFound("dictionary"))
     {
         fileName dictFileName
         (
-            args.rootPath()/args.caseName()/args.options()["dictionary"]
+            args.rootPath()/args.caseName()/args.option("dictionary")
         );
 
         IFstream dictFile(dictFileName);
@@ -75,11 +75,7 @@ int main(int argc, char *argv[])
         {
             dictionary dict(dictFile);
 
-            if
-            (
-                args.options().found("keywords")
-             && !args.options().found("entry")
-            )
+            if (args.optionFound("keywords") && !args.optionFound("entry"))
             {
                 for
                 (
@@ -91,11 +87,11 @@ int main(int argc, char *argv[])
                     Info<< iter().keyword() << endl;
                 }
             }
-            else if (args.options().found("entry"))
+            else if (args.optionFound("entry"))
             {
                 wordList entryNames
                 (
-                    fileName(args.options()["entry"]).components(':')
+                    fileName(args.option("entry")).components(':')
                 );
 
                 if (dict.found(entryNames[0]))
@@ -122,20 +118,20 @@ int main(int argc, char *argv[])
                         {
                             FatalErrorIn(args.executable())
                                 << "Cannot find sub-entry " << entryNames[i]
-                                << " in entry " << args.options()["entry"]
+                                << " in entry " << args.option("entry")
                                 << " in dictionary " << dictFileName;
                             FatalError.exit(3);
                         }
                     }
-                    
-                    if (args.options().found("keywords"))
+
+                    if (args.optionFound("keywords"))
                     {
                         /*
                         if (ent[1] != token::BEGIN_BLOCK)
                         {
                             FatalErrorIn(args.executable())
                                 << "Cannot find entry "
-                                << args.options()["entry"]
+                                << args.option("entry")
                                 << " in dictionary " << dictFileName
                                 << " is not a sub-dictionary";
                             FatalError.exit(4);
diff --git a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
index fef8c71aa1111d471763a65e09ec273d49f4f723..65dd679ecd73fc3bd6688aecb0964566465bf042 100644
--- a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
+++ b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
@@ -99,20 +99,20 @@ int main(int argc, char *argv[])
     word regionName = fvMesh::defaultRegion;
     word regionDir = word::null;
 
-    if (args.options().found("region"))
+    if (args.optionFound("region"))
     {
-        regionName = args.options()["region"];
+        regionName = args.option("region");
         regionDir = regionName;
         Info<< "Decomposing mesh " << regionName << nl << endl;
     }
 
 
-    bool writeCellDist(args.options().found("cellDist"));
-    bool copyUniform(args.options().found("copyUniform"));
-    bool decomposeFieldsOnly(args.options().found("fields"));
-    bool filterPatches(args.options().found("filterPatches"));
-    bool forceOverwrite(args.options().found("force"));
-    bool ifRequiredDecomposition(args.options().found("ifRequired"));
+    bool writeCellDist           = args.optionFound("cellDist");
+    bool copyUniform             = args.optionFound("copyUniform");
+    bool decomposeFieldsOnly     = args.optionFound("fields");
+    bool filterPatches           = args.optionFound("filterPatches");
+    bool forceOverwrite          = args.optionFound("force");
+    bool ifRequiredDecomposition = args.optionFound("ifRequired");
 
 #   include "createTime.H"
 
diff --git a/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C b/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C
index 1e3ed2b9bfb779780f349a3e59d13eab0689aa04..dd014c299fa1b27cc0e2ab784b12eb8442a2cd3d 100644
--- a/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C
+++ b/applications/utilities/parallelProcessing/reconstructPar/reconstructPar.C
@@ -57,12 +57,12 @@ int main(int argc, char *argv[])
 #   include "createTime.H"
 
     HashSet<word> selectedFields;
-    if (args.options().found("fields"))
+    if (args.optionFound("fields"))
     {
-        IStringStream(args.options()["fields"])() >> selectedFields;
+        args.optionLookup("fields")() >> selectedFields;
     }
 
-    bool noLagrangian = args.options().found("noLagrangian");
+    bool noLagrangian = args.optionFound("noLagrangian");
 
     // determine the processor count directly
     label nProcs = 0;
diff --git a/applications/utilities/parallelProcessing/reconstructParMesh/reconstructParMesh.C b/applications/utilities/parallelProcessing/reconstructParMesh/reconstructParMesh.C
index 627f2b15b48a26984c4ced5ec54ff1ece41a4b34..dc28db70971ab9aa66e93d398361971a6927dfe2 100644
--- a/applications/utilities/parallelProcessing/reconstructParMesh/reconstructParMesh.C
+++ b/applications/utilities/parallelProcessing/reconstructParMesh/reconstructParMesh.C
@@ -306,18 +306,16 @@ int main(int argc, char *argv[])
 
     word regionName = polyMesh::defaultRegion;
     fileName regionPrefix = "";
-    if (args.options().found("region"))
+    if (args.optionFound("region"))
     {
-        regionName = args.options()["region"];
+        regionName = args.option("region");
         regionPrefix = regionName;
         Info<< "Operating on region " << regionName << nl << endl;
     }
 
     scalar mergeTol = defaultMergeTol;
-    if (args.options().found("mergeTol"))
-    {
-        mergeTol = readScalar(IStringStream(args.options()["mergeTol"])());
-    }
+    args.optionReadIfPresent("mergeTol", mergeTol);
+
     scalar writeTol = Foam::pow(10.0, -scalar(IOstream::defaultPrecision()));
 
     Info<< "Merge tolerance : " << mergeTol << nl
@@ -337,7 +335,7 @@ int main(int argc, char *argv[])
     }
 
 
-    const bool fullMatch = args.options().found("fullMatch");
+    const bool fullMatch = args.optionFound("fullMatch");
 
     if (fullMatch)
     {
diff --git a/applications/utilities/parallelProcessing/redistributeMeshPar/redistributeMeshPar.C b/applications/utilities/parallelProcessing/redistributeMeshPar/redistributeMeshPar.C
index c46a41b2738795d7335106179fdd9dd9c343b9e9..c0859573e0d706fc2c996f66ec00aad434a49d9b 100644
--- a/applications/utilities/parallelProcessing/redistributeMeshPar/redistributeMeshPar.C
+++ b/applications/utilities/parallelProcessing/redistributeMeshPar/redistributeMeshPar.C
@@ -240,10 +240,7 @@ scalar getMergeDistance
 )
 {
     scalar mergeTol = defaultMergeTol;
-    if (args.options().found("mergeTol"))
-    {
-        mergeTol = readScalar(IStringStream(args.options()["mergeTol"])());
-    }
+    args.optionReadIfPresent("mergeTol", mergeTol);
 
     scalar writeTol =
         Foam::pow(scalar(10.0), -scalar(IOstream::defaultPrecision()));
diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightMesh.C b/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightMesh.C
index 94f8c19c3fed065d2b0abcc3bd6ad5953d1b5d2d..079145a0c567597811b54295430bf454d350c24e 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightMesh.C
+++ b/applications/utilities/postProcessing/dataConversion/foamToEnsight/ensightMesh.C
@@ -107,7 +107,7 @@ Foam::ensightMesh::ensightMesh
     const cellModel& wedge = *(cellModeller::lookup("wedge"));
     const cellModel& hex = *(cellModeller::lookup("hex"));
 
-    if (!args.options().found("noPatches"))
+    if (!args.optionFound("noPatches"))
     {
         forAll (mesh_.boundaryMesh(), patchI)
         {
@@ -136,9 +136,9 @@ Foam::ensightMesh::ensightMesh
 
         combineReduce(allPatchNames_, concatPatchNames());
 
-        if (args.options().found("patches"))
+        if (args.optionFound("patches"))
         {
-            wordList patchNameList(IStringStream(args.options()["patches"])());
+            wordList patchNameList(args.optionLookup("patches")());
 
             if (patchNameList.empty())
             {
@@ -228,7 +228,7 @@ Foam::ensightMesh::ensightMesh
         reduce(meshCellSets_.nPolys, sumOp<label>());
     }
 
-    if (!args.options().found("noPatches"))
+    if (!args.optionFound("noPatches"))
     {
         forAll (mesh.boundary(), patchI)
         {
diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C b/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C
index 5dc6af99f31d89f7a41d7f45ad6d25d77b0da949..a6a429318e9d51c160e4f344dc181aec85d0858a 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C
+++ b/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C
@@ -100,11 +100,7 @@ int main(int argc, char *argv[])
 #   include "setRootCase.H"
 
     // Check options
-    bool binary = true;
-    if (args.options().found("ascii"))
-    {
-        binary = false;
-    }
+    bool binary = !args.optionFound("ascii");
 
 #   include "createTime.H"
 
diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/foamToEnsightParts.C b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/foamToEnsightParts.C
index 651224d17ce932249d74aa279103f46f3bab6364..5e38986331d2b7a1c4edd86a30a0fe534b36bec3 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/foamToEnsightParts.C
+++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/foamToEnsightParts.C
@@ -107,7 +107,7 @@ int main(int argc, char *argv[])
 
     // default to binary output, unless otherwise specified
     IOstream::streamFormat format = IOstream::BINARY;
-    if (args.options().found("ascii"))
+    if (args.optionFound("ascii"))
     {
         format = IOstream::ASCII;
     }
@@ -115,14 +115,14 @@ int main(int argc, char *argv[])
     // control for renumbering iterations
     bool optIndex = false;
     label indexingNumber = 0;
-    if (args.options().found("index"))
+    if (args.optionFound("index"))
     {
         optIndex = true;
-        indexingNumber = readLabel(IStringStream(args.options()["index"])());
+        indexingNumber = args.optionRead<label>("index");
     }
 
     // always write the geometry, unless the -noMesh option is specified
-    bool optNoMesh = args.options().found("noMesh");
+    bool optNoMesh = args.optionFound("noMesh");
 
     fileName ensightDir = args.rootPath()/args.globalCaseName()/"Ensight";
     fileName dataDir = ensightDir/"data";
diff --git a/applications/utilities/postProcessing/dataConversion/foamToFieldview9/checkTimeOption.H b/applications/utilities/postProcessing/dataConversion/foamToFieldview9/checkTimeOption.H
deleted file mode 100644
index ad0aadf7c0f523a9790dacd005fe8ef989d9520a..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/dataConversion/foamToFieldview9/checkTimeOption.H
+++ /dev/null
@@ -1,26 +0,0 @@
-    if (args.options().found("time"))
-    {
-        scalar time(readScalar(IStringStream(args.options()["time"])()));
-
-        int nearestIndex = -1;
-        scalar nearestDiff = Foam::GREAT;
-
-        forAll(Times, timeIndex)
-        {
-            scalar diff = fabs(Times[timeIndex].value() - time);
-            if (diff < nearestDiff)
-            {
-                nearestDiff = diff;
-                nearestIndex = timeIndex;
-            }
-        }
-
-        startTime = nearestIndex;
-        endTime = nearestIndex + 1;
-    }
-    else
-    {
-        startTime = 0;
-        endTime = Times.size();
-    }
-
diff --git a/applications/utilities/postProcessing/dataConversion/foamToFieldview9/foamToFieldview9.C b/applications/utilities/postProcessing/dataConversion/foamToFieldview9/foamToFieldview9.C
index 7fc54a8cf2f76293c0a0e528a3d9f21260771db2..cc146bc57617143b3fe89a1b16070bcd71d1ca72 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToFieldview9/foamToFieldview9.C
+++ b/applications/utilities/postProcessing/dataConversion/foamToFieldview9/foamToFieldview9.C
@@ -307,7 +307,7 @@ int main(int argc, char *argv[])
                 new fieldviewTopology
                 (
                     mesh,
-                    !args.options().found("noWall")
+                    !args.optionFound("noWall")
                 )
             );
 
diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C
index 2d5e7479906befdf04c420de5409f1db7c274328..9bce0df59f259b5849ab9209e2ef6a94c78c264b 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C
+++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C
@@ -246,11 +246,10 @@ int main(int argc, char *argv[])
 #   include "setRootCase.H"
 #   include "createTime.H"
 
-    bool doWriteInternal = !args.options().found("noInternal");
-    bool doFaceZones = !args.options().found("noFaceZones");
-    bool doLinks = !args.options().found("noLinks");
-
-    bool binary = !args.options().found("ascii");
+    bool doWriteInternal = !args.optionFound("noInternal");
+    bool doFaceZones     = !args.optionFound("noFaceZones");
+    bool doLinks         = !args.optionFound("noLinks");
+    bool binary          = !args.optionFound("ascii");
 
     if (binary && (sizeof(floatScalar) != 4 || sizeof(label) != 4))
     {
@@ -260,7 +259,7 @@ int main(int argc, char *argv[])
             << exit(FatalError);
     }
 
-    bool nearCellValue = args.options().found("nearCellValue");
+    bool nearCellValue = args.optionFound("nearCellValue");
 
     if (nearCellValue)
     {
@@ -269,7 +268,7 @@ int main(int argc, char *argv[])
             << nl << endl;
     }
 
-    bool noPointValues = args.options().found("noPointValues");
+    bool noPointValues = args.optionFound("noPointValues");
 
     if (noPointValues)
     {
@@ -277,12 +276,12 @@ int main(int argc, char *argv[])
             << "Outputting cell values only" << nl << endl;
     }
 
-    bool allPatches = args.options().found("allPatches");
+    bool allPatches = args.optionFound("allPatches");
 
     HashSet<word> excludePatches;
-    if (args.options().found("excludePatches"))
+    if (args.optionFound("excludePatches"))
     {
-        IStringStream(args.options()["excludePatches"])() >> excludePatches;
+        args.optionLookup("excludePatches")() >> excludePatches;
 
         Info<< "Not including patches " << excludePatches << nl << endl;
     }
@@ -290,9 +289,9 @@ int main(int argc, char *argv[])
     word cellSetName;
     string vtkName;
 
-    if (args.options().found("cellSet"))
+    if (args.optionFound("cellSet"))
     {
-        cellSetName = args.options()["cellSet"];
+        cellSetName = args.option("cellSet");
         vtkName = cellSetName;
     }
     else if (Pstream::parRun())
@@ -332,8 +331,8 @@ int main(int argc, char *argv[])
     {
         if
         (
-            args.options().found("time")
-         || args.options().found("latestTime")
+            args.optionFound("time")
+         || args.optionFound("latestTime")
          || cellSetName.size()
          || regionName != polyMesh::defaultRegion
         )
@@ -377,10 +376,10 @@ int main(int argc, char *argv[])
 
 
         // If faceSet: write faceSet only (as polydata)
-        if (args.options().found("faceSet"))
+        if (args.optionFound("faceSet"))
         {
             // Load the faceSet
-            faceSet set(mesh, args.options()["faceSet"]);
+            faceSet set(mesh, args.option("faceSet"));
 
             // Filename as if patch with same name.
             mkDir(fvPath/set.name());
@@ -400,10 +399,10 @@ int main(int argc, char *argv[])
             continue;
         }
         // If pointSet: write pointSet only (as polydata)
-        if (args.options().found("pointSet"))
+        if (args.optionFound("pointSet"))
         {
             // Load the pointSet
-            pointSet set(mesh, args.options()["pointSet"]);
+            pointSet set(mesh, args.option("pointSet"));
 
             // Filename as if patch with same name.
             mkDir(fvPath/set.name());
@@ -428,9 +427,9 @@ int main(int argc, char *argv[])
         IOobjectList objects(mesh, runTime.timeName());
 
         HashSet<word> selectedFields;
-        if (args.options().found("fields"))
+        if (args.optionFound("fields"))
         {
-            IStringStream(args.options()["fields"])() >> selectedFields;
+            args.optionLookup("fields")() >> selectedFields;
         }
 
         // Construct the vol fields (on the original mesh if subsetted)
@@ -608,7 +607,7 @@ int main(int argc, char *argv[])
         //
         //---------------------------------------------------------------------
 
-        if (args.options().found("surfaceFields"))
+        if (args.optionFound("surfaceFields"))
         {
             PtrList<surfaceScalarField> ssf;
             readFields
diff --git a/applications/utilities/postProcessing/miscellaneous/dsmcFieldsCalc/dsmcFieldsCalc.C b/applications/utilities/postProcessing/miscellaneous/dsmcFieldsCalc/dsmcFieldsCalc.C
index ee4fd2c50f28c66a602156710dfe90575174e5e3..15c1153db5b17dec5191b50311c85937d588e88b 100644
--- a/applications/utilities/postProcessing/miscellaneous/dsmcFieldsCalc/dsmcFieldsCalc.C
+++ b/applications/utilities/postProcessing/miscellaneous/dsmcFieldsCalc/dsmcFieldsCalc.C
@@ -82,7 +82,7 @@ namespace Foam
 
 void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh)
 {
-    bool writeResults = !args.options().found("noWrite");
+    bool writeResults = !args.optionFound("noWrite");
 
     wordList extensiveVSFNames
     (
diff --git a/applications/utilities/postProcessing/miscellaneous/execFlowFunctionObjects/execFlowFunctionObjects.C b/applications/utilities/postProcessing/miscellaneous/execFlowFunctionObjects/execFlowFunctionObjects.C
index 45faede694f7a240f624fd4b6054da2207b49693..0843f3acf3b72ea161cfb5958493373792787fac 100644
--- a/applications/utilities/postProcessing/miscellaneous/execFlowFunctionObjects/execFlowFunctionObjects.C
+++ b/applications/utilities/postProcessing/miscellaneous/execFlowFunctionObjects/execFlowFunctionObjects.C
@@ -53,15 +53,13 @@ namespace Foam
 {
     void execFlowFunctionObjects(const argList& args, const Time& runTime)
     {
-        if (args.options().found("dict"))
+        if (args.optionFound("dict"))
         {
-            fileName dictName(args.options()["dict"]);
-
             IOdictionary dict
             (
                 IOobject
                 (
-                    dictName,
+                    args.option("dict"),
                     runTime.system(),
                     runTime,
                     IOobject::MUST_READ
diff --git a/applications/utilities/postProcessing/velocityField/Co/Co.C b/applications/utilities/postProcessing/velocityField/Co/Co.C
index 694172b72438b95227fcee8a7bd559b0dbdbe593..23d7b008a7d3dddd22b4f7f736975d71e7ec4c2a 100644
--- a/applications/utilities/postProcessing/velocityField/Co/Co.C
+++ b/applications/utilities/postProcessing/velocityField/Co/Co.C
@@ -86,7 +86,7 @@ namespace Foam
 
 void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh)
 {
-    bool writeResults = !args.options().found("noWrite");
+    bool writeResults = !args.optionFound("noWrite");
 
     IOobject phiHeader
     (
diff --git a/applications/utilities/postProcessing/velocityField/Mach/Mach.C b/applications/utilities/postProcessing/velocityField/Mach/Mach.C
index 02c69df34a07f8b44668dc2a69190ae62ad80101..daa4aa2ccf3d7aef33eef506761f46cb7c168a1c 100644
--- a/applications/utilities/postProcessing/velocityField/Mach/Mach.C
+++ b/applications/utilities/postProcessing/velocityField/Mach/Mach.C
@@ -38,7 +38,7 @@ Description
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh)
 {
-    bool writeResults = !args.options().found("noWrite");
+    bool writeResults = !args.optionFound("noWrite");
 
     IOobject Uheader
     (
diff --git a/applications/utilities/postProcessing/velocityField/Pe/Pe.C b/applications/utilities/postProcessing/velocityField/Pe/Pe.C
index 08c333481683ea08c9bf925db87300198f4bfe47..905074131d9f32b2d3d199dc8f12aae410343cb1 100644
--- a/applications/utilities/postProcessing/velocityField/Pe/Pe.C
+++ b/applications/utilities/postProcessing/velocityField/Pe/Pe.C
@@ -47,7 +47,7 @@ Description
 
 void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh)
 {
-    bool writeResults = !args.options().found("noWrite");
+    bool writeResults = !args.optionFound("noWrite");
 
     IOobject phiHeader
     (
diff --git a/applications/utilities/postProcessing/velocityField/Q/Q.C b/applications/utilities/postProcessing/velocityField/Q/Q.C
index e2338189546a1917c0bebb5a5b5679fd2c5746fd..34a09790d145896619e846f2e33d42bf379f9a00 100644
--- a/applications/utilities/postProcessing/velocityField/Q/Q.C
+++ b/applications/utilities/postProcessing/velocityField/Q/Q.C
@@ -39,7 +39,7 @@ Description
 
 void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh)
 {
-    bool writeResults = !args.options().found("noWrite");
+    bool writeResults = !args.optionFound("noWrite");
 
     IOobject Uheader
     (
diff --git a/applications/utilities/postProcessing/velocityField/enstrophy/enstrophy.C b/applications/utilities/postProcessing/velocityField/enstrophy/enstrophy.C
index 5d098240fdd72e50de54558a712b0f16564c7319..96ccb4b9079920f86d3b5b5304deb2aaff9af349 100644
--- a/applications/utilities/postProcessing/velocityField/enstrophy/enstrophy.C
+++ b/applications/utilities/postProcessing/velocityField/enstrophy/enstrophy.C
@@ -39,7 +39,7 @@ Description
 
 void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh)
 {
-    bool writeResults = !args.options().found("noWrite");
+    bool writeResults = !args.optionFound("noWrite");
 
     IOobject Uheader
     (
diff --git a/applications/utilities/postProcessing/velocityField/uprime/uprime.C b/applications/utilities/postProcessing/velocityField/uprime/uprime.C
index a546cab627bf7d2ba1d132961e1a3d4ef0ff3454..c1f7071f744d1cb2e8ba9260a257f50a5839e5e6 100644
--- a/applications/utilities/postProcessing/velocityField/uprime/uprime.C
+++ b/applications/utilities/postProcessing/velocityField/uprime/uprime.C
@@ -39,7 +39,7 @@ Description
 
 void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh)
 {
-    bool writeResults = !args.options().found("noWrite");
+    bool writeResults = !args.optionFound("noWrite");
 
     IOobject kheader
     (
diff --git a/applications/utilities/postProcessing/velocityField/vorticity/vorticity.C b/applications/utilities/postProcessing/velocityField/vorticity/vorticity.C
index e24a3b9e463b8e1e8afcaf6e63e8830796a7455a..3b4a85ca3e603927a8fed3b3257ce64b6d36ff07 100644
--- a/applications/utilities/postProcessing/velocityField/vorticity/vorticity.C
+++ b/applications/utilities/postProcessing/velocityField/vorticity/vorticity.C
@@ -39,7 +39,7 @@ Description
 
 void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh)
 {
-    bool writeResults = !args.options().found("noWrite");
+    bool writeResults = !args.optionFound("noWrite");
 
     IOobject Uheader
     (
diff --git a/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C b/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C
index dac7cd03934ada77c1c586b0320d5cdf4a301aaf..8aae7e124c965d5c0a0e249b6b1e70d0ba901bd4 100644
--- a/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C
+++ b/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C
@@ -76,16 +76,15 @@ int main(int argc, char *argv[])
     // Set the mean boundary-layer thickness
     dimensionedScalar ybl("ybl", dimLength, 0);
 
-    if (args.options().found("ybl"))
+    if (args.optionFound("ybl"))
     {
         // If the boundary-layer thickness is provided use it
-        ybl.value() = readScalar(IStringStream(args.options()["ybl"])());
+        ybl.value() = args.optionRead<scalar>("ybl");
     }
-    else if (args.options().found("Cbl"))
+    else if (args.optionFound("Cbl"))
     {
         // Calculate boundary layer thickness as Cbl * mean distance to wall
-        ybl.value() =
-            gAverage(y)*readScalar(IStringStream(args.options()["Cbl"])());
+        ybl.value() = gAverage(y) * args.optionRead<scalar>("Cbl");
     }
     else
     {
@@ -155,7 +154,7 @@ int main(int argc, char *argv[])
         sqr(kappa*min(y, ybl))*::sqrt(2)*mag(dev(symm(fvc::grad(U))))
     );
 
-    if (args.options().found("writenut"))
+    if (args.optionFound("writenut"))
     {
         Info<< "Writing nut" << endl;
         nut.write();
diff --git a/applications/utilities/preProcessing/applyWallFunctionBounaryConditions/applyWallFunctionBounaryConditions.C b/applications/utilities/preProcessing/applyWallFunctionBounaryConditions/applyWallFunctionBounaryConditions.C
index e571cc4373f42948202f6ff8fc42ea51895ce17a..1cdc3f28abe605beedac2880e0a5c9e2f5942b54 100644
--- a/applications/utilities/preProcessing/applyWallFunctionBounaryConditions/applyWallFunctionBounaryConditions.C
+++ b/applications/utilities/preProcessing/applyWallFunctionBounaryConditions/applyWallFunctionBounaryConditions.C
@@ -240,7 +240,7 @@ int main(int argc, char *argv[])
 #   include "createTime.H"
 #   include "createMesh.H"
 
-    bool compressible = args.options().found("compressible");
+    bool compressible = args.optionFound("compressible");
 
     Info<< "Updating turbulence fields to operate using new run time "
         << "selectable" << nl << "wall functions"
diff --git a/applications/utilities/preProcessing/foamUpgradeFvSolution/foamUpgradeFvSolution.C b/applications/utilities/preProcessing/foamUpgradeFvSolution/foamUpgradeFvSolution.C
index 669d7186f2460f48ec7ef0812c84dfa5ff958a12..d2e7981c68394aec4edead2391aa80a4e21faa68 100644
--- a/applications/utilities/preProcessing/foamUpgradeFvSolution/foamUpgradeFvSolution.C
+++ b/applications/utilities/preProcessing/foamUpgradeFvSolution/foamUpgradeFvSolution.C
@@ -78,7 +78,7 @@ int main(int argc, char *argv[])
     Info<< nChanged << " solver settings changed" << nl << endl;
     if (nChanged)
     {
-        if (args.options().found("test"))
+        if (args.optionFound("test"))
         {
             Info<< "-test option: no changes made" << nl << endl;
         }
diff --git a/applications/utilities/preProcessing/mapFields/setRoots.H b/applications/utilities/preProcessing/mapFields/setRoots.H
index 5c4ca191700f9942eb6544ad1d6ac3e29db190be..6aceba234f46e8d0326a343feb91d04ea2765253 100644
--- a/applications/utilities/preProcessing/mapFields/setRoots.H
+++ b/applications/utilities/preProcessing/mapFields/setRoots.H
@@ -24,20 +24,7 @@
     Info<< "Source: " << rootDirSource << " " << caseDirSource << nl
         << "Target: " << rootDirTarget << " " << caseDirTarget << endl;
 
-    bool parallelSource = false;
-    if (args.options().found("parallelSource"))
-    {
-        parallelSource = true;
-    }
+    bool parallelSource = args.optionFound("parallelSource");
+    bool parallelTarget = args.optionFound("parallelTarget");
+    bool consistent     = args.optionFound("consistent");
 
-    bool parallelTarget = false;
-    if (args.options().found("parallelTarget"))
-    {
-        parallelTarget = true;
-    }
-
-    bool consistent = false;
-    if (args.options().found("consistent"))
-    {
-        consistent = true;
-    }
diff --git a/applications/utilities/preProcessing/mapFields/setTimeIndex.H b/applications/utilities/preProcessing/mapFields/setTimeIndex.H
index c5afed3e2fbc15c2ba54620b4325c95aa63dee6d..15f8efdb0fca44b9d286e3ff6085ba952f3e24c9 100644
--- a/applications/utilities/preProcessing/mapFields/setTimeIndex.H
+++ b/applications/utilities/preProcessing/mapFields/setTimeIndex.H
@@ -1,15 +1,14 @@
     instantList sourceTimes = runTimeSource.times();
     label sourceTimeIndex = runTimeSource.timeIndex();
-    if (args.options().found("sourceTime"))
+    if (args.optionFound("sourceTime"))
     {
-        if ((args.options()["sourceTime"]) == "latestTime")
+        if (args.option("sourceTime") == "latestTime")
         {
             sourceTimeIndex = sourceTimes.size() - 1;
         }
         else
         {
-            scalar sourceTime =
-                readScalar(IStringStream(args.options()["sourceTime"])());
+            scalar sourceTime = args.optionRead<scalar>("sourceTime");
             sourceTimeIndex = getTimeIndex(sourceTimes, sourceTime);
         }
     }
diff --git a/applications/utilities/surface/surfaceAdd/surfaceAdd.C b/applications/utilities/surface/surfaceAdd/surfaceAdd.C
index bbff3715c7c8d3e64be96a0318097734dd3af075..6441486cd129b0339145acde979b4b7b9db07452 100644
--- a/applications/utilities/surface/surfaceAdd/surfaceAdd.C
+++ b/applications/utilities/surface/surfaceAdd/surfaceAdd.C
@@ -59,8 +59,8 @@ int main(int argc, char *argv[])
     fileName inFileName2(args.additionalArgs()[1]);
     fileName outFileName(args.additionalArgs()[2]);
 
-    bool addPoint = args.options().found("points");
-    bool mergeRegions = args.options().found("mergeRegions");
+    bool addPoint     = args.optionFound("points");
+    bool mergeRegions = args.optionFound("mergeRegions");
 
     if (addPoint)
     {
@@ -69,7 +69,7 @@ int main(int argc, char *argv[])
             << nl << endl;
 
         Info<< "Surface  : " << inFileName1<< nl
-            << "Points   : " << args.options()["points"] << nl
+            << "Points   : " << args.option("points") << nl
             << "Writing  : " << outFileName << nl << endl;
     }
     else
@@ -111,8 +111,8 @@ int main(int argc, char *argv[])
 
     if (addPoint)
     {
-        IFstream pointStr(args.options()["points"]);
-        pointField extraPoints(pointStr);
+        IFstream pointsFile(args.option("points"));
+        pointField extraPoints(pointsFile);
 
         Info<< "Additional Points:" << extraPoints.size() << endl;
 
@@ -252,7 +252,7 @@ int main(int argc, char *argv[])
                 newPatches[newPatchI++] = surface2.patches()[ patchI];
             }
         }
- 
+
 
         Info<< "New patches:" << nl;
         forAll(newPatches, patchI)
diff --git a/applications/utilities/surface/surfaceCheck/surfaceCheck.C b/applications/utilities/surface/surfaceCheck/surfaceCheck.C
index d714c19ec36e5bc5be435b9ac3a02349274954f2..d283ec66afc37ba554e37ddcb6d84df7dc5ce105 100644
--- a/applications/utilities/surface/surfaceCheck/surfaceCheck.C
+++ b/applications/utilities/surface/surfaceCheck/surfaceCheck.C
@@ -176,8 +176,8 @@ int main(int argc, char *argv[])
     argList::validOptions.insert("verbose", "");
     argList args(argc, argv);
 
-    bool checkSelfIntersection = args.options().found("checkSelfIntersection");
-    bool verbose = args.options().found("verbose");
+    bool checkSelfIntersection = args.optionFound("checkSelfIntersection");
+    bool verbose = args.optionFound("verbose");
 
     fileName surfFileName(args.additionalArgs()[0]);
     Pout<< "Reading surface from " << surfFileName << " ..." << nl << endl;
diff --git a/applications/utilities/surface/surfaceConvert/surfaceConvert.C b/applications/utilities/surface/surfaceConvert/surfaceConvert.C
index fd7b223827334261083e944fb9d559be218c4106..f7df57d1e1844037d6fab413aeda49715c8395fe 100644
--- a/applications/utilities/surface/surfaceConvert/surfaceConvert.C
+++ b/applications/utilities/surface/surfaceConvert/surfaceConvert.C
@@ -70,12 +70,6 @@ int main(int argc, char *argv[])
     argList args(argc, argv);
     const stringList& params = args.additionalArgs();
 
-    scalar scaleFactor = 0;
-    if (args.options().found("scale"))
-    {
-        IStringStream(args.options()["scale"])() >> scaleFactor;
-    }
-
     fileName importName(params[0]);
     fileName exportName(params[1]);
 
@@ -93,7 +87,7 @@ int main(int argc, char *argv[])
     surf.writeStats(Info);
     Info<< endl;
 
-    if (args.options().found("clean"))
+    if (args.optionFound("clean"))
     {
         Info<< "Cleaning up surface" << endl;
         surf.cleanup(true);
@@ -103,7 +97,7 @@ int main(int argc, char *argv[])
         Info<< endl;
     }
 
-    bool sortByRegion = args.options().found("group");
+    bool sortByRegion = args.optionFound("group");
 
     if (sortByRegion)
     {
@@ -115,7 +109,9 @@ int main(int argc, char *argv[])
     }
 
     Info<< "writing " << exportName;
-    if (scaleFactor > 0)
+
+    scalar scaleFactor = 0;
+    if (args.optionReadIfPresent("scale", scaleFactor) && scaleFactor > 0)
     {
         Info<< " with scaling " << scaleFactor;
         surf.scalePoints(scaleFactor);
diff --git a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C
index 8907ac46dbef278d7f02caa80e22bc46dbed87a2..c3a7e5a26dd827dbc21484aefb1c6d7e42dff4e0 100644
--- a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C
+++ b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C
@@ -110,7 +110,7 @@ int main(int argc, char *argv[])
     argList::validOptions.insert("deleteBox", "((x0 y0 z0)(x1 y1 z1))");
     argList args(argc, argv);
 
-    Pout<< "Feature line extraction is only valid on closed manifold surfaces." 
+    Pout<< "Feature line extraction is only valid on closed manifold surfaces."
         << endl;
 
 
@@ -139,27 +139,24 @@ int main(int argc, char *argv[])
 
     surfaceFeatures set(surf);
 
-    if (args.options().found("set"))
+    if (args.optionFound("set"))
     {
-        fileName setName(args.options()["set"]);
+        fileName setName(args.option("set"));
 
         Pout<< "Reading existing feature set from file " << setName << endl;
 
         set = surfaceFeatures(surf, setName);
     }
-    else if (args.options().found("includedAngle"))
+    else if (args.optionFound("includedAngle"))
     {
-        scalar includedAngle
-        (
-            readScalar(IStringStream(args.options()["includedAngle"])())
-        );
+        scalar includedAngle = args.optionRead<scalar>("includedAngle");
 
         Pout<< "Constructing feature set from included angle " << includedAngle
             << endl;
 
         set = surfaceFeatures(surf, includedAngle);
 
-        Pout<< endl << "Writing initial features" << endl;    
+        Pout<< endl << "Writing initial features" << endl;
         set.write("initial.fSet");
         set.writeObj("initial");
     }
@@ -190,16 +187,14 @@ int main(int argc, char *argv[])
     // ~~~~~~~~
 
     scalar minLen = -GREAT;
-    if (args.options().found("minLen"))
+    if (args.optionReadIfPresent("minLen", minLen))
     {
-        minLen = readScalar(IStringStream(args.options()["minLen"])());
         Pout<< "Removing features of length < " << minLen << endl;
     }
-    
+
     label minElem = 0;
-    if (args.options().found("minElem"))
+    if (args.optionReadIfPresent("minElem", minElem))
     {
-        minElem = readLabel(IStringStream(args.options()["minElem"])());
         Pout<< "Removing features with number of edges < " << minElem << endl;
     }
 
@@ -207,7 +202,7 @@ int main(int argc, char *argv[])
     if (minLen > 0 || minLen > 0)
     {
         set.trimFeatures(minLen, minElem);
-        Pout<< endl << "Removed small features" << endl;    
+        Pout<< endl << "Removed small features" << endl;
     }
 
 
@@ -218,9 +213,9 @@ int main(int argc, char *argv[])
     // Convert to marked edges, points
     List<surfaceFeatures::edgeStatus> edgeStat(set.toStatus());
 
-    if (args.options().found("subsetBox"))
+    if (args.optionFound("subsetBox"))
     {
-        treeBoundBox bb(IStringStream(args.options()["subsetBox"])());
+        treeBoundBox bb(args.optionLookup("subsetBox")());
 
         Pout<< "Removing all edges outside bb " << bb << endl;
         dumpBox(bb, "subsetBox.obj");
@@ -233,9 +228,9 @@ int main(int argc, char *argv[])
             edgeStat
         );
     }
-    else if (args.options().found("deleteBox"))
+    else if (args.optionFound("deleteBox"))
     {
-        treeBoundBox bb(IStringStream(args.options()["deleteBox"])());
+        treeBoundBox bb(args.optionLookup("deleteBox")());
 
         Pout<< "Removing all edges inside bb " << bb << endl;
         dumpBox(bb, "deleteBox.obj");
@@ -254,7 +249,7 @@ int main(int argc, char *argv[])
 
     Pout<< endl << "Writing trimmed features to " << outFileName << endl;
     newSet.write(outFileName);
-    
+
     Pout<< endl << "Writing edge objs." << endl;
     newSet.writeObj("final");
 
diff --git a/applications/utilities/surface/surfaceFind/surfaceFind.C b/applications/utilities/surface/surfaceFind/surfaceFind.C
index e162c179b69548021f5641a45ea0cbfb3c5de3a3..13d769fd1a7795b25c10fab05b888abc923b1e73 100644
--- a/applications/utilities/surface/surfaceFind/surfaceFind.C
+++ b/applications/utilities/surface/surfaceFind/surfaceFind.C
@@ -52,10 +52,12 @@ int main(int argc, char *argv[])
 
     argList args(argc, argv);
 
-    scalar x(readScalar(IStringStream(args.options()["x"])()));
-    scalar y(readScalar(IStringStream(args.options()["y"])()));
-    scalar z(readScalar(IStringStream(args.options()["z"])()));
-    point samplePt(x, y, z);
+    point samplePt
+    (
+        args.optionRead<scalar>("x"),
+        args.optionRead<scalar>("y"),
+        args.optionRead<scalar>("z")
+    );
     Info<< "Looking for nearest face/vertex to " << samplePt << endl;
 
 
diff --git a/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C b/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C
index 4f607e89fb15b477ddc6238805068db482c5d80a..6e730cc60ab3ef201ca86de13f11c4400513f925 100644
--- a/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C
+++ b/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C
@@ -110,13 +110,13 @@ int main(int argc, char *argv[])
     autoPtr<coordinateSystem> fromCsys;
     autoPtr<coordinateSystem> toCsys;
 
-    if (args.options().found("from") || args.options().found("to"))
+    if (args.optionFound("from") || args.optionFound("to"))
     {
         autoPtr<IOobject> csDictIoPtr;
 
-        if (args.options().found("dict"))
+        if (args.optionFound("dict"))
         {
-            fileName dictPath(args.options()["dict"]);
+            fileName dictPath(args.option("dict"));
 
             csDictIoPtr.set
             (
@@ -161,9 +161,9 @@ int main(int argc, char *argv[])
 
         coordinateSystems csLst(csDictIoPtr());
 
-        if (args.options().found("from"))
+        if (args.optionFound("from"))
         {
-            const word csName(args.options()["from"]);
+            const word csName(args.option("from"));
 
             label csId = csLst.find(csName);
             if (csId < 0)
@@ -177,9 +177,9 @@ int main(int argc, char *argv[])
             fromCsys.reset(new coordinateSystem(csLst[csId]));
         }
 
-        if (args.options().found("to"))
+        if (args.optionFound("to"))
         {
-            const word csName(args.options()["to"]);
+            const word csName(args.option("to"));
 
             label csId = csLst.find(csName);
             if (csId < 0)
@@ -203,32 +203,23 @@ int main(int argc, char *argv[])
         }
     }
 
-    scalar scaleIn = 0;
-    scalar scaleOut = 0;
-    if (args.options().found("scaleIn"))
-    {
-        IStringStream(args.options()["scaleIn"])() >> scaleIn;
-    }
-    if (args.options().found("scaleOut"))
-    {
-        IStringStream(args.options()["scaleOut"])() >> scaleOut;
-    }
-
 
     {
         MeshedSurface<face> surf(importName);
 
-        if (args.options().found("clean"))
+        if (args.optionFound("clean"))
         {
             surf.cleanup(true);
         }
 
-        if (scaleIn > 0)
+        scalar scaleIn = 0;
+        if (args.optionReadIfPresent("scaleIn", scaleIn) && scaleIn > 0)
         {
             Info<< " -scaleIn " << scaleIn << endl;
             surf.scalePoints(scaleIn);
         }
 
+
         if (fromCsys.valid())
         {
             Info<< " -from " << fromCsys().name() << endl;
@@ -243,7 +234,8 @@ int main(int argc, char *argv[])
             surf.movePoints(tpf());
         }
 
-        if (scaleOut > 0)
+        scalar scaleOut = 0;
+        if (args.optionReadIfPresent("scaleOut", scaleOut) && scaleOut > 0)
         {
             Info<< " -scaleOut " << scaleOut << endl;
             surf.scalePoints(scaleOut);
diff --git a/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C b/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C
index f245e4088bcb300b122f19e5ec5a6ddf2ceb97d9..e53a8616d824e3ad1d61a6542f8a35fcb7c940e1 100644
--- a/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C
+++ b/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C
@@ -86,10 +86,7 @@ int main(int argc, char *argv[])
     const stringList& params = args.additionalArgs();
 
     scalar scaleFactor = 0;
-    if (args.options().found("scale"))
-    {
-        IStringStream(args.options()["scale"])() >> scaleFactor;
-    }
+    args.optionReadIfPresent("scale", scaleFactor);
 
     fileName importName(params[0]);
     fileName exportName(params[1]);
@@ -110,7 +107,7 @@ int main(int argc, char *argv[])
         return 1;
     }
 
-    if (args.options().found("triSurface"))
+    if (args.optionFound("triSurface"))
     {
         triSurface surf(importName);
 
@@ -118,14 +115,14 @@ int main(int argc, char *argv[])
         surf.writeStats(Info);
         Info<< endl;
 
-        if (args.options().found("orient"))
+        if (args.optionFound("orient"))
         {
             Info<< "Checking surface orientation" << endl;
             PatchTools::checkOrientation(surf, true);
             Info<< endl;
         }
 
-        if (args.options().found("clean"))
+        if (args.optionFound("clean"))
         {
             Info<< "Cleaning up surface" << endl;
             surf.cleanup(true);
@@ -149,7 +146,7 @@ int main(int argc, char *argv[])
         // write sorted by region
         surf.write(exportName, true);
     }
-    else if (args.options().found("unsorted"))
+    else if (args.optionFound("unsorted"))
     {
         UnsortedMeshedSurface<face> surf(importName);
 
@@ -157,14 +154,14 @@ int main(int argc, char *argv[])
         surf.writeStats(Info);
         Info<< endl;
 
-        if (args.options().found("orient"))
+        if (args.optionFound("orient"))
         {
             Info<< "Checking surface orientation" << endl;
             PatchTools::checkOrientation(surf, true);
             Info<< endl;
         }
 
-        if (args.options().found("clean"))
+        if (args.optionFound("clean"))
         {
             Info<< "Cleaning up surface" << endl;
             surf.cleanup(true);
@@ -187,7 +184,7 @@ int main(int argc, char *argv[])
         surf.write(exportName);
     }
 #if 1
-    else if (args.options().found("triFace"))
+    else if (args.optionFound("triFace"))
     {
         MeshedSurface<triFace> surf(importName);
 
@@ -195,14 +192,14 @@ int main(int argc, char *argv[])
         surf.writeStats(Info);
         Info<< endl;
 
-        if (args.options().found("orient"))
+        if (args.optionFound("orient"))
         {
             Info<< "Checking surface orientation" << endl;
             PatchTools::checkOrientation(surf, true);
             Info<< endl;
         }
 
-        if (args.options().found("clean"))
+        if (args.optionFound("clean"))
         {
             Info<< "Cleaning up surface" << endl;
             surf.cleanup(true);
@@ -233,14 +230,14 @@ int main(int argc, char *argv[])
         surf.writeStats(Info);
         Info<< endl;
 
-        if (args.options().found("orient"))
+        if (args.optionFound("orient"))
         {
             Info<< "Checking surface orientation" << endl;
             PatchTools::checkOrientation(surf, true);
             Info<< endl;
         }
 
-        if (args.options().found("clean"))
+        if (args.optionFound("clean"))
         {
             Info<< "Cleaning up surface" << endl;
             surf.cleanup(true);
@@ -263,7 +260,7 @@ int main(int argc, char *argv[])
         }
         surf.write(exportName);
 
-        if (args.options().found("surfMesh"))
+        if (args.optionFound("surfMesh"))
         {
             Foam::Time runTime
             (
diff --git a/applications/utilities/surface/surfaceMeshExport/surfaceMeshExport.C b/applications/utilities/surface/surfaceMeshExport/surfaceMeshExport.C
index 34d93c93ebecb6e0f51f905366c33342b365fde4..b6538d0bc17900e50a8cf57635b7078aecd04b3a 100644
--- a/applications/utilities/surface/surfaceMeshExport/surfaceMeshExport.C
+++ b/applications/utilities/surface/surfaceMeshExport/surfaceMeshExport.C
@@ -89,6 +89,7 @@ int main(int argc, char *argv[])
 
     fileName exportName(params[0]);
     word importName("default");
+    args.optionReadIfPresent("name", importName);
 
     // check that writing is supported
     if (!MeshedSurface<face>::canWriteType(exportName.ext(), true))
@@ -96,23 +97,18 @@ int main(int argc, char *argv[])
         return 1;
     }
 
-    if (args.options().found("name"))
-    {
-        importName = args.options()["name"];
-    }
-
 
     // get the coordinate transformations
     autoPtr<coordinateSystem> fromCsys;
     autoPtr<coordinateSystem> toCsys;
 
-    if (args.options().found("from") || args.options().found("to"))
+    if (args.optionFound("from") || args.optionFound("to"))
     {
         autoPtr<IOobject> ioPtr;
 
-        if (args.options().found("dict"))
+        if (args.optionFound("dict"))
         {
-            fileName dictPath(args.options()["dict"]);
+            fileName dictPath(args.option("dict"));
 
             ioPtr.set
             (
@@ -157,9 +153,9 @@ int main(int argc, char *argv[])
 
         coordinateSystems csLst(ioPtr());
 
-        if (args.options().found("from"))
+        if (args.optionFound("from"))
         {
-            const word csName(args.options()["from"]);
+            const word csName(args.option("from"));
 
             label csId = csLst.find(csName);
             if (csId < 0)
@@ -173,9 +169,9 @@ int main(int argc, char *argv[])
             fromCsys.reset(new coordinateSystem(csLst[csId]));
         }
 
-        if (args.options().found("to"))
+        if (args.optionFound("to"))
         {
-            const word csName(args.options()["to"]);
+            const word csName(args.option("to"));
 
             label csId = csLst.find(csName);
             if (csId < 0)
@@ -219,24 +215,13 @@ int main(int argc, char *argv[])
 
     MeshedSurface<face> surf(smesh);
 
-    if (args.options().found("clean"))
+    if (args.optionFound("clean"))
     {
         surf.cleanup(true);
     }
 
     scalar scaleIn = 0;
-    scalar scaleOut = 0;
-    if (args.options().found("scaleIn"))
-    {
-        IStringStream(args.options()["scaleIn"])() >> scaleIn;
-    }
-    if (args.options().found("scaleOut"))
-    {
-        IStringStream(args.options()["scaleOut"])() >> scaleOut;
-    }
-
-
-    if (scaleIn > 0)
+    if (args.optionReadIfPresent("scaleIn", scaleIn) && scaleIn > 0)
     {
         Info<< " -scaleIn " << scaleIn << endl;
         surf.scalePoints(scaleIn);
@@ -256,7 +241,8 @@ int main(int argc, char *argv[])
         surf.movePoints(tpf());
     }
 
-    if (scaleOut > 0)
+    scalar scaleOut = 0;
+    if (args.optionReadIfPresent("scaleOut", scaleOut) && scaleOut > 0)
     {
         Info<< " -scaleOut " << scaleOut << endl;
         surf.scalePoints(scaleOut);
diff --git a/applications/utilities/surface/surfaceMeshImport/surfaceMeshImport.C b/applications/utilities/surface/surfaceMeshImport/surfaceMeshImport.C
index 0cb131e4ebefded7fb56483c137ed23f55b3fc86..808eefcd76c0104f5243fe99bc398cf4e2f7023d 100644
--- a/applications/utilities/surface/surfaceMeshImport/surfaceMeshImport.C
+++ b/applications/utilities/surface/surfaceMeshImport/surfaceMeshImport.C
@@ -103,6 +103,7 @@ int main(int argc, char *argv[])
 
     fileName importName(params[0]);
     word exportName("default");
+    args.optionReadIfPresent("name", exportName);
 
     // check that reading is supported
     if (!MeshedSurface<face>::canRead(importName, true))
@@ -110,23 +111,18 @@ int main(int argc, char *argv[])
         return 1;
     }
 
-    if (args.options().found("name"))
-    {
-        exportName = args.options()["name"];
-    }
-
 
     // get the coordinate transformations
     autoPtr<coordinateSystem> fromCsys;
     autoPtr<coordinateSystem> toCsys;
 
-    if (args.options().found("from") || args.options().found("to"))
+    if (args.optionFound("from") || args.optionFound("to"))
     {
         autoPtr<IOobject> ioPtr;
 
-        if (args.options().found("dict"))
+        if (args.optionFound("dict"))
         {
-            fileName dictPath(args.options()["dict"]);
+            fileName dictPath(args.option("dict"));
 
             ioPtr.set
             (
@@ -171,9 +167,9 @@ int main(int argc, char *argv[])
 
         coordinateSystems csLst(ioPtr());
 
-        if (args.options().found("from"))
+        if (args.optionFound("from"))
         {
-            const word csName(args.options()["from"]);
+            const word csName(args.option("from"));
 
             label csId = csLst.find(csName);
             if (csId < 0)
@@ -187,9 +183,9 @@ int main(int argc, char *argv[])
             fromCsys.reset(new coordinateSystem(csLst[csId]));
         }
 
-        if (args.options().found("to"))
+        if (args.optionFound("to"))
         {
-            const word csName(args.options()["to"]);
+            const word csName(args.option("to"));
 
             label csId = csLst.find(csName);
             if (csId < 0)
@@ -217,25 +213,14 @@ int main(int argc, char *argv[])
 
     MeshedSurface<face> surf(importName);
 
-    if (args.options().found("clean"))
+    if (args.optionFound("clean"))
     {
         surf.cleanup(true);
     }
 
 
     scalar scaleIn = 0;
-    scalar scaleOut = 0;
-    if (args.options().found("scaleIn"))
-    {
-        IStringStream(args.options()["scaleIn"])() >> scaleIn;
-    }
-    if (args.options().found("scaleOut"))
-    {
-        IStringStream(args.options()["scaleOut"])() >> scaleOut;
-    }
-
-
-    if (scaleIn > 0)
+    if (args.optionReadIfPresent("scaleIn", scaleIn) && scaleIn > 0)
     {
         Info<< " -scaleIn " << scaleIn << endl;
         surf.scalePoints(scaleIn);
@@ -255,7 +240,8 @@ int main(int argc, char *argv[])
         surf.movePoints(tpf());
     }
 
-    if (scaleOut > 0)
+    scalar scaleOut = 0;
+    if (args.optionReadIfPresent("scaleOut", scaleOut) && scaleOut > 0)
     {
         Info<< " -scaleOut " << scaleOut << endl;
         surf.scalePoints(scaleOut);
diff --git a/applications/utilities/surface/surfaceMeshTriangulate/surfaceMeshTriangulate.C b/applications/utilities/surface/surfaceMeshTriangulate/surfaceMeshTriangulate.C
index a57f7c9d48de064208d21658246fc6fd80c253f1..3ea9e07a82e02f278f2d70275014151d50796a1f 100644
--- a/applications/utilities/surface/surfaceMeshTriangulate/surfaceMeshTriangulate.C
+++ b/applications/utilities/surface/surfaceMeshTriangulate/surfaceMeshTriangulate.C
@@ -69,7 +69,7 @@ int main(int argc, char *argv[])
 
     bool includeProcPatches =
        !(
-            args.options().found("excludeProcPatches")
+            args.optionFound("excludeProcPatches")
          || Pstream::parRun()
         );
 
@@ -78,15 +78,15 @@ int main(int argc, char *argv[])
     // - all patches (default in sequential mode)
     // - all non-processor patches (default in parallel mode)
     // - all non-processor patches (sequential mode, -excludeProcPatches option)
-    
+
     // Construct table of patches to include.
     const polyBoundaryMesh& bMesh = mesh.boundaryMesh();
 
     labelHashSet includePatches(bMesh.size());
 
-    if (args.options().found("patches"))
+    if (args.optionFound("patches"))
     {
-        wordList patchNames(IStringStream(args.options()["patches"])());
+        wordList patchNames(args.optionLookup("patches")());
 
         forAll(patchNames, patchNameI)
         {
diff --git a/applications/utilities/surface/surfaceOrient/surfaceOrient.C b/applications/utilities/surface/surfaceOrient/surfaceOrient.C
index 720b858a211fc3b17e574b679ed5ef296d686840..1b728711cdce6ff1c052009698d5a5c3e19cad83 100644
--- a/applications/utilities/surface/surfaceOrient/surfaceOrient.C
+++ b/applications/utilities/surface/surfaceOrient/surfaceOrient.C
@@ -54,7 +54,7 @@ int main(int argc, char *argv[])
     point visiblePoint(IStringStream(args.additionalArgs()[1])());
     Info<< "Visible point " << visiblePoint << endl;
 
-    bool orientInside = args.options().found("inside");
+    bool orientInside = args.optionFound("inside");
 
     if (orientInside)
     {
diff --git a/applications/utilities/surface/surfaceSplitNonManifolds/surfaceSplitNonManifolds.C b/applications/utilities/surface/surfaceSplitNonManifolds/surfaceSplitNonManifolds.C
index b56c8e2cf0c8f0be83f9bbf079d967e5d07f7cf2..8608fe33af6a6c8291bf8fbf06264b809b3049be 100644
--- a/applications/utilities/surface/surfaceSplitNonManifolds/surfaceSplitNonManifolds.C
+++ b/applications/utilities/surface/surfaceSplitNonManifolds/surfaceSplitNonManifolds.C
@@ -692,7 +692,7 @@ int main(int argc, char *argv[])
 
     fileName inSurfName(args.additionalArgs()[0]);
     fileName outSurfName(args.additionalArgs()[1]);
-    bool debug = args.options().found("debug");
+    bool debug = args.optionFound("debug");
 
 
     Info<< "Reading surface from " << inSurfName << endl;
diff --git a/applications/utilities/surface/surfaceToPatch/surfaceToPatch.C b/applications/utilities/surface/surfaceToPatch/surfaceToPatch.C
index baf64f35555ffd0d8d75e906e2d38bb10aca233f..87ce69ddf77b49e8b52ede588d7918f4f83fd07d 100644
--- a/applications/utilities/surface/surfaceToPatch/surfaceToPatch.C
+++ b/applications/utilities/surface/surfaceToPatch/surfaceToPatch.C
@@ -177,12 +177,12 @@ int main(int argc, char *argv[])
 
     Info<< "Reading surface from " << surfName << " ..." << endl;
 
-    bool readSet = args.options().found("faceSet");
+    bool readSet = args.optionFound("faceSet");
     word setName;
 
     if (readSet)
     {
-        setName = args.options()["faceSet"];
+        setName = args.option("faceSet");
 
         Info<< "Repatching only the faces in faceSet " << setName
             << " according to nearest surface triangle ..." << endl;
@@ -194,11 +194,7 @@ int main(int argc, char *argv[])
     }
 
     scalar searchTol = 1E-3;
-
-    if (args.options().found("tol"))
-    {
-        searchTol =  readScalar(IStringStream(args.options()["tol"])());
-    }
+    args.optionReadIfPresent("tol", searchTol);
 
     // Get search box. Anything not within this box will not be considered.
     const boundBox& meshBb = mesh.globalData().bb();
diff --git a/applications/utilities/surface/surfaceTransformPoints/surfaceTransformPoints.C b/applications/utilities/surface/surfaceTransformPoints/surfaceTransformPoints.C
index 1d4597515d818d59f46eee4da17abee34d1ee34e..c3243b71ae82f02347fa25c4a98cae57b8626705 100644
--- a/applications/utilities/surface/surfaceTransformPoints/surfaceTransformPoints.C
+++ b/applications/utilities/surface/surfaceTransformPoints/surfaceTransformPoints.C
@@ -86,18 +86,18 @@ int main(int argc, char *argv[])
 
     pointField points(surf1.points());
 
-    if (args.options().found("translate"))
+    if (args.optionFound("translate"))
     {
-        vector transVector(IStringStream(args.options()["translate"])());
+        vector transVector(args.optionLookup("translate")());
 
         Info<< "Translating points by " << transVector << endl;
 
         points += transVector;
     }
 
-    if (args.options().found("rotate"))
+    if (args.optionFound("rotate"))
     {
-        Pair<vector> n1n2(IStringStream(args.options()["rotate"])());
+        Pair<vector> n1n2(args.optionLookup("rotate")());
         n1n2[0] /= mag(n1n2[0]);
         n1n2[1] /= mag(n1n2[1]);
 
@@ -107,9 +107,9 @@ int main(int argc, char *argv[])
 
         points = transform(T, points);
     }
-    else if (args.options().found("rollPitchYaw"))
+    else if (args.optionFound("rollPitchYaw"))
     {
-        vector v(IStringStream(args.options()["rollPitchYaw"])());
+        vector v(args.optionLookup("rollPitchYaw")());
 
         Info<< "Rotating points by" << nl
             << "    roll  " << v.x() << nl
@@ -125,9 +125,9 @@ int main(int argc, char *argv[])
         Info<< "Rotating points by quaternion " << R << endl;
         points = transform(R, points);
     }
-    else if (args.options().found("yawPitchRoll"))
+    else if (args.optionFound("yawPitchRoll"))
     {
-        vector v(IStringStream(args.options()["yawPitchRoll"])());
+        vector v(args.optionLookup("yawPitchRoll")());
 
         Info<< "Rotating points by" << nl
             << "    yaw   " << v.x() << nl
@@ -150,9 +150,9 @@ int main(int argc, char *argv[])
         points = transform(R, points);
     }
 
-    if (args.options().found("scale"))
+    if (args.optionFound("scale"))
     {
-        vector scaleVector(IStringStream(args.options()["scale"])());
+        vector scaleVector(args.optionLookup("scale")());
 
         Info<< "Scaling points by " << scaleVector << endl;
 
diff --git a/src/OpenFOAM/include/addConstantOption.H b/src/OpenFOAM/include/addConstantOption.H
deleted file mode 100644
index 22ef88d33b07526849dc9a3f1a01509675db5501..0000000000000000000000000000000000000000
--- a/src/OpenFOAM/include/addConstantOption.H
+++ /dev/null
@@ -1 +0,0 @@
-    argList::validOptions.insert("constant", "");
diff --git a/src/OpenFOAM/include/addLatestTimeOption.H b/src/OpenFOAM/include/addLatestTimeOption.H
deleted file mode 100644
index d241032e9a1c6b1ce9e5b77ca54d3f1eca634ae9..0000000000000000000000000000000000000000
--- a/src/OpenFOAM/include/addLatestTimeOption.H
+++ /dev/null
@@ -1 +0,0 @@
-    argList::validOptions.insert("latestTime", "");
diff --git a/src/OpenFOAM/include/addNoZeroOption.H b/src/OpenFOAM/include/addNoZeroOption.H
deleted file mode 100644
index deb25ee153254ca6e6478417e40bd5fc1000c7a3..0000000000000000000000000000000000000000
--- a/src/OpenFOAM/include/addNoZeroOption.H
+++ /dev/null
@@ -1 +0,0 @@
-    argList::validOptions.insert("noZero", "");
diff --git a/src/OpenFOAM/include/addTimeOption.H b/src/OpenFOAM/include/addTimeOption.H
deleted file mode 100644
index 1151c51dfde6b8e1a0e4e36f23117b21b8c3ba0f..0000000000000000000000000000000000000000
--- a/src/OpenFOAM/include/addTimeOption.H
+++ /dev/null
@@ -1 +0,0 @@
-    argList::validOptions.insert("time", "time");
diff --git a/src/OpenFOAM/include/addTimeOptions.H b/src/OpenFOAM/include/addTimeOptions.H
index 016d9c3ea56e9a62e9a63df16fa0bed71d2a2b03..d55374486b3625485d3e4aeef7ddb041bb5becad 100644
--- a/src/OpenFOAM/include/addTimeOptions.H
+++ b/src/OpenFOAM/include/addTimeOptions.H
@@ -1,4 +1,8 @@
-#include "addConstantOption.H"
-#include "addTimeOption.H"
-#include "addLatestTimeOption.H"
-#include "addNoZeroOption.H"
+//
+// addTimeOptions.H
+// ~~~~~~~~~~~~~~~~
+
+    argList::validOptions.insert("constant", "");
+    argList::validOptions.insert("latestTime", "");
+    argList::validOptions.insert("noZero", "");
+    argList::validOptions.insert("time", "time");
diff --git a/src/OpenFOAM/include/addTimeOptionsNoConstant.H b/src/OpenFOAM/include/addTimeOptionsNoConstant.H
deleted file mode 100644
index 91056f6a3a49f7735ffc137a0404095cc172c549..0000000000000000000000000000000000000000
--- a/src/OpenFOAM/include/addTimeOptionsNoConstant.H
+++ /dev/null
@@ -1,2 +0,0 @@
-#include "addTimeOption.H"
-#include "addLatestTimeOption.H"
diff --git a/src/OpenFOAM/include/checkConstantOption.H b/src/OpenFOAM/include/checkConstantOption.H
index 4b5dbc4356bf1b5cdf0f9bfd4965db5bb023e816..be3aa5b9f75184f1117fcbced0af279aaa856249 100644
--- a/src/OpenFOAM/include/checkConstantOption.H
+++ b/src/OpenFOAM/include/checkConstantOption.H
@@ -1,8 +1,4 @@
-    if
-    (
-        !args.options().found("constant")
-     && Times.size() > 1
-    )
-    {    
+    if (Times.size() > 1 && !args.optionFound("constant"))
+    {
         startTime = 1;
     }
diff --git a/src/OpenFOAM/include/checkLatestTimeOption.H b/src/OpenFOAM/include/checkLatestTimeOption.H
index 9256865d2fa40e932f4aa062a53a9621a1672a62..38d24a34d5d23e8cbaf3d8c7640e6109802ed206 100644
--- a/src/OpenFOAM/include/checkLatestTimeOption.H
+++ b/src/OpenFOAM/include/checkLatestTimeOption.H
@@ -1,4 +1,4 @@
-    if (args.options().found("latestTime"))
+    if (args.optionFound("latestTime"))
     {
         startTime = Times.size() - 1;
     }
diff --git a/src/OpenFOAM/include/checkTimeOption.H b/src/OpenFOAM/include/checkTimeOption.H
index 70759dd81ba12b91617ed714a2ef9be8040b236a..a3a43141fc5125d4c04f7327d3f432a0be3fd20d 100644
--- a/src/OpenFOAM/include/checkTimeOption.H
+++ b/src/OpenFOAM/include/checkTimeOption.H
@@ -1,6 +1,6 @@
-    if (args.options().found("time"))
+    if (args.optionFound("time"))
     {
-        scalar timeValue(readScalar(IStringStream(args.options()["time"])()));
+        scalar timeValue = args.optionRead<scalar>("time");
 
         startTime = Time::findClosestTimeIndex(Times, timeValue);
         endTime = startTime + 1;
diff --git a/src/OpenFOAM/include/createNamedMesh.H b/src/OpenFOAM/include/createNamedMesh.H
index 2caebe8583985b5d85543c15bfdb730dfb972b43..fe61435e479b194a0862aa3e459efc961c8bbfd9 100644
--- a/src/OpenFOAM/include/createNamedMesh.H
+++ b/src/OpenFOAM/include/createNamedMesh.H
@@ -1,16 +1,13 @@
     word regionName;
 
-    if (args.options().found("region"))
+    if (args.optionReadIfPresent("region", regionName))
     {
-        regionName = args.options()["region"];
-
         Info<< "Create mesh " << regionName << " for time = "
             << runTime.timeName() << nl << endl;
     }
     else
     {
         regionName = fvMesh::defaultRegion;
-
         Info<< "Create mesh for time = "
             << runTime.timeName() << nl << endl;
     }
diff --git a/src/OpenFOAM/include/createNamedPolyMesh.H b/src/OpenFOAM/include/createNamedPolyMesh.H
index 4bb8d1d34a53ed5133b580e2ee77c33e50bad5c6..a1670fb8ed0c29112b1da405e9a05ae301b75e22 100644
--- a/src/OpenFOAM/include/createNamedPolyMesh.H
+++ b/src/OpenFOAM/include/createNamedPolyMesh.H
@@ -1,16 +1,13 @@
     word regionName;
 
-    if (args.options().found("region"))
+    if (args.optionReadIfPresent("region", regionName))
     {
-        regionName = args.options()["region"];
-
         Info<< "Create polyMesh " << regionName << " for time = "
             << runTime.timeName() << nl << endl;
     }
     else
     {
         regionName = polyMesh::defaultRegion;
-
         Info<< "Create polyMesh for time = "
             << runTime.timeName() << nl << endl;
     }