diff --git a/applications/utilities/surface/surfaceBooleanFeatures/CGAL3DKernel.H b/applications/utilities/surface/surfaceBooleanFeatures/CGAL3DKernel.H
index d3851dbd76e69bd505bf3a6c3e4ee3083bd7a51c..b3aa5dc32af3c0f57b9ec4b7474d791685a276d0 100644
--- a/applications/utilities/surface/surfaceBooleanFeatures/CGAL3DKernel.H
+++ b/applications/utilities/surface/surfaceBooleanFeatures/CGAL3DKernel.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -27,6 +28,7 @@ Typedefs
     CGAL3DKernel
 
 Description
+    A typedef for selecting inexact (faster) or exact (slower) 3D model.
 
 \*---------------------------------------------------------------------------*/
 
@@ -38,13 +40,13 @@ Description
 #ifdef CGAL_INEXACT
 
     // Fast kernel using a double as the storage type
-    #include "CGAL/Exact_predicates_inexact_constructions_kernel.h"
+    #include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
     typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
 
 #else
 
     // Very robust but expensive kernel
-    #include "CGAL/Exact_predicates_exact_constructions_kernel.h"
+    #include <CGAL/Exact_predicates_exact_constructions_kernel.h>
     typedef CGAL::Exact_predicates_exact_constructions_kernel K;
 
 #endif
diff --git a/applications/utilities/surface/surfaceBooleanFeatures/CGALIndexedPolyhedron.H b/applications/utilities/surface/surfaceBooleanFeatures/CGALIndexedPolyhedron.H
index 2cb79393d682af93638e232c6924bfe4d138f7ec..3ed79edb2541349de13466390b01546442a9651e 100644
--- a/applications/utilities/surface/surfaceBooleanFeatures/CGALIndexedPolyhedron.H
+++ b/applications/utilities/surface/surfaceBooleanFeatures/CGALIndexedPolyhedron.H
@@ -65,6 +65,7 @@ struct IndexedFace
     Foam::label index;
     Foam::label region;
 };
+
 struct My_items
 :
     public CGAL::Polyhedron_items_3
diff --git a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/Make/options b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/Make/options
index 8ed525de9f38027a32f699dbcd70f2a2ea743f83..144ee830b9b14b4004a826fd4bf0d392da51cdf2 100644
--- a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/Make/options
+++ b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/Make/options
@@ -20,4 +20,5 @@ EXE_INC = \
 LIB_LIBS = \
     -L$(CGAL_ARCH_PATH)/lib \
     -L$(CGAL_ARCH_PATH)/lib$(WM_COMPILER_LIB_ARCH) \
+    -lsurfMesh \
     -lmeshTools
diff --git a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.C b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.C
index 5ca1bab64014195d5fa91df950566f6a32430c27..771e8f808a172c935c0e1402f23dea6e37d8b901 100644
--- a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.C
+++ b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -27,14 +28,50 @@ License
 
 #include "PolyhedronReader.H"
 
+// * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * * //
+
+template<class HDS>
+void Foam::PolyhedronReader::Build_triangle<HDS>::operator()(HDS& hds)
+{
+    // Postcondition: hds is a valid polyhedral surface.
+    CGAL::Polyhedron_incremental_builder_3<HDS> B(hds, true);
+
+    B.begin_surface(s_.nPoints(), s_.size());
+
+    typedef typename HDS::Vertex Vertex;
+    typedef typename Vertex::Point Point;
+
+    for (const auto& pt : s_.points())
+    {
+        B.add_vertex(Point(pt.x(), pt.y(), pt.z()));
+    }
+
+    for (const auto& f : s_)
+    {
+        B.begin_facet();
+
+        for (const label verti : f)
+        {
+            B.add_vertex_to_facet(verti);
+        }
+
+        B.end_facet();
+    }
+
+    B.end_surface();
+}
+
+
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 Foam::PolyhedronReader::PolyhedronReader(const triSurface& s, Polyhedron& p)
 {
     Build_triangle<HalfedgeDS> triangle(s);
     p.delegate(triangle);
+
     // Populate index and region
     Foam::label nTris = 0;
+
     for
     (
         Facet_iterator fi = p.facets_begin();
@@ -42,8 +79,10 @@ Foam::PolyhedronReader::PolyhedronReader(const triSurface& s, Polyhedron& p)
         ++fi
     )
     {
-        fi->index = nTris++;
-        fi->region = s[fi->index].region();
+        fi->index = nTris;
+        fi->region = s[nTris].region();
+
+        ++nTris;
     }
 }
 
diff --git a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.H b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.H
index 2968fb34c6926b89eeb4b17fd1226c86e5f899ce..1c0a6b5ca2131cc361fc12dcefd21f5e441966cb 100644
--- a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.H
+++ b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.H
@@ -61,28 +61,21 @@ class PolyhedronReader
 
         public:
 
-            Build_triangle(const triSurface& s);
+            Build_triangle(const triSurface& s)
+            :
+                s_(s)
+            {}
 
             void operator()(HDS& hds);
         };
 
 
-    // Private Member Functions
-
-        //- No copy construct
-        PolyhedronReader(const PolyhedronReader&) = delete;
-
-        //- No copy assignment
-        void operator=(const PolyhedronReader&) = delete;
-
-
 public:
 
     // Constructors
 
         //- Populate polyhedron from surface
         PolyhedronReader(const triSurface& s, Polyhedron& p);
-
 };
 
 
@@ -92,12 +85,6 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-#ifdef NoRepository
-#   include "PolyhedronReaderTemplates.C"
-#endif
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
 #endif
 
 // ************************************************************************* //
diff --git a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReaderTemplates.C b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReaderTemplates.C
deleted file mode 100644
index ac5e90ed3cc19aced8ba2d1ef8c8c45a4838eee0..0000000000000000000000000000000000000000
--- a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReaderTemplates.C
+++ /dev/null
@@ -1,74 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | www.openfoam.com
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-    Copyright (C) 2015 OpenFOAM Foundation
--------------------------------------------------------------------------------
-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 "PolyhedronReader.H"
-
-// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
-
-template<class HDS>
-Foam::PolyhedronReader::Build_triangle<HDS>::Build_triangle
-(
-    const triSurface& s
-)
-:
-    s_(s)
-{}
-
-
-// * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * * //
-
-template<class HDS>
-void Foam::PolyhedronReader::Build_triangle<HDS>::operator()(HDS& hds)
-{
-    // Postcondition: hds is a valid polyhedral surface.
-    CGAL::Polyhedron_incremental_builder_3<HDS> B(hds, true);
-
-    B.begin_surface(s_.nPoints(), s_.size());
-
-    typedef typename HDS::Vertex Vertex;
-    typedef typename Vertex::Point Point;
-
-    const Foam::pointField& pts = s_.points();
-    forAll(pts, i)
-    {
-        const Foam::point& pt = pts[i];
-        B.add_vertex(Point(pt.x(), pt.y(), pt.z()));
-    }
-    forAll(s_, i)
-    {
-        const Foam::labelledTri& t = s_[i];
-        B.begin_facet();
-        B.add_vertex_to_facet(t[0]);
-        B.add_vertex_to_facet(t[1]);
-        B.add_vertex_to_facet(t[2]);
-        B.end_facet();
-    }
-    B.end_surface();
-}
-
-
-// ************************************************************************* //
diff --git a/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C b/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C
index 7c02bc9da57ea887b51fb0767a540bb4e41e9a3a..1ee28949de05c24c875bd226f454032d097b8d10 100644
--- a/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C
+++ b/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2016 OpenCFD Ltd.
+    Copyright (C) 2016-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -102,8 +102,10 @@ typedef CGAL::AABB_face_graph_triangle_primitive
 typedef CGAL::AABB_traits<K, Primitive> Traits;
 typedef CGAL::AABB_tree<Traits> Tree;
 
-typedef boost::optional<Tree::Intersection_and_primitive_id<Segment>::Type>
-Segment_intersection;
+typedef boost::optional
+<
+    Tree::Intersection_and_primitive_id<Segment>::Type
+> Segment_intersection;
 
 #endif // NO_CGAL
 
@@ -633,17 +635,14 @@ labelPair edgeIntersectionsCGAL
         segments.clear();
         tree.all_intersections(segment_query, std::back_inserter(segments));
 
-        for
-        (
-            std::vector<Segment_intersection>::const_iterator iter =
-                segments.begin(),
-            end = segments.end();
-            iter != end;
-            ++iter
-        )
+
+        for (const Segment_intersection& intersect : segments)
         {
             // Get intersection object
-            if (const Point* ptPtr = boost::get<Point>(&((*iter)->first)))
+            if
+            (
+                const Point* ptPtr = boost::get<Point>(&(intersect->first))
+            )
             {
                 point pt
                 (
@@ -652,7 +651,12 @@ labelPair edgeIntersectionsCGAL
                     CGAL::to_double(ptPtr->z())
                 );
 
-                Polyhedron::Face_handle f = (*iter)->second;
+                #if defined (CGAL_VERSION_NR) && (CGAL_VERSION_NR < 1041400000)
+                Polyhedron::Face_handle f = (intersect->second);
+                #else
+                // 4.14 and later
+                Polyhedron::Face_handle f = (intersect->second).first;
+                #endif
 
                 intersections[edgeI].append
                 (
@@ -665,18 +669,24 @@ labelPair edgeIntersectionsCGAL
                 );
                 // Intersection on edge interior
                 classifications[edgeI].append(-1);
-                nPoints++;
+                ++nPoints;
             }
             else if
             (
-                const Segment* sPtr = boost::get<Segment>(&((*iter)->first))
+                const Segment* sPtr = boost::get<Segment>(&(intersect->first))
             )
             {
+                #if defined (CGAL_VERSION_NR) && (CGAL_VERSION_NR < 1041400000)
+                Polyhedron::Face_handle f = (intersect->second);
+                #else
+                // 4.14 and later
+                Polyhedron::Face_handle f = (intersect->second).first;
+                #endif
+
                 //std::cout
                 //    << "intersection object is a segment:" << sPtr->source()
                 //    << " " << sPtr->target() << std::endl;
 
-                Polyhedron::Face_handle f = (*iter)->second;
                 //std::cout<< "triangle:" << f->index
                 //    << " region:" << f->region << std::endl;
 
@@ -706,7 +716,7 @@ labelPair edgeIntersectionsCGAL
                 );
                 // Intersection aligned with face. Tbd: enums
                 classifications[edgeI].append(2);
-                nSegments++;
+                ++nSegments;
             }
         }
     }
diff --git a/wmake/rules/General/no-cgal b/wmake/rules/General/no-cgal
new file mode 100644
index 0000000000000000000000000000000000000000..7ad0714e808ead533b7eca92f0a78bf739db07ce
--- /dev/null
+++ b/wmake/rules/General/no-cgal
@@ -0,0 +1,6 @@
+# Empty flags for not compiling/linking with CGAL
+
+CGAL_INC   =
+CGAL_LIBS  =
+
+#------------------------------------------------------------------------------