diff --git a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
index 78df05d1927b95807c3ce86d16cafe72e773b688..546b53d74db517e35cae11437f5ff2d3035c5182 100644
--- a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
+++ b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
@@ -440,7 +440,7 @@ int main(int argc, char *argv[])
     {
         const wordRes patchNames(args.getList<wordRe>("patches"));
 
-        if (patchNames.size() == 1 && !patchNames.first().isPattern())
+        if (patchNames.size() == 1 && patchNames.first().isLiteral())
         {
             exposedPatchIDs.first() =
                 getExposedPatchId(mesh, patchNames.first());
diff --git a/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C b/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C
index 6a41293989ed74fed11b2e1bfa95491d3021885d..25e452fce368657265be07f744cb6428594ea014 100644
--- a/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C
+++ b/src/OpenFOAM/db/dictionary/functionEntries/removeEntry/removeEntry.C
@@ -58,7 +58,7 @@ bool Foam::functionEntries::removeEntry::execute
 
     for (const keyType& key : patterns)
     {
-        if (key.find('/') != string::npos || !key.isPattern())
+        if (key.isLiteral() && key.find('/') != string::npos)
         {
             // Remove scoped keyword, or keyword in the local scope
             dictionary::searcher finder =
diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C
index 53faf5c0469f540206edc32009b1ab6d02093cd3..ee127be2788d4c88ea55f4bac503a1b994800694 100644
--- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C
+++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C
@@ -53,7 +53,7 @@ readField
     //    patch name since is key of dictionary.
     forAllConstIter(dictionary, dict, iter)
     {
-        if (iter().isDict() && !iter().keyword().isPattern())
+        if (iter().isDict() && iter().keyword().isLiteral())
         {
             const label patchi = bmesh_.findPatchID(iter().keyword());
 
@@ -96,7 +96,7 @@ readField
         {
             const entry& e = iter();
 
-            if (e.isDict() && !e.keyword().isPattern())
+            if (e.isDict() && e.keyword().isLiteral())
             {
                 const labelList patchIds =
                     bmesh_.indices(e.keyword(), true); // use patchGroups
diff --git a/src/OpenFOAM/primitives/strings/keyType/keyType.H b/src/OpenFOAM/primitives/strings/keyType/keyType.H
index 188c66e738fa7a693a4d23e440b2a95745c32b9d..608468105f96132a545672dc8559990b634987ed 100644
--- a/src/OpenFOAM/primitives/strings/keyType/keyType.H
+++ b/src/OpenFOAM/primitives/strings/keyType/keyType.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2017-2018 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -29,8 +29,7 @@ Description
 
     A keyType is the keyword of a dictionary.
     It differs from word in that it also accepts patterns (regular expressions).
-    It is very similar to wordRe, but doesn't store the regular expression
-    separately.
+    It is very similar to wordRe, but doesn't store a regular expression.
 
 SourceFiles
     keyType.C
@@ -47,12 +46,10 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward declarations
+class keyType;
 class Istream;
 class Ostream;
-
-// Forward declaration of friend functions and operators
-class keyType;
 Istream& operator>>(Istream& is, keyType& kw);
 Ostream& operator<<(Ostream& os, const keyType& kw);
 
@@ -70,6 +67,7 @@ class keyType
         //- Is the keyType a pattern (regular expression)
         bool isPattern_;
 
+
     // Private Member Functions
 
         //- No assignment where we cannot determine string/word type
@@ -121,14 +119,17 @@ public:
         keyType(Istream& is);
 
 
-    // Member functions
+    // Member Functions
 
         //- Is this character valid for a keyType?
         //  This is largely identical with what word accepts, but also
         //  permit brace-brackets, which are valid for some regexs.
         inline static bool valid(char c);
 
-        //- Treat as a pattern rather than a literal string?
+        //- The keyType is treated as literal, not as pattern.
+        inline bool isLiteral() const;
+
+        //- The keyType is treated as a pattern, not as literal string.
         inline bool isPattern() const;
 
         //- Swap contents
@@ -139,7 +140,7 @@ public:
         bool match(const std::string& text, bool literal = false) const;
 
 
-    // Member operators
+    // Member Operators
 
         //- Perform smart match on text, as per match()
         //  Allows use as a predicate.
@@ -162,7 +163,7 @@ public:
         inline void operator=(const char* s);
 
 
-    // IOstream operators
+    // IOstream Operators
 
         friend Istream& operator>>(Istream& is, keyType& kw);
         friend Ostream& operator<<(Ostream& os, const keyType& kw);
diff --git a/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H b/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H
index 3885e6ecf2ba22dd200ad8cb174101158b8dd7e7..bf84de6a2384888d2ee825e5a1d71b6d7052a510 100644
--- a/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H
+++ b/src/OpenFOAM/primitives/strings/keyType/keyTypeI.H
@@ -84,7 +84,6 @@ inline Foam::keyType::keyType(const std::string& s, const bool isPattern)
 {}
 
 
-
 inline Foam::keyType::keyType(keyType&& s)
 :
     word(std::move(static_cast<word&>(s)), false),
@@ -117,6 +116,12 @@ inline Foam::keyType::keyType(std::string&& s, const bool isPattern)
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+inline bool Foam::keyType::isLiteral() const
+{
+    return !isPattern_;
+}
+
+
 inline bool Foam::keyType::isPattern() const
 {
     return isPattern_;
diff --git a/src/OpenFOAM/primitives/strings/wordRe/wordRe.H b/src/OpenFOAM/primitives/strings/wordRe/wordRe.H
index 4c7294aab98fbe801d5744ff9d42c63a328b8f11..9976ecb6dce27419a551067fe10e4bebef96e077 100644
--- a/src/OpenFOAM/primitives/strings/wordRe/wordRe.H
+++ b/src/OpenFOAM/primitives/strings/wordRe/wordRe.H
@@ -59,7 +59,7 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of friend functions and operators
+// Forward declarations
 class wordRe;
 class Istream;
 class Ostream;
@@ -81,6 +81,7 @@ class wordRe
         //- The regular expression
         mutable regExp re_;
 
+
 public:
 
     // Static data members
@@ -97,6 +98,7 @@ public:
         {
             LITERAL = 0, //!< Treat as a string literal
             DETECT  = 1, //!< Detect if the string contains meta-characters
+            UNKNOWN = 1, //!< Unknown content.
             REGEX   = 2, //!< Treat as regular expression
             ICASE   = 4, //!< Ignore case in regular expression
             NOCASE  = 4, //!< \deprecated Alias for ICASE (deprecated APR-2018)
@@ -163,11 +165,14 @@ public:
         wordRe(Istream& is);
 
 
-    // Member functions
+    // Member Functions
 
     // Access
 
-        //- Treat as a pattern rather than a literal string?
+        //- The wordRe is treated as literal, not as pattern.
+        inline bool isLiteral() const;
+
+        //- The wordRe is treated as a pattern, not as literal string.
         inline bool isPattern() const;
 
 
@@ -248,7 +253,7 @@ public:
         inline void operator=(wordRe&& str);
 
 
-    // IOstream operators
+    // IOstream Operators
 
         friend Istream& operator>>(Istream& is, wordRe& w);
         friend Ostream& operator<<(Ostream& os, const wordRe& w);
diff --git a/src/OpenFOAM/primitives/strings/wordRe/wordReI.H b/src/OpenFOAM/primitives/strings/wordRe/wordReI.H
index 5e9532c7b922bf052fa1a1004cb94d84dc4bff39..13579d76c72851dcc95e09874759bf3cdf3cb3ef 100644
--- a/src/OpenFOAM/primitives/strings/wordRe/wordReI.H
+++ b/src/OpenFOAM/primitives/strings/wordRe/wordReI.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2017-2018 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -157,6 +157,12 @@ inline Foam::wordRe::wordRe(const word& str, const compOption opt)
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+inline bool Foam::wordRe::isLiteral() const
+{
+    return !re_.exists();
+}
+
+
 inline bool Foam::wordRe::isPattern() const
 {
     return re_.exists();
diff --git a/src/functionObjects/field/ddt2/ddt2.C b/src/functionObjects/field/ddt2/ddt2.C
index d00fb6d0c6f07e314c5bd2e8fdad6ecee6a7ee5d..73a846f372eb957dcd9f08b4dbbfbbd2b05ec30d 100644
--- a/src/functionObjects/field/ddt2/ddt2.C
+++ b/src/functionObjects/field/ddt2/ddt2.C
@@ -174,9 +174,9 @@ bool Foam::functionObjects::ddt2::execute()
     // Check exact matches first
     for (const wordRe& select : selectFields_)
     {
-        if (!select.isPattern())
+        if (select.isLiteral())
         {
-            const word& fieldName = static_cast<const word&>(select);
+            const word& fieldName = select;
 
             if (!candidates.erase(fieldName))
             {
diff --git a/src/functionObjects/field/zeroGradient/zeroGradient.C b/src/functionObjects/field/zeroGradient/zeroGradient.C
index 1575a9be39400e8a9939c1e0b468d3c408ba12cb..f5b36b79a7d1f2f89d56a0b6b99fc5ced82ca4c4 100644
--- a/src/functionObjects/field/zeroGradient/zeroGradient.C
+++ b/src/functionObjects/field/zeroGradient/zeroGradient.C
@@ -133,9 +133,9 @@ bool Foam::functionObjects::zeroGradient::execute()
     // Check exact matches first
     for (const wordRe& select : selectFields_)
     {
-        if (!select.isPattern())
+        if (select.isLiteral())
         {
-            const word& fieldName = static_cast<const word&>(select);
+            const word& fieldName = select;
 
             if (!candidates.erase(fieldName))
             {
diff --git a/src/functionObjects/utilities/ensightWrite/ensightWrite.C b/src/functionObjects/utilities/ensightWrite/ensightWrite.C
index 75e741c2cbd82bac53363cc962f2b4a191005842..710bee74fe98f550f3eeb2d7dc51956e00aec1d2 100644
--- a/src/functionObjects/utilities/ensightWrite/ensightWrite.C
+++ b/src/functionObjects/utilities/ensightWrite/ensightWrite.C
@@ -284,7 +284,7 @@ bool Foam::functionObjects::ensightWrite::write()
     // Check exact matches first
     for (const wordRe& select : selectFields_)
     {
-        if (!select.isPattern())
+        if (select.isLiteral())
         {
             const word& fieldName = select;