diff --git a/applications/utilities/mesh/manipulation/polyDualMesh/meshDualiser.C b/applications/utilities/mesh/manipulation/polyDualMesh/meshDualiser.C
index ea88cf6198bfa5de24ce1f6b1a419591a29b23f9..9ef58b47e40934bcf8a0a2cc5c14953b333769f4 100644
--- a/applications/utilities/mesh/manipulation/polyDualMesh/meshDualiser.C
+++ b/applications/utilities/mesh/manipulation/polyDualMesh/meshDualiser.C
@@ -49,19 +49,17 @@ void Foam::meshDualiser::checkPolyTopoChange(const polyTopoChange& meshMod)
     }
 
     labelList oldToNew;
-    pointField newPoints;
-    bool hasMerged = mergePoints
+    label nUnique = mergePoints
     (
         points,
         1E-6,
         false,
-        oldToNew,
-        newPoints
+        oldToNew
     );
 
-    if (hasMerged)
+    if (nUnique < points.size())
     {
-        labelListList newToOld(invertOneToMany(newPoints.size(), oldToNew));
+        labelListList newToOld(invertOneToMany(nUnique, oldToNew));
 
         forAll(newToOld, newI)
         {
@@ -225,17 +223,15 @@ Foam::label Foam::meshDualiser::addInternalFace
         pointField facePoints(meshMod.points(), newFace);
 
         labelList oldToNew;
-        pointField newPoints;
-        bool hasMerged = mergePoints
+        label nUnique = mergePoints
         (
             facePoints,
             1E-6,
             false,
-            oldToNew,
-            newPoints
+            oldToNew
         );
 
-        if (hasMerged)
+        if (nUnique < facePoints.size())
         {
             FatalErrorIn("addInternalFace(..)")
                 << "verts:" << verts << " newFace:" << newFace
diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files
index da569b2e2113f39cd7b1c4401847cc2938f3e715..cbd98885739d0a9f300d2630dc591c273cf59ffd 100644
--- a/src/OpenFOAM/Make/files
+++ b/src/OpenFOAM/Make/files
@@ -45,6 +45,7 @@ primitives/Tensor/lists/symmTensorList.C
 primitives/Tensor/lists/tensorList.C
 
 primitives/Vector/complexVector/complexVector.C
+primitives/Vector/floatVector/floatVector.C
 primitives/Vector/labelVector/labelVector.C
 primitives/Vector/vector/vector.C
 primitives/Vector/lists/vectorList.C
@@ -501,7 +502,6 @@ meshes/treeBoundBox/treeBoundBox.C
 
 meshTools = meshes/meshTools
 $(meshTools)/matchPoints.C
-$(meshTools)/mergePoints.C
 
 fields/UniformDimensionedFields/uniformDimensionedFields.C
 fields/cloud/cloud.C
diff --git a/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C b/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C
index 10ac331363c8f4217b4b382b075ac2f722b846e7..3ce3d4a51bda1f701dbd9270588e6cdaadcd8095 100644
--- a/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C
+++ b/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C
@@ -36,7 +36,6 @@ License
 #include "removeCells.H"
 #include "polyModifyFace.H"
 #include "polyRemovePoint.H"
-#include "mergePoints.H"
 #include "mapDistributePolyMesh.H"
 #include "surfaceFields.H"
 #include "syncTools.H"
diff --git a/src/dynamicMesh/polyMeshAdder/polyMeshAdder.C b/src/dynamicMesh/polyMeshAdder/polyMeshAdder.C
index c2cde770f2e5807024066cf86c6b75af1f9b98f2..348f61db2bf8f7d09514e0d70fe3f5cad5ac42cb 100644
--- a/src/dynamicMesh/polyMeshAdder/polyMeshAdder.C
+++ b/src/dynamicMesh/polyMeshAdder/polyMeshAdder.C
@@ -1859,24 +1859,22 @@ Foam::Map<Foam::label> Foam::polyMeshAdder::findSharedPoints
             );
 
             labelList toMergedPoints;
-            pointField mergedPoints;
-            bool hasMerged = Foam::mergePoints
+            label nUnique = Foam::mergePoints
             (
                 connectedPoints,
                 mergeDist,
                 false,
-                toMergedPoints,
-                mergedPoints
+                toMergedPoints
             );
 
-            if (hasMerged)
+            if (nUnique < connectedPoints.size())
             {
                 // Invert toMergedPoints
                 const labelListList mergeSets
                 (
                     invertOneToMany
                     (
-                        mergedPoints.size(),
+                        nUnique,
                         toMergedPoints
                     )
                 );
@@ -1919,8 +1917,7 @@ Foam::Map<Foam::label> Foam::polyMeshAdder::findSharedPoints
 
     //- Old: geometric merging. Causes problems for two close shared points.
     //labelList sharedToMerged;
-    //pointField mergedPoints;
-    //bool hasMerged = Foam::mergePoints
+    //label nUnique = Foam::mergePoints
     //(
     //    pointField
     //    (
@@ -1929,8 +1926,7 @@ Foam::Map<Foam::label> Foam::polyMeshAdder::findSharedPoints
     //    ),
     //    mergeDist,
     //    false,
-    //    sharedToMerged,
-    //    mergedPoints
+    //    sharedToMerged
     //);
     //
     //// Find out which sets of points get merged and create a map from
@@ -1938,7 +1934,7 @@ Foam::Map<Foam::label> Foam::polyMeshAdder::findSharedPoints
     //
     //Map<label> pointToMaster(10*sharedToMerged.size());
     //
-    //if (hasMerged)
+    //if (nUnique < sharedPointLabels.size())
     //{
     //    labelListList mergeSets
     //    (
diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C
index dcb2c6cca5dc9d4af4b7aa0786b5aa7c6c650698..ea29efbb8454bcc368960ac1887ec7648eb9937b 100644
--- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C
+++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C
@@ -63,27 +63,26 @@ Foam::label Foam::autoSnapDriver::getCollocatedPoints
 )
 {
     labelList pointMap;
-    pointField newPoints;
-    bool hasMerged = mergePoints
+    label nUnique = mergePoints
     (
         points,                         // points
         tol,                            // mergeTol
         false,                          // verbose
-        pointMap,
-        newPoints
+        pointMap
     );
+    bool hasMerged = (nUnique < points.size());
 
     if (!returnReduce(hasMerged, orOp<bool>()))
     {
         return 0;
     }
 
-    // Determine which newPoints are referenced more than once
+    // Determine which merged points are referenced more than once
     label nCollocated = 0;
 
     // Per old point the newPoint. Or -1 (not set yet) or -2 (already seen
     // twice)
-    labelList firstOldPoint(newPoints.size(), -1);
+    labelList firstOldPoint(nUnique, -1);
     forAll(pointMap, oldPointI)
     {
         label newPointI = pointMap[oldPointI];
diff --git a/src/meshTools/triSurface/triSurfaceTools/triSurfaceTools.C b/src/meshTools/triSurface/triSurfaceTools/triSurfaceTools.C
index 451d00c03d56060f2bfee18f77529cfad4e9580b..022d6fb8218149404dcc72e150693fc36de1de53 100644
--- a/src/meshTools/triSurface/triSurfaceTools/triSurfaceTools.C
+++ b/src/meshTools/triSurface/triSurfaceTools/triSurfaceTools.C
@@ -2096,7 +2096,8 @@ Foam::triSurface Foam::triSurfaceTools::mergePoints
         (
             newTriangles,
             surf.patches(),
-            newPoints
+            newPoints,
+            true                //reuse storage
         );
     }
     else