diff --git a/applications/utilities/surface/surfaceCoarsen/Make/files b/applications/utilities/surface/surfaceCoarsen/Make/files
index f2a1e0725ff18602ae81d590d858db619e7529dc..6940e9b467d483a0ef5e20cf8c25f0455577f7d0 100644
--- a/applications/utilities/surface/surfaceCoarsen/Make/files
+++ b/applications/utilities/surface/surfaceCoarsen/Make/files
@@ -1,5 +1,5 @@
-bunnylod/progmesh.C
-bunnylod/vector.C
+bunnylod/progmesh.cxx
+bunnylod/vector.cxx
 surfaceCoarsen.C
 
 EXE = $(FOAM_APPBIN)/surfaceCoarsen
diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/README b/applications/utilities/surface/surfaceCoarsen/bunnylod/README
index 96c8188b9b25a54ce388d7197c4849386f06d10b..ccefb14ea3159e3f7e6ed1152201d2f7f96b8002 100644
--- a/applications/utilities/surface/surfaceCoarsen/bunnylod/README
+++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/README
@@ -7,3 +7,14 @@ The PC executable bunnylod.exe should run
 on a standard PC.
 Just run it and enjoy.
 Mouse dragging spins the rabbit.
+
+-------------------------------------------------------------------
+Changes
+
+2020-04-16 OpenCFD Ltd
+  - remove MSWindows components (code and makefiles)
+  - use cxx, hxx extensions to reduce possible confusion with other
+    "list" and "vector" classes
+  - use C++ versions for C headers
+
+-------------------------------------------------------------------
diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnygut.C b/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnygut.C
deleted file mode 100644
index 3e78b37861a66b3d3781fda85bdab2f3bd765ab4..0000000000000000000000000000000000000000
--- a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnygut.C
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- *   Polygon Reduction Demo by Stan Melax (c) 1998
- *  Permission to use any of this code wherever you want is granted..
- *  Although, please do acknowledge authorship if appropriate.
- *
- *  This module initializes the bunny model data and calls
- *  the polygon reduction routine.  At each frame the RenderModel()
- *  routine is called to draw the model.  This module also
- *  animates the parameters (such as number of vertices to
- *  use) to show the model at various levels of detail.
- */
-
-#include <windows.h>
-#include <stdio.h>
-#include <math.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <string.h>
-#include <GL/gl.h>
-#pragma warning(disable : 4244)
-
-#include "vector.h"
-#include "font.h"
-#include "progmesh.h"
-#include "rabdata.h"
-
-extern float DeltaT;  // change in time since last frame
-int   render_num;   // number of vertices to draw with
-float lodbase=0.5f; // the fraction of vertices used to morph toward
-float morph=1.0f;   // where to render between 2 levels of detail
-List<Vector> vert;       // global list of vertices
-List<tridata> tri;       // global list of triangles
-List<int> collapse_map;  // to which neighbor each vertex collapses
-int renderpolycount=0;   // polygons rendered in the current frame
-Vector model_position;         // position of bunny
-Quaternion model_orientation;  // orientation of bunny
-
-// Note that the use of the Map() function and the collapse_map
-// list isn't part of the polygon reduction algorithm.
-// We just set up this system here in this module
-// so that we could retrieve the model at any desired vertex count.
-// Therefore if this part of the program confuses you, then
-// dont worry about it.  It might help to look over the progmesh.cpp
-// module first.
-
-//       Map()
-//
-// When the model is rendered using a maximum of mx vertices
-// then it is vertices 0 through mx-1 that are used.
-// We are able to do this because the vertex list
-// gets sorted according to the collapse order.
-// The Map() routine takes a vertex number 'a' and the
-// maximum number of vertices 'mx' and returns the
-// appropriate vertex in the range 0 to mx-1.
-// When 'a' is greater than 'mx' the Map() routine
-// follows the chain of edge collapses until a vertex
-// within the limit is reached.
-//   An example to make this clear: assume there is
-//   a triangle with vertices 1, 3 and 12.  But when
-//   rendering the model we limit ourselves to 10 vertices.
-//   In that case we find out how vertex 12 was removed
-//   by the polygon reduction algorithm.  i.e. which
-//   edge was collapsed.  Lets say that vertex 12 was collapsed
-//   to vertex number 7.  This number would have been stored
-//   in the collapse_map array (i.e. collapse_map[12]==7).
-//   Since vertex 7 is in range (less than max of 10) we
-//   will want to render the triangle 1,3,7.
-//   Pretend now that we want to limit ourselves to 5 vertices.
-//   and vertex 7 was collapsed to vertex 3
-//   (i.e. collapse_map[7]==3).  Then triangle 1,3,12 would now be
-//   triangle 1,3,3.  i.e. this polygon was removed by the
-//   progressive mesh polygon reduction algorithm by the time
-//   it had gotten down to 5 vertices.
-//   No need to draw a one dimensional polygon. :-)
-int Map(int a,int mx) {
-        if(mx<=0) return 0;
-        while(a>=mx) {
-                a=collapse_map[a];
-        }
-        return a;
-}
-
-void DrawModelTriangles() {
-        assert(collapse_map.num);
-        renderpolycount=0;
-        int i=0;
-        for(i=0;i<tri.num;i++) {
-                int p0= Map(tri[i].v[0],render_num);
-                int p1= Map(tri[i].v[1],render_num);
-                int p2= Map(tri[i].v[2],render_num);
-                // note:  serious optimization opportunity here,
-                //  by sorting the triangles the following "continue"
-                //  could have been made into a "break" statement.
-                if(p0==p1 || p1==p2 || p2==p0) continue;
-                renderpolycount++;
-                // if we are not currenly morphing between 2 levels of detail
-                // (i.e. if morph=1.0) then q0,q1, and q2 are not necessary.
-                int q0= Map(p0,(int)(render_num*lodbase));
-                int q1= Map(p1,(int)(render_num*lodbase));
-                int q2= Map(p2,(int)(render_num*lodbase));
-                Vector v0,v1,v2;
-                v0 = vert[p0]*morph + vert[q0]*(1-morph);
-                v1 = vert[p1]*morph + vert[q1]*(1-morph);
-                v2 = vert[p2]*morph + vert[q2]*(1-morph);
-                glBegin(GL_POLYGON);
-                        // the purpose of the demo is to show polygons
-                        // therefore just use 1 face normal (flat shading)
-                        Vector nrml = (v1-v0) * (v2-v1);  // cross product
-                        if(0<magnitude(nrml)) {
-                                glNormal3fv(normalize(nrml));
-                        }
-                        glVertex3fv(v0);
-                        glVertex3fv(v1);
-                        glVertex3fv(v2);
-                glEnd();
-        }
-}
-
-
-void PermuteVertices(List<int> &permutation) {
-        // rearrange the vertex list
-        List<Vector> temp_list;
-        int i;
-        assert(permutation.num==vert.num);
-        for(i=0;i<vert.num;i++) {
-                temp_list.Add(vert[i]);
-        }
-        for(i=0;i<vert.num;i++) {
-                vert[permutation[i]]=temp_list[i];
-        }
-        // update the changes in the entries in the triangle list
-        for(i=0;i<tri.num;i++) {
-                for(int j=0;j<3;j++) {
-                        tri[i].v[j] = permutation[tri[i].v[j]];
-                }
-        }
-}
-
-void GetRabbitData(){
-        // Copy the geometry from the arrays of data in rabdata.cpp into
-        // the vert and tri lists which we send to the reduction routine
-        int i;
-        for(i=0;i<RABBIT_VERTEX_NUM;i++) {
-                float *vp=rabbit_vertices[i];
-                vert.Add(Vector(vp[0],vp[1],vp[2]));
-        }
-        for(i=0;i<RABBIT_TRIANGLE_NUM;i++) {
-                tridata td;
-                td.v[0]=rabbit_triangles[i][0];
-                td.v[1]=rabbit_triangles[i][1];
-                td.v[2]=rabbit_triangles[i][2];
-                tri.Add(td);
-        }
-        render_num=vert.num;  // by default lets use all the model to render
-}
-
-
-void InitModel() {
-        List<int> permutation;
-        GetRabbitData();
-        ProgressiveMesh(vert,tri,collapse_map,permutation);
-        PermuteVertices(permutation);
-        model_position    = Vector(0,0,-3);
-        Quaternion yaw(Vector(0,1,0),-3.14f/4);    // 45 degrees
-        Quaternion pitch(Vector(1,0,0),3.14f/12);  // 15 degrees
-        model_orientation = pitch*yaw;
-}
-
-void StatusDraw() {
-        //  Draw a slider type widget looking thing
-        // to show portion of vertices being used
-        float b = (float)render_num/(float)vert.num;
-        float a = b*(lodbase );
-        glDisable(GL_LIGHTING);
-        glMatrixMode( GL_PROJECTION );
-        glPushMatrix();
-        glLoadIdentity();
-        glOrtho(-0.15,15,-0.1,1.1,-0.1,100);
-        glMatrixMode( GL_MODELVIEW );
-
-        glPushMatrix();
-        glLoadIdentity();
-        glBegin(GL_POLYGON);
-        glColor3f(1,0,0);
-        glVertex2f(0,0);
-        glVertex2f(1,0);
-        glVertex2f(1,a);
-        glVertex2f(0,a);
-        glEnd();
-        glBegin(GL_POLYGON);
-        glColor3f(1,0,0);
-        glVertex2f(0,a);
-        glVertex2f(morph,a);
-        glVertex2f(morph,b);
-        glVertex2f(0,b);
-        glEnd();
-        glBegin(GL_POLYGON);
-        glColor3f(0,0,1);
-        glVertex2f(morph,a);
-        glVertex2f(1,a);
-        glVertex2f(1,b);
-        glVertex2f(morph,b);
-        glEnd();
-        glBegin(GL_POLYGON);
-        glColor3f(0,0,1);
-        glVertex2f(0,b);
-        glVertex2f(1,b);
-        glVertex2f(1,1);
-        glVertex2f(0,1);
-        glEnd();
-        glPopMatrix();
-        glMatrixMode( GL_PROJECTION );
-        glPopMatrix();
-        glMatrixMode( GL_MODELVIEW );
-}
-
-/*
- *  The following is just a quick hack to animate
- *  the object through various polygon reduced versions.
- */
-struct keyframethings {
-        float t;   // timestamp
-        float n;   // portion of vertices used to start
-        float dn;  // rate of change in "n"
-        float m;   // morph value
-        float dm;  // rate of change in "m"
-} keys[]={
-        {0 ,1   ,0 ,1, 0},
-        {2 ,1   ,-1,1, 0},
-        {10,0   ,1 ,1, 0},
-        {18,1   ,0 ,1, 0},
-        {20,1   ,0 ,1,-1},
-        {24,0.5 ,0 ,1, 0},
-        {26,0.5 ,0 ,1,-1},
-        {30,0.25,0 ,1, 0},
-        {32,0.25,0 ,1,-1},
-        {36,0.125,0,1, 0},
-        {38,0.25,0 ,0, 1},
-        {42,0.5 ,0 ,0, 1},
-        {46,1   ,0 ,0, 1},
-        {50,1   ,0 ,1, 0},
-};
-void AnimateParameters() {
-        static float time=0;  // global time - used for animation
-        time+=DeltaT;
-        if(time>=50) time=0;  // repeat cycle every so many seconds
-        int k=0;
-        while(time>keys[k+1].t) {
-                k++;
-        }
-        float interp = (time-keys[k].t)/(keys[k+1].t-keys[k].t);
-        render_num = vert.num*(keys[k].n + interp*keys[k].dn);
-        morph    = keys[k].m + interp*keys[k].dm;
-        morph = (morph>1.0f) ? 1.0f : morph;  // clamp value
-        if(render_num>vert.num) render_num=vert.num;
-        if(render_num<0       ) render_num=0;
-}
-
-void RenderModel() {
-        AnimateParameters();
-
-        glEnable(GL_LIGHTING);
-        glEnable(GL_LIGHT0);
-        glColor3f(1,1,1);
-        glPushMatrix();
-        glTranslatef(model_position.x,model_position.y,model_position.z);
-        // Rotate by quaternion: model_orientation
-        Vector axis=model_orientation.axis();
-        float angle=model_orientation.angle()*180.0f/3.14f;
-        glRotatef(angle,axis.x,axis.y,axis.z);
-        DrawModelTriangles();
-        StatusDraw();
-        glPopMatrix();
-
-        char buf[256];
-        sprintf(buf,"Polys: %d  Vertices: %d ",renderpolycount,render_num);
-        if(morph<1.0) {
-                sprintf(buf+strlen(buf),"<-> %d  morph: %4.2f ",
-                        (int)(lodbase *render_num),morph);
-        }
-        PostString(buf,0,-2,5);
-}
diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsp b/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsp
deleted file mode 100644
index 0109cfe72524d3347d5ace827799d786698bd8db..0000000000000000000000000000000000000000
--- a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsp
+++ /dev/null
@@ -1,114 +0,0 @@
-# Microsoft Developer Studio Project File - Name="bunnylod" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 5.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Application" 0x0101
-
-CFG=bunnylod - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "bunnylod.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "bunnylod.mak" CFG="bunnylod - Win32 Debug"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "bunnylod - Win32 Release" (based on "Win32 (x86) Application")
-!MESSAGE "bunnylod - Win32 Debug" (based on "Win32 (x86) Application")
-!MESSAGE 
-
-# Begin Project
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF  "$(CFG)" == "bunnylod - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  opengl32.lib glu32.lib winmm.lib /nologo /subsystem:windows /machine:I386
-
-!ELSEIF  "$(CFG)" == "bunnylod - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib winmm.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
-
-!ENDIF 
-
-# Begin Target
-
-# Name "bunnylod - Win32 Release"
-# Name "bunnylod - Win32 Debug"
-# Begin Source File
-
-SOURCE=.\bunnygut.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\font.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\progmesh.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rabdata.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\vector.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\winmain.cpp
-# End Source File
-# End Target
-# End Project
diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsw b/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsw
deleted file mode 100644
index 8abda094027787d425fdd57bb137e96201bbb462..0000000000000000000000000000000000000000
--- a/applications/utilities/surface/surfaceCoarsen/bunnylod/bunnylod.dsw
+++ /dev/null
@@ -1,29 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 5.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "bunnylod"=.\bunnylod.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/font.h b/applications/utilities/surface/surfaceCoarsen/bunnylod/font.h
deleted file mode 100644
index 196f5de7f61610750bd9b0dd366a0c3158f11e84..0000000000000000000000000000000000000000
--- a/applications/utilities/surface/surfaceCoarsen/bunnylod/font.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef FONT_H
-#define FONT_H
-
-void PrintString(char *s,int x=0,int y=-1);
-void PostString(char *_s,int _x,int _y,float _life=5.0);
-void RenderStrings();
-
-#endif
diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/list.h b/applications/utilities/surface/surfaceCoarsen/bunnylod/list.hxx
similarity index 98%
rename from applications/utilities/surface/surfaceCoarsen/bunnylod/list.h
rename to applications/utilities/surface/surfaceCoarsen/bunnylod/list.hxx
index b7394b1cc3142f48ab68b9dd8a8c20525d01bd51..a62609c6bcfe3af62f65a5f097970509bf334e68 100644
--- a/applications/utilities/surface/surfaceCoarsen/bunnylod/list.h
+++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/list.hxx
@@ -1,13 +1,16 @@
 /*
+ * -*- C++ -*-
+ *
  *  A generic template list class.
  *  Fairly typical of the list example you would
  *  find in any c++ book.
  */
+
 #ifndef GENERIC_LIST_H
 #define GENERIC_LIST_H
 
-#include <assert.h>
-#include <stdio.h>
+#include <cassert>
+#include <cstdio>
 
 template<class Type> class List {
         public:
@@ -123,8 +126,4 @@ void List<Type>::Remove(Type t){
         }
 }
 
-
-
-
-
 #endif
diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.C b/applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.cxx
similarity index 98%
rename from applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.C
rename to applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.cxx
index 4925650491e2882e3557d40225111f03f464c772..82ea6f3f40cf1d5dbbb89804a0cd536ba7e943fd 100644
--- a/applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.C
+++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.cxx
@@ -1,4 +1,6 @@
 /*
+ * -*- C++ -*-
+ *
  *  Progressive Mesh type Polygon Reduction Algorithm
  *  by Stan Melax (c) 1998
  *  Permission to use any of this code wherever you want is granted..
@@ -7,15 +9,14 @@
  *  See the header file progmesh.h for a description of this module
  */
 
-#include <stdio.h>
-#include <math.h>
-#include <stdlib.h>
-#include <assert.h>
-//#include <windows.h>
+#include <cstdio>
+#include <cmath>
+#include <cstdlib>
+#include <cassert>
 
-#include "vector.h"
-#include "list.h"
-#include "progmesh.h"
+#include "vector.hxx"
+#include "list.hxx"
+#include "progmesh.hxx"
 
 #define min(x,y) (((x) <= (y)) ? (x) : (y))
 #define max(x,y) (((x) >= (y)) ? (x) : (y))
diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.h b/applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.hxx
similarity index 94%
rename from applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.h
rename to applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.hxx
index 638347473337bc5bafbcf89a44f2e9e2fdff51f9..e6af82e41de4c0fed3aa09cda22274cb40fefe13 100644
--- a/applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.h
+++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/progmesh.hxx
@@ -1,4 +1,6 @@
 /*
+ * -*- C++ -*-
+ *
  *  Progressive Mesh type Polygon Reduction Algorithm
  *  by Stan Melax (c) 1998
  *
@@ -18,8 +20,8 @@
 #ifndef PROGRESSIVE_MESH_H
 #define PROGRESSIVE_MESH_H
 
-#include "vector.h"
-#include "list.h"
+#include "vector.hxx"
+#include "list.hxx"
 
 class tridata {
   public:
diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.C b/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.cxx
similarity index 97%
rename from applications/utilities/surface/surfaceCoarsen/bunnylod/vector.C
rename to applications/utilities/surface/surfaceCoarsen/bunnylod/vector.cxx
index 9bdecbbd324c790e315fbb5c3220ecdcdf5bd061..feaeaa955b60edbe3cb46da9473f2e20d91a73d0 100644
--- a/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.C
+++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.cxx
@@ -1,8 +1,8 @@
-#include <stdio.h>
-#include <math.h>
-#include <assert.h>
+#include <cstdio>
+#include <cmath>
+#include <cassert>
 
-#include "vector.h"
+#include "vector.hxx"
 
 float  sqr(float a) {return a*a;}
 
diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.h b/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.hxx
similarity index 97%
rename from applications/utilities/surface/surfaceCoarsen/bunnylod/vector.h
rename to applications/utilities/surface/surfaceCoarsen/bunnylod/vector.hxx
index 26dd9bbe71cb8402b35f7f51458491475ab9126d..85f6bffd1c74e39aa53dd339be839ac0091e2691 100644
--- a/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.h
+++ b/applications/utilities/surface/surfaceCoarsen/bunnylod/vector.hxx
@@ -1,3 +1,4 @@
+// -*- C++ -*-
 //
 // This module contains a bunch of well understood functions
 // I apologise if the conventions used here are slightly
@@ -7,8 +8,8 @@
 #ifndef GENERIC_VECTOR_H
 #define GENERIC_VECTOR_H
 
-#include <stdio.h>
-#include <math.h>
+#include <cstdio>
+#include <cmath>
 
 
 class Vector {
diff --git a/applications/utilities/surface/surfaceCoarsen/bunnylod/winmain.C b/applications/utilities/surface/surfaceCoarsen/bunnylod/winmain.C
deleted file mode 100644
index fd19db0a0453c9d3ced9c7d2e96d10a7fc2d658b..0000000000000000000000000000000000000000
--- a/applications/utilities/surface/surfaceCoarsen/bunnylod/winmain.C
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- *        Polygon Reduction Demo by Stan Melax (c) 1998
- *  Permission to use any of this code wherever you want is granted..
- *  Although, please do acknowledge authorship if appropriate.
- *
- *  This module contains the window setup code, mouse input, timing
- *  routines, and that sort of stuff.  The interesting modules
- *  to see are bunnygut.cpp and progmesh.cpp.
- *
- *  The windows 95 specific code for this application was taken from
- *  an example of processing mouse events in an OpenGL program using
- *  the Win32 API from the www.opengl.org web site.
- *
- *  Under Project->Settings, Link Options, General Category
- *  Add:
- *        Opengl32.lib glu32.lib winmm.lib
- *  to the Object/Library Modules
- *
- *  You will need have OpenGL libs and include files to compile this
- *  Go to the www.opengl.org web site if you need help with this.
- */
-
-
-#include <windows.h>    /* must include this before GL/gl.h */
-#include <GL/gl.h>              /* OpenGL header file */
-#include <GL/glu.h>             /* OpenGL utilities header file */
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/timeb.h>
-#include <time.h>
-
-#include "vector.h"
-#include "font.h"
-
-// Functions and Variables from bunny module
-extern void       InitModel();
-extern void       RenderModel();
-extern Vector     model_position;      // position of bunny
-extern Quaternion model_orientation;   // orientation of bunny
-
-// Global Variables
-float   DeltaT = 0.1f;
-float   FPS;
-int     Width  = 512;
-int     Height = 512;
-int     MouseX = 0;
-int     MouseY = 0;
-Vector  MouseVector;      // 3D direction mouse points
-Vector  OldMouseVector;
-int     MouseState=0;     // true iff left button down
-float   ViewAngle=45.0f;
-
-HDC hDC;                /* device context */
-HPALETTE hPalette = 0;  /* custom palette (if needed) */
-
-
-void CalcFPSDeltaT(){
-        static int timeinit=0;
-        static int start,start2,current,last;
-        static int frame=0, frame2=0;
-        if(!timeinit){
-                frame=0;
-                start=timeGetTime();
-                timeinit=1;
-        }
-        frame++;
-        frame2++;
-        current=timeGetTime(); // found in winmm.lib
-        double dif=(double)(current-start)/CLOCKS_PER_SEC;
-        double rv = (dif)? (double)frame/(double)dif:-1.0;
-        if(dif>2.0 && frame >10) {
-                start  = start2;
-                frame  = frame2;
-                start2 = timeGetTime();
-                frame2 = 0;
-        }
-        DeltaT = (float)(current-last)/CLOCKS_PER_SEC;
-        if(current==last) {
-                DeltaT = 0.1f/CLOCKS_PER_SEC;  // it just cant be 0
-        }
-        // if(DeltaT>1.0) DeltaT=1.0;
-        FPS = (float)rv;
-        last = current;
-}
-
-
-void ComputeMouseVector(){
-        OldMouseVector=MouseVector;
-        float spread = (float)tan(ViewAngle/2*3.14/180);
-        float y = spread * ((Height-MouseY)-Height/2.0f) /(Height/2.0f);
-    float x = spread * (MouseX-Width/2.0f)  /(Height/2.0f);
-    Vector v(x ,y,-1);
-    // v=UserOrientation *v;
-    v=normalize(v);
-        MouseVector = v;
-}
-
-Quaternion VirtualTrackBall(Vector cop,Vector cor,Vector dir1,Vector dir2) {
-        // Implement track ball functionality to spin stuf on the screen
-        //  cop   center of projection
-        //  cor   center of rotation
-        //  dir1  old mouse direction
-        //  dir2  new mouse direction
-        // pretend there is a sphere around cor.  Then find the points
-        // where dir1 and dir2 intersect that sphere.  Find the
-        // rotation that takes the first point to the second.
-        float m;
-        // compute plane
-        Vector nrml = cor - cop;
-         // since trackball proportional to distance from cop
-        float fudgefactor = 1.0f/(magnitude(nrml) * 0.25f);
-        nrml = normalize(nrml);
-        float dist = -(nrml^cor);
-        Vector u= planelineintersection(nrml,dist,cop,cop+dir1);
-        u=u-cor;
-        u=u*fudgefactor;
-        m= magnitude(u);
-        if(m>1) {u=u*1.0f/m;}
-        else {
-                u=u - (nrml * (float)sqrt(1-m*m));
-        }
-        Vector v= planelineintersection(nrml,dist,cop,cop+dir2);
-        v=v-cor;
-        v=v*fudgefactor;
-        m= magnitude(v);
-        if(m>1) {v=v*1.0f/m;}
-        else {
-                v=v - (nrml * (float)sqrt(1-m*m));
-        }
-        Vector axis = u*v;
-        float angle;
-        m=magnitude(axis);
-        if(m>1)m=1; // avoid potential floating point error
-        Quaternion q(Vector(1.0f,0.0f,0.0f),0.0f);
-        if(m>0 && (angle=(float)asin(m))>3.14/180) {
-                        axis = normalize(axis);
-                        q=Quaternion(axis,angle);
-        }
-        return q;
-}
-
-void SpinIt(){
-        // Change the orientation of the bunny according to mouse drag
-        Quaternion q=VirtualTrackBall(Vector(0,0,0),model_position,
-                                      OldMouseVector,MouseVector);
-        model_orientation=q*model_orientation;
-}
-
-void Reshape(int width, int height){
-        // called initially and when the window changes size
-        Width=width;
-        Height=height;
-    glViewport(0, 0, width, height);
-    glMatrixMode(GL_PROJECTION);
-    glLoadIdentity();
-    gluPerspective(ViewAngle, (float)width/height, 0.1, 50.0);
-    glMatrixMode(GL_MODELVIEW);
-    glLoadIdentity();
-}
-
-void PrintStats(){
-        char buf[1024];buf[0]='\0';
-        sprintf(buf,"FPS: %5.2f   ",FPS);
-        PostString(buf,0,-1,0);
-}
-
-void Display(){
-        // main drawing routine - called every frame
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-    glPushMatrix();
-        glLoadIdentity();
-        // camera at default (zero) position and orientation
-        RenderModel();
-        PrintStats();
-        glLoadIdentity();
-        RenderStrings();
-    glPopMatrix();
-    glFlush();
-    SwapBuffers(hDC);                   /* nop if singlebuffered */
-}
-
-
-LONG WINAPI WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
-    static PAINTSTRUCT ps;
-    static GLboolean left  = GL_FALSE;  /* left button currently down? */
-    static GLboolean right = GL_FALSE;  /* right button currently down? */
-    static int omx, omy, mx, my;
-
-    switch(uMsg) {
-    case WM_PAINT:
-                BeginPaint(hWnd, &ps);
-                EndPaint(hWnd, &ps);
-                return 0;
-    case WM_SIZE:
-                Reshape(LOWORD(lParam), HIWORD(lParam));
-                PostMessage(hWnd, WM_PAINT, 0, 0);
-                return 0;
-    case WM_CHAR:
-                switch (wParam) {
-                        case 27: /* ESC key */
-                            PostQuitMessage(0);
-                            break;
-                }
-                return 0;
-
-        case WM_LBUTTONDOWN:
-            /* if we don't set the capture we won't get mouse move
-           messages when the mouse moves outside the window. */
-                SetCapture(hWnd);
-                MouseX = LOWORD(lParam);
-                MouseY = HIWORD(lParam);
-                ComputeMouseVector();
-                MouseState = 1;
-                return 0;
-
-    case WM_LBUTTONUP:
-                MouseX = LOWORD(lParam);
-                MouseY = HIWORD(lParam);
-            if(MouseX & 1 << 15) MouseX -= (1 << 16);
-            if(MouseY & 1 << 15) MouseY -= (1 << 16);
-                ComputeMouseVector();
-                if(MouseState) SpinIt();
-                MouseState=0;
-                /* remember to release the capture when we are finished. */
-                ReleaseCapture();
-                return 0;
-
-    case WM_MOUSEMOVE:
-                MouseX = LOWORD(lParam);
-                MouseY = HIWORD(lParam);
-            /* Win32 is pretty braindead about the x, y position that
-               it returns when the mouse is off the left or top edge
-               of the window (due to them being unsigned). therefore,
-               roll the Win32's 0..2^16 pointer co-ord range to the
-               more amenable (and useful) 0..+/-2^15. */
-            if(MouseX & 1 << 15) MouseX -= (1 << 16);
-            if(MouseY & 1 << 15) MouseY -= (1 << 16);
-                ComputeMouseVector();
-                if(MouseState) SpinIt();
-                return 0;
-
-    case WM_PALETTECHANGED:
-                if (hWnd == (HWND)wParam) break;
-                /* fall through to WM_QUERYNEWPALETTE */
-    case WM_QUERYNEWPALETTE:
-                if (hPalette) {
-                    UnrealizeObject(hPalette);
-                    SelectPalette(hDC, hPalette, FALSE);
-                    RealizePalette(hDC);
-                    return TRUE;
-                }
-                return FALSE;
-
-    case WM_CLOSE:
-                PostQuitMessage(0);
-                return 0;
-    }
-    return DefWindowProc(hWnd, uMsg, wParam, lParam);
-}
-
-HWND CreateOpenGLWindow(char* title)
-{
-        // make a double-buffered, rgba, opengl window
-    int         n, pf;
-    HWND        hWnd;
-    WNDCLASS    wc;
-    LOGPALETTE* lpPal;
-    PIXELFORMATDESCRIPTOR pfd;
-    static HINSTANCE hInstance = 0;
-
-    /* only register the window class once - use hInstance as a flag. */
-    if (!hInstance) {
-                hInstance = GetModuleHandle(nullptr);
-                wc.style         = CS_OWNDC;
-                wc.lpfnWndProc   = (WNDPROC)WindowProc;
-                wc.cbClsExtra    = 0;
-                wc.cbWndExtra    = 0;
-                wc.hInstance     = hInstance;
-                wc.hIcon         = LoadIcon(nullptr, IDI_WINLOGO);
-                wc.hCursor       = LoadCursor(nullptr, IDC_ARROW);
-                wc.hbrBackground = nullptr;
-                wc.lpszMenuName  = nullptr;
-                wc.lpszClassName = "OpenGL";
-
-                if (!RegisterClass(&wc)) {
-                        MessageBox(nullptr, "RegisterClass() failed:  "
-                                   "Cannot register window class.",
-                                   "Error", MB_OK);
-                        return nullptr;
-                }
-    }
-
-    hWnd = CreateWindow("OpenGL", title, WS_OVERLAPPEDWINDOW |
-                        WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
-                        0,0,Width,Height, nullptr, nullptr, hInstance, nullptr);
-
-    if (hWnd == nullptr) {
-                MessageBox(nullptr,
-                           "CreateWindow() failed:  Cannot create a window.",
-                           "Error", MB_OK);
-                return nullptr;
-    }
-
-    hDC = GetDC(hWnd);
-
-    /* there is no guarantee that the contents of the stack that become
-       the pfd are zeroed, therefore _make sure_ to clear these bits. */
-    memset(&pfd, 0, sizeof(pfd));
-    pfd.nSize        = sizeof(pfd);
-    pfd.nVersion     = 1;
-    pfd.dwFlags      = PFD_DRAW_TO_WINDOW
-                     | PFD_SUPPORT_OPENGL
-                     | PFD_DOUBLEBUFFER;
-    pfd.iPixelType   = PFD_TYPE_RGBA;
-    pfd.cDepthBits   = 32;
-    pfd.cColorBits   = 32;
-
-    pf = ChoosePixelFormat(hDC, &pfd);
-    if (pf == 0) {
-                MessageBox(nullptr, "ChoosePixelFormat() failed:  "
-                           "Cannot find a suitable pixel format.",
-                           "Error", MB_OK);
-                return 0;
-    }
-
-    if (SetPixelFormat(hDC, pf, &pfd) == FALSE) {
-                MessageBox(nullptr, "SetPixelFormat() failed:  "
-                           "Cannot set format specified.", "Error", MB_OK);
-                return 0;
-    }
-
-    DescribePixelFormat(hDC, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
-
-    if (pfd.dwFlags & PFD_NEED_PALETTE ||
-                pfd.iPixelType == PFD_TYPE_COLORINDEX) {
-
-                n = 1 << pfd.cColorBits;
-                if (n > 256) n = 256;
-
-                lpPal = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) +
-                                                sizeof(PALETTEENTRY) * n);
-                memset(lpPal, 0, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * n);
-                lpPal->palVersion = 0x300;
-                lpPal->palNumEntries = n;
-
-                GetSystemPaletteEntries(hDC, 0, n, &lpPal->palPalEntry[0]);
-
-                /* if the pixel type is RGBA, then we want to make an RGB ramp,
-                   otherwise (color index) set individual colors. */
-                if (pfd.iPixelType == PFD_TYPE_RGBA) {
-                        int redMask = (1 << pfd.cRedBits) - 1;
-                        int greenMask = (1 << pfd.cGreenBits) - 1;
-                        int blueMask = (1 << pfd.cBlueBits) - 1;
-                        int i;
-
-                        /* fill in the entries with an RGB color ramp. */
-                        for (i = 0; i < n; ++i) {
-                        lpPal->palPalEntry[i].peRed =
-                                (((i >> pfd.cRedShift)   & redMask)   * 255)
-                               /redMask;
-                        lpPal->palPalEntry[i].peGreen =
-                                (((i >> pfd.cGreenShift) & greenMask) * 255)
-                               /greenMask;
-                        lpPal->palPalEntry[i].peBlue =
-                                (((i >> pfd.cBlueShift)  & blueMask)  * 255)
-                               /blueMask;
-                        lpPal->palPalEntry[i].peFlags = 0;
-                        }
-                } else {
-                        lpPal->palPalEntry[0].peRed = 0;
-                        lpPal->palPalEntry[0].peGreen = 0;
-                        lpPal->palPalEntry[0].peBlue = 0;
-                        lpPal->palPalEntry[0].peFlags = PC_NOCOLLAPSE;
-                        lpPal->palPalEntry[1].peRed = 255;
-                        lpPal->palPalEntry[1].peGreen = 0;
-                        lpPal->palPalEntry[1].peBlue = 0;
-                        lpPal->palPalEntry[1].peFlags = PC_NOCOLLAPSE;
-                        lpPal->palPalEntry[2].peRed = 0;
-                        lpPal->palPalEntry[2].peGreen = 255;
-                        lpPal->palPalEntry[2].peBlue = 0;
-                        lpPal->palPalEntry[2].peFlags = PC_NOCOLLAPSE;
-                        lpPal->palPalEntry[3].peRed = 0;
-                        lpPal->palPalEntry[3].peGreen = 0;
-                        lpPal->palPalEntry[3].peBlue = 255;
-                        lpPal->palPalEntry[3].peFlags = PC_NOCOLLAPSE;
-                }
-
-                hPalette = CreatePalette(lpPal);
-                if (hPalette) {
-                        SelectPalette(hDC, hPalette, FALSE);
-                        RealizePalette(hDC);
-                }
-
-                free(lpPal);
-    }
-
-    ReleaseDC(hDC, hWnd);
-    return hWnd;
-}
-
-int APIENTRY WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst,
-        LPSTR lpszCmdLine, int nCmdShow)
-{
-    HGLRC hRC;                          /* opengl context */
-    HWND  hWnd;                         /* window */
-    MSG   msg;                          /* message */
-
-        // InitModel() initializes some data structures and
-        // does the progressive mesh polygon reduction algorithm
-        // on the model.
-        CalcFPSDeltaT(); // to time the algorithm
-        InitModel();
-        CalcFPSDeltaT();
-
-        hWnd = CreateOpenGLWindow("bunnylod by Stan Melax");
-    if (hWnd == nullptr) exit(1);
-
-    hDC = GetDC(hWnd);
-    hRC = wglCreateContext(hDC);
-    wglMakeCurrent(hDC, hRC);
-    ShowWindow(hWnd, nCmdShow);
-        glEnable(GL_DEPTH_TEST);
-
-        PostString("Demo by Stan Melax (c)1998",5,-5,20);
-        PostString("Model by Viewpoint Datalabs (c)1996",5,-4,20);
-        char buf[128];
-        PostString("Mesh Reduction Algorithm (non-optimized)",1,0,5);
-        sprintf(buf,"was executed in %5.3f seconds",DeltaT);
-        PostString(buf,2,1,6);
-
-    while (1) {
-                while(PeekMessage(&msg, hWnd, 0, 0, PM_NOREMOVE)) {
-                    if(GetMessage(&msg, hWnd, 0, 0)) {
-                                TranslateMessage(&msg);
-                                DispatchMessage(&msg);
-                    } else {
-                                // This 'goto' was in the sample code
-                                goto quit;
-                    }
-                }
-                CalcFPSDeltaT();
-                Display();
-    }
-
-  quit:
-    wglMakeCurrent(nullptr, nullptr);
-    ReleaseDC(hDC, hWnd);
-    wglDeleteContext(hRC);
-    DestroyWindow(hWnd);
-    if (hPalette) DeleteObject(hPalette);
-    return msg.wParam;
-}
diff --git a/applications/utilities/surface/surfaceCoarsen/surfaceCoarsen.C b/applications/utilities/surface/surfaceCoarsen/surfaceCoarsen.C
index 8938ae6dc36f7a0ad1f01461f0a1e9545933d9fa..71edd76366246bde3a2ac2ee92a4938acb84cfc6 100644
--- a/applications/utilities/surface/surfaceCoarsen/surfaceCoarsen.C
+++ b/applications/utilities/surface/surfaceCoarsen/surfaceCoarsen.C
@@ -50,7 +50,7 @@ Description
 #include "triFaceList.H"
 
 // From bunnylod
-#include "progmesh.h"
+#include "progmesh.hxx"
 
 using namespace Foam;