diff --git a/src/OpenFOAM/meshes/meshTools/mergePoints.C b/src/OpenFOAM/meshes/meshTools/mergePoints.C
index 3fae7980550af9a6a40fa7338a72943eacb8c524..2b99235b72b3fabf38346b39b5937317c11c2567 100644
--- a/src/OpenFOAM/meshes/meshTools/mergePoints.C
+++ b/src/OpenFOAM/meshes/meshTools/mergePoints.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -29,16 +29,18 @@ License
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-template<class Type>
+template<class PointList>
 Foam::label Foam::mergePoints
 (
-    const UList<Type>& points,
+    const PointList& points,
     const scalar mergeTol,
     const bool verbose,
     labelList& pointMap,
-    const Type& origin
+    typename PointList::const_reference origin
 )
 {
+    typedef typename PointList::value_type point_type;
+
     // Create a old to new point mapping array
     pointMap.setSize(points.size());
     pointMap = -1;
@@ -49,10 +51,10 @@ Foam::label Foam::mergePoints
     }
 
     // Explicitly convert to Field to support various list types
-    tmp<Field<Type>> tPoints(new Field<Type>(points));
+    tmp<Field<point_type>> tPoints(new Field<point_type>(points));
 
-    Type compareOrigin = origin;
-    if (origin == Type::max)
+    point_type compareOrigin = origin;
+    if (origin == point_type::max)
     {
         compareOrigin = sum(tPoints())/points.size();
     }
@@ -69,7 +71,7 @@ Foam::label Foam::mergePoints
     const scalar mergeTolSqr = Foam::sqr(scalar(mergeTol));
 
     // Sort points by magSqr
-    const Field<Type> d(tPoints - compareOrigin);
+    const Field<point_type> d(tPoints - compareOrigin);
 
     List<scalar> magSqrD(d.size());
     forAll(d, pointi)
@@ -77,15 +79,16 @@ Foam::label Foam::mergePoints
         magSqrD[pointi] = magSqr(d[pointi]);
     }
     labelList order;
-    sortedOrder(magSqrD, order);
+    Foam::sortedOrder(magSqrD, order);
 
 
     Field<scalar> sortedTol(points.size());
     forAll(order, sortI)
     {
-        label pointi = order[sortI];
+        const label pointi = order[sortI];
 
         // Convert to scalar precision
+        // NOTE: not yet using point_type template parameter
         const point pt
         (
             scalar(d[pointi].x()),
@@ -104,9 +107,11 @@ Foam::label Foam::mergePoints
     for (label sortI = 1; sortI < order.size(); sortI++)
     {
         // Get original point index
-        label pointi = order[sortI];
+        const label pointi = order[sortI];
         const scalar mag2 = magSqrD[order[sortI]];
+
         // Convert to scalar precision
+        // NOTE: not yet using point_type template parameter
         const point pt
         (
             scalar(points[pointi].x()),
@@ -126,7 +131,10 @@ Foam::label Foam::mergePoints
             prevSortI--
         )
         {
-            label prevPointi = order[prevSortI];
+            const label prevPointi = order[prevSortI];
+
+            // Convert to scalar precision
+            // NOTE: not yet using point_type template parameter
             const point prevPt
             (
                 scalar(points[prevPointi].x()),
@@ -169,18 +177,18 @@ Foam::label Foam::mergePoints
 }
 
 
-template<class Type>
+template<class PointList>
 bool Foam::mergePoints
 (
-    const UList<Type>& points,
+    const PointList& points,
     const scalar mergeTol,
     const bool verbose,
     labelList& pointMap,
-    List<Type>& newPoints,
-    const Type& origin
+    List<typename PointList::value_type>& newPoints,
+    typename PointList::const_reference origin
 )
 {
-    label nUnique = mergePoints
+    const label nUnique = mergePoints
     (
         points,
         mergeTol,
diff --git a/src/OpenFOAM/meshes/meshTools/mergePoints.H b/src/OpenFOAM/meshes/meshTools/mergePoints.H
index 37d41f3e7b3226aa3691095f5342d5acdecf627e..791075d04a4fbd197bc55c609b240d8414b5c724 100644
--- a/src/OpenFOAM/meshes/meshTools/mergePoints.H
+++ b/src/OpenFOAM/meshes/meshTools/mergePoints.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -46,27 +46,28 @@ namespace Foam
 
 //- Sorts and merges points. All points closer than/equal mergeTol get merged.
 //  Returns the number of unique points and a map from old to new.
-template<class Type>
+template<class PointList>
 label mergePoints
 (
-    const UList<Type>& points,
+    const PointList& points,
     const scalar mergeTol,
     const bool verbose,
     labelList& pointMap,
-    const Type& origin = Type::zero
+    typename PointList::const_reference origin = PointList::value_type::zero
 );
 
+
 //- Sorts and merges points. Determines new points. Returns true if anything
 //  merged (though newPoints still sorted even if not merged).
-template<class Type>
+template<class PointList>
 bool mergePoints
 (
-    const UList<Type>& points,
+    const PointList& points,
     const scalar mergeTol,
     const bool verbose,
     labelList& pointMap,
-    List<Type>& newPoints,
-    const Type& origin = Type::zero
+    List<typename PointList::value_type>& newPoints,
+    typename PointList::const_reference origin = PointList::value_type::zero
 );
 
 } // End namespace Foam
diff --git a/src/conversion/ccm/Make/files b/src/conversion/ccm/Make/files
index 89ec20a1db35f1404009aea7b0e367eff3d00a9a..34495168b9b8e736be7a7a24070ddea1f780fd28 100644
--- a/src/conversion/ccm/Make/files
+++ b/src/conversion/ccm/Make/files
@@ -11,6 +11,4 @@ writer/ccmWriter.C
 writer/ccmWriterMesh.C
 writer/ccmWriterSolution.C
 
-/* misc/mergePoints1.C */
-
 LIB = $(FOAM_LIBBIN)/libccm
diff --git a/src/conversion/ccm/misc/mergePoints1.C b/src/conversion/ccm/misc/mergePoints1.C
deleted file mode 100644
index 487ffffdb8803dc2d05470fe9b61c79675cb449d..0000000000000000000000000000000000000000
--- a/src/conversion/ccm/misc/mergePoints1.C
+++ /dev/null
@@ -1,176 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2016 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 "ListOps.H"
-#include "point.H"
-#include "Field.H"
-
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-
-// template<class Type, template<class> class ListType=UList>
-template<class Type>
-Foam::label Foam::mergePoints
-(
-    const bool dummy,
-    const UIndirectList<Type>& points,
-    const scalar mergeTol,
-    const bool verbose,
-    labelList& pointMap,
-    const Type& origin
-)
-{
-    // Create a old to new point mapping array
-    pointMap.setSize(points.size());
-    pointMap = -1;
-
-    if (points.empty())
-    {
-        return 0;
-    }
-
-    // Explicitly convert to Field to support various list types
-    tmp<Field<Type>> tPoints(new Field<Type>(points));
-
-    Type compareOrigin = origin;
-    if (origin == Type::max)
-    {
-        compareOrigin = sum(tPoints())/points.size();
-    }
-
-    // We're comparing distance squared to origin first.
-    // Say if starting from two close points:
-    //     x, y, z
-    //     x+mergeTol, y+mergeTol, z+mergeTol
-    // Then the magSqr of both will be
-    //     x^2+y^2+z^2
-    //     x^2+y^2+z^2 + 2*mergeTol*(x+z+y) + mergeTol^2*...
-    // so the difference will be 2*mergeTol*(x+y+z)
-
-    const scalar mergeTolSqr = Foam::sqr(scalar(mergeTol));
-
-    // Sort points by magSqr
-    const Field<Type> d(tPoints - compareOrigin);
-
-    List<scalar> magSqrD(d.size());
-    forAll(d, pointi)
-    {
-        magSqrD[pointi] = magSqr(d[pointi]);
-    }
-    labelList order;
-    sortedOrder(magSqrD, order);
-
-
-    Field<scalar> sortedTol(points.size());
-    forAll(order, sortI)
-    {
-        label pointi = order[sortI];
-
-        // Convert to scalar precision
-        const point pt
-        (
-            scalar(d[pointi].x()),
-            scalar(d[pointi].y()),
-            scalar(d[pointi].z())
-        );
-        sortedTol[sortI] = 2*mergeTol*(mag(pt.x())+mag(pt.y())+mag(pt.z()));
-    }
-
-    label newPointi = 0;
-
-    // Handle 0th point separately (is always unique)
-    label pointi = order[0];
-    pointMap[pointi] = newPointi++;
-
-
-    for (label sortI = 1; sortI < order.size(); sortI++)
-    {
-        // Get original point index
-        label pointi = order[sortI];
-        const scalar mag2 = magSqrD[order[sortI]];
-        // Convert to scalar precision
-        const point pt
-        (
-            scalar(points[pointi].x()),
-            scalar(points[pointi].y()),
-            scalar(points[pointi].z())
-        );
-
-
-        // Compare to previous points to find equal one.
-        label equalPointi = -1;
-
-        for
-        (
-            label prevSortI = sortI - 1;
-            prevSortI >= 0
-         && (mag(magSqrD[order[prevSortI]] - mag2) <= sortedTol[sortI]);
-            prevSortI--
-        )
-        {
-            label prevPointi = order[prevSortI];
-            const point prevPt
-            (
-                scalar(points[prevPointi].x()),
-                scalar(points[prevPointi].y()),
-                scalar(points[prevPointi].z())
-            );
-
-            if (magSqr(pt - prevPt) <= mergeTolSqr)
-            {
-                // Found match.
-                equalPointi = prevPointi;
-
-                break;
-            }
-        }
-
-
-        if (equalPointi != -1)
-        {
-            // Same coordinate as equalPointi. Map to same new point.
-            pointMap[pointi] = pointMap[equalPointi];
-
-            if (verbose)
-            {
-                Pout<< "Foam::mergePoints : Merging points "
-                    << pointi << " and " << equalPointi
-                    << " with coordinates:" << points[pointi]
-                    << " and " << points[equalPointi]
-                    << endl;
-            }
-        }
-        else
-        {
-            // Differs. Store new point.
-            pointMap[pointi] = newPointi++;
-        }
-    }
-
-    return newPointi;
-}
-
-
-// ************************************************************************* //
diff --git a/src/conversion/ccm/misc/mergePoints1.H b/src/conversion/ccm/misc/mergePoints1.H
deleted file mode 100644
index 85fc56210a289be0d488e89985d0edaab10e13dc..0000000000000000000000000000000000000000
--- a/src/conversion/ccm/misc/mergePoints1.H
+++ /dev/null
@@ -1,73 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2016 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/>.
-
-Description
-    Merge points. See below.
-
-SourceFiles
-    mergePoints.C
-
-\*---------------------------------------------------------------------------*/
-
-#ifndef mergePoints1_H
-#define mergePoints1_H
-
-#include "scalar.H"
-#include "labelList.H"
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-namespace Foam
-{
-
-/*---------------------------------------------------------------------------*\
-                           Function mergePoints Declaration
-\*---------------------------------------------------------------------------*/
-
-//- Sorts and merges points. All points closer than/equal mergeTol get merged.
-//  Returns the number of unique points and a map from old to new.
-//template<class Type, template<class> class ListType=UList>
-template<class Type>
-label mergePoints
-(
-    const bool dummy,
-    const UIndirectList<Type>& points,
-    const scalar mergeTol,
-    const bool verbose,
-    labelList& pointMap,
-    const Type& origin = Type::zero
-);
-
-} // End namespace Foam
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#ifdef NoRepository
-    #include "mergePoints1.C"
-#endif
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#endif
-
-// ************************************************************************* //
diff --git a/src/conversion/ccm/reader/ccmReaderMesh.C b/src/conversion/ccm/reader/ccmReaderMesh.C
index 346e9b557e10a13d268ff39dba433dbd70ba50bc..c1f5077bdf13c947961b1afc3d54ce6e60023397 100644
--- a/src/conversion/ccm/reader/ccmReaderMesh.C
+++ b/src/conversion/ccm/reader/ccmReaderMesh.C
@@ -37,7 +37,7 @@ License
 #include "PackedList.H"
 #include "uindirectPrimitivePatch.H"
 #include "SortableList.H"
-#include "mergePoints1.H"
+#include "mergePoints.H"
 #include "ListOps.H"
 
 #include "ccmInternal.H" // include last to avoid any strange interactions
@@ -2002,9 +2002,8 @@ void Foam::ccm::reader::mergeInplaceInterfaces()
         Info<< "    patch "  << patch0 << "," << patch1 << ": ("
             << nPatch0Faces << " and " << nPatch1Faces << " faces) " << flush;
 
-        label nMerged = mergePoints
+        const label nMerged = mergePoints
         (
-            true,
             pointsToMerge,
             option().mergeTol(),
             false,
@@ -2017,9 +2016,9 @@ void Foam::ccm::reader::mergeInplaceInterfaces()
         if (nMerged)
         {
             // Transcribe local to global addressing
-            forAll(mergedPointMap, lookupI)
+            forAll(mergedPointMap, i)
             {
-                oldToNew[addr[lookupI]] = addr[mergedPointMap[lookupI]];
+                oldToNew[addr[i]] = addr[mergedPointMap[i]];
             }
 
             interfacesToMerge.append(interI);