diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C
index 1ed965b75808740f83c7478261c069efe87766fa..76f9706093821963df3f93e2342cd7979f05ad1c 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C
@@ -29,6 +29,24 @@ License
 #include "token.H"
 #include <cctype>
 
+// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+// Adjust stream format based on the flagMask
+inline static void processFlags(Istream& is, int flagMask)
+{
+    if ((flagMask & token::ASCII))
+    {
+        is.format(IOstream::ASCII);
+    }
+    else if ((flagMask & token::BINARY))
+    {
+        is.format(IOstream::BINARY);
+    }
+}
+}
+
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
@@ -121,19 +139,48 @@ Foam::UIPstream::~UIPstream()
 Foam::Istream& Foam::UIPstream::read(token& t)
 {
     // Return the put back token if it exists
+    // - with additional handling for special stream flags
     if (Istream::getBack(t))
     {
-        return *this;
+        if (t.isFlag())
+        {
+            processFlags(*this, t.flagToken());
+        }
+        else
+        {
+            return *this;
+        }
     }
 
-    char c;
+    // Read character, return on error
+    // - with additional handling for special stream flags
 
-    // Return on error
-    if (!read(c))
+    char c;
+    do
     {
-        t.setBad();
-        return *this;
+        if (!read(c))
+        {
+            t.setBad();   // Error
+            return *this;
+        }
+
+        if (c == token::FLAG)
+        {
+            char flagVal;
+
+            if (read(flagVal))
+            {
+                processFlags(*this, flagVal);
+            }
+            else
+            {
+                t.setBad();   // Error
+                return *this;
+            }
+        }
     }
+    while (c == token::FLAG);
+
 
     // Set the line number of this token to the current stream line number
     t.lineNumber() = lineNumber();
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C
index b5c63d0c5760ec928247de88b8f93ef1e80f90ac..6b5a46ed6f2d2f6d75167703583f83f0efe5f1bb 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C
@@ -193,7 +193,8 @@ bool Foam::UOPstream::write(const token& tok)
     {
         case token::tokenType::FLAG :
         {
-            // silently consume the flag
+            writeToBuffer(char(token::tokenType::FLAG));
+            writeToBuffer(char(tok.flagToken()));
 
             return true;
         }