diff --git a/Common/Options.h b/Common/Options.h
new file mode 100644
index 0000000000000000000000000000000000000000..a4cf563332a8aed93bdc0bd2a2ff64525f7832a9
--- /dev/null
+++ b/Common/Options.h
@@ -0,0 +1,356 @@
+/* $Id: Options.h,v 1.1 2000-12-05 15:28:22 geuzaine Exp $ */
+#ifndef _OPTIONS_H_
+#define _OPTIONS_H_
+
+#include "Geo.h"
+#include "Mesh.h"
+#include "Draw.h"
+#include "Context.h"
+
+extern Context_T   CTX ;
+
+// Option Database, with default values
+
+// STRINGS
+
+StringXString GeneralOptions_String[] = {
+  { NULL , NULL , NULL }
+} ;
+
+StringXString GeometryOptions_String[] = {
+  { NULL , NULL ,  NULL }
+} ;
+
+StringXString MeshOptions_String[] = {
+  { NULL , NULL ,  NULL }
+} ;
+
+StringXString PostProcessingOptions_String[] = {
+  { NULL , NULL ,  NULL }
+} ;
+
+StringXString PrintOptions_String[] = {
+  { "Font" ,  &CTX.print.font , "Courier" },
+  { NULL   , NULL             ,   NULL }
+} ;
+
+// NUMBERS
+
+StringXNumber GeneralOptions_Number[] = {
+  { "Rotation0"    , GMSH_DOUBLE, (void*)&CTX.r[0]          , 0.0 }, 
+  { "Rotation1"    , GMSH_DOUBLE, (void*)&CTX.r[1]          , 0.0 }, 
+  { "Rotation2"    , GMSH_DOUBLE, (void*)&CTX.r[2]          , 0.0 }, 
+  { "Translation0" , GMSH_DOUBLE, (void*)&CTX.t[0]          , 0.0 }, 
+  { "Translation1" , GMSH_DOUBLE, (void*)&CTX.t[1]          , 0.0 }, 
+  { "Translation2" , GMSH_DOUBLE, (void*)&CTX.t[2]          , 0.0 }, 
+  { "Scale0"       , GMSH_DOUBLE, (void*)&CTX.s[0]          , 1.0 }, 
+  { "Scale1"       , GMSH_DOUBLE, (void*)&CTX.s[1]          , 1.0 }, 
+  { "Scale2"       , GMSH_DOUBLE, (void*)&CTX.s[2]          , 1.0 }, 
+  { "Shininess"    , GMSH_FLOAT,  (void*)&CTX.shine         , 0.4 }, 
+  { "Verbosity"    , GMSH_INT,    (void*)&CTX.verbosity     , 2. },
+  { "Orthographic" , GMSH_INT,    (void*)&CTX.ortho         , 1. }, 
+  { "FastRedraw"   , GMSH_INT,    (void*)&CTX.fast          , 1. },
+  { "Axes"         , GMSH_INT,    (void*)&CTX.axes          , 1. },
+  { "SmallAxes"    , GMSH_INT,    (void*)&CTX.small_axes    , 1. },
+  { "DisplayLists" , GMSH_INT,    (void*)&CTX.display_lists , 0. },
+  { "SameVisual"   , GMSH_INT,    (void*)&CTX.same_visual   , 0. },
+  { "Flash"        , GMSH_INT,    (void*)&CTX.flash         , 0. },
+  { "AlphaBlending", GMSH_INT,    (void*)&CTX.alpha         , 0. },
+  { "Clip0"        , GMSH_INT,    (void*)&CTX.clip[0]       , 0. },
+  { "Clip1"        , GMSH_INT,    (void*)&CTX.clip[1]       , 0. },
+  { "Clip2"        , GMSH_INT,    (void*)&CTX.clip[2]       , 0. },
+  { "Clip3"        , GMSH_INT,    (void*)&CTX.clip[3]       , 0. },
+  { "Clip4"        , GMSH_INT,    (void*)&CTX.clip[4]       , 0. },
+  { "Clip5"        , GMSH_INT,    (void*)&CTX.clip[5]       , 0. },
+  { "Light0"       , GMSH_INT,    (void*)&CTX.light[0]      , 1. },
+  { "Light1"       , GMSH_INT,    (void*)&CTX.light[1]      , 0. },
+  { "Light2"       , GMSH_INT,    (void*)&CTX.light[2]      , 0. },
+  { "Light3"       , GMSH_INT,    (void*)&CTX.light[3]      , 0. },
+  { "Light4"       , GMSH_INT,    (void*)&CTX.light[4]      , 0. },
+  { "Light5"       , GMSH_INT,    (void*)&CTX.light[5]      , 0. },
+  { NULL           , GMSH_DOUBLE, NULL , 0. }
+} ;
+
+StringXNumber GeometryOptions_Number[] = {
+  { "Normals"         , GMSH_DOUBLE, (void*)&CTX.geom.normals      , 0. }, 
+  { "Tangents"        , GMSH_DOUBLE, (void*)&CTX.geom.tangents     , 0. }, 
+  { "Points"          , GMSH_INT,    (void*)&CTX.geom.points       , 1. }, 
+  { "Lines"           , GMSH_INT,    (void*)&CTX.geom.lines        , 1. }, 
+  { "Surfaces"        , GMSH_INT,    (void*)&CTX.geom.surfaces     , 0. }, 
+  { "Volumes"         , GMSH_INT,    (void*)&CTX.geom.volumes      , 0. }, 
+  { "PointsNumbers"   , GMSH_INT,    (void*)&CTX.geom.points_num   , 0. }, 
+  { "LinesNumbers"    , GMSH_INT,    (void*)&CTX.geom.lines_num    , 0. }, 
+  { "SurfacesNumbers" , GMSH_INT,    (void*)&CTX.geom.surfaces_num , 0. }, 
+  { "VolumesNumbers"  , GMSH_INT,    (void*)&CTX.geom.volumes_num  , 0. }, 
+  { "HiddenLines"     , GMSH_INT,    (void*)&CTX.geom.hidden       , 0. }, 
+  { "Shading"         , GMSH_INT,    (void*)&CTX.geom.shade        , 0. }, 
+  { "Highlight"       , GMSH_INT,    (void*)&CTX.geom.highlight    , 1. }, 
+  { NULL              , GMSH_DOUBLE, NULL , 0. }
+} ;
+
+StringXNumber MeshOptions_Number[] = {
+  { "Normals"         , GMSH_DOUBLE, (void*)&CTX.mesh.normals        , 0.0 }, 
+  { "Tangents"        , GMSH_DOUBLE, (void*)&CTX.mesh.tangents       , 0.0 }, 
+  { "Explode"         , GMSH_DOUBLE, (void*)&CTX.mesh.explode        , 1.0 }, 
+  { "ScalingFactor"   , GMSH_DOUBLE, (void*)&CTX.mesh.scaling_factor , 1.0 }, 
+  { "CharacteristicLengthFactor" , 
+                        GMSH_DOUBLE, (void*)&CTX.mesh.lc_factor      , 1.0 }, 
+  { "RandomFactor"    , GMSH_DOUBLE, (void*)&CTX.mesh.rand_factor    , 1.e-5 }, 
+  { "GammaLimit"      , GMSH_DOUBLE, (void*)&CTX.mesh.limit_gamma    , 0.0 }, 
+  { "EtaLimit"        , GMSH_DOUBLE, (void*)&CTX.mesh.limit_eta      , 0.0 }, 
+  { "RhoLimit"        , GMSH_DOUBLE, (void*)&CTX.mesh.limit_rho      , 0.0 }, 
+  { "Points"          , GMSH_INT,    (void*)&CTX.mesh.points         , 1. }, 
+  { "Lines"           , GMSH_INT,    (void*)&CTX.mesh.lines          , 1. }, 
+  { "Surfaces"        , GMSH_INT,    (void*)&CTX.mesh.surfaces       , 1. }, 
+  { "Volumes"         , GMSH_INT,    (void*)&CTX.mesh.volumes        , 1. }, 
+  { "PointsNumbers"   , GMSH_INT,    (void*)&CTX.mesh.points_num     , 0. }, 
+  { "LinesNumbers"    , GMSH_INT,    (void*)&CTX.mesh.lines_num      , 0. }, 
+  { "SurfacesNumbers" , GMSH_INT,    (void*)&CTX.mesh.surfaces_num   , 0. }, 
+  { "VolumesNumbers"  , GMSH_INT,    (void*)&CTX.mesh.volumes_num    , 0. }, 
+  { "HiddenLines"     , GMSH_INT,    (void*)&CTX.mesh.hidden         , 0. }, 
+  { "Shading"         , GMSH_INT,    (void*)&CTX.mesh.shade          , 0. }, 
+  { "Format"          , GMSH_INT,    (void*)&CTX.mesh.format         , FORMAT_MSH }, 
+  { "Smoothing"       , GMSH_INT,    (void*)&CTX.mesh.nb_smoothing   , 0. }, 
+  { "Algorithm"       , GMSH_INT,    (void*)&CTX.mesh.algo           , DELAUNAY_OLDALGO }, 
+  { "PointInsertion"  , GMSH_INT,    (void*)&CTX.mesh.point_insertion, CENTER_CIRCCIRC }, 
+  { "SpeedMax"        , GMSH_INT,    (void*)&CTX.mesh.speed_max      , 0. }, 
+  { "Degree"          , GMSH_INT,    (void*)&CTX.mesh.degree         , 1. }, 
+  { "Dual"            , GMSH_INT,    (void*)&CTX.mesh.dual           , 0. }, 
+  { "Interactive"     , GMSH_INT,    (void*)&CTX.mesh.interactive    , 0. }, 
+  { NULL              , GMSH_DOUBLE, NULL , 0. }
+} ;
+
+StringXNumber PostProcessingOptions_Number[] = {
+  { "Scales"           , GMSH_INT,    (void*)&CTX.post.scales             , 1. }, 
+  { "Link"             , GMSH_INT,    (void*)&CTX.post.link               , 0. }, 
+  { "Visibility"       , GMSH_INT,    (void*)&CTX.post.initial_visibility , 1. }, 
+  { "IntervalsMode"    , GMSH_INT,    (void*)&CTX.post.initial_intervals  , DRAW_POST_ISO }, 
+  { "IntervalsNumber"  , GMSH_INT,    (void*)&CTX.post.initial_nbiso      , 15. }, 
+  { "AnimationDelay"   , GMSH_INT,    (void*)&CTX.post.anim_delay         , 0. }, 
+  { NULL               , GMSH_DOUBLE, NULL , 0. }
+} ;
+
+StringXNumber PrintOptions_Number[] = {
+  { "Type"           , GMSH_INT,    (void*)&CTX.print.type      , PRINT_GL2PS_SIMPLE }, 
+  { "Format"         , GMSH_INT,    (void*)&CTX.print.format    , FORMAT_EPS }, 
+  { "FontSize"       , GMSH_INT,    (void*)&CTX.print.font_size , 12. }, 
+  { NULL             , GMSH_DOUBLE, NULL , 0. }
+} ;
+
+// ARRAYS
+
+StringXArray GeneralOptions_Array[] = {
+  { "ClipPlane0"     , GMSH_DOUBLE, CTX.clip_plane[0] , 0., 0., 0., 0. }, 
+  { "ClipPlane1"     , GMSH_DOUBLE, CTX.clip_plane[1] , 0., 0., 0., 0. }, 
+  { "ClipPlane2"     , GMSH_DOUBLE, CTX.clip_plane[2] , 0., 0., 0., 0. }, 
+  { "ClipPlane3"     , GMSH_DOUBLE, CTX.clip_plane[3] , 0., 0., 0., 0. }, 
+  { "ClipPlane4"     , GMSH_DOUBLE, CTX.clip_plane[4] , 0., 0., 0., 0. }, 
+  { "ClipPlane5"     , GMSH_DOUBLE, CTX.clip_plane[5] , 0., 0., 0., 0. }, 
+  { "LightPosition0" , GMSH_FLOAT,  CTX.light_position[0]  , 0.5, 0.3, 1.0, 0.0 }, 
+  { "LightPosition1" , GMSH_FLOAT,  CTX.light_position[1]  , 0.5, 0.3, 1.0, 0.0 }, 
+  { "LightPosition2" , GMSH_FLOAT,  CTX.light_position[2]  , 0.5, 0.3, 1.0, 0.0 }, 
+  { "LightPosition3" , GMSH_FLOAT,  CTX.light_position[3]  , 0.5, 0.3, 1.0, 0.0 }, 
+  { "LightPosition4" , GMSH_FLOAT,  CTX.light_position[4]  , 0.5, 0.3, 1.0, 0.0 }, 
+  { "LightPosition5" , GMSH_FLOAT,  CTX.light_position[5]  , 0.5, 0.3, 1.0, 0.0 }, 
+  { NULL ,             GMSH_DOUBLE, NULL, 0., 0., 0., 0. }
+} ;
+
+StringXArray GeometryOptions_Array[] = {
+  { NULL , GMSH_DOUBLE, NULL, 0., 0., 0., 0. }
+} ;
+
+StringXArray MeshOptions_Array[] = {
+  { NULL , GMSH_DOUBLE, NULL, 0., 0., 0., 0. }
+} ;
+
+StringXArray PostProcessingOptions_Array[] = {
+  { NULL , GMSH_DOUBLE, NULL, 0., 0., 0., 0. }
+} ;
+
+StringXArray PrintOptions_Array[] = {
+  { NULL , GMSH_DOUBLE, NULL, 0., 0., 0., 0. }
+} ;
+
+// COLORS
+
+StringXColor GeneralOptions_Color[] = {
+  { "Background" , &CTX.color.bg ,
+    PACK_COLOR(0,   0,   0,   255), 
+    PACK_COLOR(255, 255, 255, 255), 
+    PACK_COLOR(255, 255, 255, 255) },
+  { "Foreground" , &CTX.color.fg ,
+    PACK_COLOR(255, 255, 255, 255),
+    PACK_COLOR(0,   0,   0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Text"       , &CTX.color.text ,
+    PACK_COLOR(255, 255, 255, 255),
+    PACK_COLOR(0,   0,   0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Axes"       , &CTX.color.axes ,
+    PACK_COLOR(255, 255, 0,   255),
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "SmallAxes"  , &CTX.color.small_axes ,
+    PACK_COLOR(255, 255, 255, 255),
+    PACK_COLOR(0,   0,   0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { NULL         , NULL ,  0, 0, 0 }
+} ;
+
+StringXColor GeometryOptions_Color[] = {
+  { "Points"             , &CTX.color.geom.point , 
+    PACK_COLOR(178, 182, 129, 255) ,
+    PACK_COLOR(178, 182, 129, 255) ,
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Lines"              , &CTX.color.geom.line ,
+    PACK_COLOR(0,   0,   255, 255),
+    PACK_COLOR(0,   0,   255, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Surfaces"           , &CTX.color.geom.surface ,
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Volumes"            , &CTX.color.geom.volume ,
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "PointsSelect"       , &CTX.color.geom.point_sel ,
+    PACK_COLOR(255, 0,   0,   255),
+    PACK_COLOR(255, 0,   0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "LinesSelect"        , &CTX.color.geom.line_sel ,
+    PACK_COLOR(255, 0,   0,   255),
+    PACK_COLOR(255, 0,   0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "SurfacesSelect"     , &CTX.color.geom.surface_sel ,
+    PACK_COLOR(255, 0,   0,   255),
+    PACK_COLOR(255, 0,   0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "VolumesSelect"      , &CTX.color.geom.volume_sel ,
+    PACK_COLOR(255, 0,   0,   255),
+    PACK_COLOR(255, 0,   0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "PointsHighlight"    , &CTX.color.geom.point_hlt ,
+    PACK_COLOR(0,   255, 0,   255),
+    PACK_COLOR(0,   255, 0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "LinesHighlight"     , &CTX.color.geom.line_hlt ,
+    PACK_COLOR(0,   0,   255, 255),
+    PACK_COLOR(0,   0,   255, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "SurfacesHighlight"  , &CTX.color.geom.surface_hlt ,
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "VolumesHighlight"   , &CTX.color.geom.volume_hlt ,
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Tangents"           , &CTX.color.geom.tangents ,
+    PACK_COLOR(255, 255, 0,   255),
+    PACK_COLOR(255, 255, 0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Normals"            , &CTX.color.geom.normals ,
+    PACK_COLOR(255, 0,   0,   255),
+    PACK_COLOR(255, 0,   0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { NULL                 , NULL , 0, 0, 0  }
+} ;
+
+StringXColor MeshOptions_Color[] = {
+  { "Points"             , &CTX.color.mesh.vertex , 
+    PACK_COLOR(0  , 123, 59 , 255),
+    PACK_COLOR(0  , 123, 59 , 255),
+  },
+  { "PointsSupp"         , &CTX.color.mesh.vertex_supp , 
+    PACK_COLOR(255, 0,   255, 255),
+    PACK_COLOR(255, 0,   255, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Lines"              , &CTX.color.mesh.line , 
+    PACK_COLOR(0,   255, 0,   255),
+    PACK_COLOR(0,   255, 0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Triangles"          , &CTX.color.mesh.triangle ,
+    PACK_COLOR(0,   255, 0,   255),
+    PACK_COLOR(0,   255, 0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Quadrangles"        , &CTX.color.mesh.quadrangle ,
+    PACK_COLOR(0,   255, 0,   255),
+    PACK_COLOR(0,   255, 0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Tetrahedra"         , &CTX.color.mesh.tetrahedron ,
+    PACK_COLOR(0,   255, 0,   255),
+    PACK_COLOR(0,   255, 0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Hexahedra"          , &CTX.color.mesh.hexahedron ,
+    PACK_COLOR(128, 255, 0,   255),
+    PACK_COLOR(128, 255, 0,   255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Prisms"             , &CTX.color.mesh.prism ,
+    PACK_COLOR(0,   255, 128, 255),
+    PACK_COLOR(0,   255, 128, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Pyramids"           , &CTX.color.mesh.pyramid ,
+    PACK_COLOR(128, 255, 128, 255),
+    PACK_COLOR(128, 255, 128, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Tangents"           , &CTX.color.mesh.tangents ,
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "Normals"            , &CTX.color.mesh.normals ,
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(128, 128, 128, 255),
+    PACK_COLOR(0,   0,   0,   255) },
+  { "One"                , &CTX.color.mesh.carousel[0] ,
+    PACK_COLOR(0  , 82 , 138, 255),
+    PACK_COLOR(0  , 82 , 138, 255),
+    PACK_COLOR(255, 255, 255, 255) },
+  { "Two"                , &CTX.color.mesh.carousel[1] ,
+    PACK_COLOR(255, 0  , 0  , 255),
+    PACK_COLOR(255, 0  , 0  , 255),
+    PACK_COLOR(255, 255, 255, 255) },
+  { "Three"              , &CTX.color.mesh.carousel[2] ,
+    PACK_COLOR(31 , 110, 171, 255),
+    PACK_COLOR(31 , 110, 171, 255),
+    PACK_COLOR(255, 255, 255, 255) },
+  { "Four"               , &CTX.color.mesh.carousel[3] ,
+    PACK_COLOR(255, 255, 0  , 255),
+    PACK_COLOR(255, 255, 0  , 255),
+    PACK_COLOR(255, 255, 255, 255) },
+  { "Five"               , &CTX.color.mesh.carousel[4] ,
+    PACK_COLOR(255, 0  , 255, 255),
+    PACK_COLOR(255, 0  , 255, 255),
+    PACK_COLOR(255, 255, 255, 255) },
+  { "Six"                , &CTX.color.mesh.carousel[5] ,
+    PACK_COLOR(128, 128, 0  , 255),
+    PACK_COLOR(128, 128, 0  , 255),
+    PACK_COLOR(255, 255, 255, 255) },
+  { "Seven"              , &CTX.color.mesh.carousel[6] ,
+    PACK_COLOR(128, 0  , 255, 255),
+    PACK_COLOR(128, 0  , 255, 255),
+    PACK_COLOR(255, 255, 255, 255) },
+  { "Eight"              , &CTX.color.mesh.carousel[7] ,
+    PACK_COLOR(128, 128, 255, 255),
+    PACK_COLOR(128, 128, 255, 255),
+    PACK_COLOR(255, 255, 255, 255) },
+  { "Nine"               , &CTX.color.mesh.carousel[8] ,
+    PACK_COLOR(128, 128, 255, 255),
+    PACK_COLOR(128, 128, 255, 255),
+    PACK_COLOR(255, 255, 255, 255) },
+  { "Ten"                , &CTX.color.mesh.carousel[9] ,
+    PACK_COLOR(0  , 0  , 255, 255),
+    PACK_COLOR(0  , 0  , 255, 255),
+    PACK_COLOR(255, 255, 255, 255) },
+  { NULL                 , NULL , 0, 0, 0  }
+} ;
+
+StringXColor PostProcessingOptions_Color[] = {
+  { NULL         , NULL ,  0, 0, 0 }
+} ;
+
+StringXColor PrintOptions_Color[] = {
+  { NULL         , NULL ,  0, 0, 0 }
+} ;
+
+#endif