diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index dde036e94eee3c11b1c9b8b1ef65a6fa200b69bd..879009d2bf49466e160b817465a1c84cdee982b0 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -433,7 +433,7 @@ StringXNumber GeneralOptions_Number[] = {
   { F|O, "ClipWholeElements" , opt_general_clip_whole_elements , 0. ,
     "Clip whole elements" },
   { F|S, "ColorScheme", opt_general_color_scheme , 1. ,
-    "Default color scheme for graphics (0=dark, 1=light or 2=grayscale)" },
+    "Default color scheme for graphics (0=dark, 1=light, 2=grayscale, 3=reverse)" },
   { F|O, "ConfirmOverwrite" , opt_general_confirm_overwrite, 1. ,
     "Ask confirmation before overwriting files?" },
   { F|S, "ContextPositionX" , opt_general_context_position0 , 650. ,
@@ -1684,70 +1684,70 @@ StringXNumber PrintOptions_Number[] = {
 
 StringXColor GeneralOptions_Color[] = {
   { F|O, "Background" , opt_general_color_background ,
-    {245, 245, 245, 255}, {255, 255, 255, 255}, {245, 245, 245, 255},
+    {245, 245, 245, 255}, {255, 255, 255, 255}, {245, 245, 245, 255}, {10, 10, 10, 255},
     "Background color" },
   { F|O, "BackgroundGradient" , opt_general_color_background_gradient ,
-    {165, 165, 165, 255}, {208, 215, 255, 255}, {165, 165, 165, 255},
+    {165, 165, 165, 255}, {208, 215, 255, 255}, {165, 165, 165, 255}, {50, 50, 50, 255},
     "Background gradient color" },
   { F|O, "Foreground" , opt_general_color_foreground ,
-    {85, 85, 85, 255}, {85, 85, 85, 255}, {128, 128, 128, 255},
+    {85, 85, 85, 255}, {85, 85, 85, 255}, {85, 85, 85, 255}, {170, 170, 170, 255},
     "Foreground color" },
   { F|O, "Text" , opt_general_color_text ,
-    {0, 0, 0, 255}, {0, 0, 0, 255}, {0, 0, 0, 255},
+    {0, 0, 0, 255}, {0, 0, 0, 255}, {0, 0, 0, 255}, {245, 245, 245, 255},
     "Text color" },
   { F|O, "Axes" , opt_general_color_axes ,
-    {0, 0, 0, 255}, {0, 0, 0, 255}, {0, 0, 0, 255},
+    {0, 0, 0, 255}, {0, 0, 0, 255}, {0, 0, 0, 255}, {245, 245, 245, 255},
     "Axes color" },
   { F|O, "SmallAxes" , opt_general_color_small_axes ,
-    {0, 0, 0, 255}, {0, 0, 0, 255}, {0, 0, 0, 255},
+    {0, 0, 0, 255}, {0, 0, 0, 255}, {0, 0, 0, 255}, {245, 245, 245, 255},
     "Small axes color" },
   { F|O, "AmbientLight" , opt_general_color_ambient_light,
-    {25, 25, 25, 255}, {25, 25, 25, 255}, {25, 25, 25, 255},
+    {25, 25, 25, 255}, {25, 25, 25, 255}, {25, 25, 25, 255}, {25, 25, 25, 255},
     "Ambient light color" },
   { F|O, "DiffuseLight" , opt_general_color_diffuse_light,
-    {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255},
+    {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255},
     "Diffuse light color" },
   { F|O, "SpecularLight" , opt_general_color_specular_light,
-    {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255},
+    {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255},
     "Specular light color" },
-  { 0, 0 , 0 ,  {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
+  { 0, 0 , 0 ,  {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , {0, 0, 0, 0} , 0 }
 } ;
 
 StringXColor GeometryOptions_Color[] = {
   { F|O, "Points" , opt_geometry_color_points ,
-    {90, 90, 90, 255}, {90, 90, 90, 255}, {0, 0, 0, 255},
+    {90, 90, 90, 255}, {90, 90, 90, 255}, {0, 0, 0, 255}, {178, 178, 178, 255},
     "Normal geometry point color" },
   { F|O, "Lines" , opt_geometry_color_lines ,
-    {0, 0, 255, 255}, {0, 0, 255, 255}, {0, 0, 0, 255},
+    {0, 0, 255, 255}, {0, 0, 255, 255}, {0, 0, 0, 255}, {0, 0, 255, 255},
     "Normal geometry curve color" },
   { F|O, "Surfaces" , opt_geometry_color_surfaces ,
-    {128, 128, 128, 255}, {128, 128, 128, 255}, {0, 0, 0, 255},
+    {128, 128, 128, 255}, {128, 128, 128, 255}, {0, 0, 0, 255}, {128, 128, 128, 255},
     "Normal geometry surface color" },
   { F|O, "Volumes" , opt_geometry_color_volumes ,
-    {255, 255, 0, 255}, {255, 255, 0, 255}, {0, 0, 0, 255},
+    {255, 255, 0, 255}, {255, 255, 0, 255}, {0, 0, 0, 255}, {255, 255, 0, 255},
     "Normal geometry volume color" },
   { F|O, "Selection" , opt_geometry_color_selection ,
-    {255, 0, 0, 255}, {255, 0, 0, 255}, {255, 0, 0, 255},
+    {255, 0, 0, 255}, {255, 0, 0, 255}, {255, 0, 0, 255}, {255, 0, 0, 255},
     "Selected geometry color" },
   { F|O, "HighlightZero" , opt_geometry_color_highlight0 ,
-    {255, 0, 0, 255}, {255, 0, 0, 255}, {255, 0, 0, 255},
+    {255, 0, 0, 255}, {255, 0, 0, 255}, {255, 0, 0, 255}, {255, 0, 0, 255},
     "Highlight 0 color" },
   { F|O, "HighlightOne" , opt_geometry_color_highlight1 ,
-    {255, 150, 0, 255}, {255, 150, 0, 255}, {255, 150, 0, 255},
+    {255, 150, 0, 255}, {255, 150, 0, 255}, {255, 150, 0, 255}, {255, 150, 0, 255},
     "Highlight 1 color" },
   { F|O, "HighlightTwo" , opt_geometry_color_highlight2 ,
-    {255, 255, 0, 255}, {255, 255, 0, 255}, {255, 255, 0, 255},
+    {255, 255, 0, 255}, {255, 255, 0, 255}, {255, 255, 0, 255}, {255, 255, 0, 255},
     "Highlight 2 color" },
   { F|O, "Tangents" , opt_geometry_color_tangents ,
-    {255, 255, 0, 255}, {255, 255, 0, 255}, {0, 0, 0, 255},
+    {255, 255, 0, 255}, {255, 255, 0, 255}, {0, 0, 0, 255}, {255, 255, 0, 255},
     "Tangent geometry vectors color" },
   { F|O, "Normals" , opt_geometry_color_normals ,
-    {255, 0, 0, 255}, {255, 0, 0, 255}, {0, 0, 0, 255},
+    {255, 0, 0, 255}, {255, 0, 0, 255}, {0, 0, 0, 255}, {255, 0, 0, 255},
     "Normal geometry vectors color" },
   { F|O, "Projection" , opt_geometry_color_projection ,
-    {0, 255, 0, 255}, {0, 255, 0, 255}, {0, 0, 0, 255},
+    {0, 255, 0, 255}, {0, 255, 0, 255}, {0, 0, 0, 255}, {0, 255, 0, 255},
     "Projection surface color" },
-  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
+  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
 } ;
 
 #define COLW  {210, 210, 210, 255}
@@ -1779,90 +1779,90 @@ StringXColor GeometryOptions_Color[] = {
 
 StringXColor MeshOptions_Color[] = {
   { F|O, "Points" , opt_mesh_color_points ,
-    {0, 0, 255, 255}, {0, 0, 255, 255}, {0, 0, 0, 255},
+    {0, 0, 255, 255}, {0, 0, 255, 255}, {0, 0, 0, 255}, {0, 0, 255, 255},
     "Mesh node color" },
   { F|O, "PointsSup" , opt_mesh_color_points_sup ,
-    {255, 0, 255, 255}, {255, 0, 255, 255}, {0, 0, 0, 255},
+    {255, 0, 255, 255}, {255, 0, 255, 255}, {0, 0, 0, 255}, {255, 0, 255, 255},
     "Second order mesh node color" },
   { F|O, "Lines" , opt_mesh_color_lines ,
-    {0, 0, 0, 255}, {0, 0, 0, 255}, {0, 0, 0, 255},
+    {0, 0, 0, 255}, {0, 0, 0, 255}, {0, 0, 0, 255}, {0, 0, 0, 255},
     "Mesh line color" },
   { F|O, "Triangles" , opt_mesh_color_triangles ,
-    COLT, COLT, COLW,
+    COLT, COLT, COLW, COLT,
     "Mesh triangle color (if Mesh.ColorCarousel=0)" },
   { F|O, "Quadrangles" , opt_mesh_color_quadrangles ,
-    COLQ, COLQ, COLW,
+    COLQ, COLQ, COLW, COLQ,
     "Mesh quadrangle color (if Mesh.ColorCarousel=0)" },
   { F|O, "Tetrahedra" , opt_mesh_color_tetrahedra ,
-    COLT, COLT, COLW,
+    COLT, COLT, COLW, COLT,
      "Mesh tetrahedron color (if Mesh.ColorCarousel=0)" },
   { F|O, "Hexahedra" , opt_mesh_color_hexahedra ,
-    COLQ, COLQ, COLW,
+    COLQ, COLQ, COLW, COLQ,
     "Mesh hexahedron color (if Mesh.ColorCarousel=0)" },
   { F|O, "Prisms" , opt_mesh_color_prisms ,
-    COLP, COLP, COLW,
+    COLP, COLP, COLW, COLP,
      "Mesh prism color (if Mesh.ColorCarousel=0)" },
   { F|O, "Pyramids" , opt_mesh_color_pyramid ,
-    COLY, COLY, COLW,
+    COLY, COLY, COLW, COLY,
      "Mesh pyramid color (if Mesh.ColorCarousel=0)" },
   { F|O, "Tangents" , opt_mesh_color_tangents ,
-    {255, 255, 0, 255}, {255, 255, 0, 255}, {0, 0, 0, 255},
+    {255, 255, 0, 255}, {255, 255, 0, 255}, {0, 0, 0, 255}, {255, 255, 0, 255},
     "Tangent mesh vector color" },
   { F|O, "Normals" , opt_mesh_color_normals ,
-    {255, 0, 0, 255}, {255, 0, 0, 255}, {0, 0, 0, 255},
+    {255, 0, 0, 255}, {255, 0, 0, 255}, {0, 0, 0, 255}, {255, 0, 0, 255},
     "Normal mesh vector color" },
-  { F|O, "Zero"     , opt_mesh_color_0 , COL0, COL0, COLW,
+  { F|O, "Zero"     , opt_mesh_color_0 , COL0, COL0, COLW, COL0,
     "Color 0 in color carousel" },
-  { F|O, "One"      , opt_mesh_color_1 , COL1, COL1, COLW,
+  { F|O, "One"      , opt_mesh_color_1 , COL1, COL1, COLW, COL1,
     "Color 1 in color carousel" },
-  { F|O, "Two"      , opt_mesh_color_2 , COL2, COL2, COLW,
+  { F|O, "Two"      , opt_mesh_color_2 , COL2, COL2, COLW, COL2,
     "Color 2 in color carousel" },
-  { F|O, "Three"    , opt_mesh_color_3 , COL3, COL3, COLW,
+  { F|O, "Three"    , opt_mesh_color_3 , COL3, COL3, COLW, COL3,
     "Color 3 in color carousel" },
-  { F|O, "Four"     , opt_mesh_color_4 , COL4, COL4, COLW,
+  { F|O, "Four"     , opt_mesh_color_4 , COL4, COL4, COLW, COL4,
     "Color 4 in color carousel" },
-  { F|O, "Five"     , opt_mesh_color_5 , COL5, COL5, COLW,
+  { F|O, "Five"     , opt_mesh_color_5 , COL5, COL5, COLW, COL5,
     "Color 5 in color carousel" },
-  { F|O, "Six"      , opt_mesh_color_6 , COL6, COL6, COLW,
+  { F|O, "Six"      , opt_mesh_color_6 , COL6, COL6, COLW, COL6,
     "Color 6 in color carousel" },
-  { F|O, "Seven"    , opt_mesh_color_7 , COL7, COL7, COLW,
+  { F|O, "Seven"    , opt_mesh_color_7 , COL7, COL7, COLW, COL7,
     "Color 7 in color carousel" },
-  { F|O, "Eight"    , opt_mesh_color_8 , COL8, COL8, COLW,
+  { F|O, "Eight"    , opt_mesh_color_8 , COL8, COL8, COLW, COL8,
     "Color 8 in color carousel" },
-  { F|O, "Nine"     , opt_mesh_color_9 , COL9, COL9, COLW,
+  { F|O, "Nine"     , opt_mesh_color_9 , COL9, COL9, COLW, COL9,
     "Color 9 in color carousel" },
-  { F|O, "Ten"      , opt_mesh_color_10, COL10, COL10, COLW,
+  { F|O, "Ten"      , opt_mesh_color_10, COL10, COL10, COLW, COL10,
     "Color 10 in color carousel" },
-  { F|O, "Eleven"   , opt_mesh_color_11, COL11, COL11, COLW,
+  { F|O, "Eleven"   , opt_mesh_color_11, COL11, COL11, COLW, COL11,
     "Color 11 in color carousel" },
-  { F|O, "Twelve"   , opt_mesh_color_12, COL12, COL12, COLW,
+  { F|O, "Twelve"   , opt_mesh_color_12, COL12, COL12, COLW, COL12,
     "Color 12 in color carousel" },
-  { F|O, "Thirteen" , opt_mesh_color_13, COL13, COL13, COLW,
+  { F|O, "Thirteen" , opt_mesh_color_13, COL13, COL13, COLW, COL13,
     "Color 13 in color carousel" },
-  { F|O, "Fourteen" , opt_mesh_color_14, COL14, COL14, COLW,
+  { F|O, "Fourteen" , opt_mesh_color_14, COL14, COL14, COLW, COL14,
     "Color 14 in color carousel" },
-  { F|O, "Fifteen"  , opt_mesh_color_15, COL15, COL15, COLW,
+  { F|O, "Fifteen"  , opt_mesh_color_15, COL15, COL15, COLW, COL15,
     "Color 15 in color carousel" },
-  { F|O, "Sixteen"  , opt_mesh_color_16, COL16, COL16, COLW,
+  { F|O, "Sixteen"  , opt_mesh_color_16, COL16, COL16, COLW, COL16,
     "Color 16 in color carousel" },
-  { F|O, "Seventeen", opt_mesh_color_17, COL17, COL17, COLW,
+  { F|O, "Seventeen", opt_mesh_color_17, COL17, COL17, COLW, COL17,
     "Color 17 in color carousel" },
-  { F|O, "Eighteen" , opt_mesh_color_18, COL18, COL18, COLW,
+  { F|O, "Eighteen" , opt_mesh_color_18, COL18, COL18, COLW, COL18,
     "Color 18 in color carousel" },
-  { F|O, "Nineteen" , opt_mesh_color_19, COL19, COL19, COLW,
+  { F|O, "Nineteen" , opt_mesh_color_19, COL19, COL19, COLW, COL19,
     "Color 19 in color carousel" },
-  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
+  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , {0, 0, 0, 0} , 0 }
 } ;
 
 StringXColor SolverOptions_Color[] = {
-  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
+  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
 } ;
 
 StringXColor PostProcessingOptions_Color[] = {
-  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
+  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
 } ;
 
-#define ELECOL  {0, 0, 0, 255}, {0, 0, 0, 255}, {0, 0, 0, 255}
+#define ELECOL  {0, 0, 0, 255}, {0, 0, 0, 255}, {0, 0, 0, 255}, {245, 245, 245, 255}
 
 StringXColor ViewOptions_Color[] = {
   { F|O, "Points" , opt_view_color_points , ELECOL, "Point color" },
@@ -1874,22 +1874,22 @@ StringXColor ViewOptions_Color[] = {
   { F|O, "Prisms" , opt_view_color_prisms , ELECOL, "Prism color" },
   { F|O, "Pyramids" , opt_view_color_pyramids , ELECOL, "Pyramid color" },
   { F|O, "Tangents" , opt_view_color_tangents ,
-    {255, 255, 0, 255}, {255, 255, 0, 255}, {0, 0, 0, 255},
+    {255, 255, 0, 255}, {255, 255, 0, 255}, {0, 0, 0, 255}, {255, 255, 0, 255},
     "Tangent vector color" },
   { F|O, "Normals" , opt_view_color_normals ,
-    {255, 0, 0, 255}, {255, 0, 0, 255}, {0, 0, 0, 255},
+    {255, 0, 0, 255}, {255, 0, 0, 255}, {0, 0, 0, 255}, {255, 0, 0, 255},
     "Normal vector color" },
   { F|O, "Text2D" , opt_view_color_text2d , ELECOL, "2D text color" },
   { F|O, "Text3D" , opt_view_color_text3d , ELECOL, "3D text color" },
   { F|O, "Axes" , opt_view_color_axes , ELECOL, "Axes color" },
   { F|O, "Background2D" , opt_view_color_background2d ,
-    {255, 255, 255, 200}, {255, 255, 255, 200}, {255, 255, 255, 200},
+    {255, 255, 255, 200}, {255, 255, 255, 200}, {255, 255, 255, 200}, {245, 245, 245, 200},
     "Bacground color for 2D plots" },
-  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
+  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
 } ;
 
 StringXColor PrintOptions_Color[] = {
-  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
+  { 0, 0 , 0 , {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} , 0 }
 } ;
 
 #undef S
diff --git a/Common/Options.cpp b/Common/Options.cpp
index bae9b5935b969c32ff68e3824d13f2e0b871f8ec..fb09ce8d79b9cb60857c17044999ea0133ef015c 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -368,6 +368,13 @@ static void SetDefaultColorOptions(int num, StringXColor s[])
       i++;
     }
     break;
+  case 3:
+    while(s[i].str) {
+      s[i].function(num, GMSH_SET, CTX::instance()->packColor
+                    (s[i].def4[0], s[i].def4[1], s[i].def4[2], s[i].def4[3]));
+      i++;
+    }
+    break;
   default:
     while(s[i].str) {
       s[i].function(num, GMSH_SET, CTX::instance()->packColor
@@ -405,6 +412,10 @@ static void PrintColorOptions(int num, int level, int diff, int help,
         def = CTX::instance()->packColor
           (s[i].def3[0], s[i].def3[1], s[i].def3[2], s[i].def3[3]);
         break;
+      case 3:
+        def = CTX::instance()->packColor
+          (s[i].def4[0], s[i].def4[1], s[i].def4[2], s[i].def4[3]);
+        break;
       default:
         def = CTX::instance()->packColor
           (s[i].def1[0], s[i].def1[1], s[i].def1[2], s[i].def1[3]);
@@ -3254,7 +3265,7 @@ double opt_general_color_scheme(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET) {
     CTX::instance()->colorScheme = (int)val;
-    if(CTX::instance()->colorScheme > 2)
+    if(CTX::instance()->colorScheme > 3)
       CTX::instance()->colorScheme = 0;
     SetDefaultColorOptions(0, GeneralOptions_Color);
     SetDefaultColorOptions(0, GeometryOptions_Color);
diff --git a/Common/Options.h b/Common/Options.h
index 0ec901da7c872cd1ff8234482d51b5c6c9162324..90d721c1ae5a0d7f4408d1bd643f382edb61b13d 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -798,7 +798,7 @@ typedef struct {
   // the defaults are stored in individual bytes so that we can initialize
   // them statically independently of the machine endianness. They will be
   // packed into unsigned ints at runtime
-  unsigned char def1[4], def2[4], def3[4];
+  unsigned char def1[4], def2[4], def3[4], def4[4];
   const char *help;
 } StringXColor;
 
diff --git a/Fltk/optionWindow.cpp b/Fltk/optionWindow.cpp
index 83a7f83f8a78cc5868fd756e4da66eeb0230d388..256112a60ac7352543dbdb8ddf66e67a81ab0a6c 100644
--- a/Fltk/optionWindow.cpp
+++ b/Fltk/optionWindow.cpp
@@ -1795,6 +1795,7 @@ optionWindow::optionWindow(int deltaFontSize)
         {"Dark", 0, 0, 0},
         {"Light", 0, 0, 0},
         {"Grayscale", 0, 0, 0},
+        {"Reverse", 0, 0, 0},
         {0}
       };