diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index dbc524d1b9f7e6d44f372d4a542ef40817270998..494f43da05b2536c4454cfada9caa559ff542b9b 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -140,7 +140,7 @@ void Msg::Init(int argc, char **argv)
     if(val != "-info" && val != "-help" && val != "-version" && val != "-v")
       sargv[sargc++] = argv[i];
   }
-  sargv[sargc] = NULL;
+  sargv[sargc] = nullptr;
   PetscInitialize(&sargc, &sargv, PETSC_NULL, PETSC_NULL);
   PetscPopSignalHandler();
 #if defined(HAVE_SLEPC)
diff --git a/Common/Main.cpp b/Common/Main.cpp
index a03e7e0935884436001d357e0fbd1aa77a9de05e..6ea5173c49db227e6fd1629a82e0c05ae1c76ed3 100644
--- a/Common/Main.cpp
+++ b/Common/Main.cpp
@@ -19,12 +19,12 @@
 
 static char *toUTF8(wchar_t *src)
 {
-  if(!src) return NULL;
+  if(!src) return nullptr;
   size_t srclen = wcslen(src);
-  int len = WideCharToMultiByte(CP_UTF8, 0, src, srclen, 0, 0, NULL, NULL);
+  int len = WideCharToMultiByte(CP_UTF8, 0, src, srclen, 0, 0, nullptr, nullptr);
   char *out = new char[len + 1];
   if(out) {
-    WideCharToMultiByte(CP_UTF8, 0, src, srclen, out, len, NULL, NULL);
+    WideCharToMultiByte(CP_UTF8, 0, src, srclen, out, len, nullptr, nullptr);
     out[len] = '\0';
   }
   return out;
@@ -35,7 +35,7 @@ int wmain(int argc, wchar_t *wargv[], wchar_t *envp[])
   char **argv = new char*[argc + 1];
   for(int i = 0; i < argc; i++)
     argv[i] = toUTF8(wargv[i]);
-  argv[argc] = NULL;
+  argv[argc] = nullptr;
 
 #else
 
diff --git a/Common/OS.cpp b/Common/OS.cpp
index b62ded014757bb6dbd58d274b0b165431127bcad..7b9167717023ab462c9f5b3a2a35a1e742593822 100644
--- a/Common/OS.cpp
+++ b/Common/OS.cpp
@@ -250,7 +250,7 @@ static unsigned int utf8FromUtf16(char *dst, unsigned int dstlen,
   return count;
 }
 
-static wchar_t *wbuf[3] = {NULL, NULL, NULL};
+static wchar_t *wbuf[3] = {nullptr, nullptr, nullptr};
 
 static void setwbuf(int i, const char *f)
 {
@@ -262,7 +262,7 @@ static void setwbuf(int i, const char *f)
     return;
   }
   size_t l = strlen(f);
-  unsigned int wn = utf8toUtf16(f, (unsigned int)l, NULL, 0) + 1;
+  unsigned int wn = utf8toUtf16(f, (unsigned int)l, nullptr, 0) + 1;
   wbuf[i] = (wchar_t *)realloc(wbuf[i], sizeof(wchar_t) * wn);
   wn = utf8toUtf16(f, (unsigned)l, (unsigned short *)wbuf[i], wn);
   wbuf[i][wn] = 0;
@@ -378,7 +378,8 @@ double TotalRam()
   int name[] = {CTL_HW, HW_MEMSIZE};
   int64_t value;
   size_t len = sizeof(value);
-  if(sysctl(name, 2, &value, &len, nullptr, 0) != -1) ram = value / (1024 * 1024);
+  if(sysctl(name, 2, &value, &len, nullptr, 0) != -1)
+    ram = value / (1024 * 1024);
 #elif defined(WIN32)
   MEMORYSTATUSEX status;
   status.dwLength = sizeof(status);
@@ -424,7 +425,7 @@ std::string GetExecutableFileName()
   std::string name = "";
 #if defined(WIN32) && !defined(__CYGWIN__)
   wchar_t src[MAX_PATH];
-  unsigned long size = GetModuleFileNameW(NULL, src, MAX_PATH);
+  unsigned long size = GetModuleFileNameW(nullptr, src, MAX_PATH);
   if(size) {
     char dst[MAX_PATH];
     utf8FromUtf16(dst, MAX_PATH, src, size);
@@ -455,7 +456,7 @@ std::string GetAbsolutePath(const std::string &fileName)
 #if defined(WIN32) && !defined(__CYGWIN__)
   setwbuf(0, fileName.c_str());
   wchar_t path[MAX_PATH];
-  unsigned long size = GetFullPathNameW(wbuf[0], MAX_PATH, path, NULL);
+  unsigned long size = GetFullPathNameW(wbuf[0], MAX_PATH, path, nullptr);
   if(size) {
     char dst[MAX_PATH];
     utf8FromUtf16(dst, MAX_PATH, path, size);
@@ -565,7 +566,7 @@ int SystemCallExe(const std::string &exe, const std::string &argsOrCommand,
     setwbuf(0, "open");
     setwbuf(1, exe.c_str());
     setwbuf(2, argsOrCommand.c_str());
-    ShellExecuteW(NULL, wbuf[0], wbuf[1], wbuf[2], NULL, 0);
+    ShellExecuteW(nullptr, wbuf[0], wbuf[1], wbuf[2], nullptr, 0);
   }
   else {
     STARTUPINFOW suInfo;
@@ -575,8 +576,8 @@ int SystemCallExe(const std::string &exe, const std::string &argsOrCommand,
     Msg::Info("Calling '%s'", command.c_str());
     setwbuf(0, command.c_str());
     if(blocking) {
-      CreateProcessW(NULL, wbuf[0], NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS,
-                     NULL, NULL, &suInfo, &prInfo);
+      CreateProcessW(nullptr, wbuf[0], nullptr, nullptr, FALSE,
+                     NORMAL_PRIORITY_CLASS, nullptr, nullptr, &suInfo, &prInfo);
       // wait until child process exits.
       WaitForSingleObject(prInfo.hProcess, INFINITE);
       // close process and thread handles.
@@ -586,8 +587,8 @@ int SystemCallExe(const std::string &exe, const std::string &argsOrCommand,
     else {
       // DETACHED_PROCESS removes the console (useful if the program to launch
       // is a console-mode exe)
-      CreateProcessW(NULL, wbuf[0], NULL, NULL, FALSE,
-                     NORMAL_PRIORITY_CLASS | DETACHED_PROCESS, NULL, NULL,
+      CreateProcessW(nullptr, wbuf[0], nullptr, nullptr, FALSE,
+                     NORMAL_PRIORITY_CLASS | DETACHED_PROCESS, nullptr, nullptr,
                      &suInfo, &prInfo);
     }
   }
@@ -650,7 +651,7 @@ void RedirectIOToConsole()
         FILE *fp = _fdopen(hConHandle, "w");
         if(fp) {
           *stdout = *fp;
-          setvbuf(stdout, NULL, _IONBF, 0);
+          setvbuf(stdout, nullptr, _IONBF, 0);
         }
       }
     }
@@ -663,7 +664,7 @@ void RedirectIOToConsole()
         FILE *fp = _fdopen(hConHandle, "r");
         if(fp) {
           *stdin = *fp;
-          setvbuf(stdin, NULL, _IONBF, 0);
+          setvbuf(stdin, nullptr, _IONBF, 0);
         }
       }
     }
@@ -676,7 +677,7 @@ void RedirectIOToConsole()
         FILE *fp = _fdopen(hConHandle, "w");
         if(fp) {
           *stderr = *fp;
-          setvbuf(stderr, NULL, _IONBF, 0);
+          setvbuf(stderr, nullptr, _IONBF, 0);
         }
       }
     }
diff --git a/Common/OctreeInternals.cpp b/Common/OctreeInternals.cpp
index db3cbdc593fd328539a57432a1db6c16b4df898e..3042bb340b765e973d040746f13d8ba6aba08242 100644
--- a/Common/OctreeInternals.cpp
+++ b/Common/OctreeInternals.cpp
@@ -316,7 +316,7 @@ void *searchElement(octantBucket *_buckets_head, double *_pt,
   printf("point %lf %lf %lf has been found in bucket %lf %lf %fl -> %lf %lf %lf  %p\n",
          _pt[0],_pt[1],_pt[2], ptrBucket->minPt[0],ptrBucket->minPt[1],ptrBucket->minPt[2],
          ptrBucket->maxPt[0],ptrBucket->maxPt[1],ptrBucket->maxPt[2], ptr1);
-  if (ptr1 == NULL) {
+  if (ptr1 == nullptr) {
     printf("empty element list for centroid list!?\n, possible!");
   }
 #endif
@@ -408,7 +408,7 @@ void *searchAllElements(octantBucket *_buckets_head, double *_pt,
          _pt[0],_pt[1],_pt[2], ptrBucket->minPt[0],ptrBucket->minPt[1],ptrBucket->minPt[2],
          ptrBucket->maxPt[0],ptrBucket->maxPt[1],ptrBucket->maxPt[2], ptr1);
 
-  if (ptr1 == NULL) {
+  if (ptr1 == nullptr) {
     printf("empty element list for centroid list!?\n, possible!");
   }
 #endif
diff --git a/Fltk/FlGui.cpp b/Fltk/FlGui.cpp
index e9deec9e979faa3cff538520fe20d80577058ae8..ed6cf5ad84f01a2b183f0b89f2571ccc208fff98 100644
--- a/Fltk/FlGui.cpp
+++ b/Fltk/FlGui.cpp
@@ -1211,7 +1211,7 @@ void FlGui::copyCurrentOpenglWindowToClipboard()
   // generate handle
   HANDLE handle =
     (HANDLE)::GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER) + nBytes);
-  if(handle != NULL) {
+  if(handle != nullptr) {
     // lock handle
     char *pData = (char *)::GlobalLock((HGLOBAL)handle);
     // copy header and data
@@ -1220,7 +1220,7 @@ void FlGui::copyCurrentOpenglWindowToClipboard()
     // unlock
     ::GlobalUnlock((HGLOBAL)handle);
     // push DIB in clipboard
-    OpenClipboard(NULL);
+    OpenClipboard(nullptr);
     EmptyClipboard();
     SetClipboardData(CF_DIB, handle);
     CloseClipboard();
diff --git a/Fltk/fileDialogs.h b/Fltk/fileDialogs.h
index 899d60563269e022e9888ba2ea322249ed310528..c233b494a9711c91b97c90dc722317e3023c089f 100644
--- a/Fltk/fileDialogs.h
+++ b/Fltk/fileDialogs.h
@@ -16,7 +16,7 @@ typedef enum {
 } FILE_CHOOSER_TYPE;
 
 int fileChooser(FILE_CHOOSER_TYPE type, const char *message, const char *pat,
-                const char *fname = NULL);
+                const char *fname = nullptr);
 std::string fileChooserGetName(int num);
 int fileChooserGetFilter();
 void fileChooserGetPosition(int *x, int *y);
diff --git a/Fltk/touchBar.mm b/Fltk/touchBar.mm
index b8f47504548436715408d5723502c7ca103003cf..10e807d8c98624f14c470f23c08f1cbd2578a960 100644
--- a/Fltk/touchBar.mm
+++ b/Fltk/touchBar.mm
@@ -110,7 +110,7 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
   else if([identifier isEqualToString:touchBarItemGeoMenu]) {
     NSPopoverTouchBarItem *popoverTouchBarItem =
       [[NSPopoverTouchBarItem alloc] initWithIdentifier:touchBarItemGeoMenu];
-    
+
     popoverTouchBarItem.customizationLabel = @"Geometry";
     popoverTouchBarItem.showsCloseButton = YES;
     popoverTouchBarItem.collapsedRepresentationLabel = @"Geometry";
@@ -136,13 +136,13 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
                     trackingMode:NSSegmentSwitchTrackingSelectAny
                           target:self
                           action:@selector(buttonGeo:)];
-    
+
     segmentedControl.segmentStyle = NSSegmentStyleSeparated;
-    
+
     NSCustomTouchBarItem *touchBarItem =
       [[NSCustomTouchBarItem alloc] initWithIdentifier:touchBarItemGeoButtons];
     touchBarItem.view = segmentedControl;
-    
+
     _geoButtons = segmentedControl;
     [self updateGeo];
 
@@ -154,14 +154,14 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
                     trackingMode:NSSegmentSwitchTrackingSelectOne
                           target:self
                           action:@selector(buttonGeoNormalTangent:)];
-    
+
     [segmentedControl setWidth:30 forSegment:0];
     [segmentedControl setWidth:30 forSegment:1];
-                          
+
     NSCustomTouchBarItem *touchBarItem =
       [[NSCustomTouchBarItem alloc] initWithIdentifier:touchBarItemGeoButtonNormalTangent];
     touchBarItem.view = segmentedControl;
-    
+
     segmentedControl.selectedSegment = 0; //Normal
     _geoButtonsNormalTangent = segmentedControl;
 
@@ -170,14 +170,14 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
   else if([identifier isEqualToString:touchBarItemGeoSliderNormalTangent]) {
     NSSliderTouchBarItem *slider = [[NSSliderTouchBarItem alloc]
             initWithIdentifier:touchBarItemGeoSliderNormalTangent];
-    
+
     slider.target = self;
     slider.action = @selector(sliderGeoNormalTangent:);
     slider.label = @"Normal";
     slider.slider.minValue = 0;
     slider.slider.maxValue = 500;
     slider.slider.doubleValue = 0;
-    
+
     _geoSliderNormalTangent = slider;
     [self updateGeoSliderNormalTangent];
 
@@ -199,7 +199,7 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
   else if([identifier isEqualToString:touchBarItemMeshMenu]) {
     NSPopoverTouchBarItem *popoverTouchBarItem =
       [[NSPopoverTouchBarItem alloc] initWithIdentifier:touchBarItemMeshMenu];
-    
+
     popoverTouchBarItem.customizationLabel = @"Mesh";
     popoverTouchBarItem.showsCloseButton = YES;
     popoverTouchBarItem.collapsedRepresentationLabel = @"Mesh";
@@ -225,7 +225,7 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
                     trackingMode:NSSegmentSwitchTrackingSelectAny
                           target:self
                           action:@selector(buttonMesh:)];
-                          
+
     segmentedControl.segmentStyle = NSSegmentStyleSeparated;
 
     NSCustomTouchBarItem *touchBarItem =
@@ -243,14 +243,14 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
                     trackingMode:NSSegmentSwitchTrackingSelectOne
                           target:self
                           action:@selector(buttonMeshNormalTangent:)];
-                          
+
     [segmentedControl setWidth:30 forSegment:0];
     [segmentedControl setWidth:30 forSegment:1];
-                          
+
     NSCustomTouchBarItem *touchBarItem =
       [[NSCustomTouchBarItem alloc] initWithIdentifier:touchBarItemMeshButtonNormalTangent];
     touchBarItem.view = segmentedControl;
-    
+
     segmentedControl.selectedSegment = 0; //Normal
     _meshButtonsNormalTangent = segmentedControl;
 
@@ -259,14 +259,14 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
   else if([identifier isEqualToString:touchBarItemMeshSliderNormalTangent]) {
     NSSliderTouchBarItem *slider = [[NSSliderTouchBarItem alloc]
             initWithIdentifier:touchBarItemMeshSliderNormalTangent];
-    
+
     slider.target = self;
     slider.action = @selector(sliderMeshNormalTangent:);
     slider.label = @"Normal";
     slider.slider.minValue = 0;
     slider.slider.maxValue = 500;
     slider.slider.doubleValue = 0;
-    
+
     _meshSliderNormalTangent = slider;
     [self updateMeshSliderNormalTangent];
 
@@ -288,7 +288,7 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
   else if([identifier isEqualToString:touchBarItemViewMenu]) {
     NSPopoverTouchBarItem *popoverTouchBarItem =
       [[NSPopoverTouchBarItem alloc] initWithIdentifier:touchBarItemViewMenu];
-    
+
     popoverTouchBarItem.customizationLabel = @"View";
     popoverTouchBarItem.showsCloseButton = YES;
     popoverTouchBarItem.collapsedRepresentationLabel = @"View";
@@ -327,7 +327,7 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
   else if([identifier isEqualToString:touchBarItemViewSlider]) {
     NSSliderTouchBarItem *slider = [[NSSliderTouchBarItem alloc]
             initWithIdentifier:touchBarItemViewSlider];
-    
+
     slider.target = self;
     slider.action = @selector(sliderView:);
     slider.slider.minValue = 1;
@@ -338,7 +338,7 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
 
     return slider;
   }
-  
+
   return nil;
 }
 
@@ -688,7 +688,7 @@ static NSString *touchBarItemViewSlider = @"com.something.item_viewSlider";
 }
 @end
 
-TouchBarDelegate *touchBarDelegate = NULL;
+TouchBarDelegate *touchBarDelegate = nullptr;
 void showTouchBar()
 {
   if(!touchBarDelegate) {
diff --git a/Geo/GModelCreateTopologyFromMesh.cpp b/Geo/GModelCreateTopologyFromMesh.cpp
index 84f62e1a831f831f0b0a101b897f14e341182d94..c049cff53dca76fc26965c593fd4ed8b7a5c2b1c 100644
--- a/Geo/GModelCreateTopologyFromMesh.cpp
+++ b/Geo/GModelCreateTopologyFromMesh.cpp
@@ -79,7 +79,7 @@ std::vector<GEdge *> ensureSimplyConnectedEdge(GEdge *ge)
       if(!_part.size() || _part[_part.size() - 1] != l) { _part.push_back(l); }
       for(int j = 0; j < 2; j++) {
         auto it = _conn.find(l->getVertex(j));
-        if(it->second.first == l && it->second.second != NULL &&
+        if(it->second.first == l && it->second.second != nullptr &&
            _lines.find(it->second.second) != _lines.end()) {
           _stack.push(it->second.second);
         }
@@ -145,7 +145,7 @@ void ensureManifoldFace(GFace *gf)
           _pairs[ed] = std::make_pair(e, (MElement *)nullptr);
         }
         else {
-          if(it->second.second == NULL) { it->second.second = e; }
+          if(it->second.second == nullptr) { it->second.second = e; }
           else {
             _nonManifold.insert(ed);
             _pairs.erase(it);
@@ -170,7 +170,7 @@ void ensureManifoldFace(GFace *gf)
         MEdge ed = e->getEdge(j);
         if(_nonManifold.find(ed) == _nonManifold.end()) {
           auto it = _pairs.find(ed);
-          if(it->second.second != NULL) {
+          if(it->second.second != nullptr) {
             MElement *other =
               it->second.second == e ? it->second.first : it->second.second;
             if(_f.find(other) == _f.end()) _stack.push(other);
diff --git a/Geo/GModelIO_GEO.cpp b/Geo/GModelIO_GEO.cpp
index 0ec7d6bad3644390fa29249e657460b41f0cf172..37cbb4f13b11b42674aae5cb7a5955566ff1b2c4 100644
--- a/Geo/GModelIO_GEO.cpp
+++ b/Geo/GModelIO_GEO.cpp
@@ -454,7 +454,7 @@ static bool SortCurvesConsecutive(const std::vector<Curve *> &e,
     if(it0 == c.end())
       c[v0] = std::make_pair(v1, (Vertex *)nullptr);
     else {
-      if(it0->second.second == NULL) { it0->second.second = v1; }
+      if(it0->second.second == nullptr) { it0->second.second = v1; }
       else {
         Msg::Debug("A list of curves has points that are adjacent to 3 curves");
         return false;
@@ -463,7 +463,7 @@ static bool SortCurvesConsecutive(const std::vector<Curve *> &e,
     if(it1 == c.end())
       c[v1] = std::make_pair(v0, (Vertex *)nullptr);
     else {
-      if(it1->second.second == NULL) { it1->second.second = v0; }
+      if(it1->second.second == nullptr) { it1->second.second = v0; }
       else {
         Msg::Debug("Wrong topology for a list of curves");
         Msg::Debug("Point %d is adjacent to more than 2 points %d %d", v1->Num,
@@ -480,7 +480,7 @@ static bool SortCurvesConsecutive(const std::vector<Curve *> &e,
       auto it = c.begin();
       start = it->first;
       for(; it != c.end(); ++it) {
-        if(it->second.second == NULL) {
+        if(it->second.second == nullptr) {
           start = it->first;
           break;
         }
diff --git a/Geo/GModelIO_MSH2.cpp b/Geo/GModelIO_MSH2.cpp
index e1f1b712b260224a65445d5e7b1051f598e3efb4..bab1dbdfc1c74ef6b8cfdb56f899fb1464bb198e 100644
--- a/Geo/GModelIO_MSH2.cpp
+++ b/Geo/GModelIO_MSH2.cpp
@@ -447,7 +447,7 @@ int GModel::_readMSH2(const std::string &name)
               own = true;
               parentsOwned.insert(p);
             }
-            assert(p != NULL);
+            assert(p != nullptr);
           }
 
           // search domains
@@ -554,7 +554,7 @@ int GModel::_readMSH2(const std::string &name)
                 own = true;
                 parentsOwned.insert(p);
               }
-              assert(p != NULL);
+              assert(p != nullptr);
             }
             MElement *e = createElementMSH2(this, num, type, physical,
                                             elementary, partition, vertices,
diff --git a/Geo/MEdge.cpp b/Geo/MEdge.cpp
index f03cde46d5fc8d45d6fe3b54933ead86ab383bc7..58a277d850eaf05af506381bcb3d20f1fbefcb57 100644
--- a/Geo/MEdge.cpp
+++ b/Geo/MEdge.cpp
@@ -80,7 +80,7 @@ bool SortEdgeConsecutive(const std::vector<MEdge> &e,
     if(it0 == c.end())
       c[v0] = std::make_pair(v1, (MVertex *)nullptr);
     else {
-      if(it0->second.second == NULL) { it0->second.second = v1; }
+      if(it0->second.second == nullptr) { it0->second.second = v1; }
       else {
         Msg::Debug("A list of edges has points that are adjacent to 3 edges");
         return false;
@@ -89,7 +89,7 @@ bool SortEdgeConsecutive(const std::vector<MEdge> &e,
     if(it1 == c.end())
       c[v1] = std::make_pair(v0, (MVertex *)nullptr);
     else {
-      if(it1->second.second == NULL) { it1->second.second = v0; }
+      if(it1->second.second == nullptr) { it1->second.second = v0; }
       else {
         Msg::Debug("Wrong topology for a list of edges");
         Msg::Debug("Node %d is adjacent to more than 2 nodes %d %d",
@@ -107,7 +107,7 @@ bool SortEdgeConsecutive(const std::vector<MEdge> &e,
       auto it = c.begin();
       start = it->first;
       for(; it != c.end(); ++it) {
-        if(it->second.second == NULL) {
+        if(it->second.second == nullptr) {
           start = it->first;
           break;
         }
diff --git a/Geo/closestVertex.cpp b/Geo/closestVertex.cpp
index 202056b766fa252b0a029cfc79131f7af3df31cc..bd66409644c5f8522bceb2d3c8c9845caaa70443 100644
--- a/Geo/closestVertex.cpp
+++ b/Geo/closestVertex.cpp
@@ -61,7 +61,7 @@ MVertex *closestVertexFinder ::operator()(const SPoint3 &p)
   kdtree->annkSearch(xyz, 1, index, dist);
   return vertex[index[0]];
 #else
-  return NULL;
+  return nullptr;
 #endif
 }
 
@@ -84,6 +84,6 @@ MVertex *closestVertexFinder ::operator()(const SPoint3 &p,
   kdtree->annkSearch(xyz, 1, index, dist);
   return vertex[index[0]];
 #else
-  return NULL;
+  return nullptr;
 #endif
 }
diff --git a/Graphics/PixelBuffer.h b/Graphics/PixelBuffer.h
index aae2b92f00637fb37df1d951dca7d04f53a8a557..02d7462e9c66ed4fd4a04ffb5898cfe4ff48748c 100644
--- a/Graphics/PixelBuffer.h
+++ b/Graphics/PixelBuffer.h
@@ -110,7 +110,7 @@ public:
           "Offscreen rendering only implemented for GL_RGB/GL_UNSIGNED_BYTE");
         return;
       }
-      OSMesaContext ctx = OSMesaCreateContextExt(OSMESA_RGB, 16, 0, 0, NULL);
+      OSMesaContext ctx = OSMesaCreateContextExt(OSMESA_RGB, 16, 0, 0, nullptr);
       if(!ctx) {
         Msg::Error("OSMesaCreateContext failed");
         return;
diff --git a/Graphics/gl2ps.cpp b/Graphics/gl2ps.cpp
index 6ae3f1dfb9d3429b31c5d6420a63ddbed90fb5fc..51638130692dcd14594b3596fff2aed9a2f72204 100644
--- a/Graphics/gl2ps.cpp
+++ b/Graphics/gl2ps.cpp
@@ -26,7 +26,7 @@
  * file named "COPYING.GL2PS"; if not, I will be glad to provide one.
  *
  * For the latest info about gl2ps and a full list of contributors, see
- * http://www.geuz.org/gl2ps/.
+ * https://geuz.org/gl2ps/.
  *
  * Please report all issues on https://gitlab.onelab.info/gl2ps/gl2ps/issues.
  */
@@ -246,7 +246,7 @@ typedef struct {
 /* The gl2ps context. gl2ps is not thread safe (we should create a
    local GL2PScontext during gl2psBeginPage) */
 
-static GL2PScontext *gl2ps = nullptr;
+static GL2PScontext *gl2ps = NULL;
 
 /* Need to forward-declare this one */
 
@@ -280,11 +280,11 @@ static void *gl2psMalloc(size_t size)
 {
   void *ptr;
 
-  if(!size) return nullptr;
+  if(!size) return NULL;
   ptr = malloc(size);
   if(!ptr){
     gl2psMsg(GL2PS_ERROR, "Couldn't allocate requested memory");
-    return nullptr;
+    return NULL;
   }
   return ptr;
 }
@@ -292,12 +292,12 @@ static void *gl2psMalloc(size_t size)
 static void *gl2psRealloc(void *ptr, size_t size)
 {
   void *orig = ptr;
-  if(!size) return nullptr;
+  if(!size) return NULL;
   ptr = realloc(orig, size);
   if(!ptr){
     gl2psMsg(GL2PS_ERROR, "Couldn't reallocate requested memory");
     free(orig);
-    return nullptr;
+    return NULL;
   }
   return ptr;
 }
@@ -325,9 +325,9 @@ static int gl2psWriteBigEndian(unsigned long data, int bytes)
 static void gl2psSetupCompress(void)
 {
   gl2ps->compress = (GL2PScompress*)gl2psMalloc(sizeof(GL2PScompress));
-  gl2ps->compress->src = nullptr;
-  gl2ps->compress->start = nullptr;
-  gl2ps->compress->dest = nullptr;
+  gl2ps->compress->src = NULL;
+  gl2ps->compress->start = NULL;
+  gl2ps->compress->dest = NULL;
   gl2ps->compress->srcLen = 0;
   gl2ps->compress->destLen = 0;
 }
@@ -338,9 +338,9 @@ static void gl2psFreeCompress(void)
     return;
   gl2psFree(gl2ps->compress->start);
   gl2psFree(gl2ps->compress->dest);
-  gl2ps->compress->src = nullptr;
-  gl2ps->compress->start = nullptr;
-  gl2ps->compress->dest = nullptr;
+  gl2ps->compress->src = NULL;
+  gl2ps->compress->start = NULL;
+  gl2ps->compress->dest = NULL;
   gl2ps->compress->srcLen = 0;
   gl2ps->compress->destLen = 0;
 }
@@ -364,7 +364,7 @@ static int gl2psAllocCompress(unsigned int srcsize)
 static void *gl2psReallocCompress(unsigned int srcsize)
 {
   if(!gl2ps->compress || !srcsize)
-    return nullptr;
+    return NULL;
 
   if(srcsize < gl2ps->compress->srcLen)
     return gl2ps->compress->start;
@@ -506,7 +506,7 @@ static void gl2psPrintGzipFooter(void)
     }
     gl2psFreeCompress();
     gl2psFree(gl2ps->compress);
-    gl2ps->compress = nullptr;
+    gl2ps->compress = NULL;
   }
 #endif
 }
@@ -544,7 +544,7 @@ static GL2PSlist *gl2psListCreate(GLint n, GLint incr, GLint size)
   list->incr = incr;
   list->size = size;
   list->n = 0;
-  list->array = nullptr;
+  list->array = NULL;
   gl2psListRealloc(list, n);
   return list;
 }
@@ -584,11 +584,11 @@ static void *gl2psListPointer(GL2PSlist *list, GLint idx)
 {
   if(!list){
     gl2psMsg(GL2PS_ERROR, "Cannot point into unallocated list");
-    return nullptr;
+    return NULL;
   }
   if((idx < 0) || (idx >= list->n)){
     gl2psMsg(GL2PS_ERROR, "Wrong list index in gl2psListPointer");
-    return nullptr;
+    return NULL;
   }
   return &list->array[idx * list->size];
 }
@@ -821,11 +821,11 @@ static void gl2psConvertPixmapToPNG(GL2PSimage *pixmap, GL2PSlist *png)
   GLfloat dr, dg, db;
   int row, col;
 
-  if(!(png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr)))
+  if(!(png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)))
     return;
 
   if(!(info_ptr = png_create_info_struct(png_ptr))){
-    png_destroy_write_struct(&png_ptr, nullptr);
+    png_destroy_write_struct(&png_ptr, NULL);
     return;
   }
 
@@ -1072,7 +1072,7 @@ static GL2PSprimitive *gl2psCopyPrimitive(GL2PSprimitive *p)
 
   if(!p){
     gl2psMsg(GL2PS_ERROR, "Trying to copy an empty primitive");
-    return nullptr;
+    return NULL;
   }
 
   prim = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive));
@@ -1530,7 +1530,7 @@ static GLint gl2psFindRoot(GL2PSlist *primitives, GL2PSprimitive **root)
 static void gl2psFreeImagemap(GL2PSimagemap *list)
 {
   GL2PSimagemap *next;
-  while(list != nullptr){
+  while(list != NULL){
     next = list->next;
     gl2psFree(list->image->pixels);
     gl2psFree(list->image);
@@ -1580,7 +1580,7 @@ static void gl2psFreeBspTree(GL2PSbsptree **tree)
     }
     if((*tree)->front) gl2psFreeBspTree(&(*tree)->front);
     gl2psFree(*tree);
-    *tree = nullptr;
+    *tree = NULL;
   }
 }
 
@@ -1598,12 +1598,12 @@ static GLboolean gl2psLess(GLfloat f1, GLfloat f2)
 
 static void gl2psBuildBspTree(GL2PSbsptree *tree, GL2PSlist *primitives)
 {
-  GL2PSprimitive *prim, *frontprim = nullptr, *backprim = nullptr;
+  GL2PSprimitive *prim, *frontprim = NULL, *backprim = NULL;
   GL2PSlist *frontlist, *backlist;
   GLint i, idx;
 
-  tree->front = nullptr;
-  tree->back = nullptr;
+  tree->front = NULL;
+  tree->back = NULL;
   tree->primitives = gl2psListCreate(1, 2, sizeof(GL2PSprimitive*));
   idx = gl2psFindRoot(primitives, &prim);
   gl2psGetPlane(prim, tree->plane);
@@ -1810,7 +1810,7 @@ static void gl2psFreeBspImageTree(GL2PSbsptree2d **tree)
     if((*tree)->back)  gl2psFreeBspImageTree(&(*tree)->back);
     if((*tree)->front) gl2psFreeBspImageTree(&(*tree)->front);
     gl2psFree(*tree);
-    *tree = nullptr;
+    *tree = NULL;
   }
 }
 
@@ -1830,9 +1830,9 @@ static void gl2psAddPlanesInBspTreeImage(GL2PSprimitive *prim,
   GLint ret = 0;
   GLint i;
   GLint offset = 0;
-  GL2PSbsptree2d *head = nullptr, *cur = nullptr;
+  GL2PSbsptree2d *head = NULL, *cur = NULL;
 
-  if((*tree == nullptr) && (prim->numverts > 2)){
+  if((*tree == NULL) && (prim->numverts > 2)){
     /* don't cull if transparent
     for(i = 0; i < prim->numverts - 1; i++)
       if(prim->verts[i].rgba[3] < 1.0F) return;
@@ -1854,8 +1854,8 @@ static void gl2psAddPlanesInBspTreeImage(GL2PSprimitive *prim,
         break;
       }
     }
-    head->back = nullptr;
-    head->front = nullptr;
+    head->back = NULL;
+    head->front = NULL;
     for(i = 2+offset; i < prim->numverts; i++){
       ret = gl2psCheckPoint(prim->verts[i].xyz, head->plane);
       if(ret != GL2PS_POINT_COINCIDENT) break;
@@ -1864,29 +1864,29 @@ static void gl2psAddPlanesInBspTreeImage(GL2PSprimitive *prim,
     case GL2PS_POINT_INFRONT :
       cur = head;
       for(i = 1+offset; i < prim->numverts-1; i++){
-        if(cur->front == nullptr){
+        if(cur->front == NULL){
           cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d));
         }
         if(gl2psGetPlaneFromPoints(prim->verts[i].xyz,
                                    prim->verts[i+1].xyz,
                                    cur->front->plane)){
           cur = cur->front;
-          cur->front = nullptr;
-          cur->back = nullptr;
+          cur->front = NULL;
+          cur->back = NULL;
         }
       }
-      if(cur->front == nullptr){
+      if(cur->front == NULL){
         cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d));
       }
       if(gl2psGetPlaneFromPoints(prim->verts[i].xyz,
                                  prim->verts[offset].xyz,
                                  cur->front->plane)){
-        cur->front->front = nullptr;
-        cur->front->back = nullptr;
+        cur->front->front = NULL;
+        cur->front->back = NULL;
       }
       else{
         gl2psFree(cur->front);
-        cur->front = nullptr;
+        cur->front = NULL;
       }
       break;
     case GL2PS_POINT_BACK :
@@ -1895,29 +1895,29 @@ static void gl2psAddPlanesInBspTreeImage(GL2PSprimitive *prim,
       }
       cur = head;
       for(i = 1+offset; i < prim->numverts-1; i++){
-        if(cur->front == nullptr){
+        if(cur->front == NULL){
           cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d));
         }
         if(gl2psGetPlaneFromPoints(prim->verts[i+1].xyz,
                                    prim->verts[i].xyz,
                                    cur->front->plane)){
           cur = cur->front;
-          cur->front = nullptr;
-          cur->back = nullptr;
+          cur->front = NULL;
+          cur->back = NULL;
         }
       }
-      if(cur->front == nullptr){
+      if(cur->front == NULL){
         cur->front = (GL2PSbsptree2d*)gl2psMalloc(sizeof(GL2PSbsptree2d));
       }
       if(gl2psGetPlaneFromPoints(prim->verts[offset].xyz,
                                  prim->verts[i].xyz,
                                  cur->front->plane)){
-        cur->front->front = nullptr;
-        cur->front->back = nullptr;
+        cur->front->front = NULL;
+        cur->front->back = NULL;
       }
       else{
         gl2psFree(cur->front);
-        cur->front = nullptr;
+        cur->front = NULL;
       }
       break;
     default:
@@ -1994,7 +1994,7 @@ static void gl2psSplitPrimitive2D(GL2PSprimitive *prim,
   GLint cur = -1, prev = -1, i, v1 = 0, v2 = 0, flag = 1, prev0 = -1;
 
   /* list of vertices that will go in front and back primitive */
-  GL2PSvertex *front_list = nullptr, *back_list = nullptr;
+  GL2PSvertex *front_list = NULL, *back_list = NULL;
 
   /* number of vertices in front and back list */
   GLshort front_count = 0, back_count = 0;
@@ -2066,7 +2066,7 @@ static void gl2psSplitPrimitive2D(GL2PSprimitive *prim,
 static GLint gl2psAddInBspImageTree(GL2PSprimitive *prim, GL2PSbsptree2d **tree)
 {
   GLint ret = 0;
-  GL2PSprimitive *frontprim = nullptr, *backprim = nullptr;
+  GL2PSprimitive *frontprim = NULL, *backprim = NULL;
 
   /* FIXME: until we consider the actual extent of text strings and
      pixmaps, never cull them. Otherwise the whole string/pixmap gets
@@ -2077,7 +2077,7 @@ static GLint gl2psAddInBspImageTree(GL2PSprimitive *prim, GL2PSbsptree2d **tree)
     return 1;
   }
 
-  if(*tree == nullptr){
+  if(*tree == NULL){
     if((prim->type != GL2PS_IMAGEMAP) && (GL_FALSE == gl2ps->zerosurfacearea)){
       gl2psAddPlanesInBspTreeImage(gl2ps->primitivetoadd, tree);
     }
@@ -2087,12 +2087,12 @@ static GLint gl2psAddInBspImageTree(GL2PSprimitive *prim, GL2PSbsptree2d **tree)
     switch(gl2psCheckPrimitive(prim, (*tree)->plane)){
     case GL2PS_IN_BACK_OF: return gl2psAddInBspImageTree(prim, &(*tree)->back);
     case GL2PS_IN_FRONT_OF:
-      if((*tree)->front != nullptr) return gl2psAddInBspImageTree(prim, &(*tree)->front);
+      if((*tree)->front != NULL) return gl2psAddInBspImageTree(prim, &(*tree)->front);
       else                       return 0;
     case GL2PS_SPANNING:
       gl2psSplitPrimitive2D(prim, (*tree)->plane, &frontprim, &backprim);
       ret = gl2psAddInBspImageTree(backprim, &(*tree)->back);
-      if((*tree)->front != nullptr){
+      if((*tree)->front != NULL){
         if(gl2psAddInBspImageTree(frontprim, &(*tree)->front)){
           ret = 1;
         }
@@ -2103,13 +2103,13 @@ static GLint gl2psAddInBspImageTree(GL2PSprimitive *prim, GL2PSbsptree2d **tree)
       gl2psFree(backprim);
       return ret;
     case GL2PS_COINCIDENT:
-      if((*tree)->back != nullptr){
+      if((*tree)->back != NULL){
         gl2ps->zerosurfacearea = GL_TRUE;
         ret = gl2psAddInBspImageTree(prim, &(*tree)->back);
         gl2ps->zerosurfacearea = GL_FALSE;
         if(ret) return ret;
       }
-      if((*tree)->front != nullptr){
+      if((*tree)->front != NULL){
         gl2ps->zerosurfacearea = GL_TRUE;
         ret = gl2psAddInBspImageTree(prim, &(*tree)->front);
         gl2ps->zerosurfacearea = GL_FALSE;
@@ -2448,9 +2448,9 @@ static void gl2psParseFeedbackBuffer(GLint used)
         node->image->format = 0;
         node->image->zoom_x = 1.0F;
         node->image->zoom_y = 1.0F;
-        node->next = nullptr;
+        node->next = NULL;
 
-        if(gl2ps->imagemap_head == nullptr)
+        if(gl2ps->imagemap_head == NULL)
           gl2ps->imagemap_head = node;
         else
           gl2ps->imagemap_tail->next = node;
@@ -2858,6 +2858,7 @@ static void gl2psPrintPostScriptHeader(void)
               "/STRR{ gsave FCT moveto rotate SW neg SH neg rmoveto show grestore } BD\n");
 
   gl2psPrintf("/P  { newpath 0.0 360.0 arc closepath fill } BD\n"
+              "/R  { newpath moveto lineto lineto lineto closepath fill } BD\n"
               "/LS { newpath moveto } BD\n"
               "/L  { lineto } BD\n"
               "/LE { lineto stroke } BD\n"
@@ -3098,8 +3099,22 @@ static void gl2psPrintPostScriptPrimitive(void *data)
   switch(prim->type){
   case GL2PS_POINT :
     gl2psPrintPostScriptColor(prim->verts[0].rgba);
-    gl2psPrintf("%g %g %g P\n",
-                prim->verts[0].xyz[0], prim->verts[0].xyz[1], 0.5 * prim->width);
+    if(gl2ps->options & GL2PS_SQUARE_POINTS) {
+      gl2psPrintf("%g %g %g %g %g %g %g %g R\n",
+                  prim->verts[0].xyz[0] - 0.5*prim->width,
+                  prim->verts[0].xyz[1] - 0.5*prim->width,
+                  prim->verts[0].xyz[0] - 0.5*prim->width,
+                  prim->verts[0].xyz[1] + 0.5*prim->width,
+                  prim->verts[0].xyz[0] + 0.5*prim->width,
+                  prim->verts[0].xyz[1] + 0.5*prim->width,
+                  prim->verts[0].xyz[0] + 0.5*prim->width,
+                  prim->verts[0].xyz[1] - 0.5*prim->width);
+    }
+    else {
+      gl2psPrintf("%g %g %g P\n",
+                  prim->verts[0].xyz[0], prim->verts[0].xyz[1],
+                  0.5 * prim->width);
+    }
     break;
   case GL2PS_LINE :
     if(!gl2psSamePosition(gl2ps->lastvertex.xyz, prim->verts[0].xyz) ||
@@ -3652,7 +3667,7 @@ static void gl2psPDFgroupObjectInit(GL2PSpdfgroup *gro)
   if(!gro)
     return;
 
-  gro->ptrlist = nullptr;
+  gro->ptrlist = NULL;
   gro->fontno = gro->gsno = gro->imno = gro->maskshno = gro->shno
     = gro->trgroupno = gro->fontobjno = gro->imobjno = gro->shobjno
     = gro->maskshobjno = gro->gsobjno = gro->trgroupobjno = -1;
@@ -3663,7 +3678,7 @@ static void gl2psPDFgroupObjectInit(GL2PSpdfgroup *gro)
 static void gl2psPDFgroupListInit(void)
 {
   int i;
-  GL2PSprimitive *p = nullptr;
+  GL2PSprimitive *p = NULL;
   GL2PSpdfgroup gro;
   int lasttype = GL2PS_NO_TYPE;
   GL2PSrgba lastrgba = {-1.0F, -1.0F, -1.0F, -1.0F};
@@ -3770,7 +3785,7 @@ static void gl2psPDFgroupListInit(void)
 static void gl2psSortOutTrianglePDFgroup(GL2PSpdfgroup *gro)
 {
   GL2PStriangle t;
-  GL2PSprimitive *prim = nullptr;
+  GL2PSprimitive *prim = NULL;
 
   if(!gro)
     return;
@@ -3824,7 +3839,7 @@ static void gl2psSortOutTrianglePDFgroup(GL2PSpdfgroup *gro)
 static void gl2psPDFgroupListWriteMainStream(void)
 {
   int i, j, lastel, count;
-  GL2PSprimitive *prim = nullptr, *prev = nullptr;
+  GL2PSprimitive *prim = NULL, *prev = NULL;
   GL2PSpdfgroup *gro;
   GL2PStriangle t;
 
@@ -3849,10 +3864,15 @@ static void gl2psPDFgroupListWriteMainStream(void)
       gl2ps->streamlength += gl2psPrintPDFStrokeColor(prim->verts[0].rgba);
       for(j = 0; j <= lastel; ++j){
         prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j);
-        gl2ps->streamlength +=
-          gl2psPrintf("%f %f m %f %f l\n",
-                      prim->verts[0].xyz[0], prim->verts[0].xyz[1],
-                      prim->verts[0].xyz[0], prim->verts[0].xyz[1]);
+        if(gl2ps->options & GL2PS_SQUARE_POINTS)
+          gl2ps->streamlength +=
+            gl2psPrintf("%f %f 1 1 re\n", prim->verts[0].xyz[0],
+                        prim->verts[0].xyz[1]);
+        else
+          gl2ps->streamlength +=
+            gl2psPrintf("%f %f m %f %f l\n", prim->verts[0].xyz[0],
+                        prim->verts[0].xyz[1], prim->verts[0].xyz[0],
+                        prim->verts[0].xyz[1]);
       }
       gl2ps->streamlength += gl2psPrintf("S\n");
       gl2ps->streamlength += gl2psPrintf("0 J\n");
@@ -4075,7 +4095,7 @@ static int gl2psPDFgroupListWriteShaderResources(void)
 static int gl2psPDFgroupListWriteXObjectResources(void)
 {
   int i;
-  GL2PSprimitive *p = nullptr;
+  GL2PSprimitive *p = NULL;
   GL2PSpdfgroup *gro;
   int offs = 0;
 
@@ -4131,7 +4151,7 @@ static int gl2psPDFgroupListWriteFontResources(void)
 static void gl2psPDFgroupListDelete(void)
 {
   int i;
-  GL2PSpdfgroup *gro = nullptr;
+  GL2PSpdfgroup *gro = NULL;
 
   if(!gl2ps->pdfgrouplist)
     return;
@@ -4142,7 +4162,7 @@ static void gl2psPDFgroupListDelete(void)
   }
 
   gl2psListDelete(gl2ps->pdfgrouplist);
-  gl2ps->pdfgrouplist = nullptr;
+  gl2ps->pdfgrouplist = NULL;
 }
 
 /* Print 1st PDF object - file info */
@@ -4870,7 +4890,7 @@ static int gl2psPrintPDFText(int obj, GL2PSstring *s, int fontnumber)
 static int gl2psPDFgroupListWriteObjects(int entryoffs)
 {
   int i,j;
-  GL2PSprimitive *p = nullptr;
+  GL2PSprimitive *p = NULL;
   GL2PSpdfgroup *gro;
   int offs = entryoffs;
   GL2PStriangle *triangles;
@@ -5001,7 +5021,7 @@ static void gl2psPrintPDFFooter(void)
   if(gl2ps->options & GL2PS_COMPRESS){
     gl2psFreeCompress();
     gl2psFree(gl2ps->compress);
-    gl2ps->compress = nullptr;
+    gl2ps->compress = NULL;
   }
 #endif
 }
@@ -5321,10 +5341,19 @@ static void gl2psPrintSVGPrimitive(void *data)
   switch(prim->type){
   case GL2PS_POINT :
     gl2psSVGGetColorString(rgba[0], col);
-    gl2psPrintf("<circle fill=\"%s\" ", col);
-    if(rgba[0][3] < 1.0F) gl2psPrintf("fill-opacity=\"%g\" ", rgba[0][3]);
-    gl2psPrintf("cx=\"%g\" cy=\"%g\" r=\"%g\"/>\n",
-                xyz[0][0], xyz[0][1], 0.5 * prim->width);
+    if(gl2ps->options & GL2PS_SQUARE_POINTS){
+      gl2psPrintf("<rect fill=\"%s\" ", col);
+      if (rgba[0][3] < 1.0F) gl2psPrintf("fill-opacity=\"%g\" ", rgba[0][3]);
+      gl2psPrintf("x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\"/>\n",
+                  xyz[0][0] - 0.5*prim->width, xyz[0][1] - 0.5*prim->width,
+                  prim->width, prim->width);
+    }
+    else {
+      gl2psPrintf("<circle fill=\"%s\" ", col);
+      if (rgba[0][3] < 1.0F) gl2psPrintf("fill-opacity=\"%g\" ", rgba[0][3]);
+      gl2psPrintf("cx=\"%g\" cy=\"%g\" r=\"%g\"/>\n",
+                  xyz[0][0], xyz[0][1], 0.5 * prim->width);
+    }
     break;
   case GL2PS_LINE :
     if(!gl2psSamePosition(gl2ps->lastvertex.xyz, prim->verts[0].xyz) ||
@@ -5645,12 +5674,16 @@ static void gl2psPrintPGFPrimitive(void *data)
   case GL2PS_POINT :
     /* Points in openGL are rectangular */
     gl2psPrintPGFColor(prim->verts[0].rgba);
-    fprintf(gl2ps->stream,
-            "\\pgfpathrectangle{\\pgfpoint{%fpt}{%fpt}}"
-            "{\\pgfpoint{%fpt}{%fpt}}\n\\pgfusepath{fill}\n",
-            prim->verts[0].xyz[0]-0.5*prim->width,
-            prim->verts[0].xyz[1]-0.5*prim->width,
-            prim->width,prim->width);
+    if(gl2ps->options & GL2PS_SQUARE_POINTS)
+      fprintf(gl2ps->stream, "\\pgfpathrectangle{\\pgfpoint{%fpt}{%fpt}}"
+              "{\\pgfpoint{%fpt}{%fpt}}\n\\pgfusepath{fill}\n",
+              prim->verts[0].xyz[0]-0.5*prim->width,
+              prim->verts[0].xyz[1]-0.5*prim->width,
+              prim->width, prim->width);
+    else
+      fprintf(gl2ps->stream, "\\pgfpathcircle{\\pgfpoint{%fpt}{%fpt}}"
+              "{%fpt}\n\\pgfusepath{fill}\n",
+              prim->verts[0].xyz[0], prim->verts[0].xyz[1], 0.5*prim->width);
     break;
   case GL2PS_LINE :
     gl2psPrintPGFColor(prim->verts[0].rgba);
@@ -6011,7 +6044,7 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
   /* Validate options */
   if (gl2psCheckOptions(options, colormode) == GL_FALSE) {
     gl2psFree(gl2ps);
-    gl2ps = nullptr;
+    gl2ps = NULL;
     return GL2PS_ERROR;
   }
 
@@ -6021,7 +6054,7 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
   else {
     gl2psMsg(GL2PS_ERROR, "Unknown output format: %d", format);
     gl2psFree(gl2ps);
-    gl2ps = nullptr;
+    gl2ps = NULL;
     return GL2PS_ERROR;
   }
 
@@ -6034,7 +6067,7 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
   default :
     gl2psMsg(GL2PS_ERROR, "Unknown sorting algorithm: %d", sort);
     gl2psFree(gl2ps);
-    gl2ps = nullptr;
+    gl2ps = NULL;
     return GL2PS_ERROR;
   }
 
@@ -6044,7 +6077,7 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
   else{
     gl2psMsg(GL2PS_ERROR, "Bad file pointer");
     gl2psFree(gl2ps);
-    gl2ps = nullptr;
+    gl2ps = NULL;
     return GL2PS_ERROR;
   }
 
@@ -6052,9 +6085,9 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
   gl2ps->forcerasterpos = GL_FALSE;
   gl2ps->maxbestroot = 10;
   gl2ps->options = options;
-  gl2ps->compress = nullptr;
-  gl2ps->imagemap_head = nullptr;
-  gl2ps->imagemap_tail = nullptr;
+  gl2ps->compress = NULL;
+  gl2ps->imagemap_head = NULL;
+  gl2ps->imagemap_tail = NULL;
 
   if(gl2ps->options & GL2PS_USE_CURRENT_VIEWPORT){
     glGetIntegerv(GL_VIEWPORT, gl2ps->viewport);
@@ -6070,7 +6103,7 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
              gl2ps->viewport[0], gl2ps->viewport[1],
              gl2ps->viewport[2], gl2ps->viewport[3]);
     gl2psFree(gl2ps);
-    gl2ps = nullptr;
+    gl2ps = NULL;
     return GL2PS_ERROR;
   }
 
@@ -6091,12 +6124,12 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
   gl2ps->lastlinejoin = 0;
   gl2ps->lastpattern = 0;
   gl2ps->lastfactor = 0;
-  gl2ps->imagetree = nullptr;
-  gl2ps->primitivetoadd = nullptr;
+  gl2ps->imagetree = NULL;
+  gl2ps->primitivetoadd = NULL;
   gl2ps->zerosurfacearea = GL_FALSE;
-  gl2ps->pdfprimlist = nullptr;
-  gl2ps->pdfgrouplist = nullptr;
-  gl2ps->xreflist = nullptr;
+  gl2ps->pdfprimlist = NULL;
+  gl2ps->pdfgrouplist = NULL;
+  gl2ps->xreflist = NULL;
 
   /* get default blending mode from current OpenGL state (enabled by
      default for SVG) */
@@ -6112,7 +6145,7 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
 
   if(gl2ps->colormode == GL_RGBA){
     gl2ps->colorsize = 0;
-    gl2ps->colormap = nullptr;
+    gl2ps->colormap = NULL;
     if ((gl2ps->options & GL2PS_NO_OPENGL_CONTEXT) == GL2PS_NONE) {
       glGetFloatv(GL_COLOR_CLEAR_VALUE, gl2ps->bgcolor);
     }
@@ -6121,7 +6154,7 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
     if(!colorsize || !colormap){
       gl2psMsg(GL2PS_ERROR, "Missing colormap for GL_COLOR_INDEX rendering");
       gl2psFree(gl2ps);
-      gl2ps = nullptr;
+      gl2ps = NULL;
       return GL2PS_ERROR;
     }
     gl2ps->colorsize = colorsize;
@@ -6136,7 +6169,7 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
   else{
     gl2psMsg(GL2PS_ERROR, "Unknown color mode in gl2psBeginPage");
     gl2psFree(gl2ps);
-    gl2ps = nullptr;
+    gl2ps = NULL;
     return GL2PS_ERROR;
   }
 
@@ -6176,7 +6209,7 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
     glRenderMode(GL_FEEDBACK);
   }
   else {
-    gl2ps->feedback = nullptr;
+    gl2ps->feedback = NULL;
     gl2ps->buffersize = 0;
   }
 
@@ -6207,7 +6240,7 @@ GL2PSDLL_API GLint gl2psEndPage(void)
   gl2psFree(gl2ps->filename);
   gl2psFree(gl2ps->feedback);
   gl2psFree(gl2ps);
-  gl2ps = nullptr;
+  gl2ps = NULL;
 
   return res;
 }
@@ -6251,7 +6284,7 @@ GL2PSDLL_API GLint gl2psSorting(GLint mode)
   default :
     gl2psMsg(GL2PS_ERROR, "Unknown sorting algorithm: %d", mode);
     gl2psFree(gl2ps);
-    gl2ps = nullptr;
+    gl2ps = NULL;
     res = GL2PS_ERROR;
   }
 
@@ -6282,18 +6315,18 @@ GL2PSDLL_API GLint gl2psTextOptColorBL(const char *str, const char *fontname,
 GL2PSDLL_API GLint gl2psTextOpt(const char *str, const char *fontname,
                                 GLshort fontsize, GLint alignment, GLfloat angle)
 {
-  return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, nullptr, GL_FALSE, 0, 0);
+  return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, NULL, GL_FALSE, 0, 0);
 }
 
 GL2PSDLL_API GLint gl2psText(const char *str, const char *fontname, GLshort fontsize)
 {
   return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, GL2PS_TEXT_BL, 0.0F,
-                      nullptr, GL_FALSE, 0, 0);
+                      NULL, GL_FALSE, 0, 0);
 }
 
 GL2PSDLL_API GLint gl2psSpecial(GLint format, const char *str)
 {
-  return gl2psAddText(GL2PS_SPECIAL, str, "", 0, format, 0.0F, nullptr, GL_FALSE, 0, 0);
+  return gl2psAddText(GL2PS_SPECIAL, str, "", 0, format, 0.0F, NULL, GL_FALSE, 0, 0);
 }
 
 GL2PSDLL_API GLint gl2psSpecialColor(GLint format, const char *str, GL2PSrgba rgba)
diff --git a/Graphics/gl2ps.h b/Graphics/gl2ps.h
index 6a5ee62584765e672f73b4bfd8ec55b6943a7be1..67f0c93e8069e1adca476f994bb202c53b753c56 100644
--- a/Graphics/gl2ps.h
+++ b/Graphics/gl2ps.h
@@ -26,7 +26,7 @@
  * file named "COPYING.GL2PS"; if not, I will be glad to provide one.
  *
  * For the latest info about gl2ps and a full list of contributors, see
- * http://www.geuz.org/gl2ps/.
+ * https://geuz.org/gl2ps/.
  *
  * Please report all issues on https://gitlab.onelab.info/gl2ps/gl2ps/issues.
  */
@@ -140,6 +140,7 @@
 #define GL2PS_TIGHT_BOUNDING_BOX   (1<<12)
 #define GL2PS_NO_OPENGL_CONTEXT    (1<<13)
 #define GL2PS_NO_TEX_FONTSIZE      (1<<14)
+#define GL2PS_SQUARE_POINTS        (1<<15)
 
 /* Arguments for gl2psEnable/gl2psDisable */
 
diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp
index 8de61a581f90d5af7dd4709a0ae7a24e4f8a5135..1fc46ff801ea89ac24beee1cef70799592cb8327 100644
--- a/Mesh/Field.cpp
+++ b/Mesh/Field.cpp
@@ -1206,15 +1206,15 @@ private:
 public:
   Popen2()
   {
-    _hIn = NULL;
-    _hOut = NULL;
+    _hIn = nullptr;
+    _hOut = nullptr;
   }
   void stop()
   {
     if(_hIn) {
       CloseHandle(_hIn);
       CloseHandle(_hOut);
-      _hIn = _hOut = NULL;
+      _hIn = _hOut = nullptr;
     }
   }
   bool started() const { return _hIn; }
@@ -1226,7 +1226,7 @@ public:
     SECURITY_ATTRIBUTES saAttr;
     saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
     saAttr.bInheritHandle = TRUE;
-    saAttr.lpSecurityDescriptor = NULL;
+    saAttr.lpSecurityDescriptor = nullptr;
     if(!CreatePipe(&_hIn, &hChildStd_OUT_Wr, &saAttr, 0))
       Msg::Error("StdoutRd CreatePipe");
     if(!CreatePipe(&hChildStd_IN_Rd, &_hOut, &saAttr, 0))
@@ -1244,11 +1244,11 @@ public:
     siStartInfo.hStdOutput = hChildStd_OUT_Wr;
     siStartInfo.hStdInput = hChildStd_IN_Rd;
     siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
-    bSuccess = CreateProcess(NULL, (char *)command, NULL, NULL, TRUE, 0, NULL,
-                             NULL, &siStartInfo, &piProcInfo);
+    bSuccess = CreateProcess(nullptr, (char *)command, nullptr, nullptr, TRUE,
+                             0, nullptr, nullptr, &siStartInfo, &piProcInfo);
     if(!bSuccess) {
       Msg::Error("Child process creation failed %i", GetLastError());
-      _hIn = _hOut = NULL;
+      _hIn = _hOut = nullptr;
       return false;
     }
     CloseHandle(piProcInfo.hProcess);
@@ -1259,14 +1259,14 @@ public:
   {
     if(!_hIn) return false;
     DWORD nSuccess = 0;
-    ReadFile(_hIn, data, size, &nSuccess, NULL);
+    ReadFile(_hIn, data, size, &nSuccess, nullptr);
     return nSuccess == size;
   }
   bool write(void *data, size_t size)
   {
     if(!_hOut) return false;
     DWORD nSuccess = 0;
-    WriteFile(_hOut, data, size, &nSuccess, NULL);
+    WriteFile(_hOut, data, size, &nSuccess, nullptr);
     return nSuccess == size;
   }
   ~Popen2() { stop(); }
@@ -1302,7 +1302,7 @@ public:
       dup2(p_stdin[0], 0);
       close(p_stdout[0]);
       dup2(p_stdout[1], 1);
-      execl("/bin/sh", "sh", "-c", command, NULL);
+      execl("/bin/sh", "sh", "-c", command, nullptr);
       perror("execl");
       exit(0);
     }
diff --git a/Mesh/meshGRegionBoundaryRecovery.cpp b/Mesh/meshGRegionBoundaryRecovery.cpp
index d6f9f91ea82a296a68152a56e3fcd62103b546f6..482df260ac66f3d375316673e5bf92e03eb095ff 100644
--- a/Mesh/meshGRegionBoundaryRecovery.cpp
+++ b/Mesh/meshGRegionBoundaryRecovery.cpp
@@ -436,7 +436,7 @@ namespace tetgenBR {
               }
               decode(tptr, checktet);
             } while(checktet.tet != nullptr);
-          } // if(checktet.tet != NULL)
+          } // if(checktet.tet != nullptr)
         } // for(tetloop.ver = 0; ...
       } // i
 
@@ -471,7 +471,7 @@ namespace tetgenBR {
               }
               if(face2.tet != nullptr) {
                 // Found an adjacent hull tet.
-                assert(face2.tet[face2.ver & 3] == NULL);
+                assert(face2.tet[face2.ver & 3] == nullptr);
                 esym(hulltet, face1);
                 bond(face1, face2);
               }
@@ -629,7 +629,7 @@ namespace tetgenBR {
             /*	  point *ppt;
             subsegs->traversalinit();
             segloop.sh = shellfacetraverse(subsegs);
-            while (segloop.sh != NULL){
+            while (segloop.sh != nullptr){
               ppt = (point *) &(segloop.sh[3]);
               if(((ppt[0] == p[0]) && (ppt[1] == p[1])) ||
               ((ppt[0] == p[1]) && (ppt[1] == p[0]))){
@@ -770,7 +770,7 @@ namespace tetgenBR {
             // Check if this Steiner point locates on boundary.
             if(pointtype(pointloop) == FREESEGVERTEX) {
               sdecode(point2sh(pointloop), parentseg);
-              assert(parentseg.sh != NULL);
+              assert(parentseg.sh != nullptr);
               l_edges.insert(shellmark(parentseg));
               // Get the GEdge containing this vertex.
               GEdge *ge = nullptr;
@@ -838,7 +838,7 @@ namespace tetgenBR {
             }
             else if(pointtype(pointloop) == FREEFACETVERTEX) {
               sdecode(point2sh(pointloop), parentsh);
-              assert(parentsh.sh != NULL);
+              assert(parentsh.sh != nullptr);
               l_faces.insert(shellmark(parentsh));
               // Get the GFace containing this vertex.
               GFace *gf = nullptr;
@@ -948,7 +948,7 @@ namespace tetgenBR {
           });
 
           GFace *gf = face_location == end(f_list) ? nullptr : *face_location;
-          assert(gf != NULL);
+          assert(gf != nullptr);
 
           // Delete the old triangles.
           Msg::Info(" - Steiner points exist on surface %d", gf->tag());
diff --git a/Mesh/meshGRegionMMG.cpp b/Mesh/meshGRegionMMG.cpp
index 607340a31683014894e671a745747bb3371ed95a..f0cc5e3d2c59b4ed89eda9a9237acbf7cc7d1fb1 100644
--- a/Mesh/meshGRegionMMG.cpp
+++ b/Mesh/meshGRegionMMG.cpp
@@ -81,7 +81,7 @@ static void MMG2gmsh(GRegion *gr, MMG5_pMesh mmg,
   // mesh
   for(int k = 1; k <= nt; k++) {
     int v1mmg, v2mmg, v3mmg;
-    if(MMG3D_Get_triangle(mmg, &v1mmg, &v2mmg, &v3mmg, &ref, NULL) != 1)
+    if(MMG3D_Get_triangle(mmg, &v1mmg, &v2mmg, &v3mmg, &ref, nullptr) != 1)
       Msg::Error("Mmg3d: unable to get triangle %d", k);
 
     MVertex *v1 = kToMVertex[v1mmg];
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index f5c8612c2330b773a6ad0432df4c8e75a6ade21e..c46b83bcdda1998fb75c9482a66a831c6b9bb6b1 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -723,10 +723,10 @@ int treat_Struct_FullName_dot_tSTRING_Float_getDim
   (char* c1, char* c2, char* c3);
 char* treat_Struct_FullName_String
   (char* c1, char* c2, int type_var = 1, int index = 0,
-   char* val_default = NULL, int type_treat = 0);
+   char* val_default = nullptr, int type_treat = 0);
 char* treat_Struct_FullName_dot_tSTRING_String
   (char* c1, char* c2, char* c3, int index = 0,
-   char* val_default = NULL, int type_treat = 0);
+   char* val_default = nullptr, int type_treat = 0);
 List_T * treat_Struct_FullName_dot_tSTRING_ListOfString
   (char* c1, char* c2, char* c3);
 
@@ -10204,7 +10204,7 @@ yyreduce:
           double d;
           List_Read((yyvsp[(7) - (8)].l), 0, &d);
           gLevelset *pl = gLevelset::find((int)d);
-          gLevelset *ls = NULL;
+          gLevelset *ls = nullptr;
           if(!pl) yymsg(0, "Unknown levelset %d", (int)d);
           else ls = new gLevelsetReverse(pl, t);
           if(ls) gLevelset::add(ls);
@@ -11175,7 +11175,7 @@ yyreduce:
       if(!FunctionManager::Instance()->createFunction
          (std::string((yyvsp[(2) - (2)].c)), gmsh_yyin, gmsh_yyname, gmsh_yylineno))
 	yymsg(0, "Redefinition of function %s", (yyvsp[(2) - (2)].c));
-      skip(NULL, "Return");
+      skip(nullptr, "Return");
       Free((yyvsp[(2) - (2)].c));
     ;}
     break;
@@ -11186,7 +11186,7 @@ yyreduce:
       if(!FunctionManager::Instance()->createFunction
          (std::string((yyvsp[(2) - (2)].c)), gmsh_yyin, gmsh_yyname, gmsh_yylineno))
 	yymsg(0, "Redefinition of function %s", (yyvsp[(2) - (2)].c));
-      skip(NULL, "Return");
+      skip(nullptr, "Return");
       Free((yyvsp[(2) - (2)].c));
     ;}
     break;
@@ -13130,14 +13130,14 @@ yyreduce:
   case 467:
 #line 5381 "Gmsh.y"
     {
-      (yyval.d) = treat_Struct_FullName_Float(NULL, (yyvsp[(1) - (4)].c), 2, (int)(yyvsp[(3) - (4)].d));
+      (yyval.d) = treat_Struct_FullName_Float(nullptr, (yyvsp[(1) - (4)].c), 2, (int)(yyvsp[(3) - (4)].d));
     ;}
     break;
 
   case 468:
 #line 5386 "Gmsh.y"
     {
-      (yyval.d) = treat_Struct_FullName_Float(NULL, (yyvsp[(1) - (4)].c), 2, (int)(yyvsp[(3) - (4)].d));
+      (yyval.d) = treat_Struct_FullName_Float(nullptr, (yyvsp[(1) - (4)].c), 2, (int)(yyvsp[(3) - (4)].d));
     ;}
     break;
 
@@ -13305,7 +13305,7 @@ yyreduce:
   case 483:
 #line 5510 "Gmsh.y"
     {
-      (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[(1) - (3)].c), (yyvsp[(3) - (3)].c));
+      (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(nullptr, (yyvsp[(1) - (3)].c), (yyvsp[(3) - (3)].c));
     ;}
     break;
 
@@ -13319,7 +13319,7 @@ yyreduce:
   case 485:
 #line 5518 "Gmsh.y"
     {
-      (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d));
+      (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(nullptr, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d));
     ;}
     break;
 
@@ -13333,7 +13333,7 @@ yyreduce:
   case 487:
 #line 5526 "Gmsh.y"
     {
-      (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d));
+      (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(nullptr, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d));
     ;}
     break;
 
@@ -13467,7 +13467,7 @@ yyreduce:
 
   case 500:
 #line 5628 "Gmsh.y"
-    { (yyval.c) = NULL; ;}
+    { (yyval.c) = nullptr; ;}
     break;
 
   case 501:
@@ -13503,7 +13503,7 @@ yyreduce:
 
   case 504:
 #line 5658 "Gmsh.y"
-    { (yyval.c2).char1 = NULL; (yyval.c2).char2 = (yyvsp[(1) - (1)].c); ;}
+    { (yyval.c2).char1 = nullptr; (yyval.c2).char2 = (yyvsp[(1) - (1)].c); ;}
     break;
 
   case 505:
@@ -13948,7 +13948,7 @@ yyreduce:
   case 550:
 #line 5988 "Gmsh.y"
     {
-      (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfFloat(NULL, (yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c));
+      (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfFloat(nullptr, (yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c));
     ;}
     break;
 
@@ -14239,7 +14239,7 @@ yyreduce:
 #line 6224 "Gmsh.y"
     {
       // No need to extend to Struct_FullName (a Tag is not a String)
-      (yyval.c) = treat_Struct_FullName_String(NULL, (yyvsp[(1) - (1)].c));
+      (yyval.c) = treat_Struct_FullName_String(nullptr, (yyvsp[(1) - (1)].c));
     ;}
     break;
 
@@ -14280,7 +14280,7 @@ yyreduce:
   case 579:
 #line 6257 "Gmsh.y"
     {
-      (yyval.c) = treat_Struct_FullName_dot_tSTRING_String(NULL, (yyvsp[(1) - (3)].c), (yyvsp[(3) - (3)].c));
+      (yyval.c) = treat_Struct_FullName_dot_tSTRING_String(nullptr, (yyvsp[(1) - (3)].c), (yyvsp[(3) - (3)].c));
     ;}
     break;
 
@@ -14294,7 +14294,7 @@ yyreduce:
   case 581:
 #line 6265 "Gmsh.y"
     {
-      (yyval.c) = treat_Struct_FullName_dot_tSTRING_String(NULL, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d));
+      (yyval.c) = treat_Struct_FullName_dot_tSTRING_String(nullptr, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d));
     ;}
     break;
 
@@ -14429,7 +14429,7 @@ yyreduce:
   case 596:
 #line 6359 "Gmsh.y"
     {
-      (yyval.c) = treat_Struct_FullName_String(NULL, (yyvsp[(3) - (5)].c2).char2, 1, 0, (yyvsp[(4) - (5)].c), 2);
+      (yyval.c) = treat_Struct_FullName_String(nullptr, (yyvsp[(3) - (5)].c2).char2, 1, 0, (yyvsp[(4) - (5)].c), 2);
     ;}
     break;
 
@@ -14696,7 +14696,7 @@ yyreduce:
 #line 6559 "Gmsh.y"
     {
       std::string out;
-      const std::string * key_struct = NULL;
+      const std::string * key_struct = nullptr;
       switch (gmsh_yynamespaces.get_key_struct_from_tag(struct_namespace,
                                                         (int)(yyvsp[(3) - (4)].d), key_struct)) {
       case 0:
@@ -14798,7 +14798,7 @@ yyreduce:
   case 630:
 #line 6645 "Gmsh.y"
     {
-      (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfString(NULL, (yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c));
+      (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfString(nullptr, (yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c));
     ;}
     break;
 
@@ -15805,7 +15805,7 @@ double treat_Struct_FullName_dot_tSTRING_Float
     break;
   case 2:
     if (type_treat != 0) {
-      const std::string * out_dummy = NULL;
+      const std::string * out_dummy = nullptr;
       out = (gmsh_yynamespaces.getMember
              (struct_namespace, struct_name, key_member, out_dummy))?
         val_default : 1.;
@@ -15830,7 +15830,7 @@ double treat_Struct_FullName_dot_tSTRING_Float
 List_T * treat_Struct_FullName_dot_tSTRING_ListOfFloat
 (char* c1, char* c2, char* c3)
 {
-  List_T * out, * val_default = NULL;
+  List_T * out, * val_default = nullptr;
   const std::vector<double> * out_vector; double val_;
   std::string struct_namespace(c1? c1 : std::string("")), struct_name(c2);
   std::string key_member(c3);
@@ -15884,7 +15884,7 @@ char * treat_Struct_FullName_String
 (char* c1, char* c2, int type_var, int index, char * val_default, int type_treat)
 {
   std::string string_default(val_default? val_default : std::string(""));
-  const std::string * out = NULL;
+  const std::string * out = nullptr;
   std::string out_tmp;
   if(!c1 && gmsh_yystringsymbols.count(c2)){
     // Get (0) or GetForced (2)
@@ -15912,7 +15912,7 @@ char* treat_Struct_FullName_dot_tSTRING_String
 (char* c1, char* c2, char* c3, int index, char * val_default, int type_treat)
 {
   std::string string_default(val_default? val_default : std::string(""));
-  const std::string * out = NULL;
+  const std::string * out = nullptr;
   std::string out_tmp; // PD: we should avoid that -> StringOption() to be changed
   std::string struct_namespace(c1? c1 : std::string("")), struct_name(c2);
   std::string key_member(c3);
@@ -15947,7 +15947,7 @@ char* treat_Struct_FullName_dot_tSTRING_String
 List_T * treat_Struct_FullName_dot_tSTRING_ListOfString
 (char* c1, char* c2, char* c3)
 {
-  List_T * out, * val_default = NULL;
+  List_T * out, * val_default = nullptr;
   const std::vector<std::string> * out_vector; char * val_;
   std::string struct_namespace(c1? c1 : std::string("")), struct_name(c2);
   std::string key_member(c3);
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index cec8417a49dcf66407c5a040f523a0e5e47fcda0..f320def5e15f4d5c38e2609810c31891fe502859 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -152,10 +152,10 @@ int treat_Struct_FullName_dot_tSTRING_Float_getDim
   (char* c1, char* c2, char* c3);
 char* treat_Struct_FullName_String
   (char* c1, char* c2, int type_var = 1, int index = 0,
-   char* val_default = NULL, int type_treat = 0);
+   char* val_default = nullptr, int type_treat = 0);
 char* treat_Struct_FullName_dot_tSTRING_String
   (char* c1, char* c2, char* c3, int index = 0,
-   char* val_default = NULL, int type_treat = 0);
+   char* val_default = nullptr, int type_treat = 0);
 List_T * treat_Struct_FullName_dot_tSTRING_ListOfString
   (char* c1, char* c2, char* c3);
 
@@ -3065,7 +3065,7 @@ LevelSet :
           double d;
           List_Read($7, 0, &d);
           gLevelset *pl = gLevelset::find((int)d);
-          gLevelset *ls = NULL;
+          gLevelset *ls = nullptr;
           if(!pl) yymsg(0, "Unknown levelset %d", (int)d);
           else ls = new gLevelsetReverse(pl, t);
           if(ls) gLevelset::add(ls);
@@ -3906,7 +3906,7 @@ Loop :
       if(!FunctionManager::Instance()->createFunction
          (std::string($2), gmsh_yyin, gmsh_yyname, gmsh_yylineno))
 	yymsg(0, "Redefinition of function %s", $2);
-      skip(NULL, "Return");
+      skip(nullptr, "Return");
       Free($2);
     }
   | tMacro StringExpr
@@ -3914,7 +3914,7 @@ Loop :
       if(!FunctionManager::Instance()->createFunction
          (std::string($2), gmsh_yyin, gmsh_yyname, gmsh_yylineno))
 	yymsg(0, "Redefinition of function %s", $2);
-      skip(NULL, "Return");
+      skip(nullptr, "Return");
       Free($2);
     }
   | tReturn
@@ -5379,12 +5379,12 @@ FExpr_Single :
   | String__Index '[' FExpr ']'
     //  | Struct_FullName '[' FExpr ']'
     {
-      $$ = treat_Struct_FullName_Float(NULL, $1, 2, (int)$3);
+      $$ = treat_Struct_FullName_Float(nullptr, $1, 2, (int)$3);
     }
   | String__Index '(' FExpr ')'
     //  | Struct_FullName '(' FExpr ')'
     {
-      $$ = treat_Struct_FullName_Float(NULL, $1, 2, (int)$3);
+      $$ = treat_Struct_FullName_Float(nullptr, $1, 2, (int)$3);
     }
   | tExists '(' Struct_FullName ')'
     {
@@ -5508,7 +5508,7 @@ FExpr_Single :
   // Option Strings
   | String__Index '.' tSTRING_Reserved
     {
-      $$ = treat_Struct_FullName_dot_tSTRING_Float(NULL, $1, $3);
+      $$ = treat_Struct_FullName_dot_tSTRING_Float(nullptr, $1, $3);
     }
   | String__Index tSCOPE String__Index '.' tSTRING_Reserved
     {
@@ -5516,7 +5516,7 @@ FExpr_Single :
     }
   | String__Index '.' tSTRING_Reserved '(' FExpr ')'
     {
-      $$ = treat_Struct_FullName_dot_tSTRING_Float(NULL, $1, $3, (int)$5);
+      $$ = treat_Struct_FullName_dot_tSTRING_Float(nullptr, $1, $3, (int)$5);
     }
   | String__Index tSCOPE String__Index '.' tSTRING_Reserved '(' FExpr ')'
     {
@@ -5524,7 +5524,7 @@ FExpr_Single :
     }
   | String__Index '.' tSTRING_Reserved '[' FExpr ']'
     {
-      $$ = treat_Struct_FullName_dot_tSTRING_Float(NULL, $1, $3, (int)$5);
+      $$ = treat_Struct_FullName_dot_tSTRING_Float(nullptr, $1, $3, (int)$5);
     }
   | String__Index tSCOPE String__Index '.' tSTRING_Reserved '[' FExpr ']'
     {
@@ -5625,7 +5625,7 @@ GetForced_Default :
 
 GetForcedStr_Default :
     // none
-    { $$ = NULL; }
+    { $$ = nullptr; }
   | ',' StringExprVar
     { $$ = $2;}
 ;
@@ -5655,7 +5655,7 @@ DefineStruct :
 
 Struct_FullName :
     String__Index
-    { $$.char1 = NULL; $$.char2 = $1; }
+    { $$.char1 = nullptr; $$.char2 = $1; }
   | String__Index tSCOPE String__Index
     { $$.char1 = $1; $$.char2 = $3; }
 ;
@@ -5986,7 +5986,7 @@ FExpr_Multi :
     }
   | String__Index '.' tSTRING_Reserved LP RP
     {
-      $$ = treat_Struct_FullName_dot_tSTRING_ListOfFloat(NULL, $1, $3);
+      $$ = treat_Struct_FullName_dot_tSTRING_ListOfFloat(nullptr, $1, $3);
     }
   | String__Index tSCOPE String__Index '.' tSTRING_Reserved LP RP
     {
@@ -6223,7 +6223,7 @@ StringExprVar :
   | String__Index
     {
       // No need to extend to Struct_FullName (a Tag is not a String)
-      $$ = treat_Struct_FullName_String(NULL, $1);
+      $$ = treat_Struct_FullName_String(nullptr, $1);
     }
   | String__Index '[' FExpr ']'
     {
@@ -6255,7 +6255,7 @@ StringExprVar :
     }
   | String__Index '.' tSTRING_Reserved
     {
-      $$ = treat_Struct_FullName_dot_tSTRING_String(NULL, $1, $3);
+      $$ = treat_Struct_FullName_dot_tSTRING_String(nullptr, $1, $3);
     }
   | String__Index tSCOPE String__Index '.' tSTRING_Reserved
     {
@@ -6263,7 +6263,7 @@ StringExprVar :
     }
   | String__Index '.' tSTRING_Reserved '(' FExpr ')'
     {
-      $$ = treat_Struct_FullName_dot_tSTRING_String(NULL, $1, $3, (int)$5);
+      $$ = treat_Struct_FullName_dot_tSTRING_String(nullptr, $1, $3, (int)$5);
     }
   | String__Index tSCOPE String__Index '.' tSTRING_Reserved '(' FExpr ')'
     {
@@ -6357,7 +6357,7 @@ StringExpr :
     //+++ No need to extend to Struct_FullName (a Tag is not a String), but...
   | tGetForcedStr '(' Struct_FullName GetForcedStr_Default ')'
     {
-      $$ = treat_Struct_FullName_String(NULL, $3.char2, 1, 0, $4, 2);
+      $$ = treat_Struct_FullName_String(nullptr, $3.char2, 1, 0, $4, 2);
     }
   | tGetForcedStr '(' Struct_FullName '.' tSTRING_Reserved GetForcedStr_Default ')'
     {
@@ -6558,7 +6558,7 @@ StringExpr :
   | tNameStruct LP NameStruct_Arg RP
     {
       std::string out;
-      const std::string * key_struct = NULL;
+      const std::string * key_struct = nullptr;
       switch (gmsh_yynamespaces.get_key_struct_from_tag(struct_namespace,
                                                         (int)$3, key_struct)) {
       case 0:
@@ -6643,7 +6643,7 @@ MultiStringExprVar :
     }
   | String__Index '.' tSTRING_Reserved '(' ')'
     {
-      $$ = treat_Struct_FullName_dot_tSTRING_ListOfString(NULL, $1, $3);
+      $$ = treat_Struct_FullName_dot_tSTRING_ListOfString(nullptr, $1, $3);
     }
   | String__Index tSCOPE String__Index '.' tSTRING_Reserved '(' ')'
     {
@@ -7419,7 +7419,7 @@ double treat_Struct_FullName_dot_tSTRING_Float
     break;
   case 2:
     if (type_treat != 0) {
-      const std::string * out_dummy = NULL;
+      const std::string * out_dummy = nullptr;
       out = (gmsh_yynamespaces.getMember
              (struct_namespace, struct_name, key_member, out_dummy))?
         val_default : 1.;
@@ -7444,7 +7444,7 @@ double treat_Struct_FullName_dot_tSTRING_Float
 List_T * treat_Struct_FullName_dot_tSTRING_ListOfFloat
 (char* c1, char* c2, char* c3)
 {
-  List_T * out, * val_default = NULL;
+  List_T * out, * val_default = nullptr;
   const std::vector<double> * out_vector; double val_;
   std::string struct_namespace(c1? c1 : std::string("")), struct_name(c2);
   std::string key_member(c3);
@@ -7498,7 +7498,7 @@ char * treat_Struct_FullName_String
 (char* c1, char* c2, int type_var, int index, char * val_default, int type_treat)
 {
   std::string string_default(val_default? val_default : std::string(""));
-  const std::string * out = NULL;
+  const std::string * out = nullptr;
   std::string out_tmp;
   if(!c1 && gmsh_yystringsymbols.count(c2)){
     // Get (0) or GetForced (2)
@@ -7526,7 +7526,7 @@ char* treat_Struct_FullName_dot_tSTRING_String
 (char* c1, char* c2, char* c3, int index, char * val_default, int type_treat)
 {
   std::string string_default(val_default? val_default : std::string(""));
-  const std::string * out = NULL;
+  const std::string * out = nullptr;
   std::string out_tmp; // PD: we should avoid that -> StringOption() to be changed
   std::string struct_namespace(c1? c1 : std::string("")), struct_name(c2);
   std::string key_member(c3);
@@ -7561,7 +7561,7 @@ char* treat_Struct_FullName_dot_tSTRING_String
 List_T * treat_Struct_FullName_dot_tSTRING_ListOfString
 (char* c1, char* c2, char* c3)
 {
-  List_T * out, * val_default = NULL;
+  List_T * out, * val_default = nullptr;
   const std::vector<std::string> * out_vector; char * val_;
   std::string struct_namespace(c1? c1 : std::string("")), struct_name(c2);
   std::string key_member(c3);
diff --git a/Parser/Parser.h b/Parser/Parser.h
index 2b27d55574224b6079f95e1507614c010f79fcaf..b6c5137c757de012686cf1437664dda172aaa4a4 100644
--- a/Parser/Parser.h
+++ b/Parser/Parser.h
@@ -75,11 +75,11 @@ public:
         out = &it->second[index]; return 0;
       }
       else {
-        out = NULL; return 2; // Error: Index out of range
+        out = nullptr; return 2; // Error: Index out of range
       }
     }
     else {
-      out = NULL; return 1; // Error: Unknown member of Struct
+      out = nullptr; return 1; // Error: Unknown member of Struct
     }
   }
 
@@ -110,7 +110,7 @@ public:
       out_vector = &it->second; return 0;
     }
     else {
-      out_vector = NULL; return 1; // Error: Unknown member of Struct
+      out_vector = nullptr; return 1; // Error: Unknown member of Struct
     }
   }
 
@@ -122,7 +122,7 @@ public:
       out_vector = &it->second; return 0;
     }
     else {
-      out_vector = NULL; return 1; // Error: Unknown member of Struct
+      out_vector = nullptr; return 1; // Error: Unknown member of Struct
     }
   }
 
@@ -184,14 +184,14 @@ public:
   {
     typename std::map<K, T>::iterator it;
     if ( (it = _map.find(key)) != _map.end() ) return &it->second;
-    else return NULL;
+    else return nullptr;
   }
 
   const T * Find(K key) const
   {
     typename std::map<K, T>::const_iterator it;
     if ( (it = _map.find(key)) != _map.end() ) return &it->second;
-    else return NULL;
+    else return nullptr;
   }
 
   inline T & operator[] (K key) { return _map[key]; }
@@ -288,7 +288,7 @@ public:
              double & out) const
   {
     const Structs * structs_P = this->Find(key_namespace);
-    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : NULL;
+    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : nullptr;
     if (structs_P && struct_P) {
       out = (double)struct_P->getTag();
     }
@@ -302,7 +302,7 @@ public:
                 std::string & key_member, double & out, int index = 0) const {
 
     const Structs * structs_P = this->Find(key_namespace);
-    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : NULL;
+    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : nullptr;
     if (structs_P && struct_P) {
       switch (struct_P->getMember(key_member, out, index)) {
       case 0: break;
@@ -321,16 +321,16 @@ public:
   {
 
     const Structs * structs_P = this->Find(key_namespace);
-    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : NULL;
+    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : nullptr;
     if (structs_P && struct_P) {
       switch (struct_P->getMember(key_member, out, index)) {
       case 0: break;
-      case 1: out = NULL; return 2; // 2: Error: Unknown member of Struct
-      case 2: out = NULL; return 3; // 3: // Error: Index out of range
+      case 1: out = nullptr; return 2; // 2: Error: Unknown member of Struct
+      case 2: out = nullptr; return 3; // 3: // Error: Index out of range
       }
     }
     else  {
-      out = NULL; return 1; // 1: Error: Unknown Struct
+      out = nullptr; return 1; // 1: Error: Unknown Struct
     }
     return 0; // 0: no error
   }
@@ -339,7 +339,7 @@ public:
                     std::string & key_member, int & out) const {
 
     const Structs * structs_P = this->Find(key_namespace);
-    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : NULL;
+    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : nullptr;
     if (structs_P && struct_P) {
       switch (struct_P->getMember_Dim(key_member, out)) {
       case 0: break;
@@ -356,15 +356,15 @@ public:
                        std::string & key_member, const std::vector<double> * & out_vector) const {
 
     const Structs * structs_P = this->Find(key_namespace);
-    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : NULL;
+    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : nullptr;
     if (structs_P && struct_P) {
       switch (struct_P->getMember_Vector(key_member, out_vector)) {
       case 0: break;
-      case 1: out_vector = NULL; return 2; // 2: Error: Unknown member of Struct
+      case 1: out_vector = nullptr; return 2; // 2: Error: Unknown member of Struct
       }
     }
     else  {
-      out_vector = NULL; return 1; // 1: Error: Unknown Struct
+      out_vector = nullptr; return 1; // 1: Error: Unknown Struct
     }
     return 0; // 0: no error
   }
@@ -373,15 +373,15 @@ public:
                        std::string & key_member, const std::vector<std::string> * & out_vector) const {
 
     const Structs * structs_P = this->Find(key_namespace);
-    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : NULL;
+    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : nullptr;
     if (structs_P && struct_P) {
       switch (struct_P->getMember_Vector(key_member, out_vector)) {
       case 0: break;
-      case 1: out_vector = NULL; return 2; // 2: Error: Unknown member of Struct
+      case 1: out_vector = nullptr; return 2; // 2: Error: Unknown member of Struct
       }
     }
     else  {
-      out_vector = NULL; return 1; // 1: Error: Unknown Struct
+      out_vector = nullptr; return 1; // 1: Error: Unknown Struct
     }
     return 0; // 0: no error
   }
@@ -390,7 +390,7 @@ public:
                               int tag, const std::string * & key_struct) const
   {
     const Structs * structs_P = this->Find(key_namespace);
-    if (structs_P != NULL)
+    if (structs_P != nullptr)
       return structs_P->get_key_struct_from_tag(tag, key_struct);
     else return 1; // 1: Error: Unknown NameSpace
   }
@@ -398,7 +398,7 @@ public:
   int getMember_ValMax(std::string & key_namespace, std::string & key_name)
   {
     const Structs * structs_P = this->Find(key_namespace);
-    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : NULL;
+    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : nullptr;
     return (structs_P && struct_P)? struct_P->getMember_ValMax() : -1;
   }
 
diff --git a/Plugin/AnalyseMeshQuality.cpp b/Plugin/AnalyseMeshQuality.cpp
index 1a3e1ad655a16356e43678ec1b0a64f7ede200d2..81fc7c68868cecdd33fb668af5f12cd36736a0ca 100644
--- a/Plugin/AnalyseMeshQuality.cpp
+++ b/Plugin/AnalyseMeshQuality.cpp
@@ -35,7 +35,7 @@ StringXNumber CurvedMeshOptions_Number[] = {
   {GMSH_FULLRC, "DimensionOfElements", nullptr, -1}
 #if defined(HAVE_VISUDEV)
   ,
-  {GMSH_FULLRC, "Element to draw quality", NULL, 0}
+  {GMSH_FULLRC, "Element to draw quality", nullptr, 0}
 #endif
 };
 
diff --git a/Plugin/CVTRemesh.cpp b/Plugin/CVTRemesh.cpp
index 3d87b2c846ff3f61e79b5240b3bed76390abf17c..7cb1934f915c00985f98096f1b2705874bc8aaf7 100644
--- a/Plugin/CVTRemesh.cpp
+++ b/Plugin/CVTRemesh.cpp
@@ -28,12 +28,12 @@
 #include <iostream>
 
 StringXNumber CVTRemeshOptions_Number[] = {
-  {GMSH_FULLRC, "Sites", NULL, 20000.},
-  {GMSH_FULLRC, "Iterations", NULL, 20.},
-  {GMSH_FULLRC, "Anisotropy", NULL, 0.03},
-  {GMSH_FULLRC, "Variable density", NULL, 0.3},
-  {GMSH_FULLRC, "Feature sensitivity", NULL, 5.},
-  {GMSH_FULLRC, "Normal computation radius", NULL, 0.005}};
+  {GMSH_FULLRC, "Sites", nullptr, 20000.},
+  {GMSH_FULLRC, "Iterations", nullptr, 20.},
+  {GMSH_FULLRC, "Anisotropy", nullptr, 0.03},
+  {GMSH_FULLRC, "Variable density", nullptr, 0.3},
+  {GMSH_FULLRC, "Feature sensitivity", nullptr, 5.},
+  {GMSH_FULLRC, "Normal computation radius", nullptr, 0.005}};
 
 extern "C" {
 GMSH_Plugin *GMSH_RegisterCVTRemeshPlugin()
diff --git a/Solver/linearSystemPETSc.cpp b/Solver/linearSystemPETSc.cpp
index bb58b373ae160309b9aded70167a0d3941ae8c27..0c46f4983faa52a890c857169822258511c3b120 100644
--- a/Solver/linearSystemPETSc.cpp
+++ b/Solver/linearSystemPETSc.cpp
@@ -50,7 +50,7 @@ int linearSystemPETSc<fullMatrix<double> >::_getBlockSizeFromParameters() const
   if(_parameters.find("blockSize") == _parameters.end())
     Msg::Error("'blockSize' parameters must be set for linearSystemPETScBlock");
   int blockSize =
-    strtol(_parameters.find("blockSize")->second.c_str(), NULL, 10);
+    strtol(_parameters.find("blockSize")->second.c_str(), nullptr, 10);
   return blockSize;
 }