diff --git a/src/OpenFOAM/db/IOstreams/IOstreams/Istream.C b/src/OpenFOAM/db/IOstreams/IOstreams/Istream.C
index 21961c000aa7d488fc93a0e6320dfb24e0e09f1e..cd72d58174803a57e9046787df0ebf0a8f0b9ce0 100644
--- a/src/OpenFOAM/db/IOstreams/IOstreams/Istream.C
+++ b/src/OpenFOAM/db/IOstreams/IOstreams/Istream.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -26,6 +26,26 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "Istream.H"
+#include "ISstream.H"
+
+// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    // Return the current get position for std input stream
+    static inline std::streampos tellg(Istream* isptr)
+    {
+        ISstream* sptr = dynamic_cast<ISstream*>(isptr);
+
+        if (sptr)
+        {
+            return sptr->stdStream().tellg();
+        }
+
+        return 0;
+    }
+}
+
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
@@ -85,26 +105,28 @@ bool Foam::Istream::peekBack(token& tok)
 }
 
 
-Foam::Istream& Foam::Istream::readBegin(const char* funcName)
+bool Foam::Istream::readBegin(const char* funcName)
 {
-    token delimiter(*this);
+    const token delimiter(*this);
+
     if (delimiter != token::BEGIN_LIST)
     {
         setBad();
         FatalIOErrorInFunction(*this)
             << "Expected a '" << token::BEGIN_LIST
             << "' while reading " << funcName
-            << ", found " << delimiter.info()
+            << ", found " << delimiter.info() << nl
             << exit(FatalIOError);
     }
 
-    return *this;
+    return true;
 }
 
 
-Foam::Istream& Foam::Istream::readEnd(const char* funcName)
+bool Foam::Istream::readEnd(const char* funcName)
 {
-    token delimiter(*this);
+    const token delimiter(*this);
+
     if (delimiter != token::END_LIST)
     {
         setBad();
@@ -112,23 +134,17 @@ Foam::Istream& Foam::Istream::readEnd(const char* funcName)
             << "Expected a '" << token::END_LIST
             << "' while reading " << funcName
             << ", found " << delimiter.info()
+            << " at stream position " << tellg(this) << nl
             << exit(FatalIOError);
     }
 
-    return *this;
-}
-
-
-Foam::Istream& Foam::Istream::readEndBegin(const char* funcName)
-{
-    readEnd(funcName);
-    return readBegin(funcName);
+    return true;
 }
 
 
 char Foam::Istream::readBeginList(const char* funcName)
 {
-    token delimiter(*this);
+    const token delimiter(*this);
 
     if (delimiter != token::BEGIN_LIST && delimiter != token::BEGIN_BLOCK)
     {
@@ -149,7 +165,7 @@ char Foam::Istream::readBeginList(const char* funcName)
 
 char Foam::Istream::readEndList(const char* funcName)
 {
-    token delimiter(*this);
+    const token delimiter(*this);
 
     if (delimiter != token::END_LIST && delimiter != token::END_BLOCK)
     {
@@ -159,6 +175,7 @@ char Foam::Istream::readEndList(const char* funcName)
             << "' or a '" << token::END_BLOCK
             << "' while reading " << funcName
             << ", found " << delimiter.info()
+            << " at stream position " << tellg(this) << nl
             << exit(FatalIOError);
 
         return '\0';
diff --git a/src/OpenFOAM/db/IOstreams/IOstreams/Istream.H b/src/OpenFOAM/db/IOstreams/IOstreams/Istream.H
index 6ed2578ac06d0a76ef62f77220dc89052d400320..68a849794d24f8be7f4953698e09ea63056035d3 100644
--- a/src/OpenFOAM/db/IOstreams/IOstreams/Istream.H
+++ b/src/OpenFOAM/db/IOstreams/IOstreams/Istream.H
@@ -167,21 +167,39 @@ public:
             //- Read binary block
             virtual Istream& read(char*, std::streamsize) = 0;
 
+            //- Start of low-level raw binary read
+            virtual bool beginRaw() = 0;
+
+            //- End of low-level raw binary read
+            virtual bool endRaw() = 0;
+
+            //- Low-level raw binary read
+            virtual Istream& readRaw(char*, std::streamsize) = 0;
+
             //- Rewind the stream so that it may be read again
             virtual void rewind() = 0;
 
 
         // Read List punctuation tokens
 
-            Istream& readBegin(const char* funcName);
-            Istream& readEnd(const char* funcName);
-            Istream& readEndBegin(const char* funcName);
+            //- Begin read of data chunk, starts with '('.
+            //  \return true or FatalIOError
+            bool readBegin(const char* funcName);
 
+            //- End read of data chunk, ends with ')'
+            //  \return true or FatalIOError
+            bool readEnd(const char* funcName);
+
+            //- Begin read of list data, starts with '(' or '{'
+            //  \return starting delimiter or FatalIOError
             char readBeginList(const char* funcName);
+
+            //- End read of list data, ends with ')' or '}'
+            //  \return closing delimiter or FatalIOError
             char readEndList(const char* funcName);
 
 
-    // Member operators
+    // Member Operators
 
         //- Return a non-const reference to const Istream
         //  Needed for read-constructors where the stream argument is temporary:
diff --git a/src/OpenFOAM/db/IOstreams/IOstreams/Ostream.H b/src/OpenFOAM/db/IOstreams/IOstreams/Ostream.H
index 5d082d6e28498870495cb626ae7c6d4ded72bb1b..ee02e3bc8067e8e3656bdf50b2cfd84830ad18ce 100644
--- a/src/OpenFOAM/db/IOstreams/IOstreams/Ostream.H
+++ b/src/OpenFOAM/db/IOstreams/IOstreams/Ostream.H
@@ -141,11 +141,6 @@ public:
             //- Write binary block.
             virtual Ostream& write(const char* data, std::streamsize count) = 0;
 
-            //- Emit begin marker for low-level raw binary output.
-            //  The count should indicate the number of bytes for subsequent
-            //  writeRaw calls.
-            virtual Ostream& beginRaw(std::streamsize count) = 0;
-
             //- Low-level raw binary output.
             virtual Ostream& writeRaw
             (
@@ -153,8 +148,13 @@ public:
                 std::streamsize count
             ) = 0;
 
+            //- Emit begin marker for low-level raw binary output.
+            //  The count indicates the number of bytes for subsequent
+            //  writeRaw calls.
+            virtual bool beginRaw(std::streamsize count) = 0;
+
             //- Emit end marker for low-level raw binary output.
-            virtual Ostream& endRaw() = 0;
+            virtual bool endRaw() = 0;
 
             //- Add indentation characters
             virtual void indent() = 0;
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C
index 04710c4b2d210f9bcdb1c232ad045f033ddba336..06a4d70a0451ab9f0bbe2e29b1dce990c8696b8b 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2015 OpenFOAM Foundation
@@ -70,11 +70,20 @@ inline void Foam::UIPstream::checkEof()
 }
 
 
+inline void Foam::UIPstream::prepareBuffer(const size_t align)
+{
+    if (align > 1)
+    {
+        externalBufPosition_ =
+            align + ((externalBufPosition_ - 1) & ~(align - 1));
+    }
+}
+
+
 template<class T>
 inline void Foam::UIPstream::readFromBuffer(T& val)
 {
-    const size_t align = sizeof(T);
-    externalBufPosition_ = align + ((externalBufPosition_ - 1) & ~(align - 1));
+    prepareBuffer(sizeof(T));
 
     val = reinterpret_cast<T&>(externalBuf_[externalBufPosition_]);
     externalBufPosition_ += sizeof(T);
@@ -85,17 +94,9 @@ inline void Foam::UIPstream::readFromBuffer(T& val)
 inline void Foam::UIPstream::readFromBuffer
 (
     void* data,
-    const size_t count,
-    const size_t align
+    const size_t count
 )
 {
-    if (align > 1)
-    {
-        externalBufPosition_ =
-            align
-          + ((externalBufPosition_ - 1) & ~(align - 1));
-    }
-
     const char* const __restrict__ buf = &externalBuf_[externalBufPosition_];
     char* const __restrict__ output = reinterpret_cast<char*>(data);
 
@@ -382,6 +383,27 @@ Foam::Istream& Foam::UIPstream::read(doubleScalar& val)
 
 
 Foam::Istream& Foam::UIPstream::read(char* data, std::streamsize count)
+{
+    beginRaw();
+    readRaw(data, count);
+    endRaw();
+
+    return *this;
+}
+
+
+Foam::Istream& Foam::UIPstream::readRaw(char* data, std::streamsize count)
+{
+    // No check for format() == BINARY since this is either done in the
+    // beginRaw() method, or the caller knows what they are doing.
+
+    // Any alignment must have been done prior to this call
+    readFromBuffer(data, count);
+    return *this;
+}
+
+
+bool Foam::UIPstream::beginRaw()
 {
     if (format() != BINARY)
     {
@@ -390,8 +412,10 @@ Foam::Istream& Foam::UIPstream::read(char* data, std::streamsize count)
             << Foam::abort(FatalError);
     }
 
-    readFromBuffer(data, count, 8);
-    return *this;
+    // Alignment = 8, as per read(const char*, streamsize)
+    prepareBuffer(8);
+
+    return true;
 }
 
 
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H
index 532faf6cae7a88971e3b5c3bcc4131e94273c9d3..42cf52e36cee3f4c48df7d0ee39f8c9aecbbfc4e 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           |
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2013 OpenFOAM Foundation
@@ -80,18 +80,16 @@ class UIPstream
         //- Check the bufferPosition against messageSize_ for EOF
         inline void checkEof();
 
+        //- Prepare transfer buffer by adjusting alignment
+        inline void prepareBuffer(const size_t align);
+
         //- Read a T from the transfer buffer
         template<class T>
         inline void readFromBuffer(T& val);
 
-        //- Read count bytes of data from the transfer buffer
-        //  using align byte alignment
-        inline void readFromBuffer
-        (
-            void* data,
-            const size_t count,
-            const size_t align
-        );
+        //- Read count bytes of data from the transfer buffer.
+        //  Prior data alignment is done by prepareBuffer
+        inline void readFromBuffer(void* data, const size_t count);
 
         //- Read string length and its content.
         inline Istream& readStringFromBuffer(std::string& str);
@@ -124,7 +122,7 @@ public:
     ~UIPstream();
 
 
-    // Member functions
+    // Member Functions
 
         // Inquiry
 
@@ -171,7 +169,19 @@ public:
             Istream& read(doubleScalar& val);
 
             //- Read binary block with 8-byte alignment.
-            Istream& read(char* data, const std::streamsize count);
+            Istream& read(char* data, std::streamsize count);
+
+            //- Low-level raw binary read
+            Istream& readRaw(char* data, std::streamsize count);
+
+            //- Start of low-level raw binary read
+            bool beginRaw();
+
+            //- End of low-level raw binary read
+            bool endRaw()
+            {
+                return true;
+            }
 
             //- Rewind the stream so that it may be read again
             void rewind();
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C
index d4f6ce40d9d79f34e3f1cd34df68b10d836b24d4..2002061f9a7d3aff78d0ade2c94d15bfcf406832 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C
@@ -342,10 +342,23 @@ Foam::Ostream& Foam::UOPstream::write
 }
 
 
-Foam::Ostream& Foam::UOPstream::beginRaw
+Foam::Ostream& Foam::UOPstream::writeRaw
 (
+    const char* data,
     const std::streamsize count
 )
+{
+    // No check for format() == BINARY since this is either done in the
+    // beginRaw() method, or the caller knows what they are doing.
+
+    // Previously aligned and sizes reserved via beginRaw()
+    writeToBuffer(data, count, 1);
+
+    return *this;
+}
+
+
+bool Foam::UOPstream::beginRaw(const std::streamsize count)
 {
     if (format() != BINARY)
     {
@@ -357,23 +370,7 @@ Foam::Ostream& Foam::UOPstream::beginRaw
     // Alignment = 8, as per write(const char*, streamsize)
     prepareBuffer(count, 8);
 
-    return *this;
-}
-
-
-Foam::Ostream& Foam::UOPstream::writeRaw
-(
-    const char* data,
-    const std::streamsize count
-)
-{
-    // No check for format() == BINARY since this is either done in the
-    // beginRaw() method, or the caller knows what they are doing.
-
-    // Previously aligned and sizes reserved via beginRaw()
-    writeToBuffer(data, count, 1);
-
-    return *this;
+    return true;
 }
 
 
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.H b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.H
index f021180a28c6b3e36f3cf1e1145eb4699edd4dde..c572f5543a5caa958ccbeec4af48cbb34378fe79 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.H
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.H
@@ -192,11 +192,6 @@ public:
                 const std::streamsize count
             );
 
-            //- Begin marker for low-level raw binary output.
-            //  The count should indicate the number of bytes for subsequent
-            //  writeRaw calls.
-            virtual Ostream& beginRaw(const std::streamsize count);
-
             //- Low-level raw binary output.
             virtual Ostream& writeRaw
             (
@@ -204,10 +199,15 @@ public:
                 const std::streamsize count
             );
 
+            //- Begin marker for low-level raw binary output.
+            //  The count indicates the number of bytes for subsequent
+            //  writeRaw calls.
+            virtual bool beginRaw(const std::streamsize count);
+
             //- End marker for low-level raw binary output.
-            virtual Ostream& endRaw()
+            virtual bool endRaw()
             {
-                return *this;
+                return true;
             }
 
             //- Add indentation characters
diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C
index 1c07830d5226d52d25de84d09b5acf1a16a4df5b..e42c3a8f79274a91b0c24164b8e5b4bbba57ac9e 100644
--- a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C
+++ b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -776,8 +776,26 @@ Foam::Istream& Foam::ISstream::read(doubleScalar& val)
 }
 
 
-// read binary block
 Foam::Istream& Foam::ISstream::read(char* buf, std::streamsize count)
+{
+    beginRaw();
+    readRaw(buf, count);
+    endRaw();
+
+    return *this;
+}
+
+
+Foam::Istream& Foam::ISstream::readRaw(char* buf, std::streamsize count)
+{
+    is_.read(buf, count);
+    setState(is_.rdstate());
+
+    return *this;
+}
+
+
+bool Foam::ISstream::beginRaw()
 {
     if (format() != BINARY)
     {
@@ -787,12 +805,18 @@ Foam::Istream& Foam::ISstream::read(char* buf, std::streamsize count)
     }
 
     readBegin("binaryBlock");
-    is_.read(buf, count);
-    readEnd("binaryBlock");
+    setState(is_.rdstate());
+
+    return is_.good();
+}
+
 
+bool Foam::ISstream::endRaw()
+{
+    readEnd("binaryBlock");
     setState(is_.rdstate());
 
-    return *this;
+    return is_.good();
 }
 
 
@@ -810,7 +834,6 @@ void Foam::ISstream::rewind()
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-
 std::ios_base::fmtflags Foam::ISstream::flags() const
 {
     return is_.flags();
diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.H b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.H
index 80b83759b50861da9380ccc19dc70b4ed7c03e36..6d4eedcda4b1673f94d016db5c53ae1a37353d99 100644
--- a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.H
+++ b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2012 OpenFOAM Foundation
@@ -27,7 +27,7 @@ Class
     Foam::ISstream
 
 Description
-    Generic input stream.
+    Generic input stream using standard (STL) streams.
 
 SourceFiles
     ISstreamI.H
@@ -102,7 +102,7 @@ public:
     virtual ~ISstream() = default;
 
 
-    // Member functions
+    // Member Functions
 
         // Inquiry
 
@@ -167,6 +167,15 @@ public:
             //- Read binary block
             virtual Istream& read(char* buf, std::streamsize count);
 
+            //- Low-level raw binary read
+            virtual Istream& readRaw(char* data, std::streamsize count);
+
+            //- Start of low-level raw binary read
+            virtual bool beginRaw();
+
+            //- End of low-level raw binary read
+            virtual bool endRaw();
+
             //- Rewind the stream so that it may be read again
             virtual void rewind();
 
diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/ISstreamI.H b/src/OpenFOAM/db/IOstreams/Sstreams/ISstreamI.H
index 8ac4f00ca6182999944b6955b470378893e91fad..409ebc4217e501fcd509352342fc04aa3602454b 100644
--- a/src/OpenFOAM/db/IOstreams/Sstreams/ISstreamI.H
+++ b/src/OpenFOAM/db/IOstreams/Sstreams/ISstreamI.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           |
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2014 OpenFOAM Foundation
diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.C b/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.C
index 85e9452cc7c6a588736b0619c87f8c1bccf9448c..a9cea39ace6a2ca8c532e97bcad9cb41442c7362 100644
--- a/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.C
+++ b/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -210,10 +210,7 @@ Foam::Ostream& Foam::OSstream::write
 }
 
 
-Foam::Ostream& Foam::OSstream::beginRaw
-(
-    const std::streamsize count
-)
+bool Foam::OSstream::beginRaw(const std::streamsize count)
 {
     if (format() != BINARY)
     {
@@ -223,10 +220,18 @@ Foam::Ostream& Foam::OSstream::beginRaw
     }
 
     os_ << token::BEGIN_LIST;
+    setState(os_.rdstate());
 
+    return os_.good();
+}
+
+
+bool Foam::OSstream::endRaw()
+{
+    os_ << token::END_LIST;
     setState(os_.rdstate());
 
-    return *this;
+    return os_.good();
 }
 
 
@@ -246,15 +251,6 @@ Foam::Ostream& Foam::OSstream::writeRaw
 }
 
 
-Foam::Ostream& Foam::OSstream::endRaw()
-{
-    os_ << token::END_LIST;
-    setState(os_.rdstate());
-
-    return *this;
-}
-
-
 void Foam::OSstream::indent()
 {
     for (unsigned short i = 0; i < indentLevel_*indentSize_; ++i)
diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.H b/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.H
index b0a5dbe58e13cef49a5dc0a6f321e6309831f5d9..48da2e0a2dc3e501366c5b25c3f2fe6cc0658740 100644
--- a/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.H
+++ b/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.H
@@ -152,11 +152,6 @@ public:
                 const std::streamsize count
             );
 
-            //- Begin marker for low-level raw binary output.
-            //  The count should indicate the number of bytes for subsequent
-            //  writeRaw calls.
-            virtual Ostream& beginRaw(const std::streamsize count);
-
             //- Low-level raw binary output.
             virtual Ostream& writeRaw
             (
@@ -164,8 +159,13 @@ public:
                 const std::streamsize count
             );
 
+            //- Begin marker for low-level raw binary output.
+            //  The count indicates the number of bytes for subsequent
+            //  writeRaw calls.
+            virtual bool beginRaw(const std::streamsize count);
+
             //- End marker for low-level raw binary output.
-            virtual Ostream& endRaw();
+            virtual bool endRaw();
 
             //- Add indentation characters
             virtual void indent();
diff --git a/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.C b/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.C
index dfa552cfb33dfc27db5e0c9b4df9e4826a1b0f0f..1c908e58b2bd3020a299a661a68aa6f4b17f7ea5 100644
--- a/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.C
+++ b/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2015 OpenFOAM Foundation
@@ -278,6 +278,13 @@ Foam::Istream& Foam::ITstream::read(doubleScalar&)
 }
 
 
+Foam::Istream& Foam::ITstream::readRaw(char*, std::streamsize)
+{
+    NotImplemented;
+    return *this;
+}
+
+
 Foam::Istream& Foam::ITstream::read(char*, std::streamsize)
 {
     NotImplemented;
diff --git a/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.H b/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.H
index 07ff2aaf275d83c3d132f0b1793ecb1d486f3a19..7d1383399f88bd0e0752b006a63783a695011da0 100644
--- a/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.H
+++ b/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -257,7 +257,24 @@ public:
             virtual Istream& read(doubleScalar&);
 
             //- Read binary block
-            virtual Istream& read(char*, std::streamsize);
+            //  \note Not implemented
+            virtual Istream& read(char* data, std::streamsize);
+
+            //- Low-level raw binary read
+            //  \note Not implemented
+            virtual Istream& readRaw(char* data, std::streamsize count);
+
+            //- Start of low-level raw binary read
+            virtual bool beginRaw()
+            {
+                return false;
+            }
+
+            //- End of low-level raw binary read
+            virtual bool endRaw()
+            {
+                return false;
+            }
 
             //- Rewind the stream so that it may be read again
             virtual void rewind();
diff --git a/src/OpenFOAM/db/IOstreams/dummy/dummyISstream.H b/src/OpenFOAM/db/IOstreams/dummy/dummyISstream.H
index 13c74742a734b1430725582a26c8a858d57d152f..3e6502a281768dfefc40e6d390014b545f9ec846 100644
--- a/src/OpenFOAM/db/IOstreams/dummy/dummyISstream.H
+++ b/src/OpenFOAM/db/IOstreams/dummy/dummyISstream.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           |
+    \\  /    A nd           | Copyright (C) 2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2017 OpenFOAM Foundation
@@ -66,9 +66,9 @@ public:
     virtual ~dummyISstream() = default;
 
 
-    // Member functions
+    // Member Functions
 
-        // Read functions
+        // Read Functions
 
             //- Return next token from stream
             virtual Istream& read(token&)
@@ -126,24 +126,39 @@ public:
                 return *this;
             }
 
-            //- Rewind the stream so that it may be read again
-            virtual void rewind()
+            //- Low-level raw binary read
+            virtual Istream& readRaw(char*, std::streamsize)
             {
                 NotImplemented;
+                return *this;
+            }
+
+            //- Start of low-level raw binary read
+            virtual bool beginRaw()
+            {
+                return false;
             }
 
+            //- End of low-level raw binary read
+            virtual bool endRaw()
+            {
+                return false;
+            }
+
+            //- Rewind the stream so that it may be read again
+            virtual void rewind()
+            {}
+
             //- Return flags of stream
             virtual ios_base::fmtflags flags() const
             {
-                NotImplemented;
                 return ios_base::fmtflags(0);
             }
 
             //- Set flags of stream
-            virtual ios_base::fmtflags flags(const ios_base::fmtflags f)
+            virtual ios_base::fmtflags flags(const ios_base::fmtflags)
             {
-                NotImplemented;
-                return f;
+                return ios_base::fmtflags(0);
             }
 };
 
diff --git a/src/OpenFOAM/db/IOstreams/dummy/dummyIstream.H b/src/OpenFOAM/db/IOstreams/dummy/dummyIstream.H
index 4158a44f1e813e31bb98092f86df14053d5200d0..3543dc084a5e70e039c2f8b4f5fa5ea2bd52343e 100644
--- a/src/OpenFOAM/db/IOstreams/dummy/dummyIstream.H
+++ b/src/OpenFOAM/db/IOstreams/dummy/dummyIstream.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           |
+    \\  /    A nd           | Copyright (C) 2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2017 OpenFOAM Foundation
@@ -37,7 +37,6 @@ SourceFiles
 #define dummyIstream_H
 
 #include "Istream.H"
-//#include <sstream>
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -52,26 +51,21 @@ class dummyIstream
 :
     public Istream
 {
-
 public:
 
     // Constructors
 
         //- Construct null
-        dummyIstream()
-        :
-            Istream()
-        {}
+        dummyIstream() = default;
 
 
     //- Destructor
-    ~dummyIstream()
-    {}
+    ~dummyIstream() = default;
 
 
-    // Member functions
+    // Member Functions
 
-        // Read functions
+        // Read Functions
 
             //- Return next token from stream
             virtual Istream& read(token&)
@@ -129,25 +123,39 @@ public:
                 return *this;
             }
 
-            //- Rewind the stream so that it may be read again
-            virtual void rewind()
+            //- Low-level raw binary read
+            virtual Istream& readRaw(char*, std::streamsize)
             {
                 NotImplemented;
                 return *this;
             }
 
+            //- Start of low-level raw binary read
+            virtual bool beginRaw()
+            {
+                return false;
+            }
+
+            //- End of low-level raw binary read
+            virtual bool endRaw()
+            {
+                return false;
+            }
+
+            //- Rewind the stream so that it may be read again
+            virtual void rewind()
+            {}
+
             //- Return flags of stream
             virtual ios_base::fmtflags flags() const
             {
-                NotImplemented;
                 return ios_base::fmtflags(0);
             }
 
             //- Set flags of stream
-            virtual ios_base::fmtflags flags(const ios_base::fmtflags f)
+            virtual ios_base::fmtflags flags(const ios_base::fmtflags)
             {
-                NotImplemented;
-                return f;
+                return ios_base::fmtflags(0);
             }
 };