diff --git a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
index 0450f33c5ef2c225b90530dc78a5b536d614fa40..0b68e1f7008cfb73bbbff8f0dfc5ddec2cf3ed6c 100644
--- a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
+++ b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2016-2018 OpenCFD Ltd.
+    Copyright (C) 2016-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -88,12 +88,12 @@ labelList nearestPatch(const polyMesh& mesh, const labelList& patchIDs)
     }
 
     // Field on cells and faces.
-    List<topoDistanceData> cellData(mesh.nCells());
-    List<topoDistanceData> faceData(mesh.nFaces());
+    List<topoDistanceData<label>> cellData(mesh.nCells());
+    List<topoDistanceData<label>> faceData(mesh.nFaces());
 
     // Start of changes
     labelList patchFaces(nFaces);
-    List<topoDistanceData> patchData(nFaces);
+    List<topoDistanceData<label>> patchData(nFaces);
     nFaces = 0;
     for (const label patchi : patchIDs)
     {
@@ -102,13 +102,13 @@ labelList nearestPatch(const polyMesh& mesh, const labelList& patchIDs)
         forAll(pp, i)
         {
             patchFaces[nFaces] = pp.start()+i;
-            patchData[nFaces] = topoDistanceData(patchi, 0);
+            patchData[nFaces] = topoDistanceData<label>(0, patchi);
             ++nFaces;
         }
     }
 
     // Propagate information inwards
-    FaceCellWave<topoDistanceData> deltaCalc
+    FaceCellWave<topoDistanceData<label>> deltaCalc
     (
         mesh,
         patchFaces,
diff --git a/src/functionObjects/field/fluxSummary/fluxSummary.C b/src/functionObjects/field/fluxSummary/fluxSummary.C
index 221ea39a1435c52761284ebbeb4eb1c6b1adad2c..41be91c136d84eac00ee075982084c39a78142fe 100644
--- a/src/functionObjects/field/fluxSummary/fluxSummary.C
+++ b/src/functionObjects/field/fluxSummary/fluxSummary.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015 OpenFOAM Foundation
-    Copyright (C) 2015-2019 OpenCFD Ltd.
+    Copyright (C) 2015-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -34,7 +34,7 @@ License
 #include "syncTools.H"
 #include "meshTools.H"
 #include "PatchEdgeFaceWave.H"
-#include "patchEdgeFaceRegion.H"
+#include "edgeTopoDistanceData.H"
 #include "globalIndex.H"
 #include "OBJstream.H"
 #include "addToRunTimeSelectionTable.H"
@@ -511,8 +511,8 @@ void Foam::functionObjects::fluxSummary::initialiseCellZoneAndDirection
 
 
     // Data on all edges and faces
-    List<patchEdgeFaceRegion> allEdgeInfo(patch.nEdges());
-    List<patchEdgeFaceRegion> allFaceInfo(patch.size());
+    List<edgeTopoDistanceData<label>> allEdgeInfo(patch.nEdges());
+    List<edgeTopoDistanceData<label>> allFaceInfo(patch.size());
 
     bool search = true;
 
@@ -528,12 +528,12 @@ void Foam::functionObjects::fluxSummary::initialiseCellZoneAndDirection
     while (search)
     {
         DynamicList<label> changedEdges;
-        DynamicList<patchEdgeFaceRegion> changedInfo;
+        DynamicList<edgeTopoDistanceData<label>> changedInfo;
 
         label seedFacei = labelMax;
         for (; oldFaceID < patch.size(); oldFaceID++)
         {
-            if (allFaceInfo[oldFaceID].region() == -1)
+            if (allFaceInfo[oldFaceID].data() == -1)
             {
                 seedFacei = globalFaces.toGlobal(oldFaceID);
                 break;
@@ -553,7 +553,7 @@ void Foam::functionObjects::fluxSummary::initialiseCellZoneAndDirection
 
             forAll(fEdges, i)
             {
-                if (allEdgeInfo[fEdges[i]].region() != -1)
+                if (allEdgeInfo[fEdges[i]].data() != -1)
                 {
                     WarningInFunction
                         << "Problem in edge face wave: attempted to assign a "
@@ -563,7 +563,14 @@ void Foam::functionObjects::fluxSummary::initialiseCellZoneAndDirection
                 }
 
                 changedEdges.append(fEdges[i]);
-                changedInfo.append(regioni);
+                changedInfo.append
+                (
+                    edgeTopoDistanceData<label>
+                    (
+                        0,          // distance
+                        regioni
+                    )
+                );
             }
         }
 
@@ -571,7 +578,7 @@ void Foam::functionObjects::fluxSummary::initialiseCellZoneAndDirection
         PatchEdgeFaceWave
         <
             indirectPrimitivePatch,
-            patchEdgeFaceRegion
+            edgeTopoDistanceData<label>
         > calc
         (
             mesh_,
@@ -588,7 +595,7 @@ void Foam::functionObjects::fluxSummary::initialiseCellZoneAndDirection
             label nCells = 0;
             forAll(allFaceInfo, facei)
             {
-                if (allFaceInfo[facei].region() == regioni)
+                if (allFaceInfo[facei].data() == regioni)
                 {
                     nCells++;
                 }
@@ -611,7 +618,7 @@ void Foam::functionObjects::fluxSummary::initialiseCellZoneAndDirection
 
     forAll(allFaceInfo, facei)
     {
-        regioni = allFaceInfo[facei].region();
+        regioni = allFaceInfo[facei].data();
 
         regionFaceIDs[regioni].append(faceLocalPatchIDs[facei]);
         regionFacePatchIDs[regioni].append(facePatchIDs[facei]);
diff --git a/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.C b/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.C
index 91ac51caeb4b3d9a1e23ea8399fa5229683a936a..6b8e453a23cbc2245359a3af8b0c2e7dc66111bb 100644
--- a/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.C
+++ b/src/mesh/snappyHexMesh/meshRefinement/meshRefinement.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2015-2019 OpenCFD Ltd.
+    Copyright (C) 2015-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -417,12 +417,12 @@ Foam::labelList Foam::meshRefinement::nearestPatch
         }
 
         // Field on cells and faces.
-        List<topoDistanceData> cellData(mesh_.nCells());
-        List<topoDistanceData> faceData(mesh_.nFaces());
+        List<topoDistanceData<label>> cellData(mesh_.nCells());
+        List<topoDistanceData<label>> faceData(mesh_.nFaces());
 
         // Start of changes
         labelList patchFaces(nFaces);
-        List<topoDistanceData> patchData(nFaces);
+        List<topoDistanceData<label>> patchData(nFaces);
         nFaces = 0;
         forAll(adaptPatchIDs, i)
         {
@@ -432,13 +432,13 @@ Foam::labelList Foam::meshRefinement::nearestPatch
             forAll(pp, i)
             {
                 patchFaces[nFaces] = pp.start()+i;
-                patchData[nFaces] = topoDistanceData(patchi, 0);
+                patchData[nFaces] = topoDistanceData<label>(0, patchi);
                 nFaces++;
             }
         }
 
         // Propagate information inwards
-        FaceCellWave<topoDistanceData> deltaCalc
+        FaceCellWave<topoDistanceData<label>> deltaCalc
         (
             mesh_,
             patchFaces,
@@ -542,12 +542,12 @@ Foam::labelList Foam::meshRefinement::nearestIntersection
     labelList nearestRegion(mesh_.nFaces(), defaultRegion);
 
     // Field on cells and faces.
-    List<topoDistanceData> cellData(mesh_.nCells());
-    List<topoDistanceData> faceData(mesh_.nFaces());
+    List<topoDistanceData<label>> cellData(mesh_.nCells());
+    List<topoDistanceData<label>> faceData(mesh_.nFaces());
 
     // Start walking from all intersected faces
     DynamicList<label> patchFaces(start.size());
-    DynamicList<topoDistanceData> patchData(start.size());
+    DynamicList<topoDistanceData<label>> patchData(start.size());
     forAll(start, i)
     {
         label facei = testFaces[i];
@@ -555,18 +555,18 @@ Foam::labelList Foam::meshRefinement::nearestIntersection
         {
             patchFaces.append(facei);
             label regioni = surfaces_.globalRegion(surface1[i], region1[i]);
-            patchData.append(topoDistanceData(regioni, 0));
+            patchData.append(topoDistanceData<label>(0, regioni));
         }
         else if (surface2[i] != -1)
         {
             patchFaces.append(facei);
             label regioni = surfaces_.globalRegion(surface2[i], region2[i]);
-            patchData.append(topoDistanceData(regioni, 0));
+            patchData.append(topoDistanceData<label>(0, regioni));
         }
     }
 
     // Propagate information inwards
-    FaceCellWave<topoDistanceData> deltaCalc
+    FaceCellWave<topoDistanceData<label>> deltaCalc
     (
         mesh_,
         patchFaces,
diff --git a/src/mesh/snappyHexMesh/meshRefinement/meshRefinementBaffles.C b/src/mesh/snappyHexMesh/meshRefinement/meshRefinementBaffles.C
index 17177c7edbcbc4cfedf1b0a47b84ddd7cd81340d..132f55a39d2d7934c99b0657b691ad371e6ae339 100644
--- a/src/mesh/snappyHexMesh/meshRefinement/meshRefinementBaffles.C
+++ b/src/mesh/snappyHexMesh/meshRefinement/meshRefinementBaffles.C
@@ -47,7 +47,7 @@ License
 #include "OBJstream.H"
 #include "patchFaceOrientation.H"
 #include "PatchEdgeFaceWave.H"
-#include "patchEdgeFaceRegion.H"
+#include "edgeTopoDistanceData.H"
 #include "polyMeshAdder.H"
 #include "IOmanip.H"
 #include "refinementParameters.H"
@@ -3507,8 +3507,8 @@ Foam::label Foam::meshRefinement::markPatchZones
     labelList& faceToZone
 ) const
 {
-    List<patchEdgeFaceRegion> allEdgeInfo(patch.nEdges());
-    List<patchEdgeFaceRegion> allFaceInfo(patch.size());
+    List<edgeTopoDistanceData<label>> allEdgeInfo(patch.nEdges());
+    List<edgeTopoDistanceData<label>> allFaceInfo(patch.size());
 
 
     // Protect all non-manifold edges
@@ -3519,7 +3519,7 @@ Foam::label Foam::meshRefinement::markPatchZones
         {
             if (nMasterFacesPerEdge[edgeI] > 2)
             {
-                allEdgeInfo[edgeI] = -2;
+                allEdgeInfo[edgeI] = edgeTopoDistanceData<label>(0, -2);
                 nProtected++;
             }
         }
@@ -3532,12 +3532,12 @@ Foam::label Foam::meshRefinement::markPatchZones
     // Hand out zones
 
     DynamicList<label> changedEdges;
-    DynamicList<patchEdgeFaceRegion> changedInfo;
+    DynamicList<edgeTopoDistanceData<label>> changedInfo;
 
     const scalar tol = PatchEdgeFaceWave
     <
         indirectPrimitivePatch,
-        patchEdgeFaceRegion
+        edgeTopoDistanceData<label>
     >::propagationTol();
 
     int dummyTrackData;
@@ -3577,11 +3577,11 @@ Foam::label Foam::meshRefinement::markPatchZones
 
         if (procI == Pstream::myProcNo())
         {
-            patchEdgeFaceRegion& faceInfo = allFaceInfo[seedFaceI];
+            edgeTopoDistanceData<label>& faceInfo = allFaceInfo[seedFaceI];
 
 
             // Set face
-            faceInfo = currentZoneI;
+            faceInfo = edgeTopoDistanceData<label>(0, currentZoneI);
 
             // .. and seed its edges
             const labelList& fEdges = patch.faceEdges()[seedFaceI];
@@ -3589,7 +3589,7 @@ Foam::label Foam::meshRefinement::markPatchZones
             {
                 label edgeI = fEdges[fEdgeI];
 
-                patchEdgeFaceRegion& edgeInfo = allEdgeInfo[edgeI];
+                edgeTopoDistanceData<label>& edgeInfo = allEdgeInfo[edgeI];
 
                 if
                 (
@@ -3622,7 +3622,7 @@ Foam::label Foam::meshRefinement::markPatchZones
         PatchEdgeFaceWave
         <
             indirectPrimitivePatch,
-            patchEdgeFaceRegion
+            edgeTopoDistanceData<label>
         > calc
         (
             mesh_,
@@ -3648,7 +3648,7 @@ Foam::label Foam::meshRefinement::markPatchZones
                 << " at " << patch.faceCentres()[faceI]
                 << exit(FatalError);
         }
-        faceToZone[faceI] = allFaceInfo[faceI].region();
+        faceToZone[faceI] = allFaceInfo[faceI].data();
     }
 
     return currentZoneI;
diff --git a/src/meshTools/Make/files b/src/meshTools/Make/files
index dd2b0a6ec20cf1f5dd590b8bf71158468285d25f..e334535ce8c5c4d042efadb3b5d290d25bc5cde3 100644
--- a/src/meshTools/Make/files
+++ b/src/meshTools/Make/files
@@ -94,7 +94,6 @@ patchWave = $(algorithms)/PatchEdgeFaceWave
 $(patchWave)/PatchEdgeFaceWaveName.C
 $(patchWave)/patchEdgeFaceInfo.C
 $(patchWave)/patchPatchDist.C
-$(patchWave)/patchEdgeFaceRegion.C
 $(patchWave)/patchEdgeFaceRegions.C
 
 
@@ -297,8 +296,6 @@ PatchFunction1/makePatchFunction1s.C
 PatchFunction1/coordinateLabelScaling.C
 
 meshStructure/meshStructure.C
-meshStructure/topoDistanceData.C
-meshStructure/pointTopoDistanceData.C
 
 output/foamVtkIndPatchWriter.C
 output/foamVtkWriteTopoSet.C
diff --git a/src/meshTools/algorithms/PatchEdgeFaceWave/edgeTopoDistanceData.C b/src/meshTools/algorithms/PatchEdgeFaceWave/edgeTopoDistanceData.C
new file mode 100644
index 0000000000000000000000000000000000000000..1a6f4ad3f0b82937ee0fc3e1221d7afb8d06d3c8
--- /dev/null
+++ b/src/meshTools/algorithms/PatchEdgeFaceWave/edgeTopoDistanceData.C
@@ -0,0 +1,52 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+// * * * * * * * * * * * * * * * Friend Operators  * * * * * * * * * * * * * //
+
+template<class Type, class PrimitivePatchType>
+Foam::Ostream& Foam::operator<<
+(
+    Foam::Ostream& os,
+    const Foam::edgeTopoDistanceData<Type, PrimitivePatchType>& wDist
+)
+{
+    return os << wDist.distance_ << token::SPACE << wDist.data_;
+}
+
+
+template<class Type, class PrimitivePatchType>
+Foam::Istream& Foam::operator>>
+(
+    Foam::Istream& is,
+    Foam::edgeTopoDistanceData<Type, PrimitivePatchType>& wDist
+)
+{
+    return is >> wDist.distance_ >> wDist.data_;
+}
+
+
+// ************************************************************************* //
diff --git a/src/meshTools/algorithms/PatchEdgeFaceWave/edgeTopoDistanceData.H b/src/meshTools/algorithms/PatchEdgeFaceWave/edgeTopoDistanceData.H
new file mode 100644
index 0000000000000000000000000000000000000000..9dafc0b2d8e082a526afffcfd843d06a1fe42784
--- /dev/null
+++ b/src/meshTools/algorithms/PatchEdgeFaceWave/edgeTopoDistanceData.H
@@ -0,0 +1,253 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2012-2016 OpenFOAM Foundation
+    Copyright (C) 2019,2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::edgeTopoDistanceData
+
+Description
+    For use with PatchEdgeFaceWave. Determines topological distance to
+    starting edges. Templated on passive transported data.
+
+SourceFiles
+    edgeTopoDistanceDataI.H
+    edgeTopoDistanceData.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef edgeTopoDistanceData_H
+#define edgeTopoDistanceData_H
+
+#include "point.H"
+#include "tensor.H"
+#include "indirectPrimitivePatch.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward Declarations
+class polyPatch;
+class polyMesh;
+template<class Type, class PrimitivePatchType>
+class edgeTopoDistanceData;
+
+template<class Type, class PrimitivePatchType>
+Istream& operator>>
+(
+    Istream&,
+    edgeTopoDistanceData<Type, PrimitivePatchType>&
+);
+template<class Type, class PrimitivePatchType>
+Ostream& operator<<
+(
+    Ostream&,
+    const edgeTopoDistanceData<Type, PrimitivePatchType>&
+);
+
+
+/*---------------------------------------------------------------------------*\
+                    Class edgeTopoDistanceData Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type, class PrimitivePatchType = indirectPrimitivePatch>
+class edgeTopoDistanceData
+{
+protected:
+
+    // Protected data
+
+        //- Distance
+        label distance_;
+
+        //- Starting data
+        Type data_;
+
+
+public:
+
+    typedef Type dataType;
+
+    // Constructors
+
+        //- Construct null with invalid (-1) for distance, null constructor
+        //  for data
+        inline edgeTopoDistanceData();
+
+        //- Construct from distance, data
+        inline edgeTopoDistanceData
+        (
+            const label distance,
+            const Type& data
+        );
+
+
+    // Member Functions
+
+        // Access
+
+            inline label distance() const
+            {
+                return distance_;
+            }
+
+            inline const Type& data() const
+            {
+                return data_;
+            }
+
+
+        // Needed by PatchEdgeFaceWave
+
+            //- Check whether origin has been changed at all or
+            //  still contains original (invalid) value.
+            template<class TrackingData>
+            inline bool valid(TrackingData& td) const;
+
+            //- Apply rotation matrix
+            template<class TrackingData>
+            inline void transform
+            (
+                const polyMesh& mesh,
+                const PrimitivePatchType& patch,
+                const tensor& rotTensor,
+                const scalar tol,
+                TrackingData& td
+            );
+
+            //- Influence of face on edge
+            template<class TrackingData>
+            inline bool updateEdge
+            (
+                const polyMesh& mesh,
+                const PrimitivePatchType& patch,
+                const label edgeI,
+                const label facei,
+                const edgeTopoDistanceData<Type, PrimitivePatchType>& faceInfo,
+                const scalar tol,
+                TrackingData& td
+            );
+
+            //- New information for edge (from e.g. coupled edge)
+            template<class TrackingData>
+            inline bool updateEdge
+            (
+                const polyMesh& mesh,
+                const PrimitivePatchType& patch,
+                const edgeTopoDistanceData<Type, PrimitivePatchType>& edgeInfo,
+                const bool sameOrientation,
+                const scalar tol,
+                TrackingData& td
+            );
+
+            //- Influence of edge on face.
+            template<class TrackingData>
+            inline bool updateFace
+            (
+                const polyMesh& mesh,
+                const PrimitivePatchType& patch,
+                const label facei,
+                const label edgeI,
+                const edgeTopoDistanceData<Type, PrimitivePatchType>& edgeInfo,
+                const scalar tol,
+                TrackingData& td
+            );
+
+            //- Same (like operator==)
+            template<class TrackingData>
+            inline bool equal
+            (
+                const edgeTopoDistanceData<Type, PrimitivePatchType>&,
+                TrackingData&
+            ) const;
+
+
+    // Member Operators
+
+        // Needed for List IO
+        inline bool operator==
+        (
+            const edgeTopoDistanceData<Type, PrimitivePatchType>&
+        ) const;
+        inline bool operator!=
+        (
+            const edgeTopoDistanceData<Type, PrimitivePatchType>&
+        ) const;
+
+
+    // IOstream Operators
+
+        friend Ostream& operator<< <Type, PrimitivePatchType>
+        (
+            Ostream&,
+            const edgeTopoDistanceData<Type, PrimitivePatchType>&
+        );
+        friend Istream& operator>> <Type, PrimitivePatchType>
+        (
+            Istream&,
+            edgeTopoDistanceData<Type, PrimitivePatchType>&
+        );
+};
+
+
+// * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
+
+
+//- Data are contiguous if data type is contiguous
+template<class Type, class PrimitivePatchType>
+struct is_contiguous<edgeTopoDistanceData<Type, PrimitivePatchType>> :
+    is_contiguous<Type> {};
+
+//- Data are contiguous label if data type is label
+template<class Type, class PrimitivePatchType>
+struct is_contiguous_label<edgeTopoDistanceData<Type, PrimitivePatchType>> :
+    is_contiguous_label<Type> {};
+
+//- Data are contiguous scalar if data type is scalar
+template<class Type, class PrimitivePatchType>
+struct is_contiguous_scalar<edgeTopoDistanceData<Type, PrimitivePatchType>> :
+    is_contiguous_scalar<Type>{};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+    #include "edgeTopoDistanceData.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "edgeTopoDistanceDataI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/meshTools/algorithms/PatchEdgeFaceWave/edgeTopoDistanceDataI.H b/src/meshTools/algorithms/PatchEdgeFaceWave/edgeTopoDistanceDataI.H
new file mode 100644
index 0000000000000000000000000000000000000000..0fefdb1db94b164d1b5a5338fbcc3f155a1c01ab
--- /dev/null
+++ b/src/meshTools/algorithms/PatchEdgeFaceWave/edgeTopoDistanceDataI.H
@@ -0,0 +1,188 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2012-2016 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "polyMesh.H"
+#include "transform.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class Type, class PrimitivePatchType>
+inline
+Foam::edgeTopoDistanceData<Type, PrimitivePatchType>::edgeTopoDistanceData()
+:
+    distance_(-1),
+    data_()
+{}
+
+
+template<class Type, class PrimitivePatchType>
+inline
+Foam::edgeTopoDistanceData<Type, PrimitivePatchType>::edgeTopoDistanceData
+(
+    const label distance,
+    const Type& data
+)
+:
+    distance_(distance),
+    data_(data)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type, class PrimitivePatchType>
+template<class TrackingData>
+inline bool Foam::edgeTopoDistanceData<Type, PrimitivePatchType>::valid
+(
+    TrackingData& td
+) const
+{
+    return distance_ != -1;
+}
+
+
+template<class Type, class PrimitivePatchType>
+template<class TrackingData>
+inline void Foam::edgeTopoDistanceData<Type, PrimitivePatchType>::transform
+(
+    const polyMesh& mesh,
+    const PrimitivePatchType& patch,
+    const tensor& rotTensor,
+    const scalar tol,
+    TrackingData& td
+)
+{}
+
+
+template<class Type, class PrimitivePatchType>
+template<class TrackingData>
+inline bool Foam::edgeTopoDistanceData<Type, PrimitivePatchType>::updateEdge
+(
+    const polyMesh& mesh,
+    const PrimitivePatchType& patch,
+    const label edgeI,
+    const label facei,
+    const edgeTopoDistanceData<Type, PrimitivePatchType>& faceInfo,
+    const scalar tol,
+    TrackingData& td
+)
+{
+    // From face to edge
+    if (distance_ == -1)
+    {
+        data_ = faceInfo.data_;
+        distance_ = faceInfo.distance_ + 1;
+        return true;
+    }
+
+    return false;
+}
+
+
+template<class Type, class PrimitivePatchType>
+template<class TrackingData>
+inline bool Foam::edgeTopoDistanceData<Type, PrimitivePatchType>::updateEdge
+(
+    const polyMesh& mesh,
+    const PrimitivePatchType& patch,
+    const edgeTopoDistanceData<Type, PrimitivePatchType>& edgeInfo,
+    const bool sameOrientation,
+    const scalar tol,
+    TrackingData& td
+)
+{
+    // From edge to edge (e.g. coupled edges)
+    if (distance_ == -1)
+    {
+        this->operator=(edgeInfo);
+        return true;
+    }
+
+    return false;
+}
+
+
+template<class Type, class PrimitivePatchType>
+template<class TrackingData>
+inline bool Foam::edgeTopoDistanceData<Type, PrimitivePatchType>::updateFace
+(
+    const polyMesh& mesh,
+    const PrimitivePatchType& patch,
+    const label facei,
+    const label edgeI,
+    const edgeTopoDistanceData<Type, PrimitivePatchType>& edgeInfo,
+    const scalar tol,
+    TrackingData& td
+)
+{
+    // From edge to face
+    if (distance_ == -1)
+    {
+        this->operator=(edgeInfo);
+        return true;
+    }
+
+    return false;
+}
+
+
+template<class Type, class PrimitivePatchType>
+template<class TrackingData>
+inline bool Foam::edgeTopoDistanceData<Type, PrimitivePatchType>::equal
+(
+    const edgeTopoDistanceData<Type, PrimitivePatchType>& rhs,
+    TrackingData& td
+) const
+{
+    return operator==(rhs);
+}
+
+
+// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
+
+template<class Type, class PrimitivePatchType>
+inline bool Foam::edgeTopoDistanceData<Type, PrimitivePatchType>::operator==
+(
+    const Foam::edgeTopoDistanceData<Type, PrimitivePatchType>& rhs
+) const
+{
+    return distance() == rhs.distance() && data() == rhs.data();
+}
+
+
+template<class Type, class PrimitivePatchType>
+inline bool Foam::edgeTopoDistanceData<Type, PrimitivePatchType>::operator!=
+(
+    const Foam::edgeTopoDistanceData<Type, PrimitivePatchType>& rhs
+) const
+{
+    return !(*this == rhs);
+}
+
+
+// ************************************************************************* //
diff --git a/src/meshTools/meshStructure/meshStructure.C b/src/meshTools/meshStructure/meshStructure.C
index a59ad6c760c01b78a5f85fb8607390eb4831da7e..cba8524a66774df0aed1050b9b7557c87c342f8d 100644
--- a/src/meshTools/meshStructure/meshStructure.C
+++ b/src/meshTools/meshStructure/meshStructure.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2013-2016 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -110,8 +110,8 @@ void Foam::meshStructure::correct
 )
 {
     // Field on cells and faces.
-    List<topoDistanceData> cellData(mesh.nCells());
-    List<topoDistanceData> faceData(mesh.nFaces());
+    List<topoDistanceData<label>> cellData(mesh.nCells());
+    List<topoDistanceData<label>> faceData(mesh.nFaces());
 
     {
         if (debug)
@@ -124,20 +124,20 @@ void Foam::meshStructure::correct
 
         // Start of changes
         labelList patchFaces(pp.size());
-        List<topoDistanceData> patchData(pp.size());
+        List<topoDistanceData<label>> patchData(pp.size());
         forAll(pp, patchFacei)
         {
             patchFaces[patchFacei] = pp.addressing()[patchFacei];
-            patchData[patchFacei] = topoDistanceData
+            patchData[patchFacei] = topoDistanceData<label>
             (
-                globalFaces.toGlobal(patchFacei),
-                0
+                0,                                  // distance
+                globalFaces.toGlobal(patchFacei)    // passive data
             );
         }
 
 
         // Propagate information inwards
-        FaceCellWave<topoDistanceData> distanceCalc
+        FaceCellWave<topoDistanceData<label>> distanceCalc
         (
             mesh,
             patchFaces,
@@ -232,25 +232,25 @@ void Foam::meshStructure::correct
         }
 
         // Field on edges and points.
-        List<pointTopoDistanceData> edgeData(mesh.nEdges());
-        List<pointTopoDistanceData> pointData(mesh.nPoints());
+        List<pointTopoDistanceData<label>> edgeData(mesh.nEdges());
+        List<pointTopoDistanceData<label>> pointData(mesh.nPoints());
 
         // Start of changes
         labelList patchPoints(pp.nPoints());
-        List<pointTopoDistanceData> patchData(pp.nPoints());
+        List<pointTopoDistanceData<label>> patchData(pp.nPoints());
         forAll(pp.meshPoints(), patchPointi)
         {
             patchPoints[patchPointi] = pp.meshPoints()[patchPointi];
-            patchData[patchPointi] = pointTopoDistanceData
+            patchData[patchPointi] = pointTopoDistanceData<label>
             (
-                globalPoints.toGlobal(patchPointi),
-                0
+                0,                                  // distance
+                globalPoints.toGlobal(patchPointi)  // passive data
             );
         }
 
 
         // Walk
-        PointEdgeWave<pointTopoDistanceData> distanceCalc
+        PointEdgeWave<pointTopoDistanceData<label>> distanceCalc
         (
             mesh,
             patchPoints,
@@ -308,7 +308,8 @@ void Foam::meshStructure::correct
                     //    << " at:" << mesh.faceCentres()[facei]
                     //    << " data:" << faceData[facei]
                     //    << " pointDatas:"
-                    //    << UIndirectList<pointTopoDistanceData>(pointData, f)
+                    //    << UIndirectList<pointTopoDistanceData<label>>
+                    //       (pointData, f)
                     //    << endl;
 
                     label patchFacei = faceData[facei].data();
diff --git a/src/meshTools/meshStructure/pointTopoDistanceData.C b/src/meshTools/meshStructure/pointTopoDistanceData.C
index d1b229a7a3db14f361235bb5afd5acb69b45579a..eeb88ab6e61a4e4bb566567f996d3b9adc4e86fb 100644
--- a/src/meshTools/meshStructure/pointTopoDistanceData.C
+++ b/src/meshTools/meshStructure/pointTopoDistanceData.C
@@ -26,27 +26,27 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#include "pointTopoDistanceData.H"
-
-// * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
+// * * * * * * * * * * * * * * * Friend Operators  * * * * * * * * * * * * * //
 
+template<class Type>
 Foam::Ostream& Foam::operator<<
 (
-    Ostream& os,
-    const pointTopoDistanceData& rhs
+    Foam::Ostream& os,
+    const Foam::pointTopoDistanceData<Type>& wDist
 )
 {
-    return os << rhs.data_ << token::SPACE << rhs.distance_;
+    return os << wDist.distance_ << token::SPACE << wDist.data_;
 }
 
 
+template<class Type>
 Foam::Istream& Foam::operator>>
 (
-    Istream& is,
-    pointTopoDistanceData& rhs
+    Foam::Istream& is,
+    Foam::pointTopoDistanceData<Type>& wDist
 )
 {
-    return is >> rhs.data_ >> rhs.distance_;
+    return is >> wDist.distance_ >> wDist.data_;
 }
 
 
diff --git a/src/meshTools/meshStructure/pointTopoDistanceData.H b/src/meshTools/meshStructure/pointTopoDistanceData.H
index c45df7ff2fb2d66f5ed289c2e6526ac7bca01a41..65087f62e69f21eca1ae5b32ef3c22d5e0a52455 100644
--- a/src/meshTools/meshStructure/pointTopoDistanceData.H
+++ b/src/meshTools/meshStructure/pointTopoDistanceData.H
@@ -29,7 +29,7 @@ Class
 
 Description
     For use with PointEdgeWave. Determines topological distance to
-    starting points
+    starting points. Templated on passive transported data.
 
 SourceFiles
     pointTopoDistanceDataI.H
@@ -51,38 +51,45 @@ namespace Foam
 // Forward Declarations
 class polyPatch;
 class polyMesh;
-class pointTopoDistanceData;
-
-Istream& operator>>(Istream&, pointTopoDistanceData&);
-Ostream& operator<<(Ostream&, const pointTopoDistanceData&);
+template<class Type> class pointTopoDistanceData;
+template<class Type>
+Istream& operator>>(Istream&, pointTopoDistanceData<Type>&);
+template<class Type>
+Ostream& operator<<(Ostream&, const pointTopoDistanceData<Type>&);
 
 /*---------------------------------------------------------------------------*\
-                       Class pointTopoDistanceData Declaration
+                    Class pointTopoDistanceData Declaration
 \*---------------------------------------------------------------------------*/
 
+template<class Type>
 class pointTopoDistanceData
 {
-    // Private Data
 
-        //- Starting data
-        label data_;
+    // Protected data
 
         //- Distance
         label distance_;
 
+        //- Starting data
+        Type data_;
+
 
 public:
 
+    typedef Type dataType;
+
+
     // Constructors
 
-        //- Default construct, with invalid (-1) for data and distance
+        //- Construct null with invalid (-1) for distance, null constructor
+        //  for data
         inline pointTopoDistanceData();
 
         //- Construct from components
         inline pointTopoDistanceData
         (
-            const label data,
-            const label distance
+            const label distance,
+            const Type& data
         );
 
 
@@ -90,14 +97,14 @@ public:
 
         // Access
 
-            label data() const
+            inline label distance() const
             {
-                return data_;
+                return distance_;
             }
 
-            label distance() const
+            inline const Type& data() const
             {
-                return distance_;
+                return data_;
             }
 
 
@@ -111,7 +118,7 @@ public:
             template<class TrackingData>
             inline bool sameGeometry
             (
-                const pointTopoDistanceData&,
+                const pointTopoDistanceData<Type>&,
                 const scalar tol,
                 TrackingData& td
             ) const;
@@ -152,7 +159,7 @@ public:
                 const polyMesh& mesh,
                 const label pointi,
                 const label edgeI,
-                const pointTopoDistanceData& edgeInfo,
+                const pointTopoDistanceData<Type>& edgeInfo,
                 const scalar tol,
                 TrackingData& td
             );
@@ -164,7 +171,7 @@ public:
             (
                 const polyMesh& mesh,
                 const label pointi,
-                const pointTopoDistanceData& newPointInfo,
+                const pointTopoDistanceData<Type>& newPointInfo,
                 const scalar tol,
                 TrackingData& td
             );
@@ -174,7 +181,7 @@ public:
             template<class TrackingData>
             inline bool updatePoint
             (
-                const pointTopoDistanceData& newPointInfo,
+                const pointTopoDistanceData<Type>& newPointInfo,
                 const scalar tol,
                 TrackingData& td
             );
@@ -186,44 +193,54 @@ public:
                 const polyMesh& mesh,
                 const label edgeI,
                 const label pointi,
-                const pointTopoDistanceData& pointInfo,
+                const pointTopoDistanceData<Type>& pointInfo,
                 const scalar tol,
                 TrackingData& td
             );
 
             //- Test for equality, with TrackingData
             template<class TrackingData>
-            inline bool equal(const pointTopoDistanceData&, TrackingData&)
+            inline bool equal(const pointTopoDistanceData<Type>&, TrackingData&)
             const;
 
 
     // Member Operators
 
-        //- Test for equality
-        inline bool operator==(const pointTopoDistanceData&) const;
-
-        //- Test for inequality
-        inline bool operator!=(const pointTopoDistanceData&) const;
+        // Needed for List IO
+        inline bool operator==(const pointTopoDistanceData<Type>&) const;
+        inline bool operator!=(const pointTopoDistanceData<Type>&) const;
 
 
     // IOstream Operators
 
-        friend Ostream& operator<<(Ostream&, const pointTopoDistanceData&);
-        friend Istream& operator>>(Istream&, pointTopoDistanceData&);
+        friend Ostream& operator<< <Type>
+        (
+            Ostream&,
+            const pointTopoDistanceData<Type>&
+        );
+        friend Istream& operator>> <Type>
+        (
+            Istream&,
+            pointTopoDistanceData<Type>&
+        );
 };
 
 
 // * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
 
-//- Contiguous data for pointTopoDistanceData
-template<> struct is_contiguous<pointTopoDistanceData> : std::true_type {};
+//- Data are contiguous if data type is contiguous
+template<class Type>
+struct is_contiguous<pointTopoDistanceData<Type>> : is_contiguous<Type> {};
 
-//- Contiguous label data for pointTopoDistanceData
-template<> struct is_contiguous_label<pointTopoDistanceData>
-:
-    std::true_type
-{};
+//- Data are contiguous label if data type is label
+template<class Type>
+struct is_contiguous_label<pointTopoDistanceData<Type>> :
+    is_contiguous_label<Type> {};
 
+//- Data are contiguous scalar if data type is scalar
+template<class Type>
+struct is_contiguous_scalar<pointTopoDistanceData<Type>> :
+    is_contiguous_scalar<Type>{};
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -231,6 +248,12 @@ template<> struct is_contiguous_label<pointTopoDistanceData>
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+#ifdef NoRepository
+    #include "pointTopoDistanceData.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
 #include "pointTopoDistanceDataI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/meshStructure/pointTopoDistanceDataI.H b/src/meshTools/meshStructure/pointTopoDistanceDataI.H
index 5d0a35a7e2520346ecd68bdcb6d111c1bb68686c..3eb55e2b77fd76178e41bc5d1510b7cfcfea2d45 100644
--- a/src/meshTools/meshStructure/pointTopoDistanceDataI.H
+++ b/src/meshTools/meshStructure/pointTopoDistanceDataI.H
@@ -30,38 +30,42 @@ License
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-inline Foam::pointTopoDistanceData::pointTopoDistanceData()
+template<class Type>
+inline Foam::pointTopoDistanceData<Type>::pointTopoDistanceData()
 :
-    data_(-1),
-    distance_(-1)
+    distance_(-1),
+    data_()
 {}
 
 
-inline Foam::pointTopoDistanceData::pointTopoDistanceData
+template<class Type>
+inline Foam::pointTopoDistanceData<Type>::pointTopoDistanceData
 (
-    const label data,
-    const label distance
+    const label distance,
+    const Type& data
 )
 :
-    data_(data),
-    distance_(distance)
+    distance_(distance),
+    data_(data)
 {}
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+template<class Type>
 template<class TrackingData>
-inline bool Foam::pointTopoDistanceData::valid(TrackingData& td) const
+inline bool Foam::pointTopoDistanceData<Type>::valid(TrackingData& td) const
 {
     return distance_ != -1;
 }
 
 
 // No geometric data so never any problem on cyclics
+template<class Type>
 template<class TrackingData>
-inline bool Foam::pointTopoDistanceData::sameGeometry
+inline bool Foam::pointTopoDistanceData<Type>::sameGeometry
 (
-    const pointTopoDistanceData&,
+    const pointTopoDistanceData<Type>&,
     const scalar tol,
     TrackingData& td
 ) const
@@ -71,8 +75,9 @@ inline bool Foam::pointTopoDistanceData::sameGeometry
 
 
 // No geometric data.
+template<class Type>
 template<class TrackingData>
-inline void Foam::pointTopoDistanceData::leaveDomain
+inline void Foam::pointTopoDistanceData<Type>::leaveDomain
 (
     const polyPatch& patch,
     const label patchPointi,
@@ -83,8 +88,9 @@ inline void Foam::pointTopoDistanceData::leaveDomain
 
 
 // No geometric data.
+template<class Type>
 template<class TrackingData>
-inline void Foam::pointTopoDistanceData::transform
+inline void Foam::pointTopoDistanceData<Type>::transform
 (
     const tensor& rotTensor,
     TrackingData& td
@@ -93,8 +99,9 @@ inline void Foam::pointTopoDistanceData::transform
 
 
 // No geometric data.
+template<class Type>
 template<class TrackingData>
-inline void Foam::pointTopoDistanceData::enterDomain
+inline void Foam::pointTopoDistanceData<Type>::enterDomain
 (
     const polyPatch& patch,
     const label patchPointi,
@@ -105,21 +112,22 @@ inline void Foam::pointTopoDistanceData::enterDomain
 
 
 // Update this with information from connected edge
+template<class Type>
 template<class TrackingData>
-inline bool Foam::pointTopoDistanceData::updatePoint
+inline bool Foam::pointTopoDistanceData<Type>::updatePoint
 (
     const polyMesh& mesh,
     const label pointi,
     const label edgeI,
-    const pointTopoDistanceData& edgeInfo,
+    const pointTopoDistanceData<Type>& edgeInfo,
     const scalar tol,
     TrackingData& td
 )
 {
     if (distance_ == -1)
     {
-        data_ = edgeInfo.data_;
         distance_ = edgeInfo.distance_ + 1;
+        data_ = edgeInfo.data_;
         return true;
     }
 
@@ -128,19 +136,21 @@ inline bool Foam::pointTopoDistanceData::updatePoint
 
 
 // Update this with new information on same point
+template<class Type>
 template<class TrackingData>
-inline bool Foam::pointTopoDistanceData::updatePoint
+inline bool Foam::pointTopoDistanceData<Type>::updatePoint
 (
     const polyMesh& mesh,
     const label pointi,
-    const pointTopoDistanceData& newPointInfo,
+    const pointTopoDistanceData<Type>& newPointInfo,
     const scalar tol,
     TrackingData& td
 )
 {
     if (distance_ == -1)
     {
-        operator=(newPointInfo);
+        distance_ = newPointInfo.distance_;
+        data_ = newPointInfo.data_;
         return true;
     }
 
@@ -149,17 +159,19 @@ inline bool Foam::pointTopoDistanceData::updatePoint
 
 
 // Update this with new information on same point. No extra information.
+template<class Type>
 template<class TrackingData>
-inline bool Foam::pointTopoDistanceData::updatePoint
+inline bool Foam::pointTopoDistanceData<Type>::updatePoint
 (
-    const pointTopoDistanceData& newPointInfo,
+    const pointTopoDistanceData<Type>& newPointInfo,
     const scalar tol,
     TrackingData& td
 )
 {
     if (distance_ == -1)
     {
-        operator=(newPointInfo);
+        distance_ = newPointInfo.distance_;
+        data_ = newPointInfo.data_;
         return true;
     }
 
@@ -168,20 +180,22 @@ inline bool Foam::pointTopoDistanceData::updatePoint
 
 
 // Update this with information from connected point
+template<class Type>
 template<class TrackingData>
-inline bool Foam::pointTopoDistanceData::updateEdge
+inline bool Foam::pointTopoDistanceData<Type>::updateEdge
 (
     const polyMesh& mesh,
     const label edgeI,
     const label pointi,
-    const pointTopoDistanceData& pointInfo,
+    const pointTopoDistanceData<Type>& pointInfo,
     const scalar tol,
     TrackingData& td
 )
 {
     if (distance_ == -1)
     {
-        operator=(pointInfo);
+        distance_ = pointInfo.distance_;
+        data_ = pointInfo.data_;
         return true;
     }
 
@@ -189,10 +203,11 @@ inline bool Foam::pointTopoDistanceData::updateEdge
 }
 
 
+template<class Type>
 template<class TrackingData>
-inline bool Foam::pointTopoDistanceData::equal
+inline bool Foam::pointTopoDistanceData<Type>::equal
 (
-    const pointTopoDistanceData& rhs,
+    const pointTopoDistanceData<Type>& rhs,
     TrackingData& td
 ) const
 {
@@ -202,18 +217,20 @@ inline bool Foam::pointTopoDistanceData::equal
 
 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
 
-inline bool Foam::pointTopoDistanceData::operator==
+template<class Type>
+inline bool Foam::pointTopoDistanceData<Type>::operator==
 (
-    const pointTopoDistanceData& rhs
+    const Foam::pointTopoDistanceData<Type>& rhs
 ) const
 {
-    return data_ == rhs.data_ && distance_ == rhs.distance_;
+    return distance() == rhs.distance() && data() == rhs.data();
 }
 
 
-inline bool Foam::pointTopoDistanceData::operator!=
+template<class Type>
+inline bool Foam::pointTopoDistanceData<Type>::operator!=
 (
-    const pointTopoDistanceData& rhs
+    const Foam::pointTopoDistanceData<Type>& rhs
 ) const
 {
     return !(*this == rhs);
diff --git a/src/meshTools/meshStructure/topoDistanceData.C b/src/meshTools/meshStructure/topoDistanceData.C
index b70e599b05984749cf9d9f4116b99e8fcf53ec0f..93d46f073ca93a6ddf21cfa7e286685dae6d3e42 100644
--- a/src/meshTools/meshStructure/topoDistanceData.C
+++ b/src/meshTools/meshStructure/topoDistanceData.C
@@ -30,23 +30,25 @@ License
 
 // * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
 
+template<class Type>
 Foam::Ostream& Foam::operator<<
 (
-    Ostream& os,
-    const topoDistanceData& rhs
+    Foam::Ostream& os,
+    const Foam::topoDistanceData<Type>& wDist
 )
 {
-    return os << rhs.data_ << token::SPACE << rhs.distance_;
+    return os << wDist.distance_ << token::SPACE << wDist.data_;
 }
 
 
+template<class Type>
 Foam::Istream& Foam::operator>>
 (
-    Istream& is,
-    topoDistanceData& rhs
+    Foam::Istream& is,
+    Foam::topoDistanceData<Type>& wDist
 )
 {
-    return is >> rhs.data_ >> rhs.distance_;
+    return is >> wDist.distance_ >> wDist.data_;
 }
 
 
diff --git a/src/meshTools/meshStructure/topoDistanceData.H b/src/meshTools/meshStructure/topoDistanceData.H
index e7c4f64da4c60c91c170efa54f072084936eb870..807cd2b8e368dc95915d1b8e0f3d6aca01005747 100644
--- a/src/meshTools/meshStructure/topoDistanceData.H
+++ b/src/meshTools/meshStructure/topoDistanceData.H
@@ -28,7 +28,8 @@ Class
     Foam::topoDistanceData
 
 Description
-    For use with FaceCellWave. Determines topological distance to starting faces
+    For use with FaceCellWave. Determines topological distance to starting
+    faces. Templated on passive transported data.
 
 SourceFiles
     topoDistanceDataI.H
@@ -50,38 +51,42 @@ namespace Foam
 // Forward Declarations
 class polyPatch;
 class polyMesh;
-class topoDistanceData;
+template<class Type> class topoDistanceData;
 
-Istream& operator>>(Istream&, topoDistanceData&);
-Ostream& operator<<(Ostream&, const topoDistanceData&);
+template<class Type>
+Istream& operator>>(Istream&, topoDistanceData<Type>&);
+template<class Type>
+Ostream& operator<<(Ostream&, const topoDistanceData<Type>&);
 
 /*---------------------------------------------------------------------------*\
                       Class topoDistanceData Declaration
 \*---------------------------------------------------------------------------*/
 
+template<class Type>
 class topoDistanceData
 {
     // Private Data
 
-        //- Starting data
-        label data_;
-
         //- Distance
         label distance_;
 
+        //- Starting data
+        Type data_;
+
 
 public:
 
     // Constructors
 
-        //- Default construct, with invalid (-1) for data and distance
+        //- Construct null with invalid (-1) for distance, null constructor
+        //  for data
         inline topoDistanceData();
 
         //- Construct from components
         inline topoDistanceData
         (
-            const label data,
-            const label distance
+            const label distance,
+            const Type& data
         );
 
 
@@ -89,14 +94,14 @@ public:
 
         // Access
 
-            label data() const
+            inline label distance() const
             {
-                return data_;
+                return distance_;
             }
 
-            label distance() const
+            inline const Type& data() const
             {
-                return distance_;
+                return data_;
             }
 
 
@@ -111,7 +116,7 @@ public:
             inline bool sameGeometry
             (
                 const polyMesh&,
-                const topoDistanceData&,
+                const topoDistanceData<Type>&,
                 const scalar,
                 TrackingData& td
             ) const;
@@ -155,7 +160,7 @@ public:
                 const polyMesh&,
                 const label thisCelli,
                 const label neighbourFacei,
-                const topoDistanceData& neighbourInfo,
+                const topoDistanceData<Type>& neighbourInfo,
                 const scalar tol,
                 TrackingData& td
             );
@@ -167,7 +172,7 @@ public:
                 const polyMesh&,
                 const label thisFacei,
                 const label neighbourCelli,
-                const topoDistanceData& neighbourInfo,
+                const topoDistanceData<Type>& neighbourInfo,
                 const scalar tol,
                 TrackingData& td
             );
@@ -178,40 +183,58 @@ public:
             (
                 const polyMesh&,
                 const label thisFacei,
-                const topoDistanceData& neighbourInfo,
+                const topoDistanceData<Type>& neighbourInfo,
                 const scalar tol,
                 TrackingData& td
             );
 
             //- Test for equality, with TrackingData
             template<class TrackingData>
-            inline bool equal(const topoDistanceData&, TrackingData& td) const;
+            inline bool equal
+            (
+                const topoDistanceData<Type>&,
+                TrackingData& td
+            ) const;
 
 
     // Member Operators
 
-        //- Test for equality
-        inline bool operator==(const topoDistanceData&) const;
+        // Needed for List IO
+        inline bool operator==(const topoDistanceData<Type>&) const;
 
-        //- Test for inequality
-        inline bool operator!=(const topoDistanceData&) const;
+        inline bool operator!=(const topoDistanceData<Type>&) const;
 
 
     // IOstream Operators
 
-        friend Ostream& operator<<(Ostream&, const topoDistanceData&);
-        friend Istream& operator>>(Istream&, topoDistanceData&);
+        friend Ostream& operator<< <Type>
+        (
+            Ostream&,
+            const topoDistanceData<Type>&
+        );
+        friend Istream& operator>> <Type>
+        (
+            Istream&,
+            topoDistanceData<Type>&
+        );
 };
 
 
 // * * * * * * * * * * * * * * * * * Traits  * * * * * * * * * * * * * * * * //
 
-//- Contiguous data for topoDistanceData
-template<> struct is_contiguous<topoDistanceData> : std::true_type {};
+//- Data are contiguous if data type is contiguous
+template<class Type>
+struct is_contiguous<topoDistanceData<Type>> : is_contiguous<Type> {};
 
-//- Contiguous label data for topoDistanceData
-template<> struct is_contiguous_label<topoDistanceData> : std::true_type {};
+//- Data are contiguous label if data type is label
+template<class Type>
+struct is_contiguous_label<topoDistanceData<Type>> :
+    is_contiguous_label<Type> {};
 
+//- Data are contiguous scalar if data type is scalar
+template<class Type>
+struct is_contiguous_scalar<topoDistanceData<Type>> :
+    is_contiguous_scalar<Type>{};
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -219,6 +242,12 @@ template<> struct is_contiguous_label<topoDistanceData> : std::true_type {};
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+#ifdef NoRepository
+    #include "topoDistanceData.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
 #include "topoDistanceDataI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/meshStructure/topoDistanceDataI.H b/src/meshTools/meshStructure/topoDistanceDataI.H
index 1ede6fe5c1df110afc986654c2b612f6edb566aa..d6488f207a3f2e03f1457b20a67d597c36f40a02 100644
--- a/src/meshTools/meshStructure/topoDistanceDataI.H
+++ b/src/meshTools/meshStructure/topoDistanceDataI.H
@@ -30,39 +30,43 @@ License
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-inline Foam::topoDistanceData::topoDistanceData()
+template<class Type>
+inline Foam::topoDistanceData<Type>::topoDistanceData()
 :
-    data_(-1),
-    distance_(-1)
+    distance_(-1),
+    data_()
 {}
 
 
-inline Foam::topoDistanceData::topoDistanceData
+template<class Type>
+inline Foam::topoDistanceData<Type>::topoDistanceData
 (
-    const label data,
-    const label distance
+    const label distance,
+    const Type& data
 )
 :
-    data_(data),
-    distance_(distance)
+    distance_(distance),
+    data_(data)
 {}
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+template<class Type>
 template<class TrackingData>
-inline bool Foam::topoDistanceData::valid(TrackingData& td) const
+inline bool Foam::topoDistanceData<Type>::valid(TrackingData& td) const
 {
     return distance_ != -1;
 }
 
 
 // No geometric data so never any problem on cyclics
+template<class Type>
 template<class TrackingData>
-inline bool Foam::topoDistanceData::sameGeometry
+inline bool Foam::topoDistanceData<Type>::sameGeometry
 (
     const polyMesh&,
-    const topoDistanceData&,
+    const topoDistanceData<Type>&,
     const scalar,
     TrackingData&
 ) const
@@ -72,8 +76,9 @@ inline bool Foam::topoDistanceData::sameGeometry
 
 
 // No geometric data.
+template<class Type>
 template<class TrackingData>
-inline void Foam::topoDistanceData::leaveDomain
+inline void Foam::topoDistanceData<Type>::leaveDomain
 (
     const polyMesh&,
     const polyPatch& patch,
@@ -85,8 +90,9 @@ inline void Foam::topoDistanceData::leaveDomain
 
 
 // No geometric data.
+template<class Type>
 template<class TrackingData>
-inline void Foam::topoDistanceData::transform
+inline void Foam::topoDistanceData<Type>::transform
 (
     const polyMesh&,
     const tensor& rotTensor,
@@ -96,8 +102,9 @@ inline void Foam::topoDistanceData::transform
 
 
 // No geometric data.
+template<class Type>
 template<class TrackingData>
-inline void Foam::topoDistanceData::enterDomain
+inline void Foam::topoDistanceData<Type>::enterDomain
 (
     const polyMesh&,
     const polyPatch& patch,
@@ -109,20 +116,21 @@ inline void Foam::topoDistanceData::enterDomain
 
 
 // Update cell with neighbouring face information
+template<class Type>
 template<class TrackingData>
-inline bool Foam::topoDistanceData::updateCell
+inline bool Foam::topoDistanceData<Type>::updateCell
 (
     const polyMesh&,
     const label thisCelli,
     const label neighbourFacei,
-    const topoDistanceData& neighbourInfo,
+    const topoDistanceData<Type>& neighbourInfo,
     const scalar tol,
     TrackingData&
 )
 {
     if (distance_ == -1)
     {
-        operator=(neighbourInfo);
+        this->operator=(neighbourInfo);
         return true;
     }
 
@@ -131,13 +139,14 @@ inline bool Foam::topoDistanceData::updateCell
 
 
 // Update face with neighbouring cell information
+template<class Type>
 template<class TrackingData>
-inline bool Foam::topoDistanceData::updateFace
+inline bool Foam::topoDistanceData<Type>::updateFace
 (
     const polyMesh& mesh,
     const label thisFacei,
     const label neighbourCelli,
-    const topoDistanceData& neighbourInfo,
+    const topoDistanceData<Type>& neighbourInfo,
     const scalar tol,
     TrackingData&
 )
@@ -146,8 +155,8 @@ inline bool Foam::topoDistanceData::updateFace
 
     if (distance_ == -1)
     {
-        data_ = neighbourInfo.data_;
         distance_ = neighbourInfo.distance_ + 1;
+        data_ = neighbourInfo.data_;
         return true;
     }
 
@@ -156,12 +165,13 @@ inline bool Foam::topoDistanceData::updateFace
 
 
 // Update face with coupled face information
+template<class Type>
 template<class TrackingData>
-inline bool Foam::topoDistanceData::updateFace
+inline bool Foam::topoDistanceData<Type>::updateFace
 (
     const polyMesh&,
     const label thisFacei,
-    const topoDistanceData& neighbourInfo,
+    const topoDistanceData<Type>& neighbourInfo,
     const scalar tol,
     TrackingData&
 )
@@ -169,7 +179,7 @@ inline bool Foam::topoDistanceData::updateFace
     // From face to face (e.g. coupled faces)
     if (distance_ == -1)
     {
-        operator=(neighbourInfo);
+        this->operator=(neighbourInfo);
         return true;
     }
 
@@ -177,10 +187,11 @@ inline bool Foam::topoDistanceData::updateFace
 }
 
 
+template<class Type>
 template<class TrackingData>
-inline bool Foam::topoDistanceData::equal
+inline bool Foam::topoDistanceData<Type>::equal
 (
-    const topoDistanceData& rhs,
+    const topoDistanceData<Type>& rhs,
     TrackingData& td
 ) const
 {
@@ -190,18 +201,20 @@ inline bool Foam::topoDistanceData::equal
 
 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
 
-inline bool Foam::topoDistanceData::operator==
+template<class Type>
+inline bool Foam::topoDistanceData<Type>::operator==
 (
-    const topoDistanceData& rhs
+    const Foam::topoDistanceData<Type>& rhs
 ) const
 {
-    return data_ == rhs.data_ && distance_ == rhs.distance_;
+    return distance() == rhs.distance() && data() == rhs.data();
 }
 
 
-inline bool Foam::topoDistanceData::operator!=
+template<class Type>
+inline bool Foam::topoDistanceData<Type>::operator!=
 (
-    const topoDistanceData& rhs
+    const Foam::topoDistanceData<Type>& rhs
 ) const
 {
     return !(*this == rhs);
diff --git a/src/meshTools/regionSplit2D/regionSplit2D.C b/src/meshTools/regionSplit2D/regionSplit2D.C
index dfd82e52c7ea1174320ceb7e974ad9fd5ad21fe5..4c3b7fb9ef1318d328b4e43a4f9824ee6f886911 100644
--- a/src/meshTools/regionSplit2D/regionSplit2D.C
+++ b/src/meshTools/regionSplit2D/regionSplit2D.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2015 OpenCFD Ltd.
+    Copyright (C) 2015-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -28,7 +28,7 @@ License
 #include "regionSplit2D.H"
 #include "polyMesh.H"
 #include "PatchEdgeFaceWave.H"
-#include "Time.H"
+#include "edgeTopoDistanceData.H"
 
 // * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
 
@@ -45,10 +45,10 @@ Foam::regionSplit2D::regionSplit2D
 {
     globalIndex globalFaces(blockedFaces.size());
     label regionI = globalFaces.toGlobal(0);
-    List<patchEdgeFaceRegion> allEdgeInfo(patch.nEdges());
-    List<patchEdgeFaceRegion> allFaceInfo(patch.size());
+    List<edgeTopoDistanceData<label>> allEdgeInfo(patch.nEdges());
+    List<edgeTopoDistanceData<label>> allFaceInfo(patch.size());
     DynamicList<label> changedEdges;
-    DynamicList<patchEdgeFaceRegion> changedRegions;
+    DynamicList<edgeTopoDistanceData<label>> changedRegions;
     label nBlockedFaces = 0;
     forAll(blockedFaces, faceI)
     {
@@ -60,7 +60,14 @@ Foam::regionSplit2D::regionSplit2D
                 changedEdges.append(fEdges[feI]);
 
                 // Append globally unique value
-                changedRegions.append(regionI);
+                changedRegions.append
+                (
+                    edgeTopoDistanceData<label>
+                    (
+                        0,              // distance
+                        regionI         // passive data
+                    )
+                );
             }
             nBlockedFaces++;
             regionI++;
@@ -68,7 +75,11 @@ Foam::regionSplit2D::regionSplit2D
         else
         {
             // Block all non-seeded faces from the walk
-            allFaceInfo[faceI] = -2;
+            allFaceInfo[faceI] = edgeTopoDistanceData<label>
+            (
+                0,              // distance
+                -2         // passive data
+            );
         }
     }
 
@@ -81,7 +92,7 @@ Foam::regionSplit2D::regionSplit2D
     PatchEdgeFaceWave
     <
         indirectPrimitivePatch,
-        patchEdgeFaceRegion
+        edgeTopoDistanceData<label>
     >
     (
         mesh,
@@ -100,7 +111,7 @@ Foam::regionSplit2D::regionSplit2D
     label compactRegionI = 0;
     forAll(allFaceInfo, faceI)
     {
-        label regionI = allFaceInfo[faceI].region();
+        label regionI = allFaceInfo[faceI].data();
         if
         (
             globalFaces.isLocal(regionI)
@@ -129,7 +140,7 @@ Foam::regionSplit2D::regionSplit2D
     // Set the region index per face
     forAll(allFaceInfo, faceI)
     {
-        label regionI = allFaceInfo[faceI].region();
+        label regionI = allFaceInfo[faceI].data();
         if (regionI >= 0)
         {
             this->operator[](faceI) = regionToCompactAddr[regionI] + offset;
diff --git a/src/meshTools/regionSplit2D/regionSplit2D.H b/src/meshTools/regionSplit2D/regionSplit2D.H
index 6b7663fea20194d655cdd5dd28fe90317c55b8d2..4724e396dd90265d0b9410a9136eacec16180aeb 100644
--- a/src/meshTools/regionSplit2D/regionSplit2D.H
+++ b/src/meshTools/regionSplit2D/regionSplit2D.H
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2015 OpenCFD Ltd.
+    Copyright (C) 2015-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -42,7 +42,6 @@ SourceFiles
 #include "boolList.H"
 #include "labelList.H"
 #include "indirectPrimitivePatch.H"
-#include "patchEdgeFaceRegion.H"
 #include "globalIndex.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/meshTools/sets/faceSources/regionToFace/regionToFace.C b/src/meshTools/sets/faceSources/regionToFace/regionToFace.C
index 42f96fcd207f0d9490d9c282d56d50b8bd34eac0..f4e84e77b261b02120f16567c39913a42ec5dd47 100644
--- a/src/meshTools/sets/faceSources/regionToFace/regionToFace.C
+++ b/src/meshTools/sets/faceSources/regionToFace/regionToFace.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2012-2017 OpenFOAM Foundation
-    Copyright (C) 2018 OpenCFD Ltd.
+    Copyright (C) 2018-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -34,7 +34,7 @@ License
 #include "PatchTools.H"
 #include "addToRunTimeSelectionTable.H"
 #include "PatchEdgeFaceWave.H"
-#include "patchEdgeFaceRegion.H"
+#include "edgeTopoDistanceData.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -83,11 +83,11 @@ void Foam::regionToFace::markZone
 ) const
 {
     // Data on all edges and faces
-    List<patchEdgeFaceRegion> allEdgeInfo(patch.nEdges());
-    List<patchEdgeFaceRegion> allFaceInfo(patch.size());
+    List<edgeTopoDistanceData<label>> allEdgeInfo(patch.nEdges());
+    List<edgeTopoDistanceData<label>> allFaceInfo(patch.size());
 
     DynamicList<label> changedEdges;
-    DynamicList<patchEdgeFaceRegion> changedInfo;
+    DynamicList<edgeTopoDistanceData<label>> changedInfo;
 
     if (Pstream::myProcNo() == proci)
     {
@@ -95,7 +95,14 @@ void Foam::regionToFace::markZone
         for (const label edgei : fEdges)
         {
             changedEdges.append(edgei);
-            changedInfo.append(zoneI);
+            changedInfo.append
+            (
+                edgeTopoDistanceData<label>
+                (
+                    0,          // distance
+                    zoneI
+                )
+            );
         }
     }
 
@@ -103,7 +110,7 @@ void Foam::regionToFace::markZone
     PatchEdgeFaceWave
     <
         indirectPrimitivePatch,
-        patchEdgeFaceRegion
+        edgeTopoDistanceData<label>
     > calc
     (
         mesh_,
@@ -117,7 +124,7 @@ void Foam::regionToFace::markZone
 
     forAll(allFaceInfo, facei)
     {
-        if (allFaceInfo[facei].region() == zoneI)
+        if (allFaceInfo[facei].data() == zoneI)
         {
             faceZone[facei] = zoneI;
         }
diff --git a/src/parallel/decompose/decompositionMethods/structuredDecomp/structuredDecomp.C b/src/parallel/decompose/decompositionMethods/structuredDecomp/structuredDecomp.C
index 6619a09c1bf276dafd1e56c3ca7b617ecc4e5a0d..b49096ae09d80a27d131bd037ce8cee80dc40788 100644
--- a/src/parallel/decompose/decompositionMethods/structuredDecomp/structuredDecomp.C
+++ b/src/parallel/decompose/decompositionMethods/structuredDecomp/structuredDecomp.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2018 OpenCFD Ltd.
+    Copyright (C) 2018-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -113,12 +113,12 @@ Foam::labelList Foam::structuredDecomp::decompose
     }
 
     // Field on cells and faces.
-    List<topoDistanceData> cellData(mesh.nCells());
-    List<topoDistanceData> faceData(mesh.nFaces());
+    List<topoDistanceData<label>> cellData(mesh.nCells());
+    List<topoDistanceData<label>> faceData(mesh.nFaces());
 
     // Start of changes
     labelList patchFaces(nFaces);
-    List<topoDistanceData> patchData(nFaces);
+    List<topoDistanceData<label>> patchData(nFaces);
     nFaces = 0;
     for (const label patchi : patchIDs)
     {
@@ -127,13 +127,13 @@ Foam::labelList Foam::structuredDecomp::decompose
         forAll(fc, i)
         {
             patchFaces[nFaces] = pp.start()+i;
-            patchData[nFaces] = topoDistanceData(finalDecomp[fc[i]], 0);
+            patchData[nFaces] = topoDistanceData<label>(0, finalDecomp[fc[i]]);
             nFaces++;
         }
     }
 
     // Propagate information inwards
-    FaceCellWave<topoDistanceData> deltaCalc
+    FaceCellWave<topoDistanceData<label>> deltaCalc
     (
         mesh,
         patchFaces,
diff --git a/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.C b/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.C
index cbc1b1b93e0892a5a242459d270271fd8050f65d..dfa9c63d2b6fa66a0a5911d2b1b3376c3ef819a2 100644
--- a/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.C
+++ b/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2012-2017 OpenFOAM Foundation
-    Copyright (C) 2018 OpenCFD Ltd.
+    Copyright (C) 2018-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -72,8 +72,8 @@ bool Foam::structuredRenumber::layerLess::operator()
     const label b
 )
 {
-    const topoDistanceData& ta = distance_[a];
-    const topoDistanceData& tb = distance_[b];
+    const topoDistanceData<label>& ta = distance_[a];
+    const topoDistanceData<label>& tb = distance_[b];
 
     int dummy;
 
@@ -209,7 +209,7 @@ Foam::labelList Foam::structuredRenumber::renumber
 
     // Walk sub-ordering (=column index) out.
     labelList patchFaces(nFaces);
-    List<topoDistanceData> patchData(nFaces);
+    List<topoDistanceData<label>> patchData(nFaces);
     nFaces = 0;
     for (const label patchi : patchIDs)
     {
@@ -218,21 +218,21 @@ Foam::labelList Foam::structuredRenumber::renumber
         forAll(fc, i)
         {
             patchFaces[nFaces] = pp.start()+i;
-            patchData[nFaces] = topoDistanceData
+            patchData[nFaces] = topoDistanceData<label>
             (
-                orderedToOld[fc[i]],// passive data: global column
-                0                   // distance: layer
+                0,                  // distance: layer
+                orderedToOld[fc[i]] // passive data: global column
             );
             nFaces++;
         }
     }
 
     // Field on cells and faces.
-    List<topoDistanceData> cellData(mesh.nCells());
-    List<topoDistanceData> faceData(mesh.nFaces());
+    List<topoDistanceData<label>> cellData(mesh.nCells());
+    List<topoDistanceData<label>> faceData(mesh.nFaces());
 
     // Propagate information inwards
-    OppositeFaceCellWave<topoDistanceData> deltaCalc
+    OppositeFaceCellWave<topoDistanceData<label>> deltaCalc
     (
         mesh,
         patchFaces,
diff --git a/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.H b/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.H
index f7a16421600cd16f8773bf492150856ae53e8d00..ea8e22a8edbe8d4aa9cc8003787d7bfa168f5607 100644
--- a/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.H
+++ b/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2012-2016 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -43,11 +44,12 @@ SourceFiles
 #define structuredRenumber_H
 
 #include "renumberMethod.H"
-#include "topoDistanceData.H"
 
 namespace Foam
 {
 
+template<class Type> class topoDistanceData;
+
 /*---------------------------------------------------------------------------*\
                    Class structuredRenumber Declaration
 \*---------------------------------------------------------------------------*/
@@ -66,7 +68,7 @@ public:
         {
             const bool depthFirst_;
             const labelList& order_;
-            const List<topoDistanceData>& distance_;
+            const List<topoDistanceData<label>>& distance_;
 
         public:
 
@@ -74,7 +76,7 @@ public:
             (
                 const bool depthFirst,
                 const labelList& order,
-                const List<topoDistanceData>& distance
+                const List<topoDistanceData<label>>& distance
             )
             :
                 depthFirst_(depthFirst),
diff --git a/src/sampling/sampledSet/shortestPath/shortestPathSet.C b/src/sampling/sampledSet/shortestPath/shortestPathSet.C
index 69c97ee7185b9acaf68d4c8d0660522255a44620..ac0fd414ae6d376e5d91aa5b6971d968eb122710 100644
--- a/src/sampling/sampledSet/shortestPath/shortestPathSet.C
+++ b/src/sampling/sampledSet/shortestPath/shortestPathSet.C
@@ -54,7 +54,7 @@ Foam::label Foam::shortestPathSet::findMinFace
 (
     const polyMesh& mesh,
     const label cellI,
-    const List<topoDistanceData>& allFaceInfo,
+    const List<topoDistanceData<label>>& allFaceInfo,
     const bitSet& isLeakPoint,
     const bool distanceMode,
     const point& origin
@@ -70,7 +70,7 @@ Foam::label Foam::shortestPathSet::findMinFace
     forAll(cFaces2, i)
     {
         label faceI = cFaces2[i];
-        const topoDistanceData& info = allFaceInfo[faceI];
+        const topoDistanceData<label>& info = allFaceInfo[faceI];
         if (info.distance() < minDist)
         {
             minDist = info.distance();
@@ -146,14 +146,14 @@ void Foam::shortestPathSet::calculateDistance
     const polyMesh& mesh,
     const label cellI,
 
-    List<topoDistanceData>& allFaceInfo,
-    List<topoDistanceData>& allCellInfo
+    List<topoDistanceData<label>>& allFaceInfo,
+    List<topoDistanceData<label>>& allCellInfo
 ) const
 {
     int dummyTrackData = 0;
 
     // Seed faces on cell1
-    DynamicList<topoDistanceData> faceDist;
+    DynamicList<topoDistanceData<label>> faceDist;
     DynamicList<label> cFaces1;
 
     if (cellI != -1)
@@ -167,7 +167,7 @@ void Foam::shortestPathSet::calculateDistance
             if (!allFaceInfo[facei].valid(dummyTrackData))
             {
                 cFaces1.append(facei);
-                faceDist.append(topoDistanceData(123, 0));
+                faceDist.append(topoDistanceData<label>(0, 123));
             }
         }
     }
@@ -177,7 +177,7 @@ void Foam::shortestPathSet::calculateDistance
     // Walk through face-cell wave till all cells are reached
     FaceCellWave
     <
-        topoDistanceData
+        topoDistanceData<label>
     > wallDistCalc
     (
         mesh,
@@ -215,7 +215,7 @@ void Foam::shortestPathSet::calculateDistance
         forAll(fld.boundaryField(), patchi)
         {
             const polyPatch& pp = mesh.boundaryMesh()[patchi];
-            SubList<topoDistanceData> p(pp.patchSlice(allFaceInfo));
+            SubList<topoDistanceData<label>> p(pp.patchSlice(allFaceInfo));
             scalarField pfld(fld.boundaryField()[patchi].size());
             forAll(pfld, i)
             {
@@ -398,18 +398,18 @@ bool Foam::shortestPathSet::genSingleLeakPath
     bitSet& isLeakPoint,
 
     // Work storage
-    List<topoDistanceData>& allFaceInfo,
-    List<topoDistanceData>& allCellInfo
+    List<topoDistanceData<label>>& allFaceInfo,
+    List<topoDistanceData<label>>& allCellInfo
 ) const
 {
     const polyBoundaryMesh& pbm = mesh.boundaryMesh();
-    const topoDistanceData maxData(labelMax, labelMax);
+    const topoDistanceData<label> maxData(labelMax, labelMax);
 
 
     allFaceInfo.setSize(mesh.nFaces());
-    allFaceInfo = topoDistanceData();
+    allFaceInfo = topoDistanceData<label>();
     allCellInfo.setSize(mesh.nCells());
-    allCellInfo = topoDistanceData();
+    allCellInfo = topoDistanceData<label>();
 
     // Mark blocked faces with high distance
     forAll(isBlockedFace, facei)
@@ -597,8 +597,8 @@ bool Foam::shortestPathSet::genSingleLeakPath
                     origin
                 );
 
-                const topoDistanceData& cInfo = allCellInfo[frontCellI];
-                const topoDistanceData& fInfo = allFaceInfo[frontFaceI];
+                const topoDistanceData<label>& cInfo = allCellInfo[frontCellI];
+                const topoDistanceData<label>& fInfo = allFaceInfo[frontFaceI];
 
                 if (fInfo.distance() <= cInfo.distance())
                 {
@@ -715,7 +715,7 @@ bool Foam::shortestPathSet::genSingleLeakPath
              && allCellInfo[frontCellI].distance() < minCellDistance
             )
             {
-                const topoDistanceData& cInfo = allCellInfo[frontCellI];
+                const topoDistanceData<label>& cInfo = allCellInfo[frontCellI];
 
                 samplingPts.append(mesh.cellCentres()[frontCellI]);
                 samplingCells.append(frontCellI);
@@ -935,7 +935,7 @@ void Foam::shortestPathSet::genSamples
     // - isLeakPoint : is point on a leakFace
 
 
-    const topoDistanceData maxData(labelMax, labelMax);
+    const topoDistanceData<label> maxData(labelMax, labelMax);
 
     // Get the target point
     const label outsideCelli = mesh.findCell(outsidePoint);
@@ -943,8 +943,8 @@ void Foam::shortestPathSet::genSamples
     // Maintain overall track length. Used to make curveDist continuous.
     scalar trackLength = 0;
 
-    List<topoDistanceData> allFaceInfo(mesh.nFaces());
-    List<topoDistanceData> allCellInfo(mesh.nCells());
+    List<topoDistanceData<label>> allFaceInfo(mesh.nFaces());
+    List<topoDistanceData<label>> allCellInfo(mesh.nCells());
 
 
     // Boundary face + additional temporary blocks (to force leakpath to
diff --git a/src/sampling/sampledSet/shortestPath/shortestPathSet.H b/src/sampling/sampledSet/shortestPath/shortestPathSet.H
index 4b5398a237ef23e89e03672ed9e2c6803a820990..b9679f75f4da446ca7f12d0f6dd7737f2a9de8b8 100644
--- a/src/sampling/sampledSet/shortestPath/shortestPathSet.H
+++ b/src/sampling/sampledSet/shortestPath/shortestPathSet.H
@@ -82,7 +82,7 @@ SourceFiles
 namespace Foam
 {
 
-class topoDistanceData;
+template<class Type> class topoDistanceData;
 
 /*---------------------------------------------------------------------------*\
                        Class shortestPathSet Declaration
@@ -111,7 +111,7 @@ class shortestPathSet
         (
             const polyMesh& mesh,
             const label cellI,
-            const List<topoDistanceData>& allFaceInfo,
+            const List<topoDistanceData<label>>& allFaceInfo,
             const bitSet& isLeakPoint,
             const bool minDistance,
             const point& origin
@@ -135,8 +135,8 @@ class shortestPathSet
             const polyMesh& mesh,
             const label cellI,
 
-            List<topoDistanceData>& allFaceInfo,
-            List<topoDistanceData>& allCellInfo
+            List<topoDistanceData<label>>& allFaceInfo,
+            List<topoDistanceData<label>>& allCellInfo
         ) const;
 
         //- Checks if face uses a leak point
@@ -192,8 +192,8 @@ class shortestPathSet
             bitSet& isLeakPoint,
 
             // Work storage
-            List<topoDistanceData>& allFaceInfo,
-            List<topoDistanceData>& allCellInfo
+            List<topoDistanceData<label>>& allFaceInfo,
+            List<topoDistanceData<label>>& allCellInfo
         ) const;
 
         //- Calculate path between insideCelli (-1 if not on current processor)