diff --git a/src/OpenFOAM/db/Time/timeSelector.C b/src/OpenFOAM/db/Time/timeSelector.C
index 1930759edf8cc7b8965b719e6ab51525898b1af9..ae53c004c37f89d77a0943ff09e7ffd794b9465c 100644
--- a/src/OpenFOAM/db/Time/timeSelector.C
+++ b/src/OpenFOAM/db/Time/timeSelector.C
@@ -142,7 +142,7 @@ void Foam::timeSelector::addOptions
     (
         "time",
         "ranges",
-        "Comma-separated time ranges - eg, ':10,20,40:70,1000:'"
+        "List of ranges. Eg, ':10,20 40:70 1000:', 'none', etc"
     );
 }
 
diff --git a/src/OpenFOAM/primitives/predicates/scalar/scalarPredicates.H b/src/OpenFOAM/primitives/predicates/scalar/scalarPredicates.H
index fbb57cc559365705c6ad96162717f9d93de6a741..a8da6879b60b433cc76858cbc8db840fcb6fb2b9 100644
--- a/src/OpenFOAM/primitives/predicates/scalar/scalarPredicates.H
+++ b/src/OpenFOAM/primitives/predicates/scalar/scalarPredicates.H
@@ -32,6 +32,9 @@ Description
 Note
     This class is still subject to larger changes (2018-11) as it matures.
 
+SeeAlso
+    Foam::scalarRange, Foam::scalarRanges
+
 SourceFiles
     scalarPredicates.C
     scalarPredicatesI.H
@@ -233,7 +236,10 @@ public:
         using List<unary>::List;
 
         //- Construct from an initializer list of (opName opValue) tuples
-        explicit scalars(std::initializer_list<std::pair<word, scalar>> entries);
+        explicit scalars
+        (
+            std::initializer_list<std::pair<word, scalar>> entries
+        );
 
         //- Copy construct from a list of (opName opValue) tuples
         explicit scalars(const UList<Tuple2<word, scalar>>& entries);
diff --git a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRange.C b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRange.C
index a77bdc2a95ec352118197b500070effedf84255c..8da74e844418ee94a6844016c959b1818dff1045 100644
--- a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRange.C
+++ b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRange.C
@@ -37,6 +37,14 @@ bool Foam::scalarRange::parse(const std::string& str, scalarRange& range)
 
     if (colon == std::string::npos)
     {
+        // No colon
+
+        if (str == "none")
+        {
+            // "none" is an empty (inverse) range
+            return true;
+        }
+
         // "VALUE"
         scalar val;
         if (readScalar(str, val))
@@ -119,11 +127,11 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const scalarRange& range)
             break;
 
         case scalarRange::GE_LE:
-            os << range.min_ << ":" << range.max_;
+            os << range.min_ << ':' << range.max_;
             break;
 
         default:
-            os << "false";
+            os << "none";
             break;
     }
 
diff --git a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRange.H b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRange.H
index 8ab33c987c5fd4895524fdacad9078b808636913..e13aa381fbcbef72b764563fee60f3a08b154d6b 100644
--- a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRange.H
+++ b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRange.H
@@ -30,6 +30,12 @@ Description
     The bound can be specified as an "MIN:MAX" range, as a "MIN:" or ":MAX"
     bound or simply as a single "VALUE".
 
+    When defined via the parse() method, the special string "none" can be
+    used to define an empty (inverse) range.
+
+SeeAlso
+    Foam::predicates::scalars
+
 SourceFiles
     scalarRange.C
 
@@ -103,6 +109,10 @@ public:
         //- Construct by parsing string content.
         //  A colon (:) is used as a range marker or when specifying
         //  greater-than or less-than bounds.
+        //
+        //  \note The special string "none" can be used define an empty
+        //      (inverse) range
+        //
         //  \return True if no parse problems were encountered.
         static bool parse(const std::string& str, scalarRange& range);
 
@@ -150,10 +160,13 @@ public:
         //  For GE, LE bounds it is the min/max value, respectively.
         inline scalar value() const;
 
+        //- True if the value matches the condition.
+        inline bool match(const scalar& value) const;
+
 
     // Member Operators
 
-        //- Unary predicate to test if the value is within the bounds
+        //- Identical to match(), for use as a predicate.
         inline bool operator()(const scalar& value) const;
 
         inline bool operator==(const scalarRange& rhs) const;
diff --git a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRangeI.H b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRangeI.H
index 18cd09d2feedaaca6becf4718410923235a11713..a5c33fbef70e896e409e8f20b10775b51682cf27 100644
--- a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRangeI.H
+++ b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRangeI.H
@@ -152,23 +152,29 @@ inline Foam::scalar Foam::scalarRange::value() const
 }
 
 
-// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
-
-inline bool Foam::scalarRange::operator()(const scalar& value) const
+inline bool Foam::scalarRange::match(const scalar& value) const
 {
     switch (type_)
     {
         case EQ:    return equal(value, min_);
-        case GE:    return value >= min_;
-        case GT:    return value > min_;
-        case LE:    return value <= max_;
-        case LT:    return value < max_;
-        case GE_LE: return value >= min_ && value <= max_;
+        case GE:    return (value >= min_);
+        case GT:    return (value > min_);
+        case LE:    return (value <= max_);
+        case LT:    return (value < max_);
+        case GE_LE: return (value >= min_ && value <= max_);
         default:    return false;
     }
 }
 
 
+// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
+
+inline bool Foam::scalarRange::operator()(const scalar& value) const
+{
+    return match(value);
+}
+
+
 inline bool Foam::scalarRange::operator==(const scalarRange& rhs) const
 {
     return (type_ == rhs.type_ && min_ == rhs.min_ && max_ == rhs.max_);
diff --git a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRanges.C b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRanges.C
index 186efd781ad6b6f6b2abf6aeaf36af19d9015dd7..34f23db246b383df19840b8e1d662319a82e7036 100644
--- a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRanges.C
+++ b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRanges.C
@@ -26,33 +26,39 @@ License
 #include "scalarRanges.H"
 #include "stringOps.H"
 
-// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
 
-Foam::scalarRanges::scalarRanges(const std::string& str)
-:
-    List<scalarRange>()
+Foam::scalarRanges Foam::scalarRanges::parse
+(
+    const std::string& str,
+    bool verbose
+)
 {
     const SubStrings<std::string> items = stringOps::splitAny(str, " ,;");
 
-    setSize(items.size());
+    scalarRanges ranges(items.size());
 
-    label nItems = 0;
+    label n = 0;
 
     for (const auto& item : items)
     {
         const std::string s = item.str();
 
-        if (scalarRange::parse(s, operator[](nItems)))
+        scalarRange& range = ranges[n];
+
+        if (scalarRange::parse(s, range))
         {
-            ++nItems;
+            ++n;
         }
-        else
+        else if (verbose)
         {
             Info<< "Bad scalar-range while parsing: " << s << endl;
         }
     }
 
-    setSize(nItems);
+    ranges.resize(n);
+
+    return ranges;
 }
 
 
diff --git a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRanges.H b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRanges.H
index 89e9f24d9ee5edf652f51105754fbc6c4f483660..4807f9d0dc0afed1b56935af6cc543e9446ac136 100644
--- a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRanges.H
+++ b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRanges.H
@@ -27,6 +27,9 @@ Class
 Description
     A collection of scalar bounds to be used as a unary predicate.
 
+SeeAlso
+    Foam::predicates::scalars
+
 SourceFiles
     scalarRanges.C
 
@@ -55,17 +58,32 @@ public:
 
     // Constructors
 
-        //- Construct null
-        inline scalarRanges();
+        //- Inherit constructors from List of scalarRange
+        using List<scalarRange>::List;
+
+        //- Construct by parsing string for scalar ranges
+        //  The individual items are space, comma or semicolon delimited.
+        //  Optionally report when any range failed to parse
+        inline scalarRanges(const std::string& str, bool verbose = true);
+
 
-        //- Construct by parsing a string for scalar ranges
+    // Static Constructors
+
+        //- Construct by parsing string for scalar ranges
         //  The individual items are space, comma or semicolon delimited.
-        scalarRanges(const std::string& str);
+        static scalarRanges parse(const std::string& str, bool verbose = true);
+
+
+    // Member Functions
+
+        //- Match any condition in the list.
+        //  \return True if the value matches any condition in the list.
+        inline bool match(const scalar& value) const;
 
 
     // Member Operators
 
-        //- Unary predicate to test if the value is within any of the ranges
+        //- Identical to match(), for use as a predicate.
         inline bool operator()(const scalar& value) const;
 
 };
diff --git a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRangesI.H b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRangesI.H
index edc45f84c3ebda5314cc70865f3c706b61308092..3de0b96e4c38718c69be8ca5f10ea7c55a1bed7d 100644
--- a/src/OpenFOAM/primitives/ranges/scalarRange/scalarRangesI.H
+++ b/src/OpenFOAM/primitives/ranges/scalarRange/scalarRangesI.H
@@ -25,15 +25,15 @@ License
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-inline Foam::scalarRanges::scalarRanges()
+inline Foam::scalarRanges::scalarRanges(const std::string& str, bool verbose)
 :
-    List<scalarRange>()
+    List<scalarRange>(scalarRanges::parse(str, verbose))
 {}
 
 
-// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-inline bool Foam::scalarRanges::operator()(const scalar& value) const
+inline bool Foam::scalarRanges::match(const scalar& value) const
 {
     for (const scalarRange& range : *this)
     {
@@ -47,4 +47,12 @@ inline bool Foam::scalarRanges::operator()(const scalar& value) const
 }
 
 
+// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
+
+inline bool Foam::scalarRanges::operator()(const scalar& value) const
+{
+    return match(value);
+}
+
+
 // ************************************************************************* //
diff --git a/tutorials/incompressible/pimpleFoam/RAS/ellipsekkLOmega/Allrun.pre b/tutorials/incompressible/pimpleFoam/RAS/ellipsekkLOmega/Allrun.pre
index 800108cf41ad07a30fb4d943a9671611d2e2a954..f740041ae2f5ebda21b745f7e689690ff9b2a86b 100755
--- a/tutorials/incompressible/pimpleFoam/RAS/ellipsekkLOmega/Allrun.pre
+++ b/tutorials/incompressible/pimpleFoam/RAS/ellipsekkLOmega/Allrun.pre
@@ -20,7 +20,7 @@ runApplication topoSet
 runApplication createPatch -overwrite
 
 runApplication surfaceMeshTriangulate \
-    -patches hole ppGeometry.vtp -constant -time ''
+    -patches hole ppGeometry.vtp -constant -time none
 
 echo "End"