diff --git a/applications/test/Hashing/Test-Hashing.C b/applications/test/Hashing/Test-Hashing.C
index 35e0bb6dc4ecfbbf5652f785d0f92451495e28de..68482745074752f8deccde9c9e946c3c977f7757 100644
--- a/applications/test/Hashing/Test-Hashing.C
+++ b/applications/test/Hashing/Test-Hashing.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -78,7 +78,7 @@ void infoHashString
 
 void reportHashList(const UList<string>& list)
 {
-    Info<< "contiguous = " << contiguous<string>() << nl << nl;
+    Info<< "contiguous = " << is_contiguous<string>::value << nl << nl;
 
     for (const string& val : list)
     {
@@ -91,7 +91,7 @@ void reportHashList(const UList<string>& list)
 
 void reportHashList(const UList<label>& list)
 {
-    Info<<"contiguous = " << contiguous<label>() << nl << nl;
+    Info<<"contiguous = " << is_contiguous<label>::value << nl << nl;
 
     for (const label val : list)
     {
@@ -110,7 +110,7 @@ void reportHashList(const UList<label>& list)
 
 void reportHashList(const UList<face>& list)
 {
-    Info<<"contiguous = " << contiguous<label>() << nl << nl;
+    Info<<"contiguous = " << is_contiguous<label>::value << nl << nl;
 
     for (const face& f : list)
     {
@@ -157,7 +157,7 @@ typedef Pair<word> wordPair;
 
 void reportHashList(const UList<wordPair>& list)
 {
-    Info<<"contiguous = " << contiguous<wordPair>() << nl << nl;
+    Info<<"contiguous = " << is_contiguous<wordPair>::value << nl << nl;
 
     for (const wordPair& pr : list)
     {
@@ -182,7 +182,7 @@ void reportHashList(const UList<wordPair>& list)
 
 void reportHashList(const UList<labelPair>& list)
 {
-    Info<<"contiguous = " << contiguous<labelPair>() << nl << nl;
+    Info<<"contiguous = " << is_contiguous<labelPair>::value << nl << nl;
 
     for (const labelPair& pr : list)
     {
@@ -203,7 +203,7 @@ void reportHashList(const UList<labelPair>& list)
 
 void reportHashList(const UList<labelPairPair>& list)
 {
-    Info<<"contiguous = " << contiguous<labelPairPair>() << nl << nl;
+    Info<<"contiguous = " << is_contiguous<labelPairPair>::value << nl << nl;
 
     for (const labelPairPair& pr : list)
     {
@@ -224,7 +224,7 @@ void reportHashList(const UList<labelPairPair>& list)
 
 void reportHashList(const UList<edge>& list)
 {
-    Info<<"contiguous = " << contiguous<edge>() << nl << nl;
+    Info<<"contiguous = " << is_contiguous<edge>::value << nl << nl;
 
     for (const edge& e : list)
     {
@@ -245,7 +245,7 @@ void reportHashList(const UList<edge>& list)
 
 void reportHashList(const UList<triFace>& list)
 {
-    Info<<"contiguous = " << contiguous<triFace>() << nl << nl;
+    Info<<"contiguous = " << is_contiguous<triFace>::value << nl << nl;
 
     for (const triFace& f : list)
     {
diff --git a/applications/test/List/Test-List.C b/applications/test/List/Test-List.C
index b759f9033d783c291312512f99cf60335557091f..4be32c8e4189ceb085b145b4453c92c975618dc7 100644
--- a/applications/test/List/Test-List.C
+++ b/applications/test/List/Test-List.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
@@ -112,7 +112,7 @@ Ostream& printListOutputType(const char* what)
 {
     Info<< what
         << " (contiguous="
-        << contiguous<T>() << " no_linebreak="
+        << is_contiguous<T>::value << " no_linebreak="
         << Detail::ListPolicy::no_linebreak<T>::value
         << " short_length="
         << Detail::ListPolicy::short_length<T>::value << ')';
diff --git a/applications/test/contiguous/Make/options b/applications/test/contiguous/Make/options
index 18e6fe47afacb902cddccf82632772447704fd88..d797f175596b240ba46b06ff5da02e1d4a0aa2ba 100644
--- a/applications/test/contiguous/Make/options
+++ b/applications/test/contiguous/Make/options
@@ -1,2 +1,7 @@
-/* EXE_INC = */
+EXE_INC = \
+    -I$(LIB_SRC)/fileFormats/lnInclude \
+    -I$(LIB_SRC)/surfMesh/lnInclude \
+    -I$(LIB_SRC)/meshTools/lnInclude \
+    -I$(LIB_SRC)/parallel/distributed/lnInclude
+
 /* EXE_LIBS = */
diff --git a/applications/test/contiguous/Test-contiguous.C b/applications/test/contiguous/Test-contiguous.C
index 2de7836bd31c9f575a9c7b989d8071cfa933f288..cdf59544a51784dee018d8818d708b5a749f101e 100644
--- a/applications/test/contiguous/Test-contiguous.C
+++ b/applications/test/contiguous/Test-contiguous.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -37,6 +37,7 @@ Description
 #include "IOstreams.H"
 #include "scalar.H"
 #include "vector.H"
+#include "Switch.H"
 
 #include "labelRange.H"
 #include "scalarList.H"
@@ -44,24 +45,43 @@ Description
 #include "FixedList.H"
 #include "Pair.H"
 
+#include "distributedTriSurfaceMesh.H"
+
 namespace Foam
 {
 
 // Wrong, but interesting to test
-// template<> struct contiguous<Pair<word>> : std::true_type {};
+template<> struct is_contiguous<Pair<word>> : std::true_type {};
 
-} // End namespace Foam
+} // end namespace Foam
 
 using namespace Foam;
 
 
 template<class T>
-void printContiguous()
+void printInfo(const char* const name = nullptr)
 {
-    Info<<"contiguous " << typeid(T).name() << " () = "
-        << contiguous<T>()
-        // << " value = " << contiguous<T>::value
-        << nl;
+    if (name == nullptr)
+    {
+        Info<< typeid(T).name();
+    }
+    else
+    {
+        Info<< name;
+    }
+
+    Info<< " contiguous=" <<  Switch(is_contiguous<T>::value);
+
+    if (is_contiguous_label<T>::value)
+    {
+        Info<< " label";
+    }
+    if (is_contiguous_scalar<T>::value)
+    {
+        Info<< " scalar";
+    }
+
+    Info<< nl;
 }
 
 
@@ -74,18 +94,16 @@ int main(int argc, char *argv[])
     argList::noParallel();
     argList::noFunctionObjects();
 
-    #include "setRootCase.H"
-
-    printContiguous<label>();
-    printContiguous<double>();
-    printContiguous<FixedList<int, 2>>();
-    printContiguous<FixedList<int, 3>>();
-    printContiguous<Pair<long>>();
+    printInfo<label>();
+    printInfo<double>();
+    printInfo<FixedList<double, 4>>();
+    printInfo<Pair<long>>();
 
-    printContiguous<FixedList<word, 2>>();
-    printContiguous<Pair<word>>();
+    printInfo<FixedList<word, 2>>();
+    printInfo<Pair<word>>();
 
-    printContiguous<FixedList<FixedList<int, 2>, 2>>();
+    printInfo<FixedList<FixedList<int, 2>, 2>>();
+    printInfo<segment>();
 
     return 0;
 }
diff --git a/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.C b/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.C
index edbb3ff3610c10547509db0e38a80946d04cacaa..7a21f50758df2c044b78a064292810b510ce9485 100644
--- a/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.C
+++ b/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           |
+    \\  /    A nd           | Copyright (C) 2017-2018 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2012-2015 OpenFOAM Foundation
diff --git a/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.H b/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.H
index b2cf8a75d468f3da6de09357541dda3e44ec2527..647343a3fa370dc855e891a1b5fdcf3df7694fe9 100644
--- a/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.H
+++ b/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedCell/indexedCellEnum.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) 2012-2015 OpenFOAM Foundation
@@ -36,6 +36,7 @@ SourceFiles
 #ifndef indexedCellEnum_H
 #define indexedCellEnum_H
 
+#include "contiguous.H"
 #include "Enum.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -63,11 +64,10 @@ public:
 };
 
 
-template<>
-inline bool contiguous<indexedCellEnum>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for indexedCellEnum
+template<> struct is_contiguous<indexedCellEnum> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertex.H b/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertex.H
index 3b8971a99b6a7a713e055fd342d761278cead05e..3eea2134d8d66798b3d1c40893a1ce5cbbc4d519 100644
--- a/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertex.H
+++ b/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertex.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) 2012-2016 OpenFOAM Foundation
@@ -323,32 +323,26 @@ public:
 
 } // End namespace CGAL
 
-// * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
+
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
 
 #ifdef CGAL_INEXACT
 namespace Foam
 {
     // For inexact representations where the storage type is a double, the data
     // is contiguous. This may not be true for exact number types.
+
     template<>
-    inline bool contiguous
+    struct is_contiguous
     <
-        CGAL::indexedVertex
-        <
-            K,
-            CGAL::Triangulation_vertex_base_3<K>
-        >
-    >()
-    {
-        return true;
-    }
-
+        CGAL::indexedVertex<K, CGAL::Triangulation_vertex_base_3<K>>
+    > : std::true_type {};
 
     template<>
-    inline bool contiguous<CGAL::Triangulation_vertex_base_3<K>::Point>()
-    {
-        return true;
-    }
+    struct is_contiguous
+    <
+        CGAL::Triangulation_vertex_base_3<K>::Point
+    > : std::true_type {};
 
 } // End namespace Foam
 #endif
diff --git a/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexEnum.H b/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexEnum.H
index 65580f9daafb3aff00986aa73fa855d8b2b3fcb0..8a30152341f36ec89bc79e9595665ddffa5dd5b7 100644
--- a/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexEnum.H
+++ b/applications/utilities/mesh/generation/foamyMesh/conformalVoronoiMesh/conformalVoronoiMesh/indexedVertex/indexedVertexEnum.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) 2012-2016 OpenFOAM Foundation
@@ -84,15 +84,17 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for indexedVertexEnum
+template<> struct is_contiguous<indexedVertexEnum> : std::true_type {};
+
+
+// * * * * * * * * * * * * * * * Global Operators  * * * * * * * * * * * * * //
+
 Istream& operator>>(Istream&, indexedVertexEnum::vertexType&);
 Ostream& operator<<(Ostream&, const indexedVertexEnum::vertexType&);
 
-template<>
-inline bool contiguous<indexedVertexEnum>()
-{
-    return true;
-}
-
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/OpenFOAM/algorithms/indexedOctree/volumeType.H b/src/OpenFOAM/algorithms/indexedOctree/volumeType.H
index 26a0839aeb831952ddd6fd337e8706195b0c06a4..defadb0e878d6141b8139e54a29ff24a3521688c 100644
--- a/src/OpenFOAM/algorithms/indexedOctree/volumeType.H
+++ b/src/OpenFOAM/algorithms/indexedOctree/volumeType.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2015-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2015-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2014 OpenFOAM Foundation
@@ -38,6 +38,7 @@ SourceFiles
 #ifndef volumeType_H
 #define volumeType_H
 
+#include "contiguous.H"
 #include "Enum.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -45,7 +46,7 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declarations
+// Forward Declarations
 class dictionary;
 class volumeType;
 Istream& operator>>(Istream& is, volumeType& vt);
@@ -128,9 +129,10 @@ public:
 };
 
 
-//- Data associated with volumeType type are contiguous
-template<>
-inline bool contiguous<volumeType>() {return true;}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for volumeType
+template<> struct is_contiguous<volumeType> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/containers/IndirectLists/IndirectListBase/IndirectListBaseIO.C b/src/OpenFOAM/containers/IndirectLists/IndirectListBase/IndirectListBaseIO.C
index e5e67578d27e6261a333a0c632afb2f7cebd731d..96fd82c8671a07fe187c45d69e71e2d8fbd04951 100644
--- a/src/OpenFOAM/containers/IndirectLists/IndirectListBase/IndirectListBaseIO.C
+++ b/src/OpenFOAM/containers/IndirectLists/IndirectListBase/IndirectListBaseIO.C
@@ -44,9 +44,9 @@ Foam::Ostream& Foam::IndirectListBase<T, Addr>::writeList
     const label len = list.size();
 
     // Write list contents depending on data format
-    if (os.format() == IOstream::ASCII || !contiguous<T>())
+    if (os.format() == IOstream::ASCII || !is_contiguous<T>::value)
     {
-        if (len > 1 && contiguous<T>() && list.uniform())
+        if (len > 1 && is_contiguous<T>::value && list.uniform())
         {
             // Two or more entries, and all entries have identical values.
             os << len << token::BEGIN_BLOCK << list[0] << token::END_BLOCK;
@@ -60,7 +60,7 @@ Foam::Ostream& Foam::IndirectListBase<T, Addr>::writeList
              &&
                 (
                     Detail::ListPolicy::no_linebreak<T>::value
-                 || contiguous<T>()
+                 || is_contiguous<T>::value
                 )
             )
         )
diff --git a/src/OpenFOAM/containers/Lists/FixedList/FixedList.H b/src/OpenFOAM/containers/Lists/FixedList/FixedList.H
index c74b1d96b24d8cb3904e38512b61631ba021ac11..ca5f1d0aaba071c7ab2c76143d0436a9384359d5 100644
--- a/src/OpenFOAM/containers/Lists/FixedList/FixedList.H
+++ b/src/OpenFOAM/containers/Lists/FixedList/FixedList.H
@@ -431,7 +431,7 @@ public:
                 unsigned seed=0
             ) const
             {
-                if (contiguous<T>())
+                if (is_contiguous<T>::value)
                 {
                     return Hasher(obj.cdata(), N*sizeof(T), seed);
                 }
@@ -445,6 +445,20 @@ public:
         };
 };
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- FixedList is contiguous if the type is contiguous
+template<class T, unsigned N>
+struct is_contiguous<FixedList<T, N>> : is_contiguous<T> {};
+
+//- Check for FixedList of labels
+template<class T, unsigned N>
+struct is_contiguous_label<FixedList<T, N>> : is_contiguous_label<T> {};
+
+//- Check for FixedList of scalars
+template<class T, unsigned N>
+struct is_contiguous_scalar<FixedList<T, N>> : is_contiguous_scalar<T> {};
+
 
 // * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * * //
 
@@ -465,7 +479,7 @@ struct Hash<FixedList<T, N>>
         unsigned seed=0
     ) const
     {
-        if (contiguous<T>())
+        if (is_contiguous<T>::value)
         {
             return Hasher(obj.cdata(), N*sizeof(T), seed);
         }
diff --git a/src/OpenFOAM/containers/Lists/FixedList/FixedListIO.C b/src/OpenFOAM/containers/Lists/FixedList/FixedListIO.C
index 75fd1e8e948ec514c3c0c2b200b8823a23ca9e89..337736e54a4048a898e10372b851999b1b8d54de 100644
--- a/src/OpenFOAM/containers/Lists/FixedList/FixedListIO.C
+++ b/src/OpenFOAM/containers/Lists/FixedList/FixedListIO.C
@@ -29,7 +29,6 @@ License
 #include "Istream.H"
 #include "Ostream.H"
 #include "token.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
@@ -75,7 +74,7 @@ Foam::Ostream& Foam::FixedList<T, N>::writeList
     // small and we desire a consistent appearance.
     // Eg, FixedList<T,2> or Pair<T> as "(-1 -1)", not as "2{-1}"
 
-    if (os.format() == IOstream::ASCII || !contiguous<T>())
+    if (os.format() == IOstream::ASCII || !is_contiguous<T>::value)
     {
         if
         (
@@ -86,7 +85,7 @@ Foam::Ostream& Foam::FixedList<T, N>::writeList
              &&
                 (
                     Detail::ListPolicy::no_linebreak<T>::value
-                 || contiguous<T>()
+                 || is_contiguous<T>::value
                 )
             )
         )
@@ -146,7 +145,7 @@ Foam::Istream& Foam::operator>>(Foam::Istream& is, FixedList<T, N>& list)
 {
     is.fatalCheck(FUNCTION_NAME);
 
-    if (is.format() == IOstream::ASCII || !contiguous<T>())
+    if (is.format() == IOstream::ASCII || !is_contiguous<T>::value)
     {
         token firstToken(is);
 
diff --git a/src/OpenFOAM/containers/Lists/List/List.C b/src/OpenFOAM/containers/Lists/List/List.C
index 8e215e66662a54e93d0e669bce3fc7831468a782..2f746ce028e8419c27907a3c86fee28c2ce337a6 100644
--- a/src/OpenFOAM/containers/Lists/List/List.C
+++ b/src/OpenFOAM/containers/Lists/List/List.C
@@ -56,7 +56,7 @@ void Foam::List<T>::doResize(const label newSize)
             if (overlap)
             {
                 #ifdef USEMEMCPY
-                if (contiguous<T>())
+                if (is_contiguous<T>::value)
                 {
                     memcpy(nv, this->v_, overlap*sizeof(T));
                 }
@@ -189,7 +189,7 @@ Foam::List<T>::List(const UList<T>& a)
         doAlloc();
 
         #ifdef USEMEMCPY
-        if (contiguous<T>())
+        if (is_contiguous<T>::value)
         {
             memcpy(this->v_, a.v_, this->byteSize());
         }
@@ -217,7 +217,7 @@ Foam::List<T>::List(const List<T>& a)
         doAlloc();
 
         #ifdef USEMEMCPY
-        if (contiguous<T>())
+        if (is_contiguous<T>::value)
         {
             memcpy(this->v_, a.v_, this->byteSize());
         }
@@ -252,7 +252,7 @@ Foam::List<T>::List(List<T>& a, bool reuse)
         doAlloc();
 
         #ifdef USEMEMCPY
-        if (contiguous<T>())
+        if (is_contiguous<T>::value)
         {
             memcpy(this->v_, a.v_, this->byteSize());
         }
@@ -456,7 +456,7 @@ void Foam::List<T>::operator=(const UList<T>& a)
     if (this->size_)
     {
         #ifdef USEMEMCPY
-        if (contiguous<T>())
+        if (is_contiguous<T>::value)
         {
             memcpy(this->v_, a.v_, this->byteSize());
         }
diff --git a/src/OpenFOAM/containers/Lists/List/List.H b/src/OpenFOAM/containers/Lists/List/List.H
index c28fc1c36dc7743630c133d847da3576780040d8..019919ba57ccad0df195d1222fd7c6cf84c47ee3 100644
--- a/src/OpenFOAM/containers/Lists/List/List.H
+++ b/src/OpenFOAM/containers/Lists/List/List.H
@@ -353,7 +353,7 @@ struct Hash<List<T>>
 {
     inline unsigned operator()(const UList<T>& obj, unsigned seed=0) const
     {
-        if (contiguous<T>())
+        if (is_contiguous<T>::value)
         {
             return Hasher(obj.cdata(), obj.size()*sizeof(T), seed);
         }
diff --git a/src/OpenFOAM/containers/Lists/List/ListIO.C b/src/OpenFOAM/containers/Lists/List/ListIO.C
index 123ac8232743682e1b1607f37106d41b6e415f2a..696d90ad8ed067d2c662168afa108e21fcbf8598 100644
--- a/src/OpenFOAM/containers/Lists/List/ListIO.C
+++ b/src/OpenFOAM/containers/Lists/List/ListIO.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -79,7 +79,7 @@ Foam::Istream& Foam::operator>>(Istream& is, List<T>& list)
 
         // Read list contents depending on data format
 
-        if (is.format() == IOstream::ASCII || !contiguous<T>())
+        if (is.format() == IOstream::ASCII || !is_contiguous<T>::value)
         {
             // Read beginning of contents
             const char delimiter = is.readBeginList("List");
diff --git a/src/OpenFOAM/containers/Lists/UList/UList.C b/src/OpenFOAM/containers/Lists/UList/UList.C
index ece482a0398b9f8da3f3a3ac20aac1b995f61983..5a4adac85c2622b09f219acab87a50f7737c4c95 100644
--- a/src/OpenFOAM/containers/Lists/UList/UList.C
+++ b/src/OpenFOAM/containers/Lists/UList/UList.C
@@ -115,7 +115,7 @@ void Foam::UList<T>::deepCopy(const UList<T>& list)
     else if (len)
     {
         #ifdef USEMEMCPY
-        if (contiguous<T>())
+        if (is_contiguous<T>::value)
         {
             memcpy(this->v_, list.v_, this->byteSize());
         }
@@ -180,7 +180,7 @@ void Foam::UList<T>::operator=(const zero)
 template<class T>
 std::streamsize Foam::UList<T>::byteSize() const
 {
-    if (!contiguous<T>())
+    if (!is_contiguous<T>::value)
     {
         FatalErrorInFunction
             << "Cannot return binary size of a list with non-primitive elements"
diff --git a/src/OpenFOAM/containers/Lists/UList/UList.H b/src/OpenFOAM/containers/Lists/UList/UList.H
index 7ea917510bf057ccbf8f423fe45d27a47e539c52..8d90489f17d1b4d147f00e473400335e4b1efc58 100644
--- a/src/OpenFOAM/containers/Lists/UList/UList.H
+++ b/src/OpenFOAM/containers/Lists/UList/UList.H
@@ -247,7 +247,7 @@ public:
 
             //- Return the binary size in number of characters of the UList
             //- if the element is a primitive type
-            //  i.e. contiguous<T>() == true.
+            //  i.e. is_contiguous<T>::value == true.
             //  Note that is of type streamsize since used in stream ops
             std::streamsize byteSize() const;
 
@@ -524,7 +524,7 @@ public:
                 unsigned seed=0
             ) const
             {
-                if (contiguous<T>())
+                if (is_contiguous<T>::value)
                 {
                     return Hasher(obj.cdata(), obj.size()*sizeof(T), seed);
                 }
@@ -591,7 +591,7 @@ struct Hash<UList<T>>
 {
     inline unsigned operator()(const UList<T>& obj, unsigned seed=0) const
     {
-        if (contiguous<T>())
+        if (is_contiguous<T>::value)
         {
             return Hasher(obj.cdata(), obj.size()*sizeof(T), seed);
         }
diff --git a/src/OpenFOAM/containers/Lists/UList/UListIO.C b/src/OpenFOAM/containers/Lists/UList/UListIO.C
index cb12e88808e4d966e1520b3322405204a2131581..1560032ff4d969d3fd363f16cb88e2308ec89beb 100644
--- a/src/OpenFOAM/containers/Lists/UList/UListIO.C
+++ b/src/OpenFOAM/containers/Lists/UList/UListIO.C
@@ -81,9 +81,9 @@ Foam::Ostream& Foam::UList<T>::writeList
     const label len = list.size();
 
     // Write list contents depending on data format
-    if (os.format() == IOstream::ASCII || !contiguous<T>())
+    if (os.format() == IOstream::ASCII || !is_contiguous<T>::value)
     {
-        if (len > 1 && contiguous<T>() && list.uniform())
+        if (len > 1 && is_contiguous<T>::value && list.uniform())
         {
             // Two or more entries, and all entries have identical values.
             os  << len << token::BEGIN_BLOCK << list[0] << token::END_BLOCK;
@@ -97,7 +97,7 @@ Foam::Ostream& Foam::UList<T>::writeList
              &&
                 (
                     Detail::ListPolicy::no_linebreak<T>::value
-                 || contiguous<T>()
+                 || is_contiguous<T>::value
                 )
             )
         )
@@ -213,7 +213,7 @@ Foam::Istream& Foam::operator>>(Istream& is, UList<T>& list)
 
         // Read list contents depending on data format
 
-        if (is.format() == IOstream::ASCII || !contiguous<T>())
+        if (is.format() == IOstream::ASCII || !is_contiguous<T>::value)
         {
             // Read beginning of contents
             const char delimiter = is.readBeginList("List");
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/combineGatherScatter.C b/src/OpenFOAM/db/IOstreams/Pstreams/combineGatherScatter.C
index 7dbbb492e1988a3dfb9c360d7342a47323576214..2018ad5b8b7019bdcc2adb577b810e1a3c615289 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/combineGatherScatter.C
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/combineGatherScatter.C
@@ -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) 2011-2017 OpenFOAM Foundation
@@ -62,7 +62,7 @@ void Foam::Pstream::combineGather
         {
             label belowID = myComm.below()[belowI];
 
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 T value;
                 UIPstream::read
@@ -114,7 +114,7 @@ void Foam::Pstream::combineGather
                     << " data:" << Value << endl;
             }
 
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 UOPstream::write
                 (
@@ -194,7 +194,7 @@ void Foam::Pstream::combineScatter
         // Receive from up
         if (myComm.above() != -1)
         {
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 UIPstream::read
                 (
@@ -236,7 +236,7 @@ void Foam::Pstream::combineScatter
                 Pout<< " sending to " << belowID << " data:" << Value << endl;
             }
 
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 UOPstream::write
                 (
@@ -304,7 +304,7 @@ void Foam::Pstream::listCombineGather
         {
             label belowID = myComm.below()[belowI];
 
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 List<T> receivedValues(Values.size());
 
@@ -363,7 +363,7 @@ void Foam::Pstream::listCombineGather
                     << " data:" << Values << endl;
             }
 
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 UOPstream::write
                 (
@@ -443,7 +443,7 @@ void Foam::Pstream::listCombineScatter
         // Receive from up
         if (myComm.above() != -1)
         {
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 UIPstream::read
                 (
@@ -485,7 +485,7 @@ void Foam::Pstream::listCombineScatter
                 Pout<< " sending to " << belowID << " data:" << Values << endl;
             }
 
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 UOPstream::write
                 (
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/exchange.C b/src/OpenFOAM/db/IOstreams/Pstreams/exchange.C
index 85d5a1376e834224c7825606ba773687fdea6c66..fc78a47669fafbc0b01fd839bc333a95651847e0 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/exchange.C
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/exchange.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -192,10 +192,11 @@ void Foam::Pstream::exchange
     const bool block
 )
 {
-    if (!contiguous<T>())
+    // OR  static_assert(is_contiguous<T>::value, "Contiguous data only!")
+    if (!is_contiguous<T>::value)
     {
         FatalErrorInFunction
-            << "Continuous data only." << sizeof(T) << Foam::abort(FatalError);
+            << "Contiguous data only." << sizeof(T) << Foam::abort(FatalError);
     }
 
     if (sendBufs.size() != UPstream::nProcs(comm))
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/gatherScatter.C b/src/OpenFOAM/db/IOstreams/Pstreams/gatherScatter.C
index b6f2cac98e664bc125e086c51433b79ebfc3a005..fa9a40bcb3e728116b854693734f36e12045cc6a 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/gatherScatter.C
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/gatherScatter.C
@@ -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) 2011-2017 OpenFOAM Foundation
@@ -64,7 +64,7 @@ void Pstream::gather
         {
             T value;
 
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 UIPstream::read
                 (
@@ -95,7 +95,7 @@ void Pstream::gather
         // Send up Value
         if (myComm.above() != -1)
         {
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 UOPstream::write
                 (
@@ -161,7 +161,7 @@ void Pstream::scatter
         // Receive from up
         if (myComm.above() != -1)
         {
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 UIPstream::read
                 (
@@ -192,7 +192,7 @@ void Pstream::scatter
         // (only when using a tree schedule!) first.
         forAllReverse(myComm.below(), belowI)
         {
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 UOPstream::write
                 (
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/gatherScatterList.C b/src/OpenFOAM/db/IOstreams/Pstreams/gatherScatterList.C
index 328b87aa7a2a3cf29bd565dbf867388266ed849b..63319d7b9e240e2b2c43fcaa63b25f6eb8d7a08d 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/gatherScatterList.C
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/gatherScatterList.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2015 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2015-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2017 OpenFOAM Foundation
@@ -75,7 +75,7 @@ void Pstream::gatherList
             label belowID = myComm.below()[belowI];
             const labelList& belowLeaves = comms[belowID].allBelow();
 
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 List<T> receivedValues(belowLeaves.size() + 1);
 
@@ -145,7 +145,7 @@ void Pstream::gatherList
                     << " data:" << Values[UPstream::myProcNo(comm)] << endl;
             }
 
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 List<T> sendingValues(belowLeaves.size() + 1);
                 sendingValues[0] = Values[UPstream::myProcNo(comm)];
@@ -237,7 +237,7 @@ void Pstream::scatterList
         {
             const labelList& notBelowLeaves = myComm.allNotBelow();
 
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 List<T> receivedValues(notBelowLeaves.size());
 
@@ -288,7 +288,7 @@ void Pstream::scatterList
             label belowID = myComm.below()[belowI];
             const labelList& notBelowLeaves = comms[belowID].allNotBelow();
 
-            if (contiguous<T>())
+            if (is_contiguous<T>::value)
             {
                 List<T> sendingValues(notBelowLeaves.size());
 
diff --git a/src/OpenFOAM/fields/Fields/Field/Field.C b/src/OpenFOAM/fields/Fields/Field/Field.C
index e203a6dacc92321c37a7f968e837354e110c1469..19024266d3b9ae59ac354e5e9b79ac52f06211f1 100644
--- a/src/OpenFOAM/fields/Fields/Field/Field.C
+++ b/src/OpenFOAM/fields/Fields/Field/Field.C
@@ -634,7 +634,7 @@ void Foam::Field<Type>::writeEntry(const word& keyword, Ostream& os) const
     // The contents are 'uniform' if the list is non-empty
     // and all entries have identical values.
 
-    if (contiguous<Type>() && List<Type>::uniform())
+    if (is_contiguous<Type>::value && List<Type>::uniform())
     {
         os << "uniform " << this->first();
     }
diff --git a/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraint.H b/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraint.H
index 74822115991a34b8dd0d6535f8f1804b2e5c0e7e..4414afdc336c1aafec33b490413905ac90320a6a 100644
--- a/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraint.H
+++ b/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraint.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) 2011-2016 OpenFOAM Foundation
@@ -46,6 +46,7 @@ SourceFiles
 #include "vector.H"
 #include "Tuple2.H"
 #include "transform.H"
+#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -95,6 +96,12 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for pointConstraint
+template<> struct is_contiguous<pointConstraint> : std::true_type {};
+
+
 //- Reduce operator
 class combineConstraintsEqOp
 {
@@ -102,14 +109,11 @@ public:
     inline void operator()(pointConstraint&, const pointConstraint&) const;
 };
 
-//- Transformation function
-inline pointConstraint transform(const tensor& tt, const pointConstraint& v);
 
-//- contiguous
-template<class T> bool contiguous();
-template<>
-inline bool contiguous<pointConstraint>() {return true;}
+// * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
 
+//- Transformation function
+inline pointConstraint transform(const tensor& tt, const pointConstraint& v);
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/matrices/Matrix/MatrixIO.C b/src/OpenFOAM/matrices/Matrix/MatrixIO.C
index 9b93656bb61c359079c4922c9cf304bccf3007b0..7f363acfe4a20e81eb7a5c3f3f95d2b8b6c3f06a 100644
--- a/src/OpenFOAM/matrices/Matrix/MatrixIO.C
+++ b/src/OpenFOAM/matrices/Matrix/MatrixIO.C
@@ -68,7 +68,7 @@ bool Foam::Matrix<Form, Type>::readMatrix(Istream& is)
         const label len = size();
 
         // Read list contents depending on data format
-        if (is.format() == IOstream::ASCII || !contiguous<Type>())
+        if (is.format() == IOstream::ASCII || !is_contiguous<Type>::value)
         {
             // Read beginning of contents
             char listDelimiter = is.readBeginList("Matrix");
@@ -147,19 +147,19 @@ Foam::Ostream& Foam::Matrix<Form, Type>::writeMatrix
     os  << mat.m() << token::SPACE << mat.n();
 
     // Write list contents depending on data format
-    if (os.format() == IOstream::ASCII || !contiguous<Type>())
+    if (os.format() == IOstream::ASCII || !is_contiguous<Type>::value)
     {
         if (len)
         {
             const Type* v = mat.cdata();
 
             // Can the contents be considered 'uniform' (ie, identical)
-            if (len > 1 && contiguous<Type>() && mat.uniform())
+            if (len > 1 && is_contiguous<Type>::value && mat.uniform())
             {
                 // Two or more entries, and all entries have identical values.
                 os  << token::BEGIN_BLOCK << v[0] << token::END_BLOCK;
             }
-            else if (len < shortLen && contiguous<Type>())
+            else if (len < shortLen && is_contiguous<Type>::value)
             {
                 // Write start contents delimiter
                 os  << token::BEGIN_LIST;
diff --git a/src/OpenFOAM/meshes/boundBox/boundBox.H b/src/OpenFOAM/meshes/boundBox/boundBox.H
index e263bfdd55a57bcb412e896eb662780037dce2a3..87e140512da1c5755821cc9515499faeebef4174 100644
--- a/src/OpenFOAM/meshes/boundBox/boundBox.H
+++ b/src/OpenFOAM/meshes/boundBox/boundBox.H
@@ -345,11 +345,19 @@ public:
 };
 
 
-//- Data associated with boundBox type are contiguous
-template<>
-inline bool contiguous<boundBox>() {return contiguous<point>();}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
 
-// Global Operators
+//- Contiguous data for boundBox
+template<> struct is_contiguous<boundBox> : is_contiguous<point> {};
+
+//- Contiguous scalar data for boundBox
+template<> struct is_contiguous_scalar<boundBox>
+:
+    is_contiguous_scalar<point>
+{};
+
+
+// * * * * * * * * * * * * * * * Global Operators  * * * * * * * * * * * * * //
 
 inline bool operator==(const boundBox& a, const boundBox& b);
 inline bool operator!=(const boundBox& a, const boundBox& b);
diff --git a/src/OpenFOAM/meshes/meshShapes/edge/edge.H b/src/OpenFOAM/meshes/meshShapes/edge/edge.H
index 6c81451c16ac8f3ceb6e413b7be24e9c2c1dc609..696c2e815a89b6b340c883d3746b02a0dd5b4157 100644
--- a/src/OpenFOAM/meshes/meshShapes/edge/edge.H
+++ b/src/OpenFOAM/meshes/meshShapes/edge/edge.H
@@ -306,12 +306,17 @@ public:
 };
 
 
-// * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for edge (a pair of labels)
+template<> struct is_contiguous<edge> : std::true_type {};
 
-// Edges are a pair of labels - thus contiguous
-template<> inline bool contiguous<edge>()  {return true;}
+//- Contiguous label data for edge (a pair of labels)
+template<> struct is_contiguous_label<edge> : std::true_type {};
 
 
+// * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * * //
+
 //- Return reverse of an edge
 inline edge reverse(const edge& e)
 {
@@ -339,6 +344,7 @@ inline bool operator==(const edge& a, const edge& b);
 inline bool operator!=(const edge& a, const edge& b);
 
 
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/meshes/meshShapes/labelledTri/labelledTri.H b/src/OpenFOAM/meshes/meshShapes/labelledTri/labelledTri.H
index 773d5ab2fe73a686e944d4013327eaf91172d64d..0954dedccbacddd9b9b689ab5024bba671be7adf 100644
--- a/src/OpenFOAM/meshes/meshShapes/labelledTri/labelledTri.H
+++ b/src/OpenFOAM/meshes/meshShapes/labelledTri/labelledTri.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -45,10 +45,8 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of friend functions and operators
-
+// Forward Declarations
 class labelledTri;
-
 Istream& operator>>(Istream&, labelledTri&);
 Ostream& operator<<(Ostream&, const labelledTri&);
 
@@ -126,8 +124,13 @@ public:
 };
 
 
-template<>
-inline bool contiguous<labelledTri>()  {return true;}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for labelledTri
+template<> struct is_contiguous<labelledTri> : std::true_type {};
+
+//- Contiguous label data for labelledTri
+template<> struct is_contiguous_label<labelledTri> : std::true_type {};
 
 
 //- Specialization to offset faces, used in ListListOps::combineOffset
diff --git a/src/OpenFOAM/meshes/meshShapes/tetCell/tetCell.H b/src/OpenFOAM/meshes/meshShapes/tetCell/tetCell.H
index 8aa98ac732e8356bc93d09ad01a2e0a33019793d..4757f51af79ca4c08572182111e0a43c4c0adf81 100644
--- a/src/OpenFOAM/meshes/meshShapes/tetCell/tetCell.H
+++ b/src/OpenFOAM/meshes/meshShapes/tetCell/tetCell.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) 2011-2017 OpenFOAM Foundation
@@ -52,10 +52,11 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class cellShape;
 
 /*---------------------------------------------------------------------------*\
-                           class tetCell Declaration
+                           Class tetCell Declaration
 \*---------------------------------------------------------------------------*/
 
 class tetCell
@@ -120,11 +121,13 @@ public:
 };
 
 
-// * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
 
-//- Data associated with the type are contiguous
-template<>
-inline bool contiguous<tetCell>() {return true;}
+//- Contiguous data for tetCell
+template<> struct is_contiguous<tetCell> : std::true_type {};
+
+//- Contiguous label data for tetCell
+template<> struct is_contiguous_label<tetCell> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/meshes/meshShapes/triFace/triFace.H b/src/OpenFOAM/meshes/meshShapes/triFace/triFace.H
index 87622154331078c24d419428634ad125da3b0d36..72660ea20bee260a2452c7ccc954d00f68d58cb4 100644
--- a/src/OpenFOAM/meshes/meshShapes/triFace/triFace.H
+++ b/src/OpenFOAM/meshes/meshShapes/triFace/triFace.H
@@ -294,9 +294,14 @@ public:
 };
 
 
-// * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for triFace
+template<> struct is_contiguous<triFace> : std::true_type {};
+
+//- Contiguous label data for triFace
+template<> struct is_contiguous_label<triFace> : std::true_type {};
 
-template<> inline bool contiguous<triFace>()  {return true;}
 
 //- Hash specialization for triFace as a commutative hash value.
 template<>
diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndexTemplates.C b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndexTemplates.C
index 752f32bfbfe45a3a3010be228e4c1c713a89b7f8..ca88085226db7dfe86f8b80be08a663b5a6b2936 100644
--- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndexTemplates.C
+++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndexTemplates.C
@@ -58,7 +58,7 @@ void Foam::globalIndex::gather
             {
                 SubList<Type> procSlot(allFld, off[i+1]-off[i], off[i]);
 
-                if (contiguous<Type>())
+                if (is_contiguous<Type>::value)
                 {
                     IPstream::read
                     (
@@ -88,7 +88,7 @@ void Foam::globalIndex::gather
         {
             // nonBlocking
 
-            if (!contiguous<Type>())
+            if (!is_contiguous<Type>::value)
             {
                 FatalErrorInFunction
                     << "nonBlocking not supported for non-contiguous data"
@@ -125,7 +125,7 @@ void Foam::globalIndex::gather
          || commsType == Pstream::commsTypes::blocking
         )
         {
-            if (contiguous<Type>())
+            if (is_contiguous<Type>::value)
             {
                 OPstream::write
                 (
@@ -154,7 +154,7 @@ void Foam::globalIndex::gather
         {
             // nonBlocking
 
-            if (!contiguous<Type>())
+            if (!is_contiguous<Type>::value)
             {
                 FatalErrorInFunction
                     << "nonBlocking not supported for non-contiguous data"
@@ -311,7 +311,7 @@ void Foam::globalIndex::scatter
                     off[i]
                 );
 
-                if (contiguous<Type>())
+                if (is_contiguous<Type>::value)
                 {
                     OPstream::write
                     (
@@ -341,7 +341,7 @@ void Foam::globalIndex::scatter
         {
             // nonBlocking
 
-            if (!contiguous<Type>())
+            if (!is_contiguous<Type>::value)
             {
                 FatalErrorInFunction
                     << "nonBlocking not supported for non-contiguous data"
@@ -383,7 +383,7 @@ void Foam::globalIndex::scatter
          || commsType == Pstream::commsTypes::blocking
         )
         {
-            if (contiguous<Type>())
+            if (is_contiguous<Type>::value)
             {
                 IPstream::read
                 (
@@ -412,7 +412,7 @@ void Foam::globalIndex::scatter
         {
             // nonBlocking
 
-            if (!contiguous<Type>())
+            if (!is_contiguous<Type>::value)
             {
                 FatalErrorInFunction
                     << "nonBlocking not supported for non-contiguous data"
diff --git a/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/mapDistribute/mapDistributeBaseTemplates.C b/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/mapDistribute/mapDistributeBaseTemplates.C
index de8475deba34948fcde958aa5fc0854076bcf8d6..6df11aaafa665e8e0dffe633dd7decc04fd77bbd 100644
--- a/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/mapDistribute/mapDistributeBaseTemplates.C
+++ b/src/OpenFOAM/meshes/polyMesh/mapPolyMesh/mapDistribute/mapDistributeBaseTemplates.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2015-2016, 2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2015-2017 OpenFOAM Foundation
@@ -392,7 +392,7 @@ void Foam::mapDistributeBase::distribute
     {
         label nOutstanding = Pstream::nRequests();
 
-        if (!contiguous<T>())
+        if (!is_contiguous<T>::value)
         {
             PstreamBuffers pBufs(Pstream::commsTypes::nonBlocking, tag);
 
@@ -890,7 +890,7 @@ void Foam::mapDistributeBase::distribute
     {
         label nOutstanding = Pstream::nRequests();
 
-        if (!contiguous<T>())
+        if (!is_contiguous<T>::value)
         {
             PstreamBuffers pBufs(Pstream::commsTypes::nonBlocking, tag);
 
diff --git a/src/OpenFOAM/meshes/primitiveShapes/objectHit/pointIndexHit.H b/src/OpenFOAM/meshes/primitiveShapes/objectHit/pointIndexHit.H
index 0550453df7bb6a338b722e981953f46c759b327c..8957bfaebbf57c850d34ae0eaba28857a14794ad 100644
--- a/src/OpenFOAM/meshes/primitiveShapes/objectHit/pointIndexHit.H
+++ b/src/OpenFOAM/meshes/primitiveShapes/objectHit/pointIndexHit.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) 2011 OpenFOAM Foundation
@@ -43,10 +43,8 @@ namespace Foam
 
 typedef PointIndexHit<point> pointIndexHit;
 
-
-//- Data associated with pointIndexHit type are contiguous
-template<>
-inline bool contiguous<pointIndexHit>() {return contiguous<point>();}
+//- Contiguous data for pointIndexHit
+template<> struct is_contiguous<pointIndexHit> : is_contiguous<point> {};
 
 }
 
diff --git a/src/OpenFOAM/meshes/treeBoundBox/treeBoundBox.H b/src/OpenFOAM/meshes/treeBoundBox/treeBoundBox.H
index b106d97fc5580bdac0a1b9023ddcae756a960dc4..421891d9fbe1a670ff9c6b17999df00a6b6f910f 100644
--- a/src/OpenFOAM/meshes/treeBoundBox/treeBoundBox.H
+++ b/src/OpenFOAM/meshes/treeBoundBox/treeBoundBox.H
@@ -340,12 +340,19 @@ public:
 };
 
 
-//- Data associated with treeBoundBox type are contiguous
-template<>
-inline bool contiguous<treeBoundBox>() {return contiguous<boundBox>();}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
 
+//- Contiguous data for treeBoundBox
+template<> struct is_contiguous<treeBoundBox> : is_contiguous<boundBox> {};
 
-// Global Operators
+//- Contiguous scalar data for treeBoundBox
+template<> struct is_contiguous_scalar<treeBoundBox>
+:
+    is_contiguous_scalar<boundBox>
+{};
+
+
+// * * * * * * * * * * * * * * * Global Operators  * * * * * * * * * * * * * //
 
 inline bool operator==(const treeBoundBox& a, const treeBoundBox& b);
 inline bool operator!=(const treeBoundBox& a, const treeBoundBox& b);
diff --git a/src/OpenFOAM/primitives/Barycentric/Barycentric.H b/src/OpenFOAM/primitives/Barycentric/Barycentric.H
index ae4fe2fb420e8f2a5fadb5bac56df649618bcf7f..11869d392f0ea602bd28cb7a1b308648ca97a86b 100644
--- a/src/OpenFOAM/primitives/Barycentric/Barycentric.H
+++ b/src/OpenFOAM/primitives/Barycentric/Barycentric.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) 2016-2017 OpenFOAM Foundation
@@ -38,6 +38,7 @@ SourceFiles
 #ifndef Barycentric_H
 #define Barycentric_H
 
+#include "contiguous.H"
 #include "VectorSpace.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -104,6 +105,21 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<Barycentric<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<Barycentric<Cmpt>> : is_contiguous_label<Cmpt> {};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<Barycentric<Cmpt>> : is_contiguous_scalar<Cmpt> {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Barycentric/BarycentricTensor.H b/src/OpenFOAM/primitives/Barycentric/BarycentricTensor.H
index e603dc5304aee3fc4b31d2d2aba972eb03fff381..204e2c3732ca0bd9d06a13d3d2ce76c75eabe3a4 100644
--- a/src/OpenFOAM/primitives/Barycentric/BarycentricTensor.H
+++ b/src/OpenFOAM/primitives/Barycentric/BarycentricTensor.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
@@ -117,6 +117,27 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<BarycentricTensor<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<BarycentricTensor<Cmpt>>
+:
+    is_contiguous_label<Cmpt>
+{};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<BarycentricTensor<Cmpt>>
+:
+    is_contiguous_scalar<Cmpt>
+{};
+
+
 template<class Cmpt>
 class typeOfTranspose<Cmpt, BarycentricTensor<Cmpt>>
 {
diff --git a/src/OpenFOAM/primitives/Barycentric/barycentric/barycentric.H b/src/OpenFOAM/primitives/Barycentric/barycentric/barycentric.H
index 1f0b0aa7bdf87c0d622b723e1d57ab8cab7e0058..4734ac0af17b6e6497c4e690a70a5e007aa95beb 100644
--- a/src/OpenFOAM/primitives/Barycentric/barycentric/barycentric.H
+++ b/src/OpenFOAM/primitives/Barycentric/barycentric/barycentric.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) 2016-2017 OpenFOAM Foundation
@@ -36,34 +36,22 @@ Description
 
 #include "scalar.H"
 #include "Barycentric.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class Random;
-class cachedRandom;
-
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 typedef Barycentric<scalar> barycentric;
 
-
 //- Generate a random barycentric coordinate within the unit tetrahedron
 barycentric barycentric01(Random& rndGen);
 
-
-template<>
-inline bool contiguous<barycentric>()
-{
-    return true;
-}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Barycentric/barycentricTensor/barycentricTensor.H b/src/OpenFOAM/primitives/Barycentric/barycentricTensor/barycentricTensor.H
index a4b7e8f5964d2b91dad5f40eb8995a3c4f7d972d..34d8ed754545f5342ea6e642a31122bf89df69ba 100644
--- a/src/OpenFOAM/primitives/Barycentric/barycentricTensor/barycentricTensor.H
+++ b/src/OpenFOAM/primitives/Barycentric/barycentricTensor/barycentricTensor.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) 2016-2017 OpenFOAM Foundation
@@ -36,7 +36,6 @@ Description
 
 #include "scalar.H"
 #include "BarycentricTensor.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -47,14 +46,6 @@ namespace Foam
 
 typedef BarycentricTensor<scalar> barycentricTensor;
 
-
-template<>
-inline bool contiguous<barycentricTensor>()
-{
-    return true;
-}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Barycentric2D/Barycentric2D.H b/src/OpenFOAM/primitives/Barycentric2D/Barycentric2D.H
index ed29386b97237d55bb15aa9848e063ac32564906..0a50cf982d58ec952625a6d1441f8be6d0feee7e 100644
--- a/src/OpenFOAM/primitives/Barycentric2D/Barycentric2D.H
+++ b/src/OpenFOAM/primitives/Barycentric2D/Barycentric2D.H
@@ -38,6 +38,7 @@ SourceFiles
 #ifndef Barycentric2D_H
 #define Barycentric2D_H
 
+#include "contiguous.H"
 #include "VectorSpace.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -111,6 +112,21 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<Barycentric2D<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<Barycentric2D<Cmpt>> : is_contiguous_label<Cmpt> {};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<Barycentric2D<Cmpt>> : is_contiguous_scalar<Cmpt>{};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Barycentric2D/barycentric2D/barycentric2D.H b/src/OpenFOAM/primitives/Barycentric2D/barycentric2D/barycentric2D.H
index 762bc76c779a381d7f58ad8bc1d596957c6b5b3c..6dfe6e1c805552b5630b41cbd3864694c50c726d 100644
--- a/src/OpenFOAM/primitives/Barycentric2D/barycentric2D/barycentric2D.H
+++ b/src/OpenFOAM/primitives/Barycentric2D/barycentric2D/barycentric2D.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
@@ -36,34 +36,23 @@ Description
 
 #include "scalar.H"
 #include "Barycentric2D.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class Random;
-class cachedRandom;
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 typedef Barycentric2D<scalar> barycentric2D;
 
-
 //- Generate a random barycentric coordinate within the unit triangle
 barycentric2D barycentric2D01(Random& rndGen);
 
-
-template<>
-inline bool contiguous<barycentric2D>()
-{
-    return true;
-}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/DiagTensor/DiagTensor.H b/src/OpenFOAM/primitives/DiagTensor/DiagTensor.H
index 797b7c68eb86a2802b6d56a56b6ede6e18fba44d..9d8c285c73d1f80d0be818207b8941e82455cebf 100644
--- a/src/OpenFOAM/primitives/DiagTensor/DiagTensor.H
+++ b/src/OpenFOAM/primitives/DiagTensor/DiagTensor.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) 2011-2016 OpenFOAM Foundation
@@ -107,13 +107,27 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<DiagTensor<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<DiagTensor<Cmpt>> : is_contiguous_label<Cmpt> {};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<DiagTensor<Cmpt>> : is_contiguous_scalar<Cmpt> {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-// Include inline implementations
 #include "DiagTensorI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/primitives/DiagTensor/diagTensor/diagTensor.H b/src/OpenFOAM/primitives/DiagTensor/diagTensor/diagTensor.H
index 2988c8ce03f74f7ee8616b3a0378a511aefbfe44..5b3362e347256c1519242e8f8982afc75350cbff 100644
--- a/src/OpenFOAM/primitives/DiagTensor/diagTensor/diagTensor.H
+++ b/src/OpenFOAM/primitives/DiagTensor/diagTensor/diagTensor.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) 2011 OpenFOAM Foundation
@@ -38,7 +38,6 @@ SourceFiles
 #define diagTensor_H
 
 #include "DiagTensor.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -49,12 +48,6 @@ namespace Foam
 
 typedef DiagTensor<scalar> diagTensor;
 
-
-//- Data associated with diagTensor type are contiguous
-template<>
-inline bool contiguous<diagTensor>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Pair/Pair.H b/src/OpenFOAM/primitives/Pair/Pair.H
index db9589d6aced91b4695dd4652b6f9c954469edb6..fc8a1f01de1fdcccf42c624086ae65a2e24988e6 100644
--- a/src/OpenFOAM/primitives/Pair/Pair.H
+++ b/src/OpenFOAM/primitives/Pair/Pair.H
@@ -173,6 +173,21 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Pair is contiguous if the type is contiguous
+template<class T>
+struct is_contiguous<Pair<T>> : is_contiguous<T> {};
+
+//- Check for Pair of labels
+template<class T>
+struct is_contiguous_label<Pair<T>> : is_contiguous_label<T> {};
+
+//- Check for Pair of scalars
+template<class T>
+struct is_contiguous_scalar<Pair<T>> : is_contiguous_scalar<T> {};
+
+
 // * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * * //
 
 //- Hashing for Pair data, which uses Hasher for contiguous data and
@@ -182,7 +197,7 @@ struct Hash<Pair<T>>
 {
     inline unsigned operator()(const Pair<T>& obj, unsigned seed=0) const
     {
-        if (contiguous<T>())
+        if (is_contiguous<T>::value)
         {
             return Hasher(obj.cdata(), sizeof(obj), seed);
         }
@@ -195,8 +210,6 @@ struct Hash<Pair<T>>
 };
 
 
-// * * * * * * * * * * * * * * Global Operators  * * * * * * * * * * * * * * //
-
 //- Return reverse of a Pair
 template<class T>
 Pair<T> reverse(const Pair<T>& p)
@@ -205,6 +218,8 @@ Pair<T> reverse(const Pair<T>& p)
 }
 
 
+// * * * * * * * * * * * * * * Global Operators  * * * * * * * * * * * * * * //
+
 template<class T>
 bool operator==(const Pair<T>& a, const Pair<T>& b)
 {
diff --git a/src/OpenFOAM/primitives/SphericalTensor/SphericalTensor.H b/src/OpenFOAM/primitives/SphericalTensor/SphericalTensor.H
index ff9f8ec959524be82e83b5677e9a5e46cadd54b6..c08b288d093a3181788060712116ef49a9a51df9 100644
--- a/src/OpenFOAM/primitives/SphericalTensor/SphericalTensor.H
+++ b/src/OpenFOAM/primitives/SphericalTensor/SphericalTensor.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) 2011-2016 OpenFOAM Foundation
@@ -39,6 +39,7 @@ SourceFiles
 #ifndef SphericalTensor_H
 #define SphericalTensor_H
 
+#include "contiguous.H"
 #include "VectorSpace.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -114,13 +115,33 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<SphericalTensor<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<SphericalTensor<Cmpt>>
+:
+    is_contiguous_label<Cmpt>
+{};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<SphericalTensor<Cmpt>>
+:
+    is_contiguous_scalar<Cmpt>
+{};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-// Include inline implementations
 #include "SphericalTensorI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/primitives/SphericalTensor/labelSphericalTensor/labelSphericalTensor.H b/src/OpenFOAM/primitives/SphericalTensor/labelSphericalTensor/labelSphericalTensor.H
index bc1943f60815bf6e445785a4f0942a0f08f9f55b..b49a671e93bd0915360b52967cd1db55967a4331 100644
--- a/src/OpenFOAM/primitives/SphericalTensor/labelSphericalTensor/labelSphericalTensor.H
+++ b/src/OpenFOAM/primitives/SphericalTensor/labelSphericalTensor/labelSphericalTensor.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) 2011 OpenFOAM Foundation
@@ -38,7 +38,6 @@ SourceFiles
 #define labelSphericalTensor_H
 
 #include "SphericalTensor.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -52,11 +51,6 @@ typedef SphericalTensor<label> labelSphericalTensor;
 //- Identity labelTensor
 static const labelSphericalTensor labelI(1);
 
-//- Data associated with labelSphericalTensor type are contiguous
-template<>
-inline bool contiguous<labelSphericalTensor>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/SphericalTensor/sphericalTensor/sphericalTensor.H b/src/OpenFOAM/primitives/SphericalTensor/sphericalTensor/sphericalTensor.H
index f2263af48a1c617fb51863dc8df335907758c483..94b009f244ed99d1f4633455d120a1e18cb27307 100644
--- a/src/OpenFOAM/primitives/SphericalTensor/sphericalTensor/sphericalTensor.H
+++ b/src/OpenFOAM/primitives/SphericalTensor/sphericalTensor/sphericalTensor.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) 2011-2016 OpenFOAM Foundation
@@ -39,7 +39,6 @@ SourceFiles
 
 #include "SphericalTensor.H"
 #include "Identity.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -53,11 +52,6 @@ typedef SphericalTensor<scalar> sphericalTensor;
 static const sphericalTensor oneThirdI(1.0/3.0);
 static const sphericalTensor twoThirdsI(2.0/3.0);
 
-//- Specify data associated with sphericalTensor type are contiguous
-template<>
-inline bool contiguous<sphericalTensor>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/SphericalTensor2D/SphericalTensor2D.H b/src/OpenFOAM/primitives/SphericalTensor2D/SphericalTensor2D.H
index 73186231088b50a70bdb7f39a0c2259642f2eaa0..0a0dd67321bc20f54b2c0ede7007f6622a8f1028 100644
--- a/src/OpenFOAM/primitives/SphericalTensor2D/SphericalTensor2D.H
+++ b/src/OpenFOAM/primitives/SphericalTensor2D/SphericalTensor2D.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) 2011-2016 OpenFOAM Foundation
@@ -39,6 +39,7 @@ SourceFiles
 #ifndef SphericalTensor2D_H
 #define SphericalTensor2D_H
 
+#include "contiguous.H"
 #include "VectorSpace.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -47,7 +48,7 @@ namespace Foam
 {
 
 /*---------------------------------------------------------------------------*\
-                           Class SphericalTensor2D Declaration
+                      Class SphericalTensor2D Declaration
 \*---------------------------------------------------------------------------*/
 
 template<class Cmpt>
@@ -105,13 +106,33 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<SphericalTensor2D<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<SphericalTensor2D<Cmpt>>
+:
+    is_contiguous_label<Cmpt>
+{};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<SphericalTensor2D<Cmpt>>
+:
+    is_contiguous_scalar<Cmpt>
+{};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-// Include inline implementations
 #include "SphericalTensor2DI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/primitives/SphericalTensor2D/sphericalTensor2D/sphericalTensor2D.H b/src/OpenFOAM/primitives/SphericalTensor2D/sphericalTensor2D/sphericalTensor2D.H
index 30ddd92931d53bffecc985a94a55c82e76bb51ca..dbe441ccd30932970ea4744a974c56f4a0fea162 100644
--- a/src/OpenFOAM/primitives/SphericalTensor2D/sphericalTensor2D/sphericalTensor2D.H
+++ b/src/OpenFOAM/primitives/SphericalTensor2D/sphericalTensor2D/sphericalTensor2D.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) 2011 OpenFOAM Foundation
@@ -39,7 +39,6 @@ SourceFiles
 
 #include "SphericalTensor2D.H"
 #include "tensor.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -56,12 +55,6 @@ static const sphericalTensor2D I2D(1);
 static const sphericalTensor2D oneThirdI2D(1.0/3.0);
 static const sphericalTensor2D twoThirdsI2D(2.0/3.0);
 
-
-//- Data associated with sphericalTensor2D type are contiguous
-template<>
-inline bool contiguous<sphericalTensor2D>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/SymmTensor/SymmTensor.H b/src/OpenFOAM/primitives/SymmTensor/SymmTensor.H
index 2fb50c93b96d9f694e8372972e900496fbe9ab92..8d5f5d43bf93cc1ee756b6a0ebbd4b35164d6182 100644
--- a/src/OpenFOAM/primitives/SymmTensor/SymmTensor.H
+++ b/src/OpenFOAM/primitives/SymmTensor/SymmTensor.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) 2011-2016 OpenFOAM Foundation
@@ -40,6 +40,7 @@ SourceFiles
 #ifndef SymmTensor_H
 #define SymmTensor_H
 
+#include "contiguous.H"
 #include "VectorSpace.H"
 #include "SphericalTensor.H"
 
@@ -138,6 +139,21 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<SymmTensor<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<SymmTensor<Cmpt>> : is_contiguous_label<Cmpt> {};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<SymmTensor<Cmpt>> : is_contiguous_scalar<Cmpt> {};
+
+
 template<class Cmpt>
 class symmTypeOfRank<Cmpt, 2>
 {
@@ -153,7 +169,6 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-// Include inline implementations
 #include "SymmTensorI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/primitives/SymmTensor/labelSymmTensor/labelSymmTensor.H b/src/OpenFOAM/primitives/SymmTensor/labelSymmTensor/labelSymmTensor.H
index 447e36e87ad203a2983479392c9be807befb4fb0..40dd09ce8a585f7d5685d3fb508c2f2c234aa124 100644
--- a/src/OpenFOAM/primitives/SymmTensor/labelSymmTensor/labelSymmTensor.H
+++ b/src/OpenFOAM/primitives/SymmTensor/labelSymmTensor/labelSymmTensor.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) 2011 OpenFOAM Foundation
@@ -38,7 +38,6 @@ SourceFiles
 #define labelSymmTensor_H
 
 #include "SymmTensor.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -49,11 +48,6 @@ namespace Foam
 
 typedef SymmTensor<label> labelSymmTensor;
 
-//- Data associated with labelSymmTensor type are contiguous
-template<>
-inline bool contiguous<labelSymmTensor>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/SymmTensor/symmTensor/symmTensor.H b/src/OpenFOAM/primitives/SymmTensor/symmTensor/symmTensor.H
index dcba66e571589ea94ecb8245c70af5d0077160f7..e49a4ea24d52f86ffa2db258101b30ceedb72f2f 100644
--- a/src/OpenFOAM/primitives/SymmTensor/symmTensor/symmTensor.H
+++ b/src/OpenFOAM/primitives/SymmTensor/symmTensor/symmTensor.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) 2011-2012 OpenFOAM Foundation
@@ -38,7 +38,6 @@ SourceFiles
 #define symmTensor_H
 
 #include "SymmTensor.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -49,11 +48,6 @@ namespace Foam
 
 typedef SymmTensor<scalar> symmTensor;
 
-//- Data associated with symmTensor type are contiguous
-template<>
-inline bool contiguous<symmTensor>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/SymmTensor2D/SymmTensor2D.H b/src/OpenFOAM/primitives/SymmTensor2D/SymmTensor2D.H
index c961f6203a569b46545df76009ab125fef6f4b59..f76790d29ae7f218a25b7273c2d6b0c18c7ebead 100644
--- a/src/OpenFOAM/primitives/SymmTensor2D/SymmTensor2D.H
+++ b/src/OpenFOAM/primitives/SymmTensor2D/SymmTensor2D.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) 2011-2016 OpenFOAM Foundation
@@ -40,6 +40,7 @@ SourceFiles
 #ifndef SymmTensor2D_H
 #define SymmTensor2D_H
 
+#include "contiguous.H"
 #include "VectorSpace.H"
 #include "SphericalTensor2D.H"
 
@@ -130,13 +131,27 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<SymmTensor2D<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<SymmTensor2D<Cmpt>> : is_contiguous_label<Cmpt> {};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<SymmTensor2D<Cmpt>> : is_contiguous_scalar<Cmpt> {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-// Include inline implementations
 #include "SymmTensor2DI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/primitives/SymmTensor2D/symmTensor2D/symmTensor2D.H b/src/OpenFOAM/primitives/SymmTensor2D/symmTensor2D/symmTensor2D.H
index c958137ff8208de23bd4f4a0fad7629a1c163c33..354b0da7596058166d0f85997e92f3ee998cfffa 100644
--- a/src/OpenFOAM/primitives/SymmTensor2D/symmTensor2D/symmTensor2D.H
+++ b/src/OpenFOAM/primitives/SymmTensor2D/symmTensor2D/symmTensor2D.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) 2011-2013 OpenFOAM Foundation
@@ -38,7 +38,6 @@ SourceFiles
 #define symmTensor2D_H
 
 #include "SymmTensor2D.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -49,11 +48,6 @@ namespace Foam
 
 typedef SymmTensor2D<scalar> symmTensor2D;
 
-//- Data associated with symmTensor2D type are contiguous
-template<>
-inline bool contiguous<symmTensor2D>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Tensor/Tensor.H b/src/OpenFOAM/primitives/Tensor/Tensor.H
index 21fc9176d051670d9b95c25a3c35ddeb28aee8a6..322e6b31e289762b02b2cf513b0110f81ae039be 100644
--- a/src/OpenFOAM/primitives/Tensor/Tensor.H
+++ b/src/OpenFOAM/primitives/Tensor/Tensor.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -272,6 +272,21 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<Tensor<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<Tensor<Cmpt>> : is_contiguous_label<Cmpt> {};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<Tensor<Cmpt>> : is_contiguous_scalar<Cmpt> {};
+
+
 template<class Cmpt>
 class typeOfRank<Cmpt, 2>
 {
diff --git a/src/OpenFOAM/primitives/Tensor/doubleTensor/doubleTensor.H b/src/OpenFOAM/primitives/Tensor/doubleTensor/doubleTensor.H
index 5276c32974c9590176214da2dbb6480bf0e3f031..e58c4e189af0fe65f62508fc45e8dbd4fc24907b 100644
--- a/src/OpenFOAM/primitives/Tensor/doubleTensor/doubleTensor.H
+++ b/src/OpenFOAM/primitives/Tensor/doubleTensor/doubleTensor.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -25,7 +25,7 @@ Typedef
     Foam::doubleTensor
 
 Description
-    A Tensor of values with double precision
+    A Tensor of double precision values
 
 SourceFiles
     doubleTensor.C
@@ -36,7 +36,6 @@ SourceFiles
 #define doubleTensor_H
 
 #include "Tensor.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -47,12 +46,6 @@ namespace Foam
 
 typedef Tensor<double> doubleTensor;
 
-//- Data associated with doubleTensor type are contiguous
-#if !defined(WM_DP)
-template<>
-inline bool contiguous<doubleTensor>() {return true;}
-#endif
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Tensor/floatTensor/floatTensor.H b/src/OpenFOAM/primitives/Tensor/floatTensor/floatTensor.H
index 5240625536ffab1f18ba28395b5eae6a46d8fa41..f92a52e7ece034a7d4efcf4d8e45f8f77f3d3b00 100644
--- a/src/OpenFOAM/primitives/Tensor/floatTensor/floatTensor.H
+++ b/src/OpenFOAM/primitives/Tensor/floatTensor/floatTensor.H
@@ -27,7 +27,7 @@ Typedef
     Foam::floatTensor
 
 Description
-    A Tensor of values with float precision
+    A Tensor of float precision values
 
 SourceFiles
     floatTensor.C
@@ -38,7 +38,6 @@ SourceFiles
 #define floatTensor_H
 
 #include "Tensor.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -49,12 +48,6 @@ namespace Foam
 
 typedef Tensor<float> floatTensor;
 
-//- Data associated with floatTensor type are contiguous
-#if !defined(WM_SP) && !defined(WM_SPDP)
-template<>
-inline bool contiguous<floatTensor>() {return true;}
-#endif
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Tensor/labelTensor/labelTensor.H b/src/OpenFOAM/primitives/Tensor/labelTensor/labelTensor.H
index d431e1c7594140df2f22986a59e0402477aa4cad..fd24b361f1f12c80a7599ea0ecc5c09de0265fd0 100644
--- a/src/OpenFOAM/primitives/Tensor/labelTensor/labelTensor.H
+++ b/src/OpenFOAM/primitives/Tensor/labelTensor/labelTensor.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) 2011 OpenFOAM Foundation
@@ -27,7 +27,7 @@ Typedef
     Foam::labelTensor
 
 Description
-    A Tensor of values using label (integer) representation.
+    A Tensor of label (integer) values
 
 SourceFiles
     labelTensor.C
@@ -38,7 +38,6 @@ SourceFiles
 #define labelTensor_H
 
 #include "Tensor.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -49,11 +48,6 @@ namespace Foam
 
 typedef Tensor<label> labelTensor;
 
-//- Specify data associated with labelTensor type are contiguous
-template<>
-inline bool contiguous<labelTensor>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Tensor/tensor/tensor.H b/src/OpenFOAM/primitives/Tensor/tensor/tensor.H
index 7d2244caeef32c1ef50a18cd47e6ca57a84b8bd2..3ca0a16255a3e5eceb540ed85be3c661eb204da2 100644
--- a/src/OpenFOAM/primitives/Tensor/tensor/tensor.H
+++ b/src/OpenFOAM/primitives/Tensor/tensor/tensor.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) 2011-2014 OpenFOAM Foundation
@@ -41,7 +41,6 @@ SourceFiles
 #include "vector.H"
 #include "sphericalTensor.H"
 #include "symmTensor.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -74,10 +73,6 @@ vector eigenVector
 tensor eigenVectors(const symmTensor& T, const vector& lambdas);
 tensor eigenVectors(const symmTensor& T);
 
-//- Data associated with tensor type are contiguous
-template<>
-inline bool contiguous<tensor>() {return true;}
-
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/OpenFOAM/primitives/Tensor2D/Tensor2D.H b/src/OpenFOAM/primitives/Tensor2D/Tensor2D.H
index 332d74e9603fc803d0ff75368bbf7b92d90ef3f8..45d8f132fe578cbf7780a3fc9a77cb4fdf97cc89 100644
--- a/src/OpenFOAM/primitives/Tensor2D/Tensor2D.H
+++ b/src/OpenFOAM/primitives/Tensor2D/Tensor2D.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -48,8 +48,8 @@ SourceFiles
 namespace Foam
 {
 
-template<class Cmpt>
-class SymmTensor2D;
+// Forward Declarations
+template<class Cmpt> class SymmTensor2D;
 
 /*---------------------------------------------------------------------------*\
                            Class Tensor2D Declaration
@@ -172,13 +172,27 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<Tensor2D<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<Tensor2D<Cmpt>> : is_contiguous_label<Cmpt> {};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<Tensor2D<Cmpt>> : is_contiguous_scalar<Cmpt> {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-// Include inline implementations
 #include "Tensor2DI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/primitives/Tensor2D/tensor2D/tensor2D.H b/src/OpenFOAM/primitives/Tensor2D/tensor2D/tensor2D.H
index 56176ce9ec72b6e77c15b539254d20a9cd2ff4f0..e844974d8e1f4d732738b0c237860d272acacb2b 100644
--- a/src/OpenFOAM/primitives/Tensor2D/tensor2D/tensor2D.H
+++ b/src/OpenFOAM/primitives/Tensor2D/tensor2D/tensor2D.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) 2011-2017 OpenFOAM Foundation
@@ -27,7 +27,7 @@ Typedef
     Foam::tensor2D
 
 Description
-    Tensor2D or scalars.
+    Tensor2D of scalars.
 
 SourceFiles
     tensor2D.C
@@ -39,7 +39,6 @@ SourceFiles
 
 #include "Tensor2D.H"
 #include "vector2D.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -60,10 +59,6 @@ vector2D eigenVector
 tensor2D eigenVectors(const tensor2D& t, const vector2D& lambdas);
 tensor2D eigenVectors(const tensor2D& t);
 
-//- Data associated with tensor2D type are contiguous
-template<>
-inline bool contiguous<tensor2D>() {return true;}
-
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/OpenFOAM/primitives/Vector/Vector.H b/src/OpenFOAM/primitives/Vector/Vector.H
index bccc1bd25f810e8b8e207f187fc502b3af9ddd40..ea9fb027f3e969eab164d3f4024c8dd2716341a4 100644
--- a/src/OpenFOAM/primitives/Vector/Vector.H
+++ b/src/OpenFOAM/primitives/Vector/Vector.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -43,6 +43,7 @@ SourceFiles
 #ifndef Vector_H
 #define Vector_H
 
+#include "contiguous.H"
 #include "VectorSpace.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -132,6 +133,21 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<Vector<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<Vector<Cmpt>> : is_contiguous_label<Cmpt> {};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<Vector<Cmpt>> : is_contiguous_scalar<Cmpt> {};
+
+
 template<class Cmpt>
 class typeOfRank<Cmpt, 1>
 {
diff --git a/src/OpenFOAM/primitives/Vector/doubleVector/doubleVector.H b/src/OpenFOAM/primitives/Vector/doubleVector/doubleVector.H
index e50e1f60923f9d4d14e3faddb41dd1d958da0f6d..7397938e276b969fd6f3356a92bc7a927a339a60 100644
--- a/src/OpenFOAM/primitives/Vector/doubleVector/doubleVector.H
+++ b/src/OpenFOAM/primitives/Vector/doubleVector/doubleVector.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -36,7 +36,6 @@ SourceFiles
 #define doubleVector_H
 
 #include "Vector.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -47,12 +46,6 @@ namespace Foam
 
 typedef Vector<double> doubleVector;
 
-//- Data associated with doubleVector type are contiguous
-#if !defined(WM_DP)
-template<>
-inline bool contiguous<doubleVector>() {return true;}
-#endif
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Vector/floatVector/floatVector.H b/src/OpenFOAM/primitives/Vector/floatVector/floatVector.H
index 5c702f6d65d14bbc3e37377681c0be2aa4af9b16..f01c97531335f39b11cd4d392d47ad6f033848aa 100644
--- a/src/OpenFOAM/primitives/Vector/floatVector/floatVector.H
+++ b/src/OpenFOAM/primitives/Vector/floatVector/floatVector.H
@@ -2,10 +2,8 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2019 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2011-2019 OpenCFD Ltd.
      \\/     M anipulation  |
--------------------------------------------------------------------------------
-                            | Copyright (C) 2011 OpenFOAM Foundation
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -38,7 +36,6 @@ SourceFiles
 #define floatVector_H
 
 #include "Vector.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -49,12 +46,6 @@ namespace Foam
 
 typedef Vector<float> floatVector;
 
-//- Data associated with floatVector type are contiguous
-#if !defined(WM_SP) && !defined(WM_SPDP)
-template<>
-inline bool contiguous<floatVector>() {return true;}
-#endif
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Vector/labelVector/labelVector.H b/src/OpenFOAM/primitives/Vector/labelVector/labelVector.H
index 4e1e95254095c5695f8225c0e2398264ec6082b7..095670df0411876aa74c237fde03793790aefcb0 100644
--- a/src/OpenFOAM/primitives/Vector/labelVector/labelVector.H
+++ b/src/OpenFOAM/primitives/Vector/labelVector/labelVector.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) 2011 OpenFOAM Foundation
@@ -39,7 +39,6 @@ SourceFiles
 
 #include "label.H"
 #include "Vector.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -50,12 +49,6 @@ namespace Foam
 
 typedef Vector<label> labelVector;
 
-
-//- Data associated with labelVector type are contiguous
-template<>
-inline bool contiguous<labelVector>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Vector/vector/vector.H b/src/OpenFOAM/primitives/Vector/vector/vector.H
index 622560fa641a6e2c9de93f454f37321f638fed07..7889fd50d2f96415c0b40f05ad5b088703e37281 100644
--- a/src/OpenFOAM/primitives/Vector/vector/vector.H
+++ b/src/OpenFOAM/primitives/Vector/vector/vector.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) 2011 OpenFOAM Foundation
@@ -39,7 +39,6 @@ SourceFiles
 
 #include "scalar.H"
 #include "Vector.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -50,11 +49,7 @@ namespace Foam
 
 typedef Vector<scalar> vector;
 
-
-//- Data associated with vector type are contiguous
-template<>
-inline bool contiguous<vector>() {return true;}
-
+// Traits
 
 template<class Type>
 class flux
diff --git a/src/OpenFOAM/primitives/Vector2D/Vector2D.H b/src/OpenFOAM/primitives/Vector2D/Vector2D.H
index ed69c95ed7dac57efa9af4c97c2099dc5fa76e6a..44ccff9071fbcf9124377bd36c6706ebefc2a64b 100644
--- a/src/OpenFOAM/primitives/Vector2D/Vector2D.H
+++ b/src/OpenFOAM/primitives/Vector2D/Vector2D.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -39,6 +39,7 @@ SourceFiles
 #ifndef Vector2D_H
 #define Vector2D_H
 
+#include "contiguous.H"
 #include "VectorSpace.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -115,13 +116,27 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<Vector2D<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<Vector2D<Cmpt>> : is_contiguous_label<Cmpt> {};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<Vector2D<Cmpt>> : is_contiguous_scalar<Cmpt> {};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-// Include inline implementations
 #include "Vector2DI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/primitives/Vector2D/labelVector2D/labelVector2D.H b/src/OpenFOAM/primitives/Vector2D/labelVector2D/labelVector2D.H
index 5c558f9adeb7ba5b4dd5eb47d1694104e2be28e1..c8d094642f11d8b7f614ef1b05a15e3e5ddc2022 100644
--- a/src/OpenFOAM/primitives/Vector2D/labelVector2D/labelVector2D.H
+++ b/src/OpenFOAM/primitives/Vector2D/labelVector2D/labelVector2D.H
@@ -37,7 +37,6 @@ SourceFiles
 
 #include "label.H"
 #include "Vector2D.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -48,12 +47,6 @@ namespace Foam
 
 typedef Vector2D<label> labelVector2D;
 
-
-//- Data associated with labelVector2D type are contiguous
-template<>
-inline bool contiguous<labelVector2D>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/Vector2D/vector2D/vector2D.H b/src/OpenFOAM/primitives/Vector2D/vector2D/vector2D.H
index cd7d2fa33cc2751a70b49bf1f386639996055200..c64db4a3ea26b0b7ed5b188b7edda20e262176a5 100644
--- a/src/OpenFOAM/primitives/Vector2D/vector2D/vector2D.H
+++ b/src/OpenFOAM/primitives/Vector2D/vector2D/vector2D.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) 2011 OpenFOAM Foundation
@@ -39,7 +39,6 @@ SourceFiles
 
 #include "scalar.H"
 #include "Vector2D.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -50,12 +49,6 @@ namespace Foam
 
 typedef Vector2D<scalar> vector2D;
 
-
-//- Data associated with vector2D type are contiguous
-template<>
-inline bool contiguous<vector2D>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/complex/complex.H b/src/OpenFOAM/primitives/complex/complex.H
index 4702d9f7dab3fda1265afa3b5722d08ddc23f492..88bdd871081882fa8956fab627beace5f24b5729 100644
--- a/src/OpenFOAM/primitives/complex/complex.H
+++ b/src/OpenFOAM/primitives/complex/complex.H
@@ -38,12 +38,12 @@ SourceFiles
 #ifndef complex_H
 #define complex_H
 
-#include <complex>
-#include <type_traits>
 #include "scalar.H"
 #include "word.H"
 #include "zero.H"
 #include "contiguous.H"
+#include <complex>
+#include <type_traits>
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -344,6 +344,15 @@ namespace Detail
 } // End namespace Detail
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for complex
+template<> struct is_contiguous<complex> : std::true_type {};
+
+//- Contiguous scalar data for complex
+template<> struct is_contiguous_scalar<complex> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * Global Operators  * * * * * * * * * * * * * //
 
 Istream& operator>>(Istream& is, complex& c);
@@ -358,10 +367,6 @@ inline complex operator~(const complex& c);
 //- Return string representation of complex
 word name(const complex& c);
 
-//- Data associated with complex type are contiguous
-template<>
-inline bool contiguous<complex>() {return true;}
-
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/OpenFOAM/primitives/contiguous/contiguous.H b/src/OpenFOAM/primitives/contiguous/contiguous.H
index b8c1c55da0bd581f4bddb06269748ec336586bd4..04e189c221a7203d7b33cf84f7c4c9d4da8d87f6 100644
--- a/src/OpenFOAM/primitives/contiguous/contiguous.H
+++ b/src/OpenFOAM/primitives/contiguous/contiguous.H
@@ -23,21 +23,46 @@ License
     You should have received a copy of the GNU General Public License
     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
 
-InClass
-    Foam::contiguous
+Class
+    Foam::is_contiguous
 
 Description
-    Template function to specify if the data of a type are contiguous.
+    A template class to specify that a data type can be considered as being
+    contiguous in memory.
 
-    The default function specifies that data are not contiguous.
-    This is specialised for the types (eg, primitives) with contiguous data.
+    Normally only integral and floating-point types can be considered
+    contiguous, but some other types (eg, FixedList, Pair, Vector etc)
+    consisting purely of these fundamental types can be considered
+    as having a contiguous memory layout as well.
+
+Note
+    In OpenFOAM 1906 and earlier, the contiguous trait was handled
+    by templated \c contiguous global functions.
+
+    While possible to mark this as deleted, this does not detect or
+    prevent specializations. Thus omit the usual housekeeping.
+
+Class
+    Foam::is_contiguous_label
+
+Description
+    A template class to specify if a data type is composed solely of
+    Foam::label elements.
+
+Class
+    Foam::is_contiguous_scalar
+
+Description
+    A template class to specify if a data type is composed solely of
+    Foam::scalar elements.
 
 \*---------------------------------------------------------------------------*/
 
 #ifndef contiguous_H
 #define contiguous_H
 
-#include "int.H"
+#include "scalar.H"
+#include "label.H"
 #include <type_traits>
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -45,87 +70,30 @@ Description
 namespace Foam
 {
 
-// Forward Declarations
-template<class T, unsigned N> class FixedList;
-template<class T> class Pair;
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-//- Default definition: (integral | floating-point) are contiguous
+// Base definition for (integral | floating-point) as contiguous
 template<class T>
-inline bool contiguous()
-{
-    return std::is_arithmetic<T>::value;
-}
-
-//
-// Fixed size containers of (integral | floating-point) are contiguous
-//
-
-template<>
-inline bool contiguous<FixedList<bool, 2>>()               {return true;}
-template<>
-inline bool contiguous<Pair<bool>>()                       {return true;}
-
-template<>
-inline bool contiguous<FixedList<char, 2>>()               {return true;}
-template<>
-inline bool contiguous<Pair<char>>()                       {return true;}
-
-template<>
-inline bool contiguous<FixedList<int8_t, 2>>()             {return true;}
-template<>
-inline bool contiguous<Pair<int8_t>>()                     {return true;}
-
-template<>
-inline bool contiguous<FixedList<uint8_t, 2>>()            {return true;}
-template<>
-inline bool contiguous<Pair<uint8_t>>()                    {return true;}
-
-template<>
-inline bool contiguous<FixedList<int16_t, 2>>()            {return true;}
-template<>
-inline bool contiguous<Pair<int16_t>>()                    {return true;}
-
-template<>
-inline bool contiguous<FixedList<uint16_t, 2>>()           {return true;}
-template<>
-inline bool contiguous<Pair<uint16_t>>()                   {return true;}
-
-template<>
-inline bool contiguous<FixedList<int32_t, 2>>()            {return true;}
-template<>
-inline bool contiguous<Pair<int32_t>>()                    {return true;}
-
-template<>
-inline bool contiguous<FixedList<uint32_t, 2>>()           {return true;}
-template<>
-inline bool contiguous<Pair<uint32_t>>()                   {return true;}
-
-template<>
-inline bool contiguous<FixedList<int64_t, 2>>()            {return true;}
-template<>
-inline bool contiguous<Pair<int64_t>>()                    {return true;}
-
-template<>
-inline bool contiguous<FixedList<uint64_t, 2>>()           {return true;}
-template<>
-inline bool contiguous<Pair<uint64_t>>()                   {return true;}
-
-template<>
-inline bool contiguous<FixedList<float, 2>>()              {return true;}
-template<>
-inline bool contiguous<Pair<float>>()                      {return true;}
-
-template<>
-inline bool contiguous<FixedList<double, 2>>()             {return true;}
-template<>
-inline bool contiguous<Pair<double>>()                     {return true;}
-
-template<>
-inline bool contiguous<FixedList<long double, 2>>()        {return true;}
-template<>
-inline bool contiguous<Pair<long double>>()                {return true;}
+struct is_contiguous
+:
+    std::is_arithmetic<T>
+{};
+
+
+// Base definition for 'label'
+template<class T>
+struct is_contiguous_label
+:
+    std::is_same<T, label>
+{};
+
+
+// Base definition for 'scalar'
+template<class T>
+struct is_contiguous_scalar
+:
+    std::is_same<T, scalar>
+{};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/primitives/globalIndexAndTransform/vectorTensorTransform/vectorTensorTransform.H b/src/OpenFOAM/primitives/globalIndexAndTransform/vectorTensorTransform/vectorTensorTransform.H
index 605ee406198df4b5d7009abe7dacc8d4c851cba4..75d045a9aad3750f64d87e4c864e1bdc372026b1 100644
--- a/src/OpenFOAM/primitives/globalIndexAndTransform/vectorTensorTransform/vectorTensorTransform.H
+++ b/src/OpenFOAM/primitives/globalIndexAndTransform/vectorTensorTransform/vectorTensorTransform.H
@@ -50,7 +50,7 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of friend functions and operators
+// Forward Declarations
 
 class vectorTensorTransform;
 Istream& operator>>(Istream& is, vectorTensorTransform&);
@@ -172,25 +172,27 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for vectorTensorTransform
+template<> struct is_contiguous<vectorTensorTransform> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
 
 //- Return the inverse of the given vectorTensorTransform
 inline vectorTensorTransform inv(const vectorTensorTransform& tr);
 
-
 //- Return a string representation of a vectorTensorTransform
 word name(const vectorTensorTransform&);
 
-
-//- Data associated with vectorTensorTransform type are contiguous
-template<>
-inline bool contiguous<vectorTensorTransform>() {return true;}
-
 //- Template specialisations
 template<>
 tmp<Field<bool>> vectorTensorTransform::transform(const Field<bool>&) const;
+
 template<>
 tmp<Field<label>> vectorTensorTransform::transform(const Field<label>&) const;
+
 template<>
 tmp<Field<scalar>> vectorTensorTransform::transform(const Field<scalar>&)
 const;
diff --git a/src/OpenFOAM/primitives/quaternion/quaternion.H b/src/OpenFOAM/primitives/quaternion/quaternion.H
index b7b69bbc836e1f4107d449ab2504117dace6e4a3..ca624e305ded82739ab0fb5ee336fcee67593b50 100644
--- a/src/OpenFOAM/primitives/quaternion/quaternion.H
+++ b/src/OpenFOAM/primitives/quaternion/quaternion.H
@@ -42,7 +42,6 @@ SourceFiles
 #include "vector.H"
 #include "tensor.H"
 #include "word.H"
-#include "contiguous.H"
 #include "Enum.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -239,6 +238,15 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for quaternion
+template<> struct is_contiguous<quaternion> : std::true_type {};
+
+//- Contiguous scalar data for quaternion
+template<> struct is_contiguous_scalar<quaternion> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
 
 inline scalar magSqr(const quaternion& q);
@@ -280,10 +288,6 @@ quaternion pow(const quaternion& q, const label power);
 //- Power of a quaternion
 quaternion pow(const quaternion& q, const scalar power);
 
-//- Data associated with quaternion type are contiguous
-template<>
-inline bool contiguous<quaternion>() {return true;}
-
 
 // * * * * * * * * * * * * * * * Global Operators  * * * * * * * * * * * * * //
 
diff --git a/src/OpenFOAM/primitives/septernion/septernion.H b/src/OpenFOAM/primitives/septernion/septernion.H
index da333c142dfaef57f4f3b4ea69a8170310b887e4..d44fb1ed5abba77221d903c6fd4281a61e85417c 100644
--- a/src/OpenFOAM/primitives/septernion/septernion.H
+++ b/src/OpenFOAM/primitives/septernion/septernion.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           |
+    \\  /    A nd           | Copyright (C) 2004-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -47,15 +47,13 @@ SourceFiles
 #include "quaternion.H"
 #include "spatialTransform.H"
 #include "word.H"
-#include "contiguous.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
 
-// Forward declaration of friend functions and operators
-
+// Forward Declarations
 class septernion;
 Istream& operator>>(Istream& is, septernion&);
 Ostream& operator<<(Ostream& os, const septernion& C);
@@ -67,7 +65,7 @@ Ostream& operator<<(Ostream& os, const septernion& C);
 
 class septernion
 {
-    // private data
+    // Private Data
 
         //- Translation vector
         vector t_;
@@ -154,6 +152,15 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for septernion
+template<> struct is_contiguous<septernion> : std::true_type {};
+
+//- Contiguous scalar data for septernion
+template<> struct is_contiguous_scalar<septernion> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
 
 //- Return the inverse of the given septernion
@@ -177,10 +184,6 @@ septernion average
     const UList<scalar> w
 );
 
-//- Data associated with septernion type are contiguous
-template<>
-inline bool contiguous<septernion>() {return true;}
-
 
 // * * * * * * * * * * * * * * * Global Operators  * * * * * * * * * * * * * //
 
diff --git a/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensor/CompactSpatialTensor.H b/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensor/CompactSpatialTensor.H
index 75c5e00a0029e4ba9b9c10aa9f97d67bfc1020d4..3de1dfb9ab586b6d28834960c05e996113345f14 100644
--- a/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensor/CompactSpatialTensor.H
+++ b/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensor/CompactSpatialTensor.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) 2016-2017 OpenFOAM Foundation
@@ -98,6 +98,27 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<CompactSpatialTensor<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<CompactSpatialTensor<Cmpt>>
+:
+    is_contiguous_label<Cmpt>
+{};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<CompactSpatialTensor<Cmpt>>
+:
+    is_contiguous_scalar<Cmpt>
+{};
+
+
 template<class Cmpt>
 class typeOfInnerProduct<Cmpt, CompactSpatialTensor<Cmpt>, Tensor<Cmpt>>
 {
diff --git a/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensor/compactSpatialTensor/compactSpatialTensor.H b/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensor/compactSpatialTensor/compactSpatialTensor.H
index 0d28d0cdf8a881ec798f4553d413d5fe6a362260..0bccd16f5acc4fcd8c40c9184c91f82d765cd470 100644
--- a/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensor/compactSpatialTensor/compactSpatialTensor.H
+++ b/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensor/compactSpatialTensor/compactSpatialTensor.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) 2016 OpenFOAM Foundation
@@ -48,11 +48,6 @@ namespace Foam
 
 typedef CompactSpatialTensor<scalar> compactSpatialTensor;
 
-//- Data associated with compactSpatialTensor type are contiguous
-template<>
-inline bool contiguous<compactSpatialTensor>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensorT/CompactSpatialTensorT.H b/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensorT/CompactSpatialTensorT.H
index 1a8354aa7585b65cfc27f294bc04b91ab573236c..209fa96f243358620eb6f31d8ec74f5e3dfe3737 100644
--- a/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensorT/CompactSpatialTensorT.H
+++ b/src/OpenFOAM/primitives/spatialVectorAlgebra/CompactSpatialTensorT/CompactSpatialTensorT.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) 2016 OpenFOAM Foundation
@@ -97,6 +97,27 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<CompactSpatialTensorT<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<CompactSpatialTensorT<Cmpt>>
+:
+    is_contiguous_label<Cmpt>
+{};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<CompactSpatialTensorT<Cmpt>>
+:
+    is_contiguous_scalar<Cmpt>
+{};
+
+
 template<class Cmpt>
 class typeOfTranspose<Cmpt, CompactSpatialTensor<Cmpt>>
 {
diff --git a/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialTensor/SpatialTensor.H b/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialTensor/SpatialTensor.H
index 923a05bd611bb49af341e02c3bb5791094a0f09c..8b7b1b860f427815ea1c900ca9396786804e7874 100644
--- a/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialTensor/SpatialTensor.H
+++ b/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialTensor/SpatialTensor.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) 2016 OpenFOAM Foundation
@@ -128,6 +128,27 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<SpatialTensor<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<SpatialTensor<Cmpt>>
+:
+    is_contiguous_label<Cmpt>
+{};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<SpatialTensor<Cmpt>>
+:
+    is_contiguous_scalar<Cmpt>
+{};
+
+
 template<class Cmpt>
 class typeOfTranspose<Cmpt, SpatialTensor<Cmpt>>
 {
@@ -170,7 +191,6 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-// Include inline implementations
 #include "SpatialTensorI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialTensor/spatialTensor/spatialTensor.H b/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialTensor/spatialTensor/spatialTensor.H
index 9b96f76a5109851f33df5897aefa03302df1f379..279ed70329a5e8aee01908eb2910057e98d38b67 100644
--- a/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialTensor/spatialTensor/spatialTensor.H
+++ b/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialTensor/spatialTensor/spatialTensor.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) 2016 OpenFOAM Foundation
@@ -48,11 +48,6 @@ namespace Foam
 
 typedef SpatialTensor<scalar> spatialTensor;
 
-//- Data associated with spatialTensor type are contiguous
-template<>
-inline bool contiguous<spatialTensor>() {return true;}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialVector/SpatialVector.H b/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialVector/SpatialVector.H
index feaaf56491695b2cdc3334182be846d2361fcf9c..b4fa977c8b1212257156dca7a19f18b19951b0f8 100644
--- a/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialVector/SpatialVector.H
+++ b/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialVector/SpatialVector.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) 2016 OpenFOAM Foundation
@@ -158,6 +158,27 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Data are contiguous if component type is contiguous
+template<class Cmpt>
+struct is_contiguous<SpatialVector<Cmpt>> : is_contiguous<Cmpt> {};
+
+//- Data are contiguous label if component type is label
+template<class Cmpt>
+struct is_contiguous_label<SpatialVector<Cmpt>>
+:
+    is_contiguous_label<Cmpt>
+{};
+
+//- Data are contiguous scalar if component type is scalar
+template<class Cmpt>
+struct is_contiguous_scalar<SpatialVector<Cmpt>>
+:
+    is_contiguous_scalar<Cmpt>
+{};
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialVector/spatialVector/spatialVector.H b/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialVector/spatialVector/spatialVector.H
index c28807b2e02622f8e65fd28a8ad5bb4e96b0fdea..ca59d3cf96fdc15d1e47f92ae2609d54b8bc5fb4 100644
--- a/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialVector/spatialVector/spatialVector.H
+++ b/src/OpenFOAM/primitives/spatialVectorAlgebra/SpatialVector/spatialVector/spatialVector.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) 2016 OpenFOAM Foundation
@@ -48,10 +48,6 @@ namespace Foam
 
 typedef SpatialVector<scalar> spatialVector;
 
-//- Data associated with spatialVector type are contiguous
-template<>
-inline bool contiguous<spatialVector>() {return true;}
-
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/OpenFOAM/primitives/triad/triad.H b/src/OpenFOAM/primitives/triad/triad.H
index 21e062d858d319bd1116a29cf23e898c3845ab89..4f7bb6e9cfce68f5a87c9bbe7ee5483e18a846ef 100644
--- a/src/OpenFOAM/primitives/triad/triad.H
+++ b/src/OpenFOAM/primitives/triad/triad.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2012-2016 OpenFOAM Foundation
@@ -53,13 +53,12 @@ namespace Foam
 
 // Forward declarations
 class triad;
+class quaternion;
 class Istream;
 class Ostream;
 Istream& operator>>(Istream&, triad&);
 Ostream& operator<<(Ostream&, const triad&);
 
-class quaternion;
-
 /*---------------------------------------------------------------------------*\
                            Class triad Declaration
 \*---------------------------------------------------------------------------*/
@@ -165,15 +164,20 @@ public:
 };
 
 
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for triad
+template<> struct is_contiguous<triad> : std::true_type {};
+
+//- Contiguous 'scalar' data for triad
+template<> struct is_contiguous_scalar<triad> : std::true_type {};
+
+
 // * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
 
 //- Return a quantity of the difference between two triads
 scalar diff(const triad& A, const triad& B);
 
-//- Data associated with quaternion type are contiguous
-template<>
-inline bool contiguous<triad>() {return true;}
-
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/TurbulenceModels/turbulenceModels/LES/LESdeltas/smoothDelta/smoothDelta.H b/src/TurbulenceModels/turbulenceModels/LES/LESdeltas/smoothDelta/smoothDelta.H
index 81956b51545bf92b9d60b42336670d07377e6938..8f2ef00f1fe8fb5c930046d007ce1482c133d120 100644
--- a/src/TurbulenceModels/turbulenceModels/LES/LESdeltas/smoothDelta/smoothDelta.H
+++ b/src/TurbulenceModels/turbulenceModels/LES/LESdeltas/smoothDelta/smoothDelta.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           |
+    \\  /    A nd           | Copyright (C) 2004-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -271,8 +271,7 @@ public:
 
 
     //- Destructor
-    virtual ~smoothDelta()
-    {}
+    virtual ~smoothDelta() = default;
 
 
     // Member Functions
@@ -289,14 +288,13 @@ public:
 
 } // End namespace LESModels
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-//- Data associated with deltaData type are contiguous
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for deltaData
 template<>
-inline bool contiguous<LESModels::smoothDelta::deltaData>()
-{
-    return true;
-}
+struct is_contiguous<LESModels::smoothDelta::deltaData> : std::true_type {};
+
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.H b/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.H
index 1892a3a5f2a549ad7f3b5c6c2392b256bd40fa04..1ce342adc2439b24e99cd7e9bfd28f2880a66da1 100644
--- a/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.H
+++ b/src/dynamicMesh/meshCut/directions/directionInfo/directionInfo.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) 2011-2016 OpenFOAM Foundation
@@ -64,16 +64,14 @@ SourceFiles
 
 namespace Foam
 {
+
+// Forward Declarations
 class polyPatch;
 class polyMesh;
 class primitiveMesh;
 class edge;
 class face;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class directionInfo;
 
 Istream& operator>>(Istream&, directionInfo&);
@@ -86,7 +84,7 @@ Ostream& operator<<(Ostream&, const directionInfo&);
 
 class directionInfo
 {
-    // Private data
+    // Private Data
 
         // Either mesh edge or face point
         label index_;
@@ -262,12 +260,10 @@ public:
 };
 
 
-//- Data associated with directionInfo type are contiguous
-template<>
-inline bool contiguous<directionInfo>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for directionInfo
+template<> struct is_contiguous<directionInfo> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/meshCut/wallLayerCells/wallNormalInfo/wallNormalInfo.H b/src/dynamicMesh/meshCut/wallLayerCells/wallNormalInfo/wallNormalInfo.H
index 67bf68504f1a7fe0e2751481390fe1870de520a2..98359fd8f0932b155d729f53d4ccf4295da4bdaf 100644
--- a/src/dynamicMesh/meshCut/wallLayerCells/wallNormalInfo/wallNormalInfo.H
+++ b/src/dynamicMesh/meshCut/wallLayerCells/wallNormalInfo/wallNormalInfo.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) 2011-2016 OpenFOAM Foundation
@@ -49,13 +49,9 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class wallNormalInfo;
 
 Istream& operator>>(Istream&, wallNormalInfo&);
@@ -202,12 +198,10 @@ public:
 };
 
 
-//- Data associated with wallNormalInfo type are contiguous
-template<>
-inline bool contiguous<wallNormalInfo>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for wallNormalInfo
+template<> struct is_contiguous<wallNormalInfo> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/motionSolvers/displacement/layeredSolver/pointEdgeStructuredWalk.H b/src/dynamicMesh/motionSolvers/displacement/layeredSolver/pointEdgeStructuredWalk.H
index 8fc9b6a06b6dd083da8c271df648379fe397a1d0..6d03f1eceade18dd19bbf8ce67872512111a6e05 100644
--- a/src/dynamicMesh/motionSolvers/displacement/layeredSolver/pointEdgeStructuredWalk.H
+++ b/src/dynamicMesh/motionSolvers/displacement/layeredSolver/pointEdgeStructuredWalk.H
@@ -46,7 +46,7 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declarations
+// Forward Declarations
 class polyPatch;
 class polyMesh;
 class pointEdgeStructuredWalk;
@@ -236,12 +236,10 @@ public:
 };
 
 
-//- Data associated with pointEdgeStructuredWalk type are contiguous
-template<>
-inline bool contiguous<pointEdgeStructuredWalk>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for pointEdgeStructuredWalk
+template<> struct is_contiguous<pointEdgeStructuredWalk> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/pointPatchDist/externalPointEdgePoint.H b/src/dynamicMesh/pointPatchDist/externalPointEdgePoint.H
index fe4f35cb922621373d095294182082ab81b2b7dd..7eaac6d88d4e430959b3930cb95cdcc2fac59635 100644
--- a/src/dynamicMesh/pointPatchDist/externalPointEdgePoint.H
+++ b/src/dynamicMesh/pointPatchDist/externalPointEdgePoint.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) 2013-2016 OpenFOAM Foundation
@@ -47,13 +47,9 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class externalPointEdgePoint;
 
 Istream& operator>>(Istream&, externalPointEdgePoint&);
@@ -251,12 +247,10 @@ public:
 };
 
 
-//- Data associated with externalPointEdgePoint type are contiguous
-template<>
-inline bool contiguous<externalPointEdgePoint>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for externalPointEdgePoint
+template<> struct is_contiguous<externalPointEdgePoint> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/pointEdgeCollapse/pointEdgeCollapse.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/pointEdgeCollapse/pointEdgeCollapse.H
index e00bc3b9d92c2f0ed8a70160b791eb04394e2888..0038fa8f691846781c4a5d6e97764f49222a58de 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/pointEdgeCollapse/pointEdgeCollapse.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/pointEdgeCollapse/pointEdgeCollapse.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) 2012-2016 OpenFOAM Foundation
@@ -46,13 +46,9 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class pointEdgeCollapse;
 
 Istream& operator>>(Istream&, pointEdgeCollapse&);
@@ -221,12 +217,10 @@ public:
 };
 
 
-//- Data associated with pointEdgeCollapse type are contiguous
-template<>
-inline bool contiguous<pointEdgeCollapse>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for pointEdgeCollapse
+template<> struct is_contiguous<pointEdgeCollapse> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementData.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementData.H
index f82a41c517e574dd2f3e8d4efd0ccd7e747aef50..fc2a2b39c7e7fe2ee1a1050918ec70c8bd4b0b88 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementData.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementData.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) 2011-2016 OpenFOAM Foundation
@@ -47,12 +47,9 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class refinementData;
 
 Istream& operator>>(Istream&, refinementData&);
@@ -219,12 +216,13 @@ public:
 };
 
 
-//- Data associated with refinementData type are contiguous
-template<>
-inline bool contiguous<refinementData>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for refinementData
+template<> struct is_contiguous<refinementData> : std::true_type {};
+
+//- Contiguous label data for refinementData
+template<> struct is_contiguous_label<refinementData> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDistanceData.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDistanceData.H
index e49ef5a0defed79086da6ea7c4c548b880464f9d..66318f4dfbe815eb959a528b72bd2971a31b8017 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDistanceData.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/refinementDistanceData.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) 2011-2016 OpenFOAM Foundation
@@ -47,12 +47,9 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class refinementDistanceData;
 
 Istream& operator>>(Istream&, refinementDistanceData&);
@@ -65,7 +62,6 @@ Ostream& operator<<(Ostream&, const refinementDistanceData&);
 
 class refinementDistanceData
 {
-
     // Private data
 
         //- Unrefined (level0) buffer size (nBufferLayers*level0Size)
@@ -253,12 +249,10 @@ public:
 };
 
 
-//- Data associated with refinementDistanceData type are contiguous
-template<>
-inline bool contiguous<refinementDistanceData>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for refinementDistanceData
+template<> struct is_contiguous<refinementDistanceData> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/finiteVolume/finiteVolume/fvc/fvcSmooth/smoothData.H b/src/finiteVolume/finiteVolume/fvc/fvcSmooth/smoothData.H
index 2f4919b338c50c2206f91e2de07efdb6aaa53801..4de6094140ffc38289557edbaaab8e55bfba9165 100644
--- a/src/finiteVolume/finiteVolume/fvc/fvcSmooth/smoothData.H
+++ b/src/finiteVolume/finiteVolume/fvc/fvcSmooth/smoothData.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) 2011-2016 OpenFOAM Foundation
@@ -221,13 +221,10 @@ public:
 };
 
 
-//- Data associated with smoothData type are contiguous
-template<>
-inline bool contiguous<smoothData>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
 
+//- Contiguous data for smoothData
+template<> struct is_contiguous<smoothData> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/finiteVolume/finiteVolume/fvc/fvcSmooth/sweepData.H b/src/finiteVolume/finiteVolume/fvc/fvcSmooth/sweepData.H
index 7533d31c6a38e7f7d73011833d0cdfb9a1359d48..3b64353117fb708b19d5e7ad8a12121b63ba8493 100644
--- a/src/finiteVolume/finiteVolume/fvc/fvcSmooth/sweepData.H
+++ b/src/finiteVolume/finiteVolume/fvc/fvcSmooth/sweepData.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           |
+    \\  /    A nd           | Copyright (C) 2010-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -212,13 +212,10 @@ public:
 };
 
 
-//- Data associated with sweepData type are contiguous
-template<>
-inline bool contiguous<sweepData>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
 
+//- Contiguous data for sweepData
+template<> struct is_contiguous<sweepData> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/finiteVolume/fvMesh/wallDist/wallPointYPlus/wallPointYPlus.H b/src/finiteVolume/fvMesh/wallDist/wallPointYPlus/wallPointYPlus.H
index 18cb23e3712f0aaa8af43b0c2d4cc4493b7040be..d01addb110a614a67b51f731dc1e8db988f88de1 100644
--- a/src/finiteVolume/fvMesh/wallDist/wallPointYPlus/wallPointYPlus.H
+++ b/src/finiteVolume/fvMesh/wallDist/wallPointYPlus/wallPointYPlus.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) 2011-2016 OpenFOAM Foundation
@@ -53,7 +53,6 @@ SourceFiles
 namespace Foam
 {
 
-
 /*---------------------------------------------------------------------------*\
                            Class wallPointYPlus Declaration
 \*---------------------------------------------------------------------------*/
@@ -81,7 +80,7 @@ public:
 
     // Static data members
 
-        //- cut-off value for y+
+        //- The cut-off value for y+
         static scalar yPlusCutOff;
 
 
@@ -144,12 +143,11 @@ public:
 };
 
 
-//- Data associated with pointEdgePoint type as contiguous as underlying type
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for wallPointYPlus
 template<>
-inline bool contiguous<wallPointYPlus>()
-{
-    return contiguous<wallPointData<scalar>>();
-}
+struct is_contiguous<wallPointYPlus> : is_contiguous<wallPointData<scalar>> {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/functionObjects/field/nearWallFields/findCellParticle.H b/src/functionObjects/field/nearWallFields/findCellParticle.H
index 8e1505753d6b5cdfbb4d346e5574e6567009ec89..85bd34bcb165761a7c6dfeee83ecd7497d940084 100644
--- a/src/functionObjects/field/nearWallFields/findCellParticle.H
+++ b/src/functionObjects/field/nearWallFields/findCellParticle.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) 2013-2017 OpenFOAM Foundation
@@ -45,11 +45,8 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class findCellParticleCloud;
-
-
-// Forward declaration of friend functions and operators
-
 class findCellParticle;
 
 Ostream& operator<<(Ostream&, const findCellParticle&);
@@ -273,11 +270,10 @@ public:
 };
 
 
-template<>
-inline bool contiguous<findCellParticle>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for findCellParticle
+template<> struct is_contiguous<findCellParticle> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/lagrangian/coalCombustion/coalParcel/coalParcel.H b/src/lagrangian/coalCombustion/coalParcel/coalParcel.H
index fef1d73a28525c35bb86db3ae91a708e456a51d2..e960050d44915850ca0b36f2491194d2a51f9f5f 100644
--- a/src/lagrangian/coalCombustion/coalParcel/coalParcel.H
+++ b/src/lagrangian/coalCombustion/coalParcel/coalParcel.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) 2011-2015 OpenFOAM Foundation
@@ -62,11 +62,8 @@ namespace Foam
         >
     > coalParcel;
 
-    template<>
-    inline bool contiguous<coalParcel>()
-    {
-        return false;
-    }
+    //- Non-contiguous data for coalParcel
+    template<> struct is_contiguous<coalParcel> : std::false_type {};
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/lagrangian/intermediate/parcels/derived/basicHeterogeneousReactingParcel/basicHeterogeneousReactingParcel.H b/src/lagrangian/intermediate/parcels/derived/basicHeterogeneousReactingParcel/basicHeterogeneousReactingParcel.H
index 63b9156fdb1eef6705602fce162eeefc1ff36032..9600bbdbaed40558368c5d279ac0c04f342776c9 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicHeterogeneousReactingParcel/basicHeterogeneousReactingParcel.H
+++ b/src/lagrangian/intermediate/parcels/derived/basicHeterogeneousReactingParcel/basicHeterogeneousReactingParcel.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -60,11 +60,9 @@ namespace Foam
         >
     > basicHeterogeneousReactingParcel;
 
+    //- Non-contiguous data for basicHeterogeneousReactingParcel
     template<>
-    inline bool contiguous<basicHeterogeneousReactingParcel>()
-    {
-        return false;
-    }
+    struct is_contiguous<basicHeterogeneousReactingParcel> : std::false_type {};
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/lagrangian/intermediate/parcels/derived/basicKinematicMPPICParcel/basicKinematicMPPICParcel.H b/src/lagrangian/intermediate/parcels/derived/basicKinematicMPPICParcel/basicKinematicMPPICParcel.H
index ae1950ab5d9acb183d9de97e367b0a7dea46c731..65436b7d8f4c069fbebefcfaa3f880b73602fde0 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicKinematicMPPICParcel/basicKinematicMPPICParcel.H
+++ b/src/lagrangian/intermediate/parcels/derived/basicKinematicMPPICParcel/basicKinematicMPPICParcel.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) 2013-2016 OpenFOAM Foundation
@@ -48,11 +48,9 @@ namespace Foam
 {
     typedef MPPICParcel<KinematicParcel<particle>> basicKinematicMPPICParcel;
 
+    //- Contiguous data for basicKinematicMPPICParcel
     template<>
-    inline bool contiguous<basicKinematicMPPICParcel>()
-    {
-        return true;
-    }
+    struct is_contiguous<basicKinematicMPPICParcel> : std::true_type {};
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.H b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.H
index 23fc0fd883089d4b1ba32b209a98fe7212afdd17..9bcd834d0c51e5a3fb3b00074b86601072e57d07 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.H
+++ b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.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) 2011 OpenFOAM Foundation
@@ -47,11 +47,8 @@ namespace Foam
 {
     typedef KinematicParcel<particle> basicKinematicParcel;
 
-    template<>
-    inline bool contiguous<basicKinematicParcel>()
-    {
-        return true;
-    }
+    //- Contiguous data for basicKinematicParcel
+    template<> struct is_contiguous<basicKinematicParcel> : std::true_type {};
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H
index a86baaaf1aa0a0732bb2e72c85a746975d3aa68e..3a20d7709f59f9745ca726422765577eb3a1f89a 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.H
+++ b/src/lagrangian/intermediate/parcels/derived/basicReactingMultiphaseParcel/basicReactingMultiphaseParcel.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) 2011 OpenFOAM Foundation
@@ -63,11 +63,9 @@ namespace Foam
         >
     > basicReactingMultiphaseParcel;
 
+    //- Non-contiguous data for basicReactingMultiphaseParcel
     template<>
-    inline bool contiguous<basicReactingMultiphaseParcel>()
-    {
-        return false;
-    }
+    struct is_contiguous<basicReactingMultiphaseParcel> : std::false_type {};
 }
 
 
diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.H b/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.H
index 7831c8ff1bb6cffe5dcd2b538573e398b6470deb..a74f6d1d09b8ba5116854d1435fe70c942afc8fb 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.H
+++ b/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/basicReactingParcel.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) 2011-2016 OpenFOAM Foundation
@@ -50,11 +50,8 @@ namespace Foam
     typedef ReactingParcel<ThermoParcel<KinematicParcel<particle>>>
         basicReactingParcel;
 
-    template<>
-    inline bool contiguous<basicReactingParcel>()
-    {
-        return false;
-    }
+    //- Non-contiguous data for basicReactingParcel
+    template<> struct is_contiguous<basicReactingParcel> : std::false_type {};
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.H b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.H
index 6af3b3fb09d25fb46a02b1455398f49e821e4651..c17e0522551f54d569ba501b4756948ce0e5406f 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.H
+++ b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.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) 2011-2016 OpenFOAM Foundation
@@ -48,11 +48,8 @@ namespace Foam
 {
     typedef ThermoParcel<KinematicParcel<particle>> basicThermoParcel;
 
-    template<>
-    inline bool contiguous<basicThermoParcel>()
-    {
-        return true;
-    }
+    //- Contiguous data for basicThermoParcel
+    template<> struct is_contiguous<basicThermoParcel> : std::true_type {};
 }
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/lagrangian/solidParticle/solidParticle.H b/src/lagrangian/solidParticle/solidParticle.H
index a7eb274ad0829f4ca085483f8d45b1619bfa527e..ca9a87168b6bffee829062c811561bbab5370ef0 100644
--- a/src/lagrangian/solidParticle/solidParticle.H
+++ b/src/lagrangian/solidParticle/solidParticle.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2017 OpenFOAM Foundation
@@ -52,7 +52,6 @@ namespace Foam
 {
 
 // Forward Declarations
-
 class solidParticleCloud;
 class solidParticle;
 
@@ -237,11 +236,10 @@ public:
 };
 
 
-template<>
-inline bool contiguous<solidParticle>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for solidParticle
+template<> struct is_contiguous<solidParticle> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/lagrangian/spray/parcels/derived/basicSprayParcel/basicSprayParcel.H b/src/lagrangian/spray/parcels/derived/basicSprayParcel/basicSprayParcel.H
index d62de144caa49558fdae8d6cb6fb4a018758af13..5a9f27faabf539df0048198de85dc1de9472bb4a 100644
--- a/src/lagrangian/spray/parcels/derived/basicSprayParcel/basicSprayParcel.H
+++ b/src/lagrangian/spray/parcels/derived/basicSprayParcel/basicSprayParcel.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) 2011 OpenFOAM Foundation
@@ -63,11 +63,8 @@ namespace Foam
         >
     > basicSprayParcel;
 
-    template<>
-    inline bool contiguous<basicSprayParcel>()
-    {
-        return false;
-    }
+    //- Non-contiguous data for basicSprayParcel
+    template<> struct is_contiguous<basicSprayParcel> : std::false_type {};
 }
 
 
diff --git a/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.H b/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.H
index 98c8650c2c43c748dba8e1a1e06f31ecc54255bf..50fd6acbe3fa9ad8f441bd46e8cf0f4792969ce5 100644
--- a/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.H
+++ b/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2015-2017 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2015-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2017 OpenFOAM Foundation
@@ -1664,9 +1664,6 @@ public:
             );
 };
 
-template<>
-inline bool contiguous<FixedList<label, 3>>()               {return true;}
-
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/mesh/snappyHexMesh/meshRefinement/patchFaceOrientation.H b/src/mesh/snappyHexMesh/meshRefinement/patchFaceOrientation.H
index c8c9e5d9a56e4d85f78d75600a63c1322ae588ee..d2c1e46ae2e04c9507b09e33461e113b7bcd262f 100644
--- a/src/mesh/snappyHexMesh/meshRefinement/patchFaceOrientation.H
+++ b/src/mesh/snappyHexMesh/meshRefinement/patchFaceOrientation.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) 2013-2015 OpenFOAM Foundation
@@ -46,12 +46,8 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class patchFaceOrientation;
 
 Istream& operator>>(Istream&, patchFaceOrientation&);
@@ -164,12 +160,13 @@ public:
 };
 
 
-//- Data associated with patchFaceOrientation type are contiguous
-template<>
-inline bool contiguous<patchFaceOrientation>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for patchFaceOrientation
+template<> struct is_contiguous<patchFaceOrientation> : std::true_type {};
+
+//- Contiguous label data for patchFaceOrientation
+template<> struct is_contiguous_label<patchFaceOrientation> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/mesh/snappyHexMesh/meshRefinement/transportData.H b/src/mesh/snappyHexMesh/meshRefinement/transportData.H
index c206a08350483570ee707aa22e3fef0a08b1f8c5..ecf8da41e5e627bcb86ab927067b4b3372ae2b2e 100644
--- a/src/mesh/snappyHexMesh/meshRefinement/transportData.H
+++ b/src/mesh/snappyHexMesh/meshRefinement/transportData.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2015 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2015-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -43,7 +43,7 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class polyMesh;
 
 /*---------------------------------------------------------------------------*\
@@ -148,17 +148,15 @@ public:
 };
 
 
-//- Data associated with transportData type is same as underlying
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for transportData
 template<>
-inline bool contiguous<transportData>()
-{
-    return contiguous<wallPointData<scalar>>();
-}
+struct is_contiguous<transportData> : is_contiguous<wallPointData<scalar>> {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-
 } // End namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/mesh/snappyHexMesh/snappyHexMeshDriver/PointIntegrateData/PointIntegrateData.H b/src/mesh/snappyHexMesh/snappyHexMeshDriver/PointIntegrateData/PointIntegrateData.H
index a2d32ba9ed21fe6a6a3c3b6b31ccdc4eb4f68492..01c5a8fd720db4fdf9882cb8e90a0a2db17cf436 100644
--- a/src/mesh/snappyHexMesh/snappyHexMeshDriver/PointIntegrateData/PointIntegrateData.H
+++ b/src/mesh/snappyHexMesh/snappyHexMeshDriver/PointIntegrateData/PointIntegrateData.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -40,13 +40,11 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class Istream;
 class Ostream;
-template<class DataType>
-class PointIntegrateData;
+template<class DataType> class PointIntegrateData;
 
-// Forward declaration of friend functions and operators
 template<class DataType>
 Ostream& operator<<(Ostream&, const PointIntegrateData<DataType>&);
 template<class DataType>
@@ -86,7 +84,6 @@ public:
     };
 
 
-
     // Constructors
 
         //- Construct null
@@ -227,21 +224,16 @@ public:
         );
 };
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-//- Data associated with PointIntegrateData types is contiguous
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
 
-template<>
-inline bool contiguous<PointIntegrateData<scalar>>()
-{
-    return true;
-}
+//- Data are contiguous if the data type is contiguous
+template<class DataType>
+struct is_contiguous<PointIntegrateData<DataType>>
+:
+    is_contiguous<DataType>
+{};
 
-template<>
-inline bool contiguous<PointIntegrateData<vector>>()
-{
-    return true;
-}
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/mesh/snappyHexMesh/trackedParticle/trackedParticle.C b/src/mesh/snappyHexMesh/trackedParticle/trackedParticle.C
index e4187f63dc4971c65d29d1fdae3391c0c8bbf7e7..d5d1f47e80e23f6eb887516aebc4e1cee6753a61 100644
--- a/src/mesh/snappyHexMesh/trackedParticle/trackedParticle.C
+++ b/src/mesh/snappyHexMesh/trackedParticle/trackedParticle.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2019 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2017 OpenFOAM Foundation
@@ -27,7 +27,6 @@ License
 
 #include "trackedParticle.H"
 
-
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
 const std::size_t Foam::trackedParticle::sizeofFields_
diff --git a/src/mesh/snappyHexMesh/trackedParticle/trackedParticle.H b/src/mesh/snappyHexMesh/trackedParticle/trackedParticle.H
index 46b99b8bda9bae7b52567785424d8a603e8f0aae..066ae635de672f7183a2ca94d65519529248d25a 100644
--- a/src/mesh/snappyHexMesh/trackedParticle/trackedParticle.H
+++ b/src/mesh/snappyHexMesh/trackedParticle/trackedParticle.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2019 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2017 OpenFOAM Foundation
@@ -47,7 +47,7 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declarations
+// Forward Declarations
 
 class trackedParticleCloud;
 class trackedParticle;
@@ -298,17 +298,10 @@ public:
 };
 
 
-template<>
-inline bool contiguous<trackedParticle>()
-{
-    return true;
-}
-
-//template<>
-//void Cloud<trackedParticle>::readFields();
-//
-//template<>
-//void Cloud<trackedParticle>::writeFields() const;
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for trackedParticle
+template<> struct is_contiguous<trackedParticle> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/algorithms/PatchEdgeFaceWave/patchEdgeFaceInfo.H b/src/meshTools/algorithms/PatchEdgeFaceWave/patchEdgeFaceInfo.H
index 525851fb0e0d2aff1c53f7f6131495d7a0852cb4..5a299a229fb94b89d6277a54a0f217afb8c81987 100644
--- a/src/meshTools/algorithms/PatchEdgeFaceWave/patchEdgeFaceInfo.H
+++ b/src/meshTools/algorithms/PatchEdgeFaceWave/patchEdgeFaceInfo.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) 2011-2016 OpenFOAM Foundation
@@ -49,14 +49,9 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
-
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class patchEdgeFaceInfo;
 
 Istream& operator>>(Istream&, patchEdgeFaceInfo&);
@@ -201,12 +196,13 @@ public:
 };
 
 
-//- Data associated with patchEdgeFaceInfo type are contiguous
-template<>
-inline bool contiguous<patchEdgeFaceInfo>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for patchEdgeFaceInfo
+template<> struct is_contiguous<patchEdgeFaceInfo> : std::true_type {};
+
+//- Contiguous scalar data for patchEdgeFaceInfo
+template<> struct is_contiguous_scalar<patchEdgeFaceInfo> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/algorithms/PatchEdgeFaceWave/patchEdgeFaceRegion.H b/src/meshTools/algorithms/PatchEdgeFaceWave/patchEdgeFaceRegion.H
index f4d2293782de7986f1f71391d44550ae8db5f4e8..802a46394bf373ad7df6f62baea9e9715cd531f9 100644
--- a/src/meshTools/algorithms/PatchEdgeFaceWave/patchEdgeFaceRegion.H
+++ b/src/meshTools/algorithms/PatchEdgeFaceWave/patchEdgeFaceRegion.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) 2012-2016 OpenFOAM Foundation
@@ -51,13 +51,9 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class patchEdgeFaceRegion;
 
 Istream& operator>>(Istream&, patchEdgeFaceRegion&);
@@ -181,12 +177,13 @@ public:
 };
 
 
-//- Data associated with patchEdgeFaceRegion type are contiguous
-template<>
-inline bool contiguous<patchEdgeFaceRegion>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for patchEdgeFaceRegion
+template<> struct is_contiguous<patchEdgeFaceRegion> : std::true_type {};
+
+//- Contiguous label data for patchEdgeFaceRegion
+template<> struct is_contiguous_label<patchEdgeFaceRegion> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/algorithms/PointEdgeWave/PointData.H b/src/meshTools/algorithms/PointEdgeWave/PointData.H
index 4adf7b240ae378edbe46fc182324e7eeea8d2e0c..4adc976fe531f9f75114f89704120077a14c9976 100644
--- a/src/meshTools/algorithms/PointEdgeWave/PointData.H
+++ b/src/meshTools/algorithms/PointEdgeWave/PointData.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) 2011-2015 OpenFOAM Foundation
@@ -46,13 +46,11 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class Istream;
 class Ostream;
-template<class DataType>
-class PointData;
+template<class DataType> class PointData;
 
-// Forward declaration of friend functions and operators
 template<class DataType>
 Ostream& operator<<(Ostream&, const PointData<DataType>&);
 template<class DataType>
@@ -67,8 +65,6 @@ class PointData
 :
     public pointEdgePoint
 {
-private:
-
     // Private data
 
         //- Additional transported data
@@ -178,21 +174,20 @@ public:
         );
 };
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-//- Data associated with PointData types is contiguous
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
 
-template<>
-inline bool contiguous<PointData<scalar>>()
-{
-    return true;
-}
+//- Data are contiguous if data type is contiguous
+template<class DataType>
+struct is_contiguous<PointData<DataType>> : is_contiguous<DataType> {};
+
+//- Contiguous scalar only when data type is also scalar
+template<class DataType>
+struct is_contiguous_scalar<PointData<DataType>>
+:
+    is_contiguous_scalar<DataType>
+{};
 
-template<>
-inline bool contiguous<PointData<vector>>()
-{
-    return true;
-}
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/meshTools/algorithms/PointEdgeWave/pointEdgePoint.H b/src/meshTools/algorithms/PointEdgeWave/pointEdgePoint.H
index 2e51060d5a7b3fbb254f0b590814c327b22e3b9f..0a9d2ca13ee78bab096cbfdeb73109c0ca3a3009 100644
--- a/src/meshTools/algorithms/PointEdgeWave/pointEdgePoint.H
+++ b/src/meshTools/algorithms/PointEdgeWave/pointEdgePoint.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) 2011-2016 OpenFOAM Foundation
@@ -51,13 +51,9 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class pointEdgePoint;
 
 Istream& operator>>(Istream&, pointEdgePoint&);
@@ -237,12 +233,13 @@ public:
 };
 
 
-//- Data associated with pointEdgePoint type are contiguous
-template<>
-inline bool contiguous<pointEdgePoint>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for pointEdgePoint
+template<> struct is_contiguous<pointEdgePoint> : std::true_type {};
+
+//- Contiguous scalar data for pointEdgePoint
+template<> struct is_contiguous_scalar<pointEdgePoint> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/cellClassification/cellInfo.H b/src/meshTools/cellClassification/cellInfo.H
index 3c6265b5d2b48b9d9f654880d8378ff7276d4211..15b42eb8d45ed6c2f37d6c24e1d41925688576e7 100644
--- a/src/meshTools/cellClassification/cellInfo.H
+++ b/src/meshTools/cellClassification/cellInfo.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) 2011-2016 OpenFOAM Foundation
@@ -47,12 +47,10 @@ SourceFiles
 
 namespace Foam
 {
+
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class cellInfo;
 
 Istream& operator>>(Istream&, cellInfo&);
@@ -69,6 +67,7 @@ class cellInfo
 
         label type_;
 
+
     // Private Member Functions
 
         //- Update current cell/face type with neighbouring
@@ -212,12 +211,13 @@ public:
 };
 
 
-//- Data associated with cellInfo type are contiguous
-template<>
-inline bool contiguous<cellInfo>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for cellInfo
+template<> struct is_contiguous<cellInfo> : std::true_type {};
+
+//- Contiguous label data for cellInfo
+template<> struct is_contiguous_label<cellInfo> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/cellDist/wallPoint/wallPoint.H b/src/meshTools/cellDist/wallPoint/wallPoint.H
index cb11e2659d26b248d408d617fd9923a6a9afc79d..89179c6ec6354fe3f1f8f94fcc74f75b0012c8b8 100644
--- a/src/meshTools/cellDist/wallPoint/wallPoint.H
+++ b/src/meshTools/cellDist/wallPoint/wallPoint.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) 2011-2016 OpenFOAM Foundation
@@ -49,12 +49,11 @@ SourceFiles
 namespace Foam
 {
 
-// Forward declaration of classes
+// Forward Declarations
 class polyPatch;
 class polyMesh;
 class wallPoint;
 
-// Forward declaration of friend functions and operators
 Ostream& operator<<(Ostream&, const wallPoint&);
 Istream& operator>>(Istream&, wallPoint&);
 
@@ -65,7 +64,7 @@ Istream& operator>>(Istream&, wallPoint&);
 
 class wallPoint
 {
-    // Private data
+    // Private Data
 
         //- Position of nearest wall center
         point origin_;
@@ -219,12 +218,13 @@ public:
 };
 
 
-//- Data associated with wallPoint type are contiguous
-template<>
-inline bool contiguous<wallPoint>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for wallPoint
+template<> struct is_contiguous<wallPoint> : std::true_type {};
+
+//- Contiguous scalar data for wallPoint
+template<> struct is_contiguous_scalar<wallPoint> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/cellDist/wallPoint/wallPointData.H b/src/meshTools/cellDist/wallPoint/wallPointData.H
index b52d88a43c51d5057d748e93b8ee91ba2b10c30b..9591cc0f35539ebed7d68426824f6ea6d915c595 100644
--- a/src/meshTools/cellDist/wallPoint/wallPointData.H
+++ b/src/meshTools/cellDist/wallPoint/wallPointData.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) 2011-2016 OpenFOAM Foundation
@@ -48,10 +48,9 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 template<class Type> class wallPointData;
 
-// Forward declaration of friend functions and operators
-
 template<class Type> Istream& operator>>(Istream&, wallPointData<Type>&);
 template<class Type> Ostream& operator<<(Ostream&, const wallPointData<Type>&);
 
@@ -162,48 +161,22 @@ public:
 };
 
 
-//- Data associated with wallPointData type are contiguous. List the usual
-//  ones.
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
 
-template<>
-inline bool contiguous<wallPointData<bool>>()
-{
-    return contiguous<wallPoint>();
-}
-template<>
-inline bool contiguous<wallPointData<label>>()
-{
-    return contiguous<wallPoint>();
-}
-template<>
-inline bool contiguous<wallPointData<scalar>>()
-{
-    return contiguous<wallPoint>();
-}
-template<>
-inline bool contiguous<wallPointData<vector>>()
-{
-    return contiguous<wallPoint>();
-}
-template<>
-inline bool contiguous<wallPointData<sphericalTensor>>()
-{
-    return contiguous<wallPoint>();
-}
-template<>
-inline bool contiguous<wallPointData<symmTensor>>()
-{
-    return contiguous<wallPoint>();
-}
-template<>
-inline bool contiguous<wallPointData<tensor>>()
-{
-    return contiguous<wallPoint>();
-}
+//- Data are contiguous if data type is contiguous
+template<class Type>
+struct is_contiguous<wallPointData<Type>> : is_contiguous<Type> {};
 
+//- Data are contiguous label if data type is label
+template<class Type>
+struct is_contiguous_label<wallPointData<Type>> : is_contiguous_label<Type> {};
+
+//- Data are contiguous scalar if data type is scalar
+template<class Type>
+struct is_contiguous_scalar<wallPointData<Type>> : is_contiguous_scalar<Type>{};
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
 
diff --git a/src/meshTools/meshStructure/pointTopoDistanceData.H b/src/meshTools/meshStructure/pointTopoDistanceData.H
index 2a6918a10385ab875c92c7d6b634878fb96ed654..f86e3b284ad772f8c11a2126de0f830cf963a478 100644
--- a/src/meshTools/meshStructure/pointTopoDistanceData.H
+++ b/src/meshTools/meshStructure/pointTopoDistanceData.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) 2013-2016 OpenFOAM Foundation
@@ -47,12 +47,9 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class pointTopoDistanceData;
 
 Istream& operator>>(Istream&, pointTopoDistanceData&);
@@ -78,10 +75,10 @@ public:
 
     // Constructors
 
-        //- Construct null
+        //- Construct null with invalid (-1) for data and distance
         inline pointTopoDistanceData();
 
-        //- Construct from count
+        //- Construct from components
         inline pointTopoDistanceData
         (
             const label data,
@@ -93,7 +90,6 @@ public:
 
         // Access
 
-
             inline label data() const
             {
                 return data_;
@@ -208,6 +204,7 @@ public:
         inline bool operator==(const pointTopoDistanceData&) const;
         inline bool operator!=(const pointTopoDistanceData&) const;
 
+
     // IOstream Operators
 
         friend Ostream& operator<<(Ostream&, const pointTopoDistanceData&);
@@ -215,12 +212,16 @@ public:
 };
 
 
-//- Data associated with pointTopoDistanceData type are contiguous
-template<>
-inline bool contiguous<pointTopoDistanceData>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for pointTopoDistanceData
+template<> struct is_contiguous<pointTopoDistanceData> : std::true_type {};
+
+//- Contiguous label data for pointTopoDistanceData
+template<> struct is_contiguous_label<pointTopoDistanceData>
+:
+    std::true_type
+{};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/meshStructure/topoDistanceData.H b/src/meshTools/meshStructure/topoDistanceData.H
index 7afe6de5934b627c6099ae5349f07e8d2125dbc5..400287345701baa6cf5e7d23066f369825734b19 100644
--- a/src/meshTools/meshStructure/topoDistanceData.H
+++ b/src/meshTools/meshStructure/topoDistanceData.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) 2011-2016 OpenFOAM Foundation
@@ -46,12 +46,9 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class topoDistanceData;
 
 Istream& operator>>(Istream&, topoDistanceData&);
@@ -77,10 +74,10 @@ public:
 
     // Constructors
 
-        //- Construct null
+        //- Construct null with invalid (-1) for data and distance
         inline topoDistanceData();
 
-        //- Construct from count
+        //- Construct from components
         inline topoDistanceData
         (
             const label data,
@@ -92,7 +89,6 @@ public:
 
         // Access
 
-
             inline label data() const
             {
                 return data_;
@@ -191,6 +187,7 @@ public:
             template<class TrackingData>
             inline bool equal(const topoDistanceData&, TrackingData& td) const;
 
+
     // Member Operators
 
         // Needed for List IO
@@ -206,12 +203,13 @@ public:
 };
 
 
-//- Data associated with topoDistanceData type are contiguous
-template<>
-inline bool contiguous<topoDistanceData>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for topoDistanceData
+template<> struct is_contiguous<topoDistanceData> : std::true_type {};
+
+//- Contiguous label data for topoDistanceData
+template<> struct is_contiguous_label<topoDistanceData> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/regionSplit/minData.H b/src/meshTools/regionSplit/minData.H
index 20bba243a7f63702de185e59308987878c021156..05ed9ca00b051b442de859713cb200ad1211c2bd 100644
--- a/src/meshTools/regionSplit/minData.H
+++ b/src/meshTools/regionSplit/minData.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2015 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2015-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2014-2016 OpenFOAM Foundation
@@ -45,12 +45,10 @@ SourceFiles
 namespace Foam
 {
 
+// Forward declarations
+
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class minData;
 
 Istream& operator>>(Istream&, minData&);
@@ -193,12 +191,13 @@ public:
 };
 
 
-//- Data associated with minData type are contiguous
-template<>
-inline bool contiguous<minData>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for minData
+template<> struct is_contiguous<minData> : std::true_type {};
+
+//- Contiguous label data for minData
+template<> struct is_contiguous_label<minData> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/overset/cellCellStencil/inverseDistance/meshToMeshData.H b/src/overset/cellCellStencil/inverseDistance/meshToMeshData.H
index 0b252bbee05d5349217c6f18d626c3f35571471d..d47a25b5f450098121e4c3f57e9b78d375abe211 100644
--- a/src/overset/cellCellStencil/inverseDistance/meshToMeshData.H
+++ b/src/overset/cellCellStencil/inverseDistance/meshToMeshData.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  |
 -------------------------------------------------------------------------------
 License
@@ -45,12 +45,9 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class polyPatch;
 class polyMesh;
-
-
-// Forward declaration of friend functions and operators
-
 class meshToMeshData;
 
 Istream& operator>>(Istream&, meshToMeshData&);
@@ -210,6 +207,7 @@ public:
                 TrackingData&
             ) const;
 
+
     // Member Operators
 
         // Needed for List IO
@@ -225,12 +223,13 @@ public:
 };
 
 
-//- Data associated with meshToMeshData type are contiguous
-template<>
-inline bool contiguous<meshToMeshData>()
-{
-    return true;
-}
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+//- Contiguous data for meshToMeshData
+template<> struct is_contiguous<meshToMeshData> : std::true_type {};
+
+//- Contiguous label data for meshToMeshData
+template<> struct is_contiguous_label<meshToMeshData> : std::true_type {};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.H b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.H
index 779221faa8785eddd4ac116faec954d239be6900..4480c7c2c238f096be5df2bb4a271dc8f4bc9d7e 100644
--- a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.H
+++ b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2015-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2015-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2017 OpenFOAM Foundation
@@ -76,8 +76,6 @@ class decompositionMethod;
 
 // Typedefs
 typedef Pair<point> segment;
-template<>
-inline bool contiguous<segment>() {return contiguous<point>();}
 
 
 /*---------------------------------------------------------------------------*\