diff --git a/Geo/GModelIO_GEO.cpp b/Geo/GModelIO_GEO.cpp
index b7e6e9a5713f03927972ca170c50c61994cdc6da..6280783ffee5b220c1e76dd5ed3e03d99bedfdd8 100644
--- a/Geo/GModelIO_GEO.cpp
+++ b/Geo/GModelIO_GEO.cpp
@@ -301,6 +301,17 @@ void GEO_Internals::addPlaneSurface(int num, std::vector<int> wireTags)
   _changed = true;
 }
 
+void GEO_Internals::addDiscreteSurface(int num)
+{
+  if(FindSurface(num)){
+    Msg::Error("GEO face with tag %d already exists", num);
+    return;
+  }
+  Surface *s = Create_Surface(num, MSH_SURF_DISCRETE);
+  Tree_Add(Surfaces, &s);
+  _changed = true;
+}
+
 void GEO_Internals::addSurfaceFilling(int num, std::vector<int> wireTags,
                                       int sphereCenterTag)
 {
@@ -563,6 +574,115 @@ void GEO_Internals::setTransfiniteVolume(int tag, std::vector<int> cornerTags)
   }
 }
 
+void GEO_Internals::setTransfiniteVolumeQuadTri(int tag)
+{
+  if(!tag){
+    List_T *tmp = Tree2List(Volumes);
+    for(int i = 0; i < List_Nbr(tmp); i++){
+      Volume *v;
+      List_Read(tmp, i, &v);
+      v->QuadTri = TRANSFINITE_QUADTRI_1;
+    }
+    List_Delete(tmp);
+  }
+  else{
+    Volume *v = FindVolume(tag);
+    if(v)
+      v->QuadTri = TRANSFINITE_QUADTRI_1;
+  }
+}
+
+void GEO_Internals::setRecombine(int dim, int tag, double angle)
+{
+  if(dim == 2){
+    if(!tag){
+      List_T *tmp = Tree2List(Surfaces);
+      for(int i = 0; i < List_Nbr(tmp); i++){
+        Surface *s;
+        List_Read(tmp, i, &s);
+        s->Recombine = 1;
+        s->RecombineAngle = angle;
+      }
+      List_Delete(tmp);
+    }
+    else{
+      Surface *s = FindSurface(tag);
+      if(s){
+        s->Recombine = 1;
+        s->RecombineAngle = angle;
+      }
+    }
+  }
+  else if(dim == 3){
+    if(!tag){
+      List_T *tmp = Tree2List(Volumes);
+      for(int i = 0; i < List_Nbr(tmp); i++){
+        Volume *v;
+        List_Read(tmp, i, &v);
+        v->Recombine3D = 1;
+      }
+      List_Delete(tmp);
+    }
+    else{
+      Volume *v = FindVolume(tag);
+      if(v){
+        v->Recombine3D = 1;
+      }
+    }
+  }
+}
+
+void GEO_Internals::setSmoothing(int tag, int val)
+{
+  if(!tag){
+    List_T *tmp = Tree2List(Surfaces);
+    for(int i = 0; i < List_Nbr(tmp); i++){
+      Surface *s;
+      List_Read(tmp, i, &s);
+      s->TransfiniteSmoothing = val;
+    }
+    List_Delete(tmp);
+  }
+  else{
+    Surface *s = FindSurface(tag);
+    if(s) s->TransfiniteSmoothing = val;
+  }
+}
+
+void GEO_Internals::setReverseMesh(int dim, int tag)
+{
+  if(dim == 1){
+    if(!tag){
+      List_T *tmp = Tree2List(Curves);
+      for(int i = 0; i < List_Nbr(tmp); i++){
+        Curve *c;
+        List_Read(tmp, i, &c);
+        c->ReverseMesh = 1;
+      }
+      List_Delete(tmp);
+    }
+    else{
+      Curve *c = FindCurve(tag);
+      if(c) c->ReverseMesh = 1;
+    }
+  }
+  else if(dim == 2){
+    if(!tag){
+      List_T *tmp = Tree2List(Surfaces);
+      for(int i = 0; i < List_Nbr(tmp); i++){
+        Surface *s;
+        List_Read(tmp, i, &s);
+        s->ReverseMesh = 1;
+      }
+      List_Delete(tmp);
+    }
+    else{
+      Surface *s = FindSurface(tag);
+      if(s) s->ReverseMesh = 1;
+    }
+  }
+}
+
 void GEO_Internals::synchronize(GModel *model)
 {
   Msg::Debug("Syncing GEO_Internals with GModel");
@@ -740,6 +860,9 @@ void GEO_Internals::synchronize(GModel *model)
     }
     List_Delete(volumes);
   }
+
+  // we might want to store physical groups directly in GModel; but this is OK
+  // for efficiency
   for(int i = 0; i < List_Nbr(PhysicalGroups); i++){
     PhysicalGroup *p;
     List_Read(PhysicalGroups, i, &p);
@@ -762,7 +885,8 @@ void GEO_Internals::synchronize(GModel *model)
     }
   }
 
-  // this should not be stored in GEO_internals, but directly set in GModel
+  // we might want to store mesh compounds directly in GModel; but this is OK
+  // for efficiency
   for(std::multimap<int, std::vector<int> >::iterator it = meshCompounds.begin();
       it != meshCompounds.end(); ++it){
     int dim = it->first;
diff --git a/Geo/GModelIO_GEO.h b/Geo/GModelIO_GEO.h
index ac9d23f3eff323878728daf00153563e420ad480..ef2a815b8b5ebd82f7d8ca3635f6b36881064b96 100644
--- a/Geo/GModelIO_GEO.h
+++ b/Geo/GModelIO_GEO.h
@@ -44,6 +44,7 @@ class GEO_Internals{
   void addCompoundLine(int num, std::vector<int> edgeTags);
   void addLineLoop(int num, std::vector<int> edgeTags);
   void addPlaneSurface(int num, std::vector<int> wireTags);
+  void addDiscreteSurface(int num);
   void addSurfaceFilling(int num, std::vector<int> wireTags, int sphereCenterTag=-1);
   void addSurfaceLoop(int num, std::vector<int> faceTags);
   void addCompoundSurface(int num, std::vector<int> faceTags,
@@ -65,6 +66,10 @@ class GEO_Internals{
   void setTransfiniteLine(int tag, int nPoints, int type, double coef);
   void setTransfiniteSurface(int tag, int arrangement, std::vector<int> cornerTags);
   void setTransfiniteVolume(int tag, std::vector<int> cornerTags);
+  void setTransfiniteVolumeQuadTri(int tag);
+  void setRecombine(int dim, int tag, double angle);
+  void setSmoothing(int tag, int val);
+  void setReverseMesh(int dim, int tag);
 
   // synchronize internal CAD data with the given GModel
   void synchronize(GModel *model);
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 8086076fd3e7b98a58214ebf7263e391f4ecc318..b27f3b1f44cba18370f23951c9ed143af4a1027b 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -1259,7 +1259,7 @@ static const yytype_int16 yyrhs[] =
       -1,   117,    92,   329,   315,     6,    -1,   156,   329,     6,
       -1,   145,    90,   233,   331,   234,     7,   322,     6,    -1,
      139,    90,   329,   316,     6,    -1,   139,    92,   329,     6,
-      -1,   140,    90,   328,     7,   322,     6,    -1,   121,    87,
+      -1,   140,    90,   329,     7,   322,     6,    -1,   121,    87,
      233,   331,   234,     7,   233,   331,   234,   317,     6,    -1,
      121,    90,   233,   331,   234,     7,   233,   331,   234,   317,
        6,    -1,   121,    87,   233,   331,   234,     7,   233,   331,
@@ -1419,32 +1419,32 @@ static const yytype_uint16 yyrline[] =
     4136,  4135,  4149,  4148,  4162,  4161,  4175,  4174,  4188,  4187,
     4201,  4200,  4214,  4213,  4227,  4226,  4240,  4239,  4256,  4259,
     4265,  4277,  4297,  4320,  4324,  4328,  4332,  4336,  4340,  4344,
-    4348,  4367,  4380,  4381,  4382,  4383,  4384,  4388,  4389,  4390,
-    4393,  4427,  4453,  4477,  4480,  4496,  4499,  4516,  4519,  4525,
-    4528,  4535,  4538,  4545,  4561,  4601,  4644,  4649,  4687,  4723,
-    4732,  4777,  4818,  4840,  4872,  4899,  4925,  4951,  4977,  5003,
-    5025,  5031,  5037,  5043,  5049,  5055,  5096,  5137,  5154,  5171,
-    5188,  5200,  5206,  5212,  5224,  5228,  5238,  5249,  5250,  5251,
-    5255,  5261,  5273,  5291,  5319,  5320,  5321,  5322,  5323,  5324,
-    5325,  5326,  5327,  5334,  5335,  5336,  5337,  5338,  5339,  5340,
-    5341,  5342,  5343,  5344,  5345,  5346,  5347,  5348,  5349,  5350,
-    5351,  5352,  5353,  5354,  5355,  5356,  5357,  5358,  5359,  5360,
-    5361,  5362,  5363,  5364,  5365,  5366,  5375,  5376,  5377,  5378,
-    5379,  5380,  5381,  5382,  5383,  5384,  5385,  5390,  5389,  5397,
-    5402,  5407,  5424,  5442,  5460,  5478,  5496,  5501,  5507,  5522,
-    5541,  5561,  5581,  5601,  5624,  5629,  5634,  5644,  5654,  5659,
-    5670,  5679,  5684,  5689,  5716,  5720,  5724,  5728,  5732,  5739,
-    5743,  5747,  5751,  5758,  5763,  5770,  5775,  5779,  5784,  5788,
-    5796,  5807,  5811,  5823,  5831,  5839,  5846,  5856,  5878,  5882,
-    5886,  5890,  5894,  5898,  5902,  5906,  5910,  5941,  5972,  6003,
-    6034,  6050,  6066,  6082,  6098,  6108,  6118,  6128,  6140,  6153,
-    6165,  6169,  6173,  6177,  6181,  6199,  6217,  6225,  6233,  6262,
-    6272,  6291,  6296,  6300,  6304,  6316,  6320,  6332,  6349,  6359,
-    6363,  6378,  6383,  6390,  6394,  6407,  6421,  6435,  6449,  6463,
-    6471,  6482,  6486,  6490,  6498,  6504,  6510,  6518,  6526,  6533,
-    6541,  6556,  6570,  6584,  6596,  6612,  6621,  6630,  6640,  6651,
-    6659,  6667,  6671,  6690,  6697,  6703,  6710,  6718,  6717,  6730,
-    6735,  6741,  6750,  6763,  6766,  6770
+    4348,  4357,  4370,  4371,  4372,  4373,  4374,  4378,  4379,  4380,
+    4383,  4417,  4443,  4467,  4470,  4486,  4489,  4506,  4509,  4515,
+    4518,  4525,  4528,  4535,  4551,  4591,  4634,  4639,  4677,  4701,
+    4710,  4739,  4764,  4789,  4821,  4848,  4874,  4900,  4926,  4952,
+    4974,  4980,  4986,  4992,  4998,  5004,  5029,  5054,  5071,  5088,
+    5105,  5117,  5123,  5129,  5141,  5145,  5155,  5166,  5167,  5168,
+    5172,  5178,  5190,  5208,  5236,  5237,  5238,  5239,  5240,  5241,
+    5242,  5243,  5244,  5251,  5252,  5253,  5254,  5255,  5256,  5257,
+    5258,  5259,  5260,  5261,  5262,  5263,  5264,  5265,  5266,  5267,
+    5268,  5269,  5270,  5271,  5272,  5273,  5274,  5275,  5276,  5277,
+    5278,  5279,  5280,  5281,  5282,  5283,  5292,  5293,  5294,  5295,
+    5296,  5297,  5298,  5299,  5300,  5301,  5302,  5307,  5306,  5314,
+    5319,  5324,  5341,  5359,  5377,  5395,  5413,  5418,  5424,  5439,
+    5458,  5478,  5498,  5518,  5541,  5546,  5551,  5561,  5571,  5576,
+    5587,  5596,  5601,  5606,  5633,  5637,  5641,  5645,  5649,  5656,
+    5660,  5664,  5668,  5675,  5680,  5687,  5692,  5696,  5701,  5705,
+    5713,  5724,  5728,  5740,  5748,  5756,  5763,  5773,  5795,  5799,
+    5803,  5807,  5811,  5815,  5819,  5823,  5827,  5858,  5889,  5920,
+    5951,  5967,  5983,  5999,  6015,  6025,  6035,  6045,  6057,  6070,
+    6082,  6086,  6090,  6094,  6098,  6116,  6134,  6142,  6150,  6179,
+    6189,  6208,  6213,  6217,  6221,  6233,  6237,  6249,  6266,  6276,
+    6280,  6295,  6300,  6307,  6311,  6324,  6338,  6352,  6366,  6380,
+    6388,  6399,  6403,  6407,  6415,  6421,  6427,  6435,  6443,  6450,
+    6458,  6473,  6487,  6501,  6513,  6529,  6538,  6547,  6557,  6568,
+    6576,  6584,  6588,  6607,  6614,  6620,  6627,  6635,  6634,  6647,
+    6652,  6658,  6667,  6680,  6683,  6687
 };
 #endif
 
@@ -1970,214 +1970,214 @@ static const yytype_int16 yypact[] =
     6113,  6113,   933,   941,   951,   971,   972,  7463,  7688,  7913,
      939,  9634,  1117,  6788,    21,  1003,  1021,  -128,  -128,  -128,
    11133, 11133,  -182, -1819,   -79,  -128,  1050,  1051,  1060,  9859,
-     -65,    93,  1024,  1068,  1092,  1097,  1100,  1103,  1109, 11133,
-    6113,  6113,  6788,  1113,    15,  1119, -1819,   891,  1241,  1345,
-   -1819,  1138,  1149,  1161,  6113,  6113,  1124,  1159,  1167, -1819,
-   11133, -1819,  1369,  1391, 11133, 11133, 11133,  -135, 11133,  1166,
-   -1819,  1230, 11133, 11133, 11133, -1819, -1819, 11133,  1169,  1399,
-    1403,  1177, -1819, -1819,  1405, -1819,  1408, -1819,   647, 10223,
-     432,  4343, 11133, -1819, -1819,  6788,  6788, 10556, 10775,  1182,
-    1186,  2374, -1819, -1819, -1819, -1819, -1819, -1819,  6788,  1414,
-    1193, 11133, 11133,  1422, 11133, 11133, 11133, 11133, 11133, 11133,
+     -65,    93,  1024,  1068,  1092,  1097,  1100,  1109,  1113, 11133,
+    6113,  6113,  6113,  1121,    15,  1123, -1819,   891,  1241,  1346,
+   -1819,  1138,  1149,  1161,  6113,  6113,  1159,  1167,  1169, -1819,
+   11133, -1819,  1369,  1393, 11133, 11133, 11133,  -135, 11133,  1171,
+   -1819,  1230, 11133, 11133, 11133, -1819, -1819, 11133,  1170,  1403,
+    1404,  1178, -1819, -1819,  1408, -1819,  1409, -1819,   647, 10223,
+     432,  4343, 11133, -1819, -1819,  6788,  6788, 10556, 10775,  1186,
+    1187,  2374, -1819, -1819, -1819, -1819, -1819, -1819,  6788,  1415,
+    1198, 11133, 11133,  1424, 11133, 11133, 11133, 11133, 11133, 11133,
    11133, 11133, 11133, 11133, 11133, 11133, 11133, 11133, 11133, 11133,
    11133, 11133, 11133, 11133, 11133, 11133,  4343,  4343,  4343,  4343,
     4343,  4343,  4343,  4343,  4343,  4343,  6788,  4343,  4343, 11133,
     4343,  4343,  4343,  4343,  4343, 11133,  2374, 11133,  4343,  4343,
-    4343,  4343,  4343,    14,  2374,    14,  1203,  1203,  1203,    25,
-   13226,   194,  4494,   265,  1204,  1445,   176,  1217, -1819,  1220,
+    4343,  4343,  4343,    14,  2374,    14,  1209,  1209,  1209,    25,
+   13226,   194,  4494,   265,  1220,  1445,   176,  1221, -1819,  1222,
     5223, 11133,  9978, -1819, 11133, 11133, 11133, 11133, 11133, 11133,
    11133, 11133, 11133, 11133, 11133, 11133, 11133, 11133, 11133, -1819,
    -1819, 11133, 11133, -1819, -1819,  1013,   746,     0, -1819,   591,
-   -1819,   405, 10607, -1819,   424,   196,   232,  1223,  1224, 13247,
+   -1819,   405, 10607, -1819,   424,   196,   232,  1223,  1225, 13247,
     9978,  3043, -1819,   531, 13268, 13289, 11133, 13310,   575, 13331,
    13352, 11133, 13373,   601, 13394, 13415, 13436, 13457, 13478, 13499,
-    1232, 13520, 13541, 13562,  1450, 11133, 11133,   625,  1452,  1455,
-    1457,  1237, 11133, 11133,  1461,   439,  8138,  8363, 11133, 11133,
-    4343, 11133, -1819,  1404, 11133, -1819,  1406, -1819,  1407, -1819,
-    1409,  6788,    43,    44,    45,    47,  9978,  9978,  1203, -1819,
+    1232, 13520, 13541, 13562,  1451, 11133, 11133,   625,  1455,  1457,
+    1458,  1238, 11133, 11133,  1462,   439,  8138,  8363, 11133, 11133,
+    4343, 11133, -1819,  1405, 11133, -1819,  1406, -1819,  1407, -1819,
+    1410,  6788,    43,    44,    45,    47,  9978,  9978,  1209, -1819,
    13583, -1819,   638, 11133,  8588, 11133, 11133,   596, 13604,   649,
-   11133, 11133, 11133, -1819,  1460,  1465,  1465, 11133, 10197, 10197,
-   10197, 10197, 11133,  1483, 11133,  1484, 11133,  1485,  9978,  9978,
-   10321,  1268,  1488,  1263, -1819, -1819,   -84, -1819, -1819, 10679,
+   11133, 11133, 11133, -1819,  1464,  1482,  1482, 11133, 10197, 10197,
+   10197, 10197, 11133,  1484, 11133,  1485, 11133,  1488,  9978,  9978,
+   10321,  1268,  1490,  1264, -1819, -1819,   -84, -1819, -1819, 10679,
    10721,  -128,  -128,   346,   346,    98, 11133, 11133, 11133,  9859,
     9859, 11133,   840,   140, -1819, 11133, 11133, 11133, 11133, 11133,
-   11133, 11133, 11133, 11133, 13625,  1490,  1500,  1495, 11133,  1501,
-   11133, 11133,  2612, -1819, -1819,  9978,  9978,  9978,  1503,  1504,
-   11133, 11133, 11133, 13646, -1819, -1819, 13667, 13688, 13709,  1341,
-   10801, -1819,  1278,  3320, 13730, 13751, 11381, -1819, -1819,  9978,
-   -1819,  3191, -1819,  3277, 11133, 11133, -1819, 11133, 11133,  1283,
-   13772,  4669,  1289,   705,   342, 13793,   360, 12881, 11133,  9978,
-    1512,  1515, -1819, 11133, 13814, 12904,   -64,  4155,  4155,  4155,
+   11133, 11133, 11133, 11133, 13625,  1495,  1500,  1501, 11133,  1503,
+   11133, 11133,  2612, -1819, -1819,  9978,  9978,  9978,  1504,  1505,
+   11133, 11133, 11133, 13646, -1819, -1819, 13667, 13688, 13709,  1340,
+   10801, -1819,  1279,  3320, 13730, 13751, 11381, -1819, -1819,  9978,
+   -1819,  3191, -1819,  3277, 11133, 11133, -1819, 11133, 11133,  1287,
+   13772,  4669,  1291,   705,   342, 13793,   360, 12881, 11133,  9978,
+    1515,  1516, -1819, 11133, 13814, 12904,   -64,  4155,  4155,  4155,
     4155,  4155,  4155,  4155,  4155,  4155,  4155,  4155, 10898,  4155,
     4155,  4155,  4155,  4155,  4155,  4155, 10965, 11007, 11091,   -88,
-     595,   -88,  1295,  1298,  1294,   737,   737,  1296,   737,  1297,
-    1299,  1300, 11289,   737,   737,   737,   586,   737, 14570, -1819,
-    1089,  1301,  1302,  1303,   679,   757,  1309,  1310,  1321,  1494,
-    1508,  6788,   318,  1513,  1514,  6788,    97,  2374, 11133,  1521,
-    1535,    24,   737, -1819,   133,    33,    41,   148,  1338,   -33,
+     595,   -88,  1298,  1299,  1295,   737,   737,  1296,   737,  1297,
+    1300,  1301, 11289,   737,   737,   737,   586,   737, 14570, -1819,
+    1089,  1302,  1304,  1303,   679,   757,  1310,  1311,  1321,  1487,
+    1508,  6788,   318,  1513,  1514,  6788,    97,  2374, 11133,  1533,
+    1560,    24,   737, -1819,   133,    33,    41,   148,  1339,   -33,
      856, -1819,  3772,   792,  3549,  1502,  1551,   836,   836,   630,
-     630,   630,   630,     1,     1,  1203,  1203,  1203,  1203,    13,
-   13835, 12927, -1819, 11133, 11133,  1561,     9,  9978, 11133, 11133,
-    1562,  9978, 11133,  1563,  4343,  1565, -1819,    14,  1566,  4343,
-   11133,  2374,  1560,  9978,  9978,  1423,  1567,  1568, 13856,  1569,
-    1424,  1588,  1590, 13877,  1591,  1429,  1596,  1597,  1598,  1603,
-    1604,  1605, -1819,  1607,  1608,  1613, 11133, 13898,  4655,  1388,
-   -1819, -1819, -1819,  1619, 13919, 12950,   470, -1819, -1819,  9978,
-   -1819,  9978,  3043,  1400,  9978,  1397,   391, 11410, 11711,   737,
-   11737,  1395,  4812,  1396,  1398,  1401, -1819,  9978, -1819,  9978,
-   -1819,  9978, -1819,  9978,   737,   798,  1623, -1819,  3568,  9978,
-    1203, -1819, 13940, 12973,  9978, -1819,  1625,  1402, 13961, 13982,
-   14003, 11133,  6788,  1629,  1632, 14024,  1412, 14570,  1410,  1416,
-   14570,  1415,  1417, 14570,  1432,  1421, 14570,  1434, 14045, -1819,
-   14066, -1819, 14087, -1819,   799,   826,  9978,  1411, -1819, -1819,
-    3388,  3591,  -128, 11133, 11133, -1819, -1819,  1433,  1435,  9859,
-   11763, 11789, 11815, 10515,  1527,   -29,  -128,  4578, 14108,  4840,
-   14129, 14150, 14171, 14192, 14213, 14234, 14255,  1663, 11133,  1666,
+     630,   630,   630,     1,     1,  1209,  1209,  1209,  1209,    13,
+   13835, 12927, -1819, 11133, 11133,  1563,     9,  9978, 11133, 11133,
+    1562,  9978, 11133,  1565,  4343,  1566, -1819,    14,  1568,  4343,
+   11133,  2374,  1569,  9978,  9978,  1399,  1586,  1587, 13856,  1588,
+    1427,  1591,  1592, 13877,  1596,  1434,  1598,  1603,  1604,  1605,
+    1607,  1608, -1819,  1613,  1614,  1618, 11133, 13898,  4655,  1342,
+   -1819, -1819, -1819,  1620, 13919, 12950,   470, -1819, -1819,  9978,
+   -1819,  9978,  3043,  1400,  9978,  1401,   391, 11410, 11711,   737,
+   11737,  1395,  4812,  1396,  1398,  1402, -1819,  9978, -1819,  9978,
+   -1819,  9978, -1819,  9978,   737,   798,  1625, -1819,  3568,  9978,
+    1209, -1819, 13940, 12973,  9978, -1819,  1626,  1411, 13961, 13982,
+   14003, 11133,  6788,  1630,  1632, 14024,  1412, 14570,  1416,  1414,
+   14570,  1417,  1420, 14570,  1432,  1439, 14570,  1435, 14045, -1819,
+   14066, -1819, 14087, -1819,   799,   826,  9978,  1413, -1819, -1819,
+    3388,  3591,  -128, 11133, 11133, -1819, -1819,  1436,  1438,  9859,
+   11763, 11789, 11815, 10515,  1520,   -29,  -128,  4578, 14108,  4840,
+   14129, 14150, 14171, 14192, 14213, 14234, 14255,  1662, 11133,  1667,
    -1819, 11133, 14276, -1819, 12996, 13019, -1819,   831,   832,   837,
-   -1819, -1819, 13042, 13065, 11841, -1819,  1667,  1668,  1669,  1448,
+   -1819, -1819, 13042, 13065, 11841, -1819,  1668,  1669,  1672,  1444,
    11133,  5111, 11133, 11133, -1819, -1819,     7,   848, -1819, -1819,
-   11281, -1819,  1672, 10847,  1439,  1453,  6788,  1675,  1641,  1643,
-    6788,   318,  1647,  1648,  6788,   318,  4868,   869, -1819, -1819,
+   11281, -1819,  1674, 10847,  1452,  1454,  6788,  1679,  1634,  1647,
+    6788,   318,  1648,  1649,  6788,   318,  4868,   869, -1819, -1819,
    13088,   122,   130, -1819, -1819, -1819, -1819, -1819, -1819, -1819,
    -1819, -1819, -1819, -1819, -1819, 11133, -1819, -1819, -1819, -1819,
    -1819, -1819, -1819, 11133, 11133, 11133, -1819,  9978, -1819, -1819,
    -1819, -1819,  4343, -1819, -1819, 11133, -1819,  6788,  4343,  4343,
     4343, -1819, -1819, -1819, -1819, -1819, -1819, -1819, -1819, 11133,
     4343, -1819,  4343, -1819, 11133, -1819, -1819, -1819, -1819,   176,
-     176,  1687, -1819, 11133,  1688,   176,   176,  1693,    26, 11133,
-    1695,  1696,  1228, -1819,  1699,  1475,    21,  1702, -1819,  9978,
-    9978,  9978,  9978, 11133,  1498,  1505,  1506,  1507, -1819,   737,
-   11133, -1819,  1524,  1525,  1476, -1819,  1720, -1819, -1819, -1819,
-   -1819, -1819,   154,   303, 14297, 13111, -1819, -1819,  1516,  4343,
+     176,  1688, -1819, 11133,  1693,   176,   176,  1695,    26, 11133,
+    1696,  1697,  1228, -1819,  1699,  1480,    21,  1703, -1819,  9978,
+    9978,  9978,  9978, 11133,  1498,  1506,  1507,  1524, -1819,   737,
+   11133, -1819,  1525,  1526,  1493, -1819,  1722, -1819, -1819, -1819,
+   -1819, -1819,   154,   303, 14297, 13111, -1819, -1819,  1517,  4343,
      633, 14318, 13134, -1819,   689, 11867, -1819, -1819, -1819,    59,
    -1819, -1819,  4155,   737,  -128,  3043, -1819,   978,  6788,  6788,
-    1721,  6788,  1017,  6788,  6788,  1723,  6788,  1642,  6788,  6788,
-    6788,  6788,  6788,  6788,  6788,  6788,  6788,  1267,  1745,  1748,
+    1724,  6788,  1017,  6788,  6788,  1727,  6788,  1637,  6788,  6788,
+    6788,  6788,  6788,  6788,  6788,  6788,  6788,  1267,  1748,  1749,
     9978, -1819,   470,   253,   880,   881, -1819,   885, -1819, -1819,
    11133, 11133, -1819, 11133, 11133, -1819, 11133, 11133, 11133,   886,
      893,   898,   924, -1819, -1819,  6788, 11133,   930,   470,   470,
-     931,  6788,  9978,  1749,  1750,  1751,  3523, -1819, -1819,  1769,
-   -1819,  1770,   366, 11133,   366, 11133,   366, 11133,   366, 11133,
-    1771,  1772,  1773,  1774,  1775,   934,  1779, 11320, -1819, -1819,
+     931,  6788,  9978,  1750,  1751,  1768,  3523, -1819, -1819,  1771,
+   -1819,  1772,   366, 11133,   366, 11133,   366, 11133,   366, 11133,
+    1773,  1774,  1775,  1776,  1779,   934,  1783, 11320, -1819, -1819,
      152, 11893, 11919, -1819, -1819,  5043,  -108,  -128,  -128,  -128,
-    1684,  1783, 11066,  1555,  1785,  1570,    48,    54,   -32, -1819,
-     159, -1819,   -29,  1786,  1788,  1790,  1791,  1792,  1793,  1794,
-    1795,  1797,  6788, 14570, -1819,  1371,  1559,  1789,  1800,  1801,
-    1718,  1803,  1805,  1806, 11133,  6788,  6788,  6788,  1809, 11945,
-   -1819,  3624,   202,  1810,  1811,  1584, -1819,  1585, -1819,  1443,
-    1586,  6788,  1587, -1819,   176,   176,  1814, 11133,  1816,   176,
-     176,  1817, 11133,  1818, -1819,   737,  1819, -1819,  1822, -1819,
-    1821,  4155,  4155,  4155,  4155,   763,  1599, 10430,  1601,   737,
-     737,  1600,   788,   811, 14339,  1602,   737,  4155,  1496,  4343,
-   -1819,  1529, -1819,  1496,  4343, -1819,   328,  1606,  1826,  1671,
+    1676,  1784, 11066,  1558,  1786,  1567,    48,    54,   -32, -1819,
+     159, -1819,   -29,  1787,  1789,  1790,  1791,  1792,  1793,  1794,
+    1795,  1797,  6788, 14570, -1819,  1371,  1573,  1801,  1802,  1804,
+    1706,  1805,  1807,  1808, 11133,  6788,  6788,  6788,  1811, 11945,
+   -1819,  3624,   202,  1812,  1814,  1579, -1819,  1589, -1819,  1443,
+    1590,  6788,  1585, -1819,   176,   176,  1815, 11133,  1818,   176,
+     176,  1819, 11133,  1820, -1819,   737,  1821, -1819,  1816, -1819,
+    1822,  4155,  4155,  4155,  4155,   763,  1597, 10430,  1606,   737,
+     737,  1599,   788,   811, 14339,  1609,   737,  4155,  1496,  4343,
+   -1819,  1529, -1819,  1496,  4343, -1819,   328,  1602,  1827,  1671,
    -1819, -1819, -1819,    21, 11133, -1819,   946, -1819,   949,   952,
      953,   961, 14360, 11133, 11133, 11133, 11133,   366, 14570,  1611,
-   11133, 11133,  6788,  1609, -1819, -1819, -1819, -1819,  1610, -1819,
-    1828,    23, -1819, -1819,  1832, 11133,  9263,  1612,  1614,  1835,
-    1838,    77,  1615,  1616,  1730,  1730,  6788,  1840,  1618,  1620,
-    1846,  1848,  6788,  1685,  1624,  1852,  1853,  1856,  1857,  1858,
-    1859,  1860,  1862,  1864, -1819,  1866,  6788,   962,  1868,   737,
-    1646,  1645, 11971, 11997, 12023, 12049, 12075, 12101, 12127, -1819,
-   -1819, -1819, -1819,  1869, 14570, -1819,   737,  1886,   983,  6788,
-    6788,  6788,  1889,  1888, -1819,  6788,  6788, 14570,  6788, 14570,
-    6788, 14570,  6788, 14570,  6788,  6788,  6788,  1664,  1670,  1892,
-     185, -1819, 11133, 11133, 11133,  1673,  1674,  -148,  -140,  -105,
-    1676,  1677, -1819,  1953,  6788, -1819, 11133, -1819,  1895, -1819,
-    1898, -1819, -1819,  9859,   477,  6338, -1819,  1678,  1679,  1680,
-    1683,  1689,  1690,  8813,  1902, -1819,  9978, -1819, -1819, -1819,
-    1691, 11133, -1819, -1819, 13157,  1904,  1911,  1752, -1819, 11133,
-   11133, 11133, -1819,  1919,   835,  2374, -1819, -1819, -1819,  1697,
-    1924,  1496,  4343, -1819,  2114, -1819,  1496,  4343, -1819,  2151,
+   11133, 11133,  6788,  1610, -1819, -1819, -1819, -1819,  1612, -1819,
+    1832,    23, -1819, -1819,  1833, 11133,  9263,  1617,  1616,  1834,
+    1835,    77,  1615,  1619,  1731,  1731,  6788,  1843,  1621,  1622,
+    1845,  1847,  6788,  1687,  1629,  1852,  1853,  1857,  1858,  1859,
+    1860,  1862,  1864,  1865, -1819,  1867,  6788,   962,  1869,   737,
+    1665,  1645, 11971, 11997, 12023, 12049, 12075, 12101, 12127, -1819,
+   -1819, -1819, -1819,  1887, 14570, -1819,   737,  1888,   983,  6788,
+    6788,  6788,  1871,  1891, -1819,  6788,  6788, 14570,  6788, 14570,
+    6788, 14570,  6788, 14570,  6788,  6788,  6788,  1666,  1670,  1894,
+     185, -1819, 11133, 11133, 11133,  1673,  1675,  -148,  -140,  -105,
+    1677,  1681, -1819,  1953,  6788, -1819, 11133, -1819,  1898, -1819,
+    1899, -1819, -1819,  9859,   477,  6338, -1819,  1678,  1680,  1683,
+    1684,  1685,  1689,  8813,  1901, -1819,  9978, -1819, -1819, -1819,
+    1690, 11133, -1819, -1819, 13157,  1906,  1918,  1759, -1819, 11133,
+   11133, 11133, -1819,  1923,   835,  2374, -1819, -1819, -1819,  1698,
+    1954,  1496,  4343, -1819,  2114, -1819,  1496,  4343, -1819,  2151,
    -1819,   366, -1819,   582, -1819, -1819, -1819, -1819, -1819, -1819,
-    4343, 11133, -1819, -1819, -1819, -1819,  4343,  1956, -1819, -1819,
-      17, -1819, -1819, -1819, -1819, -1819, -1819,  1955,   -88,   -88,
-   -1819,  1957,   -88,   -88,  2374, 11133,  1958,  1961,    24, -1819,
-    1960, 13180,    21, -1819,  1962,  1963,  1968,  1969,  1623, 14381,
+    4343, 11133, -1819, -1819, -1819, -1819,  4343,  1957, -1819, -1819,
+      17, -1819, -1819, -1819, -1819, -1819, -1819,  1956,   -88,   -88,
+   -1819,  1958,   -88,   -88,  2374, 11133,  1959,  1962,    24, -1819,
+    1961, 13180,    21, -1819,  1963,  1968,  1969,  1970,  1625, 14381,
    14402, 14423, 14444,  6788, 11133, 12153, 12179,   984, -1819, 11133,
-    1972, -1819, -1819,  4343, -1819, 12205,  5663, 14570, -1819,  1973,
-    1974, -1819, -1819, -1819, 11133, 11133,  -128,  1976,  1977,  1978,
-   -1819, 11133, 11133, -1819, -1819,  1979,  1874,  1981, 11133, -1819,
-   -1819, -1819, -1819, -1819, -1819, -1819, -1819, -1819,  1983,  1986,
-    1734,   470, -1819, -1819, -1819, 11133, 11133, 11133, 11133, 11133,
-   11133, 11133, -1819, -1819, -1819,  1746,  1987,  1685,  1988, 11133,
-   -1819,  1989,  1992,  1994,  1996,  1997,  1999,  1231,  2002,  9978,
+    1964, -1819, -1819,  4343, -1819, 12205,  5663, 14570, -1819,  1972,
+    1973, -1819, -1819, -1819, 11133, 11133,  -128,  1975,  1976,  1977,
+   -1819, 11133, 11133, -1819, -1819,  1978,  1875,  1979, 11133, -1819,
+   -1819, -1819, -1819, -1819, -1819, -1819, -1819, -1819,  1982,  1986,
+    1755,   470, -1819, -1819, -1819, 11133, 11133, 11133, 11133, 11133,
+   11133, 11133, -1819, -1819, -1819,  1760,  1988,  1687,  1989, 11133,
+   -1819,  1992,  1994,  1996,  1997,  1999,  2002,  1231,  2004,  9978,
     9978, 11133, -1819, 10197,  5155, 14465,  3912,   346,   346,  -128,
-    2004,  -128,  2005,  -128,  2006, 11133, 11133, -1819,   375,  1782,
-   14486, -1819, -1819,  5183,   169, -1819,  2009,  2011,  6788,  -128,
-    -128,  -128,  -128,  -128,  1917,  2013, -1819,  1007, 11133,  2544,
-    2014, -1819, -1819,  6788,  4354,   472, 14507, -1819, -1819,  9336,
-    1799,  4669,  4669,  6788, -1819,  2015,   -88,   -88, -1819,  2016,
-     -88,   -88, -1819,  6788, -1819,  1796,  4155,   737,  5888,  9561,
-    2374, -1819,  2018,  2019, -1819,  2020,  2021,  2023,  2598, -1819,
-    2025,  2028, -1819,  1807, -1819, -1819, -1819, -1819, -1819,  1751,
-    1771,  1772,  1773,  2029,   730, 14570, 11133, 11133,  6788,  1808,
-    1010, 14570, -1819,  2032, 11133, -1819, -1819,  1823,  1824,  5362,
-    5601,   676, -1819, -1819, -1819,  5826,  6051, -1819,  1827, -1819,
-    6276,  2034, -1819,  6788,  4155,  4155, 12231, 12257, 12283, 12309,
+    2005,  -128,  2006,  -128,  2008, 11133, 11133, -1819,   375,  1785,
+   14486, -1819, -1819,  5183,   169, -1819,  2009,  2013,  6788,  -128,
+    -128,  -128,  -128,  -128,  1917,  2014, -1819,  1007, 11133,  2544,
+    2015, -1819, -1819,  6788,  4354,   472, 14507, -1819, -1819,  9336,
+    1799,  4669,  4669,  6788, -1819,  2016,   -88,   -88, -1819,  2017,
+     -88,   -88, -1819,  6788, -1819,  1798,  4155,   737,  5888,  9561,
+    2374, -1819,  2018,  2020, -1819,  2021,  2023,  2026,  2598, -1819,
+    2027,  2029, -1819,  1809, -1819, -1819, -1819, -1819, -1819,  1768,
+    1773,  1774,  1775,  2031,   730, 14570, 11133, 11133,  6788,  1823,
+    1010, 14570, -1819,  2032, 11133, -1819, -1819,  1824,  1826,  5362,
+    5601,   676, -1819, -1819, -1819,  5826,  6051, -1819,  1829, -1819,
+    6276,  2035, -1819,  6788,  4155,  4155, 12231, 12257, 12283, 12309,
    12335, 11133, -1819,  2036, -1819, 14570, -1819, -1819, -1819, -1819,
-   -1819, -1819,  1829, -1819, -1819,  1011,  1014, 10388,  2675,  2049,
-    1830, -1819, 11133, -1819,  1825,  1836,   191, -1819,  1839,   214,
-   -1819,  1841,   250, -1819,  1842,  6501, 13203,  2063,  6788,  2033,
-    1843, 11133, -1819, -1819,  1023,   269,   293,   323,   327,   385,
-    9038,   387, -1819,  2065,  6726, -1819, -1819,  1908, 11133, -1819,
-   11133, -1819, -1819,  9978,  2715,  2071,  2374,  1844,  1845,  1847,
-   -1819,  2076,  2077, -1819,  2079,  2080,  2082, -1819, -1819, -1819,
+   -1819, -1819,  1830, -1819, -1819,  1011,  1014, 10388,  2675,  2049,
+    1836, -1819, 11133, -1819,  1837,  1838,   191, -1819,  1840,   214,
+   -1819,  1841,   250, -1819,  1842,  6501, 13203,  2054,  6788,  2034,
+    1844, 11133, -1819, -1819,  1023,   269,   293,   323,   327,   385,
+    9038,   387, -1819,  2064,  6726, -1819, -1819,  1911, 11133, -1819,
+   11133, -1819, -1819,  9978,  2715,  2072,  2374,  1848,  1849,  1851,
+   -1819,  2073,  2075, -1819,  2080,  2082,  2083, -1819, -1819, -1819,
     5424, -1819, -1819,  4343, 14570, -1819, -1819, -1819, -1819, -1819,
-   -1819, -1819, -1819,    21, -1819,  1921, -1819, -1819, 11133, 12361,
-   12387, -1819,  6788, 11133,  2084, -1819, 12413, -1819, -1819,  6788,
-    6788,  2085,  2086,  2087,  2088, 11133,  2089,  2090,  1026, -1819,
+   -1819, -1819, -1819,    21, -1819,  1922, -1819, -1819, 11133, 12361,
+   12387, -1819,  6788, 11133,  2085, -1819, 12413, -1819, -1819,  6788,
+    6788,  2086,  2087,  2088,  2089, 11133,  2090,  2091,  1026, -1819,
    -1819, 11133, 11133, 11133, 11133, 11133,  6951, -1819,  6788,   581,
      712,  9978, -1819, -1819,   346,  4627, -1819, -1819,  9859,   -29,
-    9859,   -29,  9859,   -29, -1819,  2091, -1819,  1027,  6788, -1819,
-    7176,  2092,  9978,  -128,  -128,  -128,  -128,  -128, -1819, -1819,
-   11133,  7401,  7626,  1033, -1819, -1819,  1872,  1867, -1819,  2095,
-   -1819, -1819, -1819, -1819, -1819,  1034,  2041,  2096,  1037,  2098,
-   -1819,  1875, 14570, 11133, 11133,  1038, 14570, -1819, 11133,  1042,
+    9859,   -29,  9859,   -29, -1819,  2092, -1819,  1027,  6788, -1819,
+    7176,  2093,  9978,  -128,  -128,  -128,  -128,  -128, -1819, -1819,
+   11133,  7401,  7626,  1033, -1819, -1819,  1873,  1868, -1819,  2097,
+   -1819, -1819, -1819, -1819, -1819,  1034,  2041,  2098,  1037,  2102,
+   -1819,  1876, 14570, 11133, 11133,  1038, 14570, -1819, 11133,  1042,
     1043, -1819, -1819, -1819, -1819, -1819, -1819,  7851, -1819, -1819,
-    1876, 12439, 12465, 12491, 12517, 12543, -1819,  1047,  1877,  -128,
-    6788,  2099,  1883,  -128,  2111,  1048,  1884, 11133, -1819,  8076,
+    1877, 12439, 12465, 12491, 12517, 12543, -1819,  1047,  1883,  -128,
+    6788,  2111,  1885,  -128,  2115,  1048,  1870, 11133, -1819,  8076,
      395,   556,  8301,   423,   715,  8526,   425,   749, -1819,  6788,
-    2115,  2000, 11375,  1890, -1819,  1057,   427,   429,   482,   484,
-     534,  2736, -1819, -1819,  2118,  2119, -1819, -1819, 11133, -1819,
+    2116,  2001, 11375,  1892, -1819,  1057,   427,   429,   482,   484,
+     534,  2736, -1819, -1819,  2118,  2120, -1819, -1819, 11133, -1819,
     2374,    14, -1819, -1819, 11133, 14528, 12569,    49, 12595, -1819,
    -1819, -1819, -1819, -1819, 11133, 11133, 11133, 11133, 11133, 11133,
-    2120,  -128,    96, -1819, -1819,  -128,   117, -1819,  2121, -1819,
-    8751,  2122, 11133,  2123,  2124, 11133,  2125,  2126, 11133,  2129,
-    1903, -1819, 11133, -1819,   -29, -1819,  2133,  9978,  9978,  9978,
-    9978,  9038, -1819, -1819, -1819,  4669,  1147, -1819,  1914,  1058,
+    2121,  -128,    96, -1819, -1819,  -128,   117, -1819,  2122, -1819,
+    8751,  2123, 11133,  2124,  2125, 11133,  2126,  2129, 11133,  2131,
+    1905, -1819, 11133, -1819,   -29, -1819,  2134,  9978,  9978,  9978,
+    9978,  9038, -1819, -1819, -1819,  4669,  1147, -1819,  1915,  1058,
    -1819, 11133, -1819,  6788, 11133,  1078,  1079, 12621, 12647, 12673,
    12699, 12725, 12751, -1819,   536, -1819,   538, -1819, -1819, -1819,
-   -1819,  1909,  8976, -1819, -1819,  1912,  9211, -1819, -1819,  1916,
-    9292, -1819,  2135,  2874,   765, 11440, -1819,  1085,  1090,  1102,
-    1106,   543,  1112,  1910,  2374,  1920,  2146,  1922, 14549,  1116,
+   -1819,  1909,  8976, -1819, -1819,  1912,  9211, -1819, -1819,  1914,
+    9292, -1819,  2138,  2874,   765, 11440, -1819,  1085,  1090,  1102,
+    1106,   543,  1112,  1920,  2374,  1925,  2143,  1941, 14549,  1116,
     9466, -1819, -1819, 11133, 11133, 11133, 11133, 11133, 11133,  -128,
-    -128,   -29,  2148,   -29,  2150,   -29,  2152, -1819, -1819, -1819,
-   -1819,   -29,  2168,  2169,  2170,  2171,  9978,  2173,  2174, -1819,
-   -1819, -1819,  4343, -1819,  1948,  2181,  9508,  4155, 12777, 12803,
-   12829, 12855,   555,   580,   888, -1819,  1959,   945, -1819,  1964,
-     957, -1819,  1965,  1022, -1819, -1819, -1819, -1819,  1136, -1819,
-   -1819,  1142, -1819,  1967,  6788, -1819,  2183, -1819, 11133, 11133,
-   11133, 11133, 11133, 11133,  2184,   -29,  2187,   -29,  2188,   -29,
+    -128,   -29,  2149,   -29,  2150,   -29,  2152, -1819, -1819, -1819,
+   -1819,   -29,  2169,  2170,  2171,  2173,  9978,  2174,  2175, -1819,
+   -1819, -1819,  4343, -1819,  1960,  2181,  9508,  4155, 12777, 12803,
+   12829, 12855,   555,   580,   888, -1819,  1965,   945, -1819,  1967,
+     957, -1819,  1971,  1022, -1819, -1819, -1819, -1819,  1136, -1819,
+   -1819,  1142, -1819,  1974,  6788, -1819,  2183, -1819, 11133, 11133,
+   11133, 11133, 11133, 11133,  2184,   -29,  2186,   -29,  2188,   -29,
    -1819,  2189,  4343,  2190,  4343,  1146, -1819,  9588,  9691,  9733,
     9916, 10102, 10144, -1819,  1259, -1819,  1366, -1819,  1470, -1819,
-   -1819, -1819,  1154, -1819,  2196, -1819, -1819, -1819, -1819,  2198,
-    2199,  2200,  2201,  2202,  4343,  2204, -1819, -1819, -1819, -1819,
+   -1819, -1819,  1154, -1819,  2191, -1819, -1819, -1819, -1819,  2196,
+    2199,  2200,  2202,  2204,  4343,  2206, -1819, -1819, -1819, -1819,
    -1819, -1819, -1819, -1819
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-   -1819, -1819, -1819, -1819,   851, -1819, -1819, -1819, -1819,   189,
+   -1819, -1819, -1819, -1819,   852, -1819, -1819, -1819, -1819,   190,
    -1819, -1819, -1819, -1819, -1819, -1819, -1819, -1819, -1819, -1819,
-   -1819, -1819,  -372,    11,  4456,  3589, -1819,  1698, -1819, -1819,
+   -1819, -1819,  -372,    11,  4456,  3589, -1819,  1700, -1819, -1819,
    -1819, -1819, -1819, -1819, -1819, -1818, -1819,   337, -1819, -1819,
-   -1819, -1819, -1819,   589,   846,  2223,    -2,  -619,  -306, -1819,
-   -1819, -1819, -1819, -1819, -1819, -1819, -1819,  2232, -1819, -1819,
+   -1819, -1819, -1819,   594,   851,  2232,    -2,  -619,  -306, -1819,
+   -1819, -1819, -1819, -1819, -1819, -1819, -1819,  2236, -1819, -1819,
    -1819, -1819, -1819, -1819, -1819, -1819, -1819, -1819, -1819, -1819,
-   -1819, -1236, -1230,  2236, -1679,  2237, -1819, -1819, -1819,  1649,
+   -1819, -1236, -1230,  2237, -1679,  2239, -1819, -1819, -1819,  1650,
    -1819,   344, -1819, -1819, -1819, -1819,  1980, -1819, -1819,  1067,
-   -1819, -1657,  2820,   987,  3344,  3400,  -312,   694, -1819,   341,
+   -1819, -1657,  2820,   987,  3344,  3400,  -312,   697, -1819,   341,
       64, -1819,  -429,    -3,   283
 };
 
@@ -2320,99 +2320,99 @@ static const yytype_int16 yytable[] =
     1873,  2066,  2126,   628,   638,   510,   484,   485,   486,   487,
      488,   489,   490,   491,   492,   493,   494,   495,   496,   497,
     1527,  1527,  2131,  2132,   498,   509,   509,   824,   639,  2152,
-     509,   509,   824,   640,  2153,   510,   641,   645,   646,   642,
-     347,   510,   510,   510,   824,   643,  2154,  1546,   824,   648,
-    2155,   658,   659,   510,   824,   510,  2157,   651,  1738,   292,
-    2164,   654,   660,  1300,   484,   485,   486,   487,   488,   489,
+     509,   509,   824,   640,  2153,   510,   641,   645,   646,   647,
+     347,   510,   510,   510,   824,   642,  2154,  1546,   824,   643,
+    2155,   658,   659,   510,   824,   510,  2157,   648,  1738,   292,
+    2164,   651,   654,  1300,   484,   485,   486,   487,   488,   489,
      490,   491,   492,   493,   494,   495,   496,   497,   824,   370,
     2211,   655,   498,   292,  2212,   664,  2213,  1475,  1738,   292,
-    2234,  1231,   656,  1306,   616,   617,  2244,   661,  2245,  1309,
-    1310,  1311,   625,   292,   657,   662,   633,   665,  1232,   671,
-     672,  1315,   510,  1316,   210,   677,  1233,  1234,  1235,   678,
-     679,   680,  1236,  1237,   682,   698,   292,   292,   292,   699,
-     702,   703,   292,   292,  1948,   292,   706,   292,   498,   292,
-    1578,   292,   292,   292,   770,   484,   485,   486,   487,   488,
+    2234,  1231,   656,  1306,   616,   617,  2244,   660,  2245,  1309,
+    1310,  1311,   625,   292,   657,   661,   633,   662,  1232,   665,
+     672,  1315,   510,  1316,   671,   210,  1233,  1234,  1235,   677,
+     678,   679,  1236,  1237,   680,   682,   292,   292,   292,   698,
+     699,   702,   292,   292,  1948,   292,   703,   292,   706,   292,
+    1578,   292,   292,   292,   498,   484,   485,   486,   487,   488,
      489,   490,   491,   492,   493,   494,   495,   496,   497,  1497,
-     209,   292,   771,   498,   773,   820,   821,   846,   850,   842,
-    1360,   851,   292,   852,   853,   856,   871,   901,   873,   874,
-     292,   875,   902,   292,   484,   485,   486,   487,   488,   489,
-     490,   491,   492,   493,   494,   495,   496,   497,  1231,   919,
-     921,   923,   498,  2241,   928,   927,   929,   958,   509,   509,
-     506,   135,   961,   509,   509,  1232,   960,   963,   979,   970,
-     971,   982,   991,  1233,  1234,  1235,   995,   509,  1008,  1236,
-    1237,  1009,  1040,   509,  1704,  1041,  1042,  1083,  1045,  1047,
-    1061,  1048,  1049,  1059,  1060,  1540,  1066,  1067,  1069,  1084,
+     770,   292,   771,   498,   209,   820,   773,   821,   846,   842,
+    1360,   850,   292,   851,   852,   853,   856,   871,   873,   874,
+     292,   901,   875,   292,   484,   485,   486,   487,   488,   489,
+     490,   491,   492,   493,   494,   495,   496,   497,  1231,   902,
+     919,   921,   498,  2241,   923,   927,   928,   929,   509,   509,
+     506,   135,   958,   509,   509,  1232,   960,   979,   961,   963,
+     970,   971,   982,  1233,  1234,  1235,   991,   509,   995,  1236,
+    1237,  1008,  1009,   509,  1704,  1040,  1041,  1042,  1045,  1047,
+    1061,  1069,  1048,  1049,  1059,  1540,  1060,  1066,  1067,  1083,
      162,   163,   164,   165,   166,   167,   168,   169,   170,   347,
     1068,  1949,  1070,   175,   176,   177,   178,  1075,  1076,  1690,
-     292,   180,   181,   182,  1093,  1116,   183,  1134,  1123,  1126,
-     509,  1128,  1130,   292,  1138,  1139,  1141,   188,   484,   485,
+     292,   180,   181,   182,  1084,  1093,   183,  1116,  1123,  1137,
+     509,  1126,  1128,   292,  1130,  1160,  1134,   188,   484,   485,
      486,   487,   488,   489,   490,   491,   492,   493,   494,   495,
-     496,   497,  1231,  1137,  1142,  1143,   498,  1144,  1146,  1147,
-    2242,   510,   510,  1148,  1149,  1150,   510,   510,  1717,  1232,
-    1151,  1152,  1153,  2002,  1154,  1155,   370,  1233,  1234,  1235,
-    1156,  1160,  1704,  1236,  1237,  1161,  1168,  1166,  1174,  1176,
-    1185,  1177,  1191,  1198,  1178,  1192,   292,   292,  1200,  1202,
-    1746,  1216,  1203,  1204,  1206,   478,   478,  1205,  1208,  1230,
+     496,   497,  1231,  1138,  1139,  1141,   498,  1142,  1143,  1144,
+    2242,   510,   510,  1146,  1147,  1148,   510,   510,  1717,  1232,
+    1149,  1150,  1151,  2002,  1152,  1153,   370,  1233,  1234,  1235,
+    1154,  1155,  1704,  1236,  1237,  1156,  1161,  1166,  1174,  1176,
+    1168,  1177,  1185,  1191,  1198,  1178,   292,   292,  1200,  1202,
+    1746,  1204,  1230,  1216,  1192,   478,   478,  1206,  1203,  1205,
      484,   485,   486,   487,   488,   489,   490,   491,   492,   493,
-     494,   495,   496,   497,  1207,   292,  1209,  1223,   498,  1224,
-    1252,   292,  1254,  1280,  1265,  1266,  1267,  1549,  1268,  1277,
-     292,  1283,   191,   192,   193,  1284,  1281,  1285,   935,   936,
-     292,  1289,  1290,  1320,  1322,   200,   617,   201,   108,  1325,
-     292,  1330,  1331,  1334,  2243,   292,  1333,  1789,  1337,  1352,
+     494,   495,   496,   497,  1207,   292,  1208,  1209,   498,  1252,
+    1223,   292,  1224,  1254,  1268,  1265,  1266,  1549,  1284,  1267,
+     292,  1277,   191,   192,   193,  1283,  1280,  1281,   935,   936,
+     292,  1285,  1289,  1290,  1320,   200,   617,   201,   108,  1322,
+     292,  1325,  1330,  1331,  2243,   292,  1333,  1789,  1334,  1337,
     2075,   486,   487,   488,   489,   490,   491,   492,   493,   494,
-     495,   496,   497,   857,  1343,   858,  1354,   498,  1376,  1359,
-    1382,  1344,  1345,  1346,  1384,   292,   484,   485,   486,   487,
+     495,   496,   497,   857,  1343,   858,  1352,   498,  1354,  1384,
+    1359,  1376,  1344,  1345,  1382,   292,   484,   485,   486,   487,
      488,   489,   490,   491,   492,   493,   494,   495,   496,   497,
-    1350,  1351,  1395,  1835,   498,  1396,  1419,  1420,  1421,  2115,
+    1346,  1350,  1351,  1835,   498,  1395,  1396,  1419,  1420,  2115,
      292,   487,   488,   489,   490,   491,   492,   493,   494,   495,
-     496,   497,  1852,  1855,  1856,  1424,   498,  1425,  1434,  1435,
-    1436,  1437,  1438,  1440,   510,   510,  1450,  1451,  1454,   510,
-     510,  1455,  1476,  1465,  1466,  1477,  1456,  1467,  1468,  1469,
-    1470,  1471,  1472,   510,  1473,   292,  1478,  1479,  1480,   510,
-    1481,  1482,  1483,  1488,  1493,  1494,  1495,   292,  1496,  1498,
-    1503,  1500,  1505,  1508,  1510,  1512,  1513,  1514,  1523,  1534,
-     292,  1520,  1526,  1548,  1571,   370,  1547,  1564,  1574,  1579,
-    1570,  1581,  1569,  1580,  1582,  1586,  1590,   292,  1584,  1585,
-     509,  1591,  1593,  1592,  1594,  1596,   510,  1598,  1599,  1600,
-     347,  1705,  1601,  1602,  1603,  1604,  1605,  1707,  1606,   292,
-    1607,  1608,  1611,  1613,  1614,  1622,   292,   292,   484,   485,
+     496,   497,  1852,  1855,  1856,  1421,   498,  1424,  1450,  1425,
+    1434,  1435,  1436,  1437,   510,   510,  1438,  1440,  1451,   510,
+     510,  1454,  1455,  1456,  1465,  1466,  1480,  1467,  1468,  1469,
+    1470,  1471,  1472,   510,  1473,   292,  1476,  1477,  1478,   510,
+    1479,  1495,  1481,  1482,  1483,  1488,  1493,   292,  1494,  1500,
+    1513,  1503,  1496,  1498,  1505,  1508,  1510,  1512,  1514,  1520,
+     292,  1526,  1547,  1523,  1548,   370,  1534,  1564,  1571,  1574,
+    1581,  1582,  1570,  1569,  1579,  1580,  1586,   292,  1584,  1590,
+     509,  1593,  1585,  1594,  1591,  1592,   510,  1596,  1599,  1600,
+     347,  1705,  1598,  1601,  1602,  1603,  1604,  1707,  1605,   292,
+    1606,  1607,  1608,  1611,  1614,  1629,   292,   292,   484,   485,
      486,   487,   488,   489,   490,   491,   492,   493,   494,   495,
-     496,   497,  1624,  1629,  1630,   292,   498,  1639,   292,  1641,
-    1936,  1661,   478,  1640,  1662,  1656,  1647,  1648,  1676,  1655,
-    1681,  1668,  1669,  1670,  1743,   292,  1671,  1682,  1683,   292,
-     133,   268,  1672,  1673,  1678,  1687,   136,   137,   138,  1693,
-    1694,   139,   140,   141,   142,   143,   144,   145,   146,   147,
+     496,   497,  1613,  1622,  1624,   292,   498,  1630,   292,  1639,
+    1936,  1641,   478,  1640,  1661,  1662,  1647,  1676,  1648,  1656,
+    1655,  1668,  1681,  1669,  1743,   292,  1670,  1671,  1672,   292,
+     133,   268,  1673,  1678,  1682,  1683,   136,   137,   138,  1687,
+    1693,   139,   140,   141,   142,   143,   144,   145,   146,   147,
      148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
      158,   159,   160,   161,   269,   270,   271,   272,   273,  1657,
-    1708,  1711,  1758,  1714,  1719,  1720,  1722,  1763,  1725,  1726,
-     171,   172,   173,   174,  1727,  1728,  1742,   292,   179,  1771,
-    1747,  1748,  1752,  1753,  1754,  1757,   212,  1759,  1761,   184,
-     185,   186,  1762,  1772,  1774,  1776,   292,   187,  1777,  1220,
-    1778,   274,  1779,  1780,   275,  1781,  1226,   276,  1784,   277,
-    1797,  1800,  1803,  1240,  1808,  1812,    36,  1813,   347,  1822,
-    1826,  1840,  1843,  1847,  1857,  1858,  1859,  1860,   278,  1861,
-      49,  1836,  1863,   279,  1864,  1866,   280,  1865,  1875,  1887,
-    1918,  1872,  1897,    60,    61,    62,    63,    64,  2020,   583,
-      66,    67,    68,    69,    70,  1903,  1879,  1880,    74,  1906,
-    1885,    77,  1898,  1904,   292,   292,   292,   292,   292,  1916,
-    1907,  1928,  1909,  1930,  1911,  1913,  1919,  1935,  1937,  1938,
-     292,  1939,  1940,  1941,  2077,  1942,  1943,   389,  1944,  1950,
-    1957,  1963,  1964,  1965,  1966,  1968,  1969,  1998,  2004,  2015,
-    2016,  2017,   190,  2021,  2023,  2044,   194,   281,  2024,  2034,
-    2041,   195,   196,   197,   198,   199,  2045,  2047,  2049,   108,
-    1698,  2061,  2062,  2065,  2073,  2074,  2093,  2098,  2100,  2103,
-    2104,  2107,  2108,   629,  1820,  2111,   510,  2112,   204,  2116,
-    2125,  2147,  2141,   631,  2158,  2143,   370,  2160,   208,  2145,
-     321,   581,  2161,   292,  2175,  2162,  2178,  1702,  2181,   509,
+    1694,  1708,  1711,  1758,  1714,  1719,  1720,  1722,  1742,  1725,
+     171,   172,   173,   174,  1726,  1727,  1728,   292,   179,  1747,
+    1748,  1752,  1753,  1754,  1757,  1759,   212,  1761,  1763,   184,
+     185,   186,  1762,  1771,  1772,  1774,   292,   187,  1776,  1220,
+    1777,   274,  1778,  1779,   275,  1780,  1226,   276,  1781,   277,
+    1784,  1797,  1800,  1240,  1803,  1812,    36,  1808,   347,  1813,
+    1822,  1826,  1840,  1843,  1857,  1847,  1858,  1859,   278,  1860,
+      49,  1836,  1861,   279,  1863,  1864,   280,  1866,  1875,  1865,
+    1887,  1918,  1897,    60,    61,    62,    63,    64,  2020,   583,
+      66,    67,    68,    69,    70,  1903,  1872,  1879,    74,  1880,
+    1916,    77,  1885,  1898,   292,   292,   292,   292,   292,  1904,
+    1928,  1906,  1907,  1909,  1911,  1913,  1930,  1919,  1935,  1940,
+     292,  1941,  1937,  1938,  2077,  1939,  1942,   389,  1943,  1944,
+    1950,  1957,  1963,  1964,  1965,  1966,  1968,  1969,  1998,  2004,
+    2015,  2016,   190,  2017,  2049,  2021,   194,   281,  2023,  2024,
+    2034,   195,   196,   197,   198,   199,  2041,  2044,  2045,   108,
+    1698,  2047,  2061,  2062,  2073,  2065,  2074,  2093,  2098,  2100,
+    2103,  2104,  2107,   629,  1820,  2108,   510,  2111,   204,  2112,
+    2116,  2125,  2141,   631,  2147,  2143,   370,  2145,   208,  2161,
+     321,   581,  2160,   292,  2158,  2175,  2178,  1702,  2181,   509,
      484,   485,   486,   487,   488,   489,   490,   491,   492,   493,
-     494,   495,   496,   497,  2184,  2185,  2186,  2187,   498,  2189,
-    2190,  2194,   466,   467,   468,   470,   472,  2195,  2159,  2216,
-    2223,   292,  2205,  2225,  2227,  2229,  2231,  2207,  2209,   505,
-    2214,  1371,  2246,   512,  2247,  2248,  2249,  2250,  2251,   509,
-    2253,   509,  1573,  2079,   819,  1960,  1773,   519,   521,   524,
-     525,  1588,   527,   521,   529,   530,   113,   532,   521,   534,
-     535,   536,   537,   538,   539,   123,   541,   542,   543,   124,
-     125,   509,  1721,   521,  1984,   904,     0,     0,   484,   485,
+     494,   495,   496,   497,  2162,  2184,  2185,  2186,   498,  2187,
+    2189,  2190,   466,   467,   468,   470,   472,  2195,  2159,  2216,
+    2223,   292,  2225,  2194,  2227,  2229,  2231,  2246,  2205,   505,
+    2207,  1371,  2247,   512,  2209,  2248,  2249,  2214,  2250,   509,
+    2251,   509,  2253,  1573,  2079,  1960,   819,   519,   521,   524,
+     525,  1773,   527,   521,   529,   530,  1588,   532,   521,   534,
+     535,   536,   537,   538,   539,   113,   541,   542,   543,   123,
+     124,   509,   125,   521,  1984,  1721,   904,     0,   484,   485,
      486,   487,   488,   489,   490,   491,   492,   493,   494,   823,
      496,   497,   578,   580,   521,     0,   498,     0,     0,     0,
        0,     0,     0,     0,   588,   521,     0,     0,     0,     0,
@@ -2504,7 +2504,7 @@ static const yytype_int16 yytable[] =
        0,     0,     0,   612,     0,     0,     0,     0,  2121,     0,
      521,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     1402,  1403,     0,  1404,  1405,     0,  1406,  1407,  1408,     0,
-       0,     0,   647,     0,     0,     0,  1414,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1414,     0,     0,     0,
        0,     0,   521,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,  1427,     0,  1429,     0,  1431,     0,  1433,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
@@ -3804,99 +3804,99 @@ static const yytype_int16 yycheck[] =
      232,   234,   234,   233,   226,  1012,   207,   208,   209,   210,
      211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
      232,   232,   234,   234,   225,  1318,  1319,   232,   226,   234,
-    1323,  1324,   232,   226,   234,  1042,   226,   340,   341,   226,
+    1323,  1324,   232,   226,   234,  1042,   226,   340,   341,   342,
     1333,  1048,  1049,  1050,   232,   226,   234,  1326,   232,   226,
-     234,   354,   355,  1060,   232,  1062,   234,   228,   232,  1352,
-     234,     6,   228,  1012,   207,   208,   209,   210,   211,   212,
+     234,   354,   355,  1060,   232,  1062,   234,   226,   232,  1352,
+     234,   228,     6,  1012,   207,   208,   209,   210,   211,   212,
      213,   214,   215,   216,   217,   218,   219,   220,   232,  1086,
      234,   233,   225,  1376,   232,     6,   234,     6,   232,  1382,
      234,   122,   233,  1042,   317,   318,   232,   228,   234,  1048,
-    1049,  1050,   325,  1396,   233,   228,   329,     6,   139,   233,
-     170,  1060,  1119,  1062,   235,     6,   147,   148,   149,     6,
-     233,     6,   153,   154,     6,   233,  1419,  1420,  1421,   233,
-       6,   228,  1425,  1426,  1853,  1428,     4,  1430,   225,  1432,
-    1366,  1434,  1435,  1436,   230,   207,   208,   209,   210,   211,
+    1049,  1050,   325,  1396,   233,   228,   329,   228,   139,     6,
+     170,  1060,  1119,  1062,   233,   235,   147,   148,   149,     6,
+       6,   233,   153,   154,     6,     6,  1419,  1420,  1421,   233,
+     233,     6,  1425,  1426,  1853,  1428,   228,  1430,     4,  1432,
+    1366,  1434,  1435,  1436,   225,   207,   208,   209,   210,   211,
      212,   213,   214,   215,   216,   217,   218,   219,   220,     6,
-     233,  1454,     7,   225,   234,   232,   232,     7,     6,   227,
-    1119,     6,  1465,     6,   227,     4,    62,     7,    62,    62,
-    1473,    62,     7,  1476,   207,   208,   209,   210,   211,   212,
-     213,   214,   215,   216,   217,   218,   219,   220,   122,     6,
-       6,     6,   225,   234,     6,   227,   233,     7,  1501,  1502,
-       4,     5,     7,  1506,  1507,   139,     6,     6,   167,     6,
-       6,   233,   229,   147,   148,   149,   227,  1520,     6,   153,
-     154,     6,   227,  1526,  1513,   227,   232,     6,   232,   232,
-     227,   232,   232,   232,   232,     6,   227,   227,    44,     4,
+     230,  1454,     7,   225,   233,   232,   234,   232,     7,   227,
+    1119,     6,  1465,     6,     6,   227,     4,    62,    62,    62,
+    1473,     7,    62,  1476,   207,   208,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,   218,   219,   220,   122,     7,
+       6,     6,   225,   234,     6,   227,     6,   233,  1501,  1502,
+       4,     5,     7,  1506,  1507,   139,     6,   167,     7,     6,
+       6,     6,   233,   147,   148,   149,   229,  1520,   227,   153,
+     154,     6,     6,  1526,  1513,   227,   227,   232,   232,   232,
+     227,    44,   232,   232,   232,     6,   232,   227,   227,     6,
       44,    45,    46,    47,    48,    49,    50,    51,    52,  1552,
      229,  1863,    44,    57,    58,    59,    60,    44,    44,  1495,
-    1563,    65,    66,    67,   226,     4,    70,     7,     6,     6,
-    1573,     6,     6,  1576,     7,     7,     7,    81,   207,   208,
+    1563,    65,    66,    67,     4,   226,    70,     4,     6,   170,
+    1573,     6,     6,  1576,     6,   233,     7,    81,   207,   208,
      209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
-     219,   220,   122,   170,   170,     7,   225,     7,     7,   170,
-     234,  1318,  1319,     7,     7,     7,  1323,  1324,  1544,   139,
+     219,   220,   122,     7,     7,     7,   225,   170,     7,     7,
+     234,  1318,  1319,     7,   170,     7,  1323,  1324,  1544,   139,
        7,     7,     7,  1919,     7,     7,  1333,   147,   148,   149,
-       7,   233,  1611,   153,   154,     6,   229,   227,   233,   233,
-       7,   233,     7,     4,   233,   233,  1639,  1640,     6,   227,
-    1576,   230,   232,   227,   227,  1647,  1648,   232,   227,   122,
+       7,     7,  1611,   153,   154,     7,     6,   227,   233,   233,
+     229,   233,     7,     7,     4,   233,  1639,  1640,     6,   227,
+    1576,   227,   122,   230,   233,  1647,  1648,   227,   232,   232,
      207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
-     217,   218,   219,   220,   232,  1668,   232,   234,   225,   234,
-       7,  1674,     6,   234,     7,     7,     7,     6,   230,     7,
-    1683,     6,   186,   187,   188,    44,   233,    44,   621,   622,
-    1693,    44,    44,     6,     6,   199,   629,   201,   202,     6,
-    1703,     6,     6,   228,   234,  1708,     7,  1643,     6,   233,
+     217,   218,   219,   220,   232,  1668,   227,   232,   225,     7,
+     234,  1674,   234,     6,   230,     7,     7,     6,    44,     7,
+    1683,     7,   186,   187,   188,     6,   234,   233,   621,   622,
+    1693,    44,    44,    44,     6,   199,   629,   201,   202,     6,
+    1703,     6,     6,     6,   234,  1708,     7,  1643,   228,     6,
     2016,   209,   210,   211,   212,   213,   214,   215,   216,   217,
-     218,   219,   220,   227,   226,   229,     6,   225,     7,   213,
-       7,   226,   226,   226,    92,  1738,   207,   208,   209,   210,
+     218,   219,   220,   227,   226,   229,   233,   225,     6,    92,
+     213,     7,   226,   226,     7,  1738,   207,   208,   209,   210,
      211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
-     226,   226,     7,  1689,   225,     7,     7,     7,     7,  2065,
+     226,   226,   226,  1689,   225,     7,     7,     7,     7,  2065,
     1763,   210,   211,   212,   213,   214,   215,   216,   217,   218,
-     219,   220,  1708,  1709,  1710,     6,   225,     7,     7,     7,
-       7,     7,     7,     4,  1501,  1502,   102,     4,   233,  1506,
-    1507,     6,   233,     7,     6,     6,   226,     7,     7,     7,
-       7,     7,     7,  1520,     7,  1808,     6,     6,    90,  1526,
-       7,     6,     6,     4,     4,     4,   232,  1820,   233,   233,
-       6,   234,     6,     6,     6,     6,     4,     6,   227,   227,
-    1833,   232,   232,     7,     6,  1552,   230,   226,     6,   227,
-     230,     6,   233,   229,     6,   115,     6,  1850,   233,   233,
-    1853,   233,     6,   233,     6,   170,  1573,   233,     6,     6,
-    1863,  1520,     6,     6,     6,     6,     6,  1526,     6,  1872,
-       6,     5,     4,   227,   229,     6,  1879,  1880,   207,   208,
+     219,   220,  1708,  1709,  1710,     7,   225,     6,   102,     7,
+       7,     7,     7,     7,  1501,  1502,     7,     4,     4,  1506,
+    1507,   233,     6,   226,     7,     6,    90,     7,     7,     7,
+       7,     7,     7,  1520,     7,  1808,   233,     6,     6,  1526,
+       6,   232,     7,     6,     6,     4,     4,  1820,     4,   234,
+       4,     6,   233,   233,     6,     6,     6,     6,     6,   232,
+    1833,   232,   230,   227,     7,  1552,   227,   226,     6,     6,
+       6,     6,   230,   233,   227,   229,   115,  1850,   233,     6,
+    1853,     6,   233,     6,   233,   233,  1573,   170,     6,     6,
+    1863,  1520,   233,     6,     6,     6,     6,  1526,     6,  1872,
+       6,     6,     5,     4,   229,     4,  1879,  1880,   207,   208,
      209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
-     219,   220,     6,     4,     6,  1898,   225,   233,  1901,     7,
-    1836,     6,  1904,   233,     6,   228,   233,   233,     6,   233,
-       6,   233,   233,   233,  1573,  1918,   233,     6,   166,  1922,
-       3,     4,   233,   233,   233,     6,     9,    10,    11,   232,
-       6,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+     219,   220,   227,     6,     6,  1898,   225,     6,  1901,   233,
+    1836,     7,  1904,   233,     6,     6,   233,     6,   233,   228,
+     233,   233,     6,   233,  1573,  1918,   233,   233,   233,  1922,
+       3,     4,   233,   233,     6,   166,     9,    10,    11,     6,
+     232,    14,    15,    16,    17,    18,    19,    20,    21,    22,
       23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
       33,    34,    35,    36,    37,    38,    39,    40,    41,     6,
-       4,     6,    88,     6,     6,     4,     6,   233,     6,     6,
-      53,    54,    55,    56,     6,     6,     4,  1980,    61,   233,
-       7,     7,     6,     6,     6,     6,     6,     6,     5,    72,
-      73,    74,     6,     6,     6,     6,  1999,    80,     6,   932,
+       6,     4,     6,    88,     6,     6,     4,     6,     4,     6,
+      53,    54,    55,    56,     6,     6,     6,  1980,    61,     7,
+       7,     6,     6,     6,     6,     6,     6,     5,   233,    72,
+      73,    74,     6,   233,     6,     6,  1999,    80,     6,   932,
        6,    84,     6,     6,    87,     6,   939,    90,     6,    92,
-       6,     6,     6,   946,   232,     6,    99,     6,  2021,     6,
-       6,     6,     6,   227,     6,     6,     6,     6,   111,     6,
-     113,   232,     7,   116,     6,     6,   119,   230,     6,     5,
-       7,   233,     6,   126,   127,   128,   129,   130,     7,     8,
-     133,   134,   135,   136,   137,     6,   233,   233,   141,   234,
-     233,   144,   233,   233,  2067,  2068,  2069,  2070,  2071,     6,
-     234,     6,   233,   165,   233,   233,   233,     6,   234,   234,
-    2083,   234,     6,     6,  2020,     6,     6,   107,     6,   168,
-       6,     6,     6,     6,     6,     6,     6,     6,     6,   227,
-     233,     6,   185,     7,     6,     6,   189,   190,   233,   233,
-     233,   194,   195,   196,   197,   198,   233,     6,   234,   202,
-       6,     6,   122,   233,     6,     6,     6,     6,     6,     6,
-       6,     6,     6,   216,   217,     6,  1853,   234,   221,     6,
-     226,     6,   233,   226,   234,   233,  1863,   227,   231,   233,
-     233,   234,     6,  2156,     6,   233,     6,     6,     6,  2162,
+       6,     6,     6,   946,     6,     6,    99,   232,  2021,     6,
+       6,     6,     6,     6,     6,   227,     6,     6,   111,     6,
+     113,   232,     6,   116,     7,     6,   119,     6,     6,   230,
+       5,     7,     6,   126,   127,   128,   129,   130,     7,     8,
+     133,   134,   135,   136,   137,     6,   233,   233,   141,   233,
+       6,   144,   233,   233,  2067,  2068,  2069,  2070,  2071,   233,
+       6,   234,   234,   233,   233,   233,   165,   233,     6,     6,
+    2083,     6,   234,   234,  2020,   234,     6,   107,     6,     6,
+     168,     6,     6,     6,     6,     6,     6,     6,     6,     6,
+     227,   233,   185,     6,   234,     7,   189,   190,     6,   233,
+     233,   194,   195,   196,   197,   198,   233,     6,   233,   202,
+       6,     6,     6,   122,     6,   233,     6,     6,     6,     6,
+       6,     6,     6,   216,   217,     6,  1853,     6,   221,   234,
+       6,   226,   233,   226,     6,   233,  1863,   233,   231,     6,
+     233,   234,   227,  2156,   234,     6,     6,     6,     6,  2162,
      207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
-     217,   218,   219,   220,     6,     6,     6,     6,   225,     6,
-       6,   233,   202,   203,   204,   205,   206,     6,  2124,     6,
-       6,  2194,   233,     6,     6,     6,     6,   233,   233,   219,
-     233,  1134,     6,   223,     6,     6,     6,     6,     6,  2212,
-       6,  2214,  1361,  2024,   516,  1878,  1627,   237,   238,   239,
-     240,  1375,   242,   243,   244,   245,     3,   247,   248,   249,
+     217,   218,   219,   220,   233,     6,     6,     6,   225,     6,
+       6,     6,   202,   203,   204,   205,   206,     6,  2124,     6,
+       6,  2194,     6,   233,     6,     6,     6,     6,   233,   219,
+     233,  1134,     6,   223,   233,     6,     6,   233,     6,  2212,
+       6,  2214,     6,  1361,  2024,  1878,   516,   237,   238,   239,
+     240,  1627,   242,   243,   244,   245,  1375,   247,   248,   249,
      250,   251,   252,   253,   254,     3,   256,   257,   258,     3,
-       3,  2244,  1548,   263,  1900,   596,    -1,    -1,   207,   208,
+       3,  2244,     3,   263,  1900,  1548,   596,    -1,   207,   208,
      209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
      219,   220,   282,   283,   284,    -1,   225,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,   294,   295,    -1,    -1,    -1,    -1,
@@ -3988,7 +3988,7 @@ static const yytype_int16 yycheck[] =
       -1,    -1,    -1,   313,    -1,    -1,    -1,    -1,  2071,    -1,
     1160,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
     1170,  1171,    -1,  1173,  1174,    -1,  1176,  1177,  1178,    -1,
-      -1,    -1,   342,    -1,    -1,    -1,  1186,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1186,    -1,    -1,    -1,
       -1,    -1,  1192,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,  1203,    -1,  1205,    -1,  1207,    -1,  1209,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
@@ -5222,7 +5222,7 @@ static const yytype_uint16 yystos[] =
      322,     4,   328,   332,   233,   233,   325,   325,   325,   322,
      322,   216,   217,   233,   233,   325,   233,   233,   233,   216,
      217,   226,   284,   325,   233,   226,   233,   226,   226,   226,
-     226,   226,   226,   226,   322,   329,   329,   328,   226,     4,
+     226,   226,   226,   226,   322,   329,   329,   329,   226,     4,
      228,   228,   284,     6,     6,   233,   233,   233,   329,   329,
      228,   228,   228,   322,     6,     6,   322,   322,   322,   230,
      322,   233,   170,   322,   322,   322,   322,     6,     6,   233,
@@ -11080,27 +11080,17 @@ yyreduce:
   case 340:
 #line 4349 "Gmsh.y"
     {
+      std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (9)].l), tags);
       int num = (int)(yyvsp[(3) - (9)].d);
-      if(FindSurface(num)){
-	yymsg(0, "Surface %d already exists", num);
-      }
-      else{
-	Surface *s = Create_Surface(num, MSH_SURF_DISCRETE);
-	Tree_Add(GModel::current()->getGEOInternals()->Surfaces, &s);
-	extr.mesh.Holes[num].first = (yyvsp[(8) - (9)].d);
-	extr.mesh.Holes[num].second.clear();
-	for(int i = 0; i < List_Nbr((yyvsp[(6) - (9)].l)); i++){
-	  double d;
-	  List_Read((yyvsp[(6) - (9)].l), i, &d);
-	  extr.mesh.Holes[num].second.push_back((int)d);
-	}
-      }
+      GModel::current()->getGEOInternals()->addDiscreteSurface(num);
+      extr.mesh.Holes[num].first = (yyvsp[(8) - (9)].d);
+      extr.mesh.Holes[num].second = tags;
       List_Delete((yyvsp[(6) - (9)].l));
     ;}
     break;
 
   case 341:
-#line 4368 "Gmsh.y"
+#line 4358 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (6)].c), "Index"))
         extr.mesh.BoundaryLayerIndex = (yyvsp[(4) - (6)].d);
@@ -11111,47 +11101,47 @@ yyreduce:
     break;
 
   case 342:
-#line 4380 "Gmsh.y"
+#line 4370 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Union; ;}
     break;
 
   case 343:
-#line 4381 "Gmsh.y"
+#line 4371 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Intersection; ;}
     break;
 
   case 344:
-#line 4382 "Gmsh.y"
+#line 4372 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Difference; ;}
     break;
 
   case 345:
-#line 4383 "Gmsh.y"
+#line 4373 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Section; ;}
     break;
 
   case 346:
-#line 4384 "Gmsh.y"
+#line 4374 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Fragments; ;}
     break;
 
   case 347:
-#line 4388 "Gmsh.y"
+#line 4378 "Gmsh.y"
     { (yyval.i) = 0; ;}
     break;
 
   case 348:
-#line 4389 "Gmsh.y"
+#line 4379 "Gmsh.y"
     { (yyval.i) = 1; ;}
     break;
 
   case 349:
-#line 4390 "Gmsh.y"
+#line 4380 "Gmsh.y"
     { (yyval.i) = (yyvsp[(2) - (3)].d); ;}
     break;
 
   case 350:
-#line 4395 "Gmsh.y"
+#line 4385 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       if(factory == "OpenCASCADE"){
@@ -11187,7 +11177,7 @@ yyreduce:
     break;
 
   case 351:
-#line 4428 "Gmsh.y"
+#line 4418 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       if(factory == "OpenCASCADE"){
@@ -11213,7 +11203,7 @@ yyreduce:
     break;
 
   case 352:
-#line 4455 "Gmsh.y"
+#line 4445 "Gmsh.y"
     {
       if(factory == "OpenCASCADE"){
         std::vector<int> shape[4], tool[4];
@@ -11235,14 +11225,14 @@ yyreduce:
     break;
 
   case 353:
-#line 4477 "Gmsh.y"
+#line 4467 "Gmsh.y"
     {
       (yyval.v)[0] = (yyval.v)[1] = 1.;
     ;}
     break;
 
   case 354:
-#line 4481 "Gmsh.y"
+#line 4471 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Progression") || !strcmp((yyvsp[(2) - (3)].c), "Power"))
         (yyval.v)[0] = 1.;
@@ -11258,14 +11248,14 @@ yyreduce:
     break;
 
   case 355:
-#line 4496 "Gmsh.y"
+#line 4486 "Gmsh.y"
     {
       (yyval.i) = -1; // left
     ;}
     break;
 
   case 356:
-#line 4500 "Gmsh.y"
+#line 4490 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "Right"))
         (yyval.i) = 1;
@@ -11282,49 +11272,49 @@ yyreduce:
     break;
 
   case 357:
-#line 4516 "Gmsh.y"
+#line 4506 "Gmsh.y"
     {
      (yyval.l) = List_Create(1, 1, sizeof(double));
    ;}
     break;
 
   case 358:
-#line 4520 "Gmsh.y"
+#line 4510 "Gmsh.y"
     {
      (yyval.l) = (yyvsp[(2) - (2)].l);
    ;}
     break;
 
   case 359:
-#line 4525 "Gmsh.y"
+#line 4515 "Gmsh.y"
     {
       (yyval.i) = 45;
     ;}
     break;
 
   case 360:
-#line 4529 "Gmsh.y"
+#line 4519 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(2) - (2)].d);
     ;}
     break;
 
   case 361:
-#line 4535 "Gmsh.y"
+#line 4525 "Gmsh.y"
     {
       (yyval.l) = List_Create(1, 1, sizeof(double));
     ;}
     break;
 
   case 362:
-#line 4539 "Gmsh.y"
+#line 4529 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
     ;}
     break;
 
   case 363:
-#line 4546 "Gmsh.y"
+#line 4536 "Gmsh.y"
     {
       // mesh sizes at vertices are stored in internal CAD data, as they can be
       // specified during vertex creation and copied around during CAD
@@ -11343,7 +11333,7 @@ yyreduce:
     break;
 
   case 364:
-#line 4562 "Gmsh.y"
+#line 4552 "Gmsh.y"
     {
       // transfinite constraints are also stored in GEO internals, as they can
       // be copied around during GEO operations
@@ -11386,7 +11376,7 @@ yyreduce:
     break;
 
   case 365:
-#line 4602 "Gmsh.y"
+#line 4592 "Gmsh.y"
     {
       // transfinite constraints are also stored in GEO internals, as they can
       // be copied around during GEO operations
@@ -11432,7 +11422,7 @@ yyreduce:
     break;
 
   case 366:
-#line 4645 "Gmsh.y"
+#line 4635 "Gmsh.y"
     {
       yymsg(1, "Elliptic Surface is deprecated: use Transfinite instead (with smoothing)");
       List_Delete((yyvsp[(7) - (8)].l));
@@ -11440,7 +11430,7 @@ yyreduce:
     break;
 
   case 367:
-#line 4650 "Gmsh.y"
+#line 4640 "Gmsh.y"
     {
       // transfinite constraints are also stored in GEO internals, as they can
       // be copied around during GEO operations
@@ -11481,38 +11471,26 @@ yyreduce:
     break;
 
   case 368:
-#line 4688 "Gmsh.y"
+#line 4678 "Gmsh.y"
     {
+      // transfinite constraints are also stored in GEO internals, as they can
+      // be copied around during GEO operations
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
       if(!(yyvsp[(2) - (3)].l)){
-  	  List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes);
-        if(List_Nbr(tmp)){
-          for(int i = 0; i < List_Nbr(tmp); i++){
-            Volume *v;
-            List_Read(tmp, i, &v);
-            v->QuadTri = TRANSFINITE_QUADTRI_1;
-          }
-        }
-        else{
-          for(GModel::riter it = GModel::current()->firstRegion();
-              it != GModel::current()->lastRegion(); it++)
-            (*it)->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
-        }
-        List_Delete(tmp);
+        GModel::current()->getGEOInternals()->setTransfiniteVolumeQuadTri(0);
+        for(GModel::riter it = GModel::current()->firstRegion();
+            it != GModel::current()->lastRegion(); it++)
+          (*it)->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
       }
       else{
         for(int i = 0; i < List_Nbr((yyvsp[(2) - (3)].l)); i++){
           double d;
           List_Read((yyvsp[(2) - (3)].l), i, &d);
-          Volume *v = FindVolume((int)d);
-          if(v)
-            v->QuadTri = TRANSFINITE_QUADTRI_1;
-          else{
-            GRegion *gr = GModel::current()->getRegionByTag((int)d);
-            if(gr)
-              gr->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
-            else
-              yymsg(1, "Unknown model region with tag %d", (int)d);
-          }
+          int tag = (int)d;
+          GModel::current()->getGEOInternals()->setTransfiniteVolumeQuadTri(tag);
+          GRegion *gr = GModel::current()->getRegionByTag(tag);
+          if(gr) gr->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
         }
         List_Delete((yyvsp[(2) - (3)].l));
       }
@@ -11520,7 +11498,7 @@ yyreduce:
     break;
 
   case 369:
-#line 4724 "Gmsh.y"
+#line 4702 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (8)].l)); i++){
 	double d;
@@ -11532,46 +11510,30 @@ yyreduce:
     break;
 
   case 370:
-#line 4733 "Gmsh.y"
+#line 4711 "Gmsh.y"
     {
       // recombine constraints are also stored in GEO internals, as they can be
       // copied around during GEO operations
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
       if(!(yyvsp[(3) - (5)].l)){
-	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces);
-        if(List_Nbr(tmp)){
-          for(int i = 0; i < List_Nbr(tmp); i++){
-            Surface *s;
-            List_Read(tmp, i, &s);
-            s->Recombine = 1;
-            s->RecombineAngle = (yyvsp[(4) - (5)].i);
-          }
-        }
-        else{
-          for(GModel::fiter it = GModel::current()->firstFace();
-              it != GModel::current()->lastFace(); it++){
-            (*it)->meshAttributes.recombine = 1;
-            (*it)->meshAttributes.recombineAngle = (yyvsp[(4) - (5)].i);
-          }
+        GModel::current()->getGEOInternals()->setRecombine(2, 0, (yyvsp[(4) - (5)].i));
+        for(GModel::fiter it = GModel::current()->firstFace();
+            it != GModel::current()->lastFace(); it++){
+          (*it)->meshAttributes.recombine = 1;
+          (*it)->meshAttributes.recombineAngle = (yyvsp[(4) - (5)].i);
         }
-        List_Delete(tmp);
       }
       else{
         for(int i = 0; i < List_Nbr((yyvsp[(3) - (5)].l)); i++){
           double d;
           List_Read((yyvsp[(3) - (5)].l), i, &d);
-          Surface *s = FindSurface((int)d);
-          if(s){
-            s->Recombine = 1;
-            s->RecombineAngle = (yyvsp[(4) - (5)].i);
-          }
-          else{
-            GFace *gf = GModel::current()->getFaceByTag((int)d);
-            if(gf){
-              gf->meshAttributes.recombine = 1;
-              gf->meshAttributes.recombineAngle = (yyvsp[(4) - (5)].i);
-            }
-            else
-              yymsg(1, "Unknown model face with tag %d", (int)d);
+          int tag = (int)d;
+          GModel::current()->getGEOInternals()->setRecombine(2, tag, (yyvsp[(4) - (5)].i));
+          GFace *gf = GModel::current()->getFaceByTag(tag);
+          if(gf){
+            gf->meshAttributes.recombine = 1;
+            gf->meshAttributes.recombineAngle = (yyvsp[(4) - (5)].i);
           }
         }
         List_Delete((yyvsp[(3) - (5)].l));
@@ -11580,43 +11542,27 @@ yyreduce:
     break;
 
   case 371:
-#line 4778 "Gmsh.y"
+#line 4740 "Gmsh.y"
     {
       // recombine constraints are also stored in GEO internals, as they can be
       // copied around during GEO operations
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
       if(!(yyvsp[(3) - (4)].l)){
-	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes);
-        if(List_Nbr(tmp)){
-          for(int i = 0; i < List_Nbr(tmp); i++){
-            Volume *v;
-            List_Read(tmp, i, &v);
-            v->Recombine3D = 1;
-          }
-        }
-        else{
-          for(GModel::riter it = GModel::current()->firstRegion();
-              it != GModel::current()->lastRegion(); it++){
-            (*it)->meshAttributes.recombine3D = 1;
-          }
+        GModel::current()->getGEOInternals()->setRecombine(3, 0, 0.);
+        for(GModel::riter it = GModel::current()->firstRegion();
+            it != GModel::current()->lastRegion(); it++){
+          (*it)->meshAttributes.recombine3D = 1;
         }
-        List_Delete(tmp);
       }
       else{
         for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
           double d;
           List_Read((yyvsp[(3) - (4)].l), i, &d);
-          Volume *v = FindVolume((int)d);
-          if(v){
-            v->Recombine3D = 1;
-          }
-          else{
-            GRegion *gr = GModel::current()->getRegionByTag((int)d);
-            if(gr){
-              gr->meshAttributes.recombine3D = 1;
-            }
-            else
-              yymsg(1, "Unknown model region with tag %d", (int)d);
-          }
+          int tag = (int)d;
+          GModel::current()->getGEOInternals()->setRecombine(3, tag, 0.);
+          GRegion *gr = GModel::current()->getRegionByTag(tag);
+          if(gr) gr->meshAttributes.recombine3D = 1;
         }
         List_Delete((yyvsp[(3) - (4)].l));
       }
@@ -11624,32 +11570,35 @@ yyreduce:
     break;
 
   case 372:
-#line 4819 "Gmsh.y"
+#line 4765 "Gmsh.y"
     {
       // smoothing constraints are also stored in GEO internals, as they can be
       // copied around during GEO operations
-      for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
-        double d;
-        List_Read((yyvsp[(3) - (6)].l), i, &d);
-        int j = (int)d;
-        Surface *s = FindSurface(j);
-        if(s){
-          s->TransfiniteSmoothing = (int)(yyvsp[(5) - (6)].d);
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
+      if(!(yyvsp[(3) - (6)].l)){
+        GModel::current()->getGEOInternals()->setSmoothing(0, (int)(yyvsp[(5) - (6)].d));
+        for(GModel::fiter it = GModel::current()->firstFace();
+            it != GModel::current()->lastFace(); it++){
+          (*it)->meshAttributes.transfiniteSmoothing = (int)(yyvsp[(5) - (6)].d);
         }
-        else{
-          GFace *gf = GModel::current()->getFaceByTag(j);
-          if(gf)
-            gf->meshAttributes.transfiniteSmoothing = (int)(yyvsp[(5) - (6)].d);
-          else
-            yymsg(1, "Unknown model face with tag %d", (int)(yyvsp[(5) - (6)].d));
+      }
+      else{
+        for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
+          double d;
+          List_Read((yyvsp[(3) - (6)].l), i, &d);
+          int tag = (int)d;
+          GModel::current()->getGEOInternals()->setSmoothing(tag, (int)(yyvsp[(5) - (6)].d));
+          GFace *gf = GModel::current()->getFaceByTag(tag);
+          if(gf) gf->meshAttributes.transfiniteSmoothing = (int)(yyvsp[(5) - (6)].d);
         }
+        List_Delete((yyvsp[(3) - (6)].l));
       }
-      List_Delete((yyvsp[(3) - (6)].l));
     ;}
     break;
 
   case 373:
-#line 4842 "Gmsh.y"
+#line 4791 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (11)].l)) != List_Nbr((yyvsp[(8) - (11)].l))){
         yymsg(0, "Number of master lines (%d) different from number of "
@@ -11683,7 +11632,7 @@ yyreduce:
     break;
 
   case 374:
-#line 4874 "Gmsh.y"
+#line 4823 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (11)].l)) != List_Nbr((yyvsp[(8) - (11)].l))){
         yymsg(0, "Number of master faces (%d) different from number of "
@@ -11712,7 +11661,7 @@ yyreduce:
     break;
 
   case 375:
-#line 4901 "Gmsh.y"
+#line 4850 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (18)].l)) != List_Nbr((yyvsp[(8) - (18)].l))){
         yymsg(0, "Number of master edges (%d) different from number of "
@@ -11740,7 +11689,7 @@ yyreduce:
     break;
 
   case 376:
-#line 4927 "Gmsh.y"
+#line 4876 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (18)].l)) != List_Nbr((yyvsp[(8) - (18)].l))){
         yymsg(0, "Number of master faces (%d) different from number of "
@@ -11768,7 +11717,7 @@ yyreduce:
     break;
 
   case 377:
-#line 4953 "Gmsh.y"
+#line 4902 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (12)].l)) != List_Nbr((yyvsp[(8) - (12)].l))){
         yymsg(0, "Number of master edges (%d) different from number of "
@@ -11796,7 +11745,7 @@ yyreduce:
     break;
 
   case 378:
-#line 4979 "Gmsh.y"
+#line 4928 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (12)].l)) != List_Nbr((yyvsp[(8) - (12)].l))){
         yymsg(0, "Number of master faces (%d) different from number of "
@@ -11824,7 +11773,7 @@ yyreduce:
     break;
 
   case 379:
-#line 5005 "Gmsh.y"
+#line 4954 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(5) - (12)].l)) != List_Nbr((yyvsp[(10) - (12)].l))){
         yymsg(0, "Number of master surface edges (%d) different from number of "
@@ -11848,7 +11797,7 @@ yyreduce:
     break;
 
   case 380:
-#line 5026 "Gmsh.y"
+#line 4975 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags);
       addEmbedded(0, tags, 2, (int)(yyvsp[(8) - (10)].d));
@@ -11857,7 +11806,7 @@ yyreduce:
     break;
 
   case 381:
-#line 5032 "Gmsh.y"
+#line 4981 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags);
       addEmbedded(1, tags, 2, (int)(yyvsp[(8) - (10)].d));
@@ -11866,7 +11815,7 @@ yyreduce:
     break;
 
   case 382:
-#line 5038 "Gmsh.y"
+#line 4987 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags);
       addEmbedded(0, tags, 3, (int)(yyvsp[(8) - (10)].d));
@@ -11875,7 +11824,7 @@ yyreduce:
     break;
 
   case 383:
-#line 5044 "Gmsh.y"
+#line 4993 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags);
       addEmbedded(1, tags, 3, (int)(yyvsp[(8) - (10)].d));
@@ -11884,7 +11833,7 @@ yyreduce:
     break;
 
   case 384:
-#line 5050 "Gmsh.y"
+#line 4999 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags);
       addEmbedded(2, tags, 3, (int)(yyvsp[(8) - (10)].d));
@@ -11893,43 +11842,27 @@ yyreduce:
     break;
 
   case 385:
-#line 5056 "Gmsh.y"
+#line 5005 "Gmsh.y"
     {
       // reverse mesh constraints are also stored in GEO internals, as they can
       // be copied around during GEO operations
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
       if(!(yyvsp[(3) - (4)].l)){
-	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces);
-        if(List_Nbr(tmp)){
-          for(int i = 0; i < List_Nbr(tmp); i++){
-            Surface *s;
-            List_Read(tmp, i, &s);
-            s->ReverseMesh = 1;
-          }
-        }
-        else{
-          for(GModel::fiter it = GModel::current()->firstFace();
-              it != GModel::current()->lastFace(); it++){
-            (*it)->meshAttributes.reverseMesh = 1;
-          }
+        GModel::current()->getGEOInternals()->setReverseMesh(2, 0);
+        for(GModel::fiter it = GModel::current()->firstFace();
+            it != GModel::current()->lastFace(); it++){
+          (*it)->meshAttributes.reverseMesh = 1;
         }
-        List_Delete(tmp);
       }
       else{
         for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
           double d;
           List_Read((yyvsp[(3) - (4)].l), i, &d);
-          Surface *s = FindSurface((int)d);
-          if(s){
-            s->ReverseMesh = 1;
-          }
-          else{
-            GFace *gf = GModel::current()->getFaceByTag((int)d);
-            if(gf){
-              gf->meshAttributes.reverseMesh = 1;
-            }
-            else
-              yymsg(1, "Unknown model face with tag %d", (int)d);
-          }
+          int num = (int)d;
+          GModel::current()->getGEOInternals()->setReverseMesh(2, num);
+          GFace *gf = GModel::current()->getFaceByTag(num);
+          if(gf) gf->meshAttributes.reverseMesh = 1;
         }
         List_Delete((yyvsp[(3) - (4)].l));
       }
@@ -11937,43 +11870,27 @@ yyreduce:
     break;
 
   case 386:
-#line 5097 "Gmsh.y"
+#line 5030 "Gmsh.y"
     {
       // reverse mesh constraints are also stored in GEO internals, as they can
       // be copied around during GEO operations
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
       if(!(yyvsp[(3) - (4)].l)){
-	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Curves);
-        if(List_Nbr(tmp)){
-          for(int i = 0; i < List_Nbr(tmp); i++){
-            Curve *c;
-            List_Read(tmp, i, &c);
-            c->ReverseMesh = 1;
-          }
-        }
-        else{
-          for(GModel::eiter it = GModel::current()->firstEdge();
-              it != GModel::current()->lastEdge(); it++){
-            (*it)->meshAttributes.reverseMesh = 1;
-          }
+        GModel::current()->getGEOInternals()->setReverseMesh(1, 0);
+        for(GModel::eiter it = GModel::current()->firstEdge();
+            it != GModel::current()->lastEdge(); it++){
+          (*it)->meshAttributes.reverseMesh = 1;
         }
-        List_Delete(tmp);
       }
       else{
         for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
           double d;
           List_Read((yyvsp[(3) - (4)].l), i, &d);
-          Curve *c = FindCurve((int)d);
-          if(c){
-            c->ReverseMesh = 1;
-          }
-          else{
-            GEdge *ge = GModel::current()->getEdgeByTag((int)d);
-            if(ge){
-              ge->meshAttributes.reverseMesh = 1;
-            }
-            else
-              yymsg(1, "Unknown model edge with tag %d", (int)d);
-          }
+          int num = (int)d;
+          GModel::current()->getGEOInternals()->setReverseMesh(1, num);
+          GEdge *ge = GModel::current()->getEdgeByTag(num);
+          if(ge) ge->meshAttributes.reverseMesh = 1;
         }
         List_Delete((yyvsp[(3) - (4)].l));
       }
@@ -11981,7 +11898,7 @@ yyreduce:
     break;
 
   case 387:
-#line 5138 "Gmsh.y"
+#line 5055 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
         for(GModel::viter it = GModel::current()->firstVertex();
@@ -12001,7 +11918,7 @@ yyreduce:
     break;
 
   case 388:
-#line 5155 "Gmsh.y"
+#line 5072 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
         for(GModel::eiter it = GModel::current()->firstEdge();
@@ -12021,7 +11938,7 @@ yyreduce:
     break;
 
   case 389:
-#line 5172 "Gmsh.y"
+#line 5089 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
         for(GModel::fiter it = GModel::current()->firstFace();
@@ -12041,7 +11958,7 @@ yyreduce:
     break;
 
   case 390:
-#line 5189 "Gmsh.y"
+#line 5106 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
 	double dnum;
@@ -12056,7 +11973,7 @@ yyreduce:
     break;
 
   case 391:
-#line 5201 "Gmsh.y"
+#line 5118 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (4)].l), tags);
       GModel::current()->getGEOInternals()->setCompoundMesh(1, tags);
@@ -12065,7 +11982,7 @@ yyreduce:
     break;
 
   case 392:
-#line 5207 "Gmsh.y"
+#line 5124 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (4)].l), tags);
       GModel::current()->getGEOInternals()->setCompoundMesh(2, tags);
@@ -12074,7 +11991,7 @@ yyreduce:
     break;
 
   case 393:
-#line 5213 "Gmsh.y"
+#line 5130 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (4)].l), tags);
       GModel::current()->getGEOInternals()->setCompoundMesh(3, tags);
@@ -12083,14 +12000,14 @@ yyreduce:
     break;
 
   case 394:
-#line 5225 "Gmsh.y"
+#line 5142 "Gmsh.y"
     {
       GModel::current()->getGEOInternals()->removeAllDuplicates();
     ;}
     break;
 
   case 395:
-#line 5229 "Gmsh.y"
+#line 5146 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Geometry"))
         GModel::current()->getGEOInternals()->removeAllDuplicates();
@@ -12103,7 +12020,7 @@ yyreduce:
     break;
 
   case 396:
-#line 5239 "Gmsh.y"
+#line 5156 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(4) - (6)].l), tags);
       GModel::current()->getGEOInternals()->mergeVertices(tags);
@@ -12112,22 +12029,22 @@ yyreduce:
     break;
 
   case 397:
-#line 5249 "Gmsh.y"
+#line 5166 "Gmsh.y"
     { (yyval.c) = (char*)"Homology"; ;}
     break;
 
   case 398:
-#line 5250 "Gmsh.y"
+#line 5167 "Gmsh.y"
     { (yyval.c) = (char*)"Cohomology"; ;}
     break;
 
   case 399:
-#line 5251 "Gmsh.y"
+#line 5168 "Gmsh.y"
     { (yyval.c) = (char*)"Betti"; ;}
     break;
 
   case 400:
-#line 5256 "Gmsh.y"
+#line 5173 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < 4; i++) dim.push_back(i);
@@ -12136,7 +12053,7 @@ yyreduce:
     break;
 
   case 401:
-#line 5262 "Gmsh.y"
+#line 5179 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (5)].l)); i++){
@@ -12151,7 +12068,7 @@ yyreduce:
     break;
 
   case 402:
-#line 5274 "Gmsh.y"
+#line 5191 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (7)].l)); i++){
@@ -12172,7 +12089,7 @@ yyreduce:
     break;
 
   case 403:
-#line 5292 "Gmsh.y"
+#line 5209 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(6) - (10)].l)); i++){
@@ -12198,47 +12115,47 @@ yyreduce:
     break;
 
   case 404:
-#line 5319 "Gmsh.y"
+#line 5236 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d);           ;}
     break;
 
   case 405:
-#line 5320 "Gmsh.y"
+#line 5237 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (3)].d);           ;}
     break;
 
   case 406:
-#line 5321 "Gmsh.y"
+#line 5238 "Gmsh.y"
     { (yyval.d) = -(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 407:
-#line 5322 "Gmsh.y"
+#line 5239 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (2)].d);           ;}
     break;
 
   case 408:
-#line 5323 "Gmsh.y"
+#line 5240 "Gmsh.y"
     { (yyval.d) = !(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 409:
-#line 5324 "Gmsh.y"
+#line 5241 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 410:
-#line 5325 "Gmsh.y"
+#line 5242 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 411:
-#line 5326 "Gmsh.y"
+#line 5243 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 412:
-#line 5328 "Gmsh.y"
+#line 5245 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (3)].d))
 	yymsg(0, "Division by zero in '%g / %g'", (yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));
@@ -12248,232 +12165,232 @@ yyreduce:
     break;
 
   case 413:
-#line 5334 "Gmsh.y"
+#line 5251 "Gmsh.y"
     { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d);  ;}
     break;
 
   case 414:
-#line 5335 "Gmsh.y"
+#line 5252 "Gmsh.y"
     { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));  ;}
     break;
 
   case 415:
-#line 5336 "Gmsh.y"
+#line 5253 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 416:
-#line 5337 "Gmsh.y"
+#line 5254 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 417:
-#line 5338 "Gmsh.y"
+#line 5255 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 418:
-#line 5339 "Gmsh.y"
+#line 5256 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 419:
-#line 5340 "Gmsh.y"
+#line 5257 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 420:
-#line 5341 "Gmsh.y"
+#line 5258 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 421:
-#line 5342 "Gmsh.y"
+#line 5259 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 422:
-#line 5343 "Gmsh.y"
+#line 5260 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 423:
-#line 5344 "Gmsh.y"
+#line 5261 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;}
     break;
 
   case 424:
-#line 5345 "Gmsh.y"
+#line 5262 "Gmsh.y"
     { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 425:
-#line 5346 "Gmsh.y"
+#line 5263 "Gmsh.y"
     { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 426:
-#line 5347 "Gmsh.y"
+#line 5264 "Gmsh.y"
     { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 427:
-#line 5348 "Gmsh.y"
+#line 5265 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 428:
-#line 5349 "Gmsh.y"
+#line 5266 "Gmsh.y"
     { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 429:
-#line 5350 "Gmsh.y"
+#line 5267 "Gmsh.y"
     { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 430:
-#line 5351 "Gmsh.y"
+#line 5268 "Gmsh.y"
     { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 431:
-#line 5352 "Gmsh.y"
+#line 5269 "Gmsh.y"
     { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 432:
-#line 5353 "Gmsh.y"
+#line 5270 "Gmsh.y"
     { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 433:
-#line 5354 "Gmsh.y"
+#line 5271 "Gmsh.y"
     { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 434:
-#line 5355 "Gmsh.y"
+#line 5272 "Gmsh.y"
     { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 435:
-#line 5356 "Gmsh.y"
+#line 5273 "Gmsh.y"
     { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 436:
-#line 5357 "Gmsh.y"
+#line 5274 "Gmsh.y"
     { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 437:
-#line 5358 "Gmsh.y"
+#line 5275 "Gmsh.y"
     { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 438:
-#line 5359 "Gmsh.y"
+#line 5276 "Gmsh.y"
     { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 439:
-#line 5360 "Gmsh.y"
+#line 5277 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 440:
-#line 5361 "Gmsh.y"
+#line 5278 "Gmsh.y"
     { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 441:
-#line 5362 "Gmsh.y"
+#line 5279 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d) + 0.5); ;}
     break;
 
   case 442:
-#line 5363 "Gmsh.y"
+#line 5280 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 443:
-#line 5364 "Gmsh.y"
+#line 5281 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 444:
-#line 5365 "Gmsh.y"
+#line 5282 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 445:
-#line 5366 "Gmsh.y"
+#line 5283 "Gmsh.y"
     { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 446:
-#line 5375 "Gmsh.y"
+#line 5292 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
     break;
 
   case 447:
-#line 5376 "Gmsh.y"
+#line 5293 "Gmsh.y"
     { (yyval.d) = 3.141592653589793; ;}
     break;
 
   case 448:
-#line 5377 "Gmsh.y"
+#line 5294 "Gmsh.y"
     { (yyval.d) = (double)ImbricatedTest; ;}
     break;
 
   case 449:
-#line 5378 "Gmsh.y"
+#line 5295 "Gmsh.y"
     { (yyval.d) = Msg::GetCommRank(); ;}
     break;
 
   case 450:
-#line 5379 "Gmsh.y"
+#line 5296 "Gmsh.y"
     { (yyval.d) = Msg::GetCommSize(); ;}
     break;
 
   case 451:
-#line 5380 "Gmsh.y"
+#line 5297 "Gmsh.y"
     { (yyval.d) = GetGmshMajorVersion(); ;}
     break;
 
   case 452:
-#line 5381 "Gmsh.y"
+#line 5298 "Gmsh.y"
     { (yyval.d) = GetGmshMinorVersion(); ;}
     break;
 
   case 453:
-#line 5382 "Gmsh.y"
+#line 5299 "Gmsh.y"
     { (yyval.d) = GetGmshPatchVersion(); ;}
     break;
 
   case 454:
-#line 5383 "Gmsh.y"
+#line 5300 "Gmsh.y"
     { (yyval.d) = Cpu(); ;}
     break;
 
   case 455:
-#line 5384 "Gmsh.y"
+#line 5301 "Gmsh.y"
     { (yyval.d) = GetMemoryUsage()/1024./1024.; ;}
     break;
 
   case 456:
-#line 5385 "Gmsh.y"
+#line 5302 "Gmsh.y"
     { (yyval.d) = TotalRam(); ;}
     break;
 
   case 457:
-#line 5390 "Gmsh.y"
+#line 5307 "Gmsh.y"
     { floatOptions.clear(); charOptions.clear(); ;}
     break;
 
   case 458:
-#line 5392 "Gmsh.y"
+#line 5309 "Gmsh.y"
     {
       std::vector<double> val(1, (yyvsp[(3) - (6)].d));
       Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions);
@@ -12482,7 +12399,7 @@ yyreduce:
     break;
 
   case 459:
-#line 5398 "Gmsh.y"
+#line 5315 "Gmsh.y"
     {
       (yyval.d) = Msg::GetOnelabNumber((yyvsp[(3) - (4)].c));
       Free((yyvsp[(3) - (4)].c));
@@ -12490,7 +12407,7 @@ yyreduce:
     break;
 
   case 460:
-#line 5403 "Gmsh.y"
+#line 5320 "Gmsh.y"
     {
       (yyval.d) = Msg::GetOnelabNumber((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
@@ -12498,7 +12415,7 @@ yyreduce:
     break;
 
   case 461:
-#line 5408 "Gmsh.y"
+#line 5325 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (1)].c));
@@ -12518,7 +12435,7 @@ yyreduce:
     break;
 
   case 462:
-#line 5425 "Gmsh.y"
+#line 5342 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (4)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){
@@ -12539,7 +12456,7 @@ yyreduce:
     break;
 
   case 463:
-#line 5443 "Gmsh.y"
+#line 5360 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (4)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){
@@ -12560,7 +12477,7 @@ yyreduce:
     break;
 
   case 464:
-#line 5461 "Gmsh.y"
+#line 5378 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (4)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){
@@ -12581,7 +12498,7 @@ yyreduce:
     break;
 
   case 465:
-#line 5479 "Gmsh.y"
+#line 5396 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (4)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){
@@ -12602,7 +12519,7 @@ yyreduce:
     break;
 
   case 466:
-#line 5497 "Gmsh.y"
+#line 5414 "Gmsh.y"
     {
       (yyval.d) = gmsh_yysymbols.count((yyvsp[(3) - (4)].c));
       Free((yyvsp[(3) - (4)].c));
@@ -12610,7 +12527,7 @@ yyreduce:
     break;
 
   case 467:
-#line 5502 "Gmsh.y"
+#line 5419 "Gmsh.y"
     {
       std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(3) - (4)].c));
       (yyval.d) = !StatFile(tmp);
@@ -12619,7 +12536,7 @@ yyreduce:
     break;
 
   case 468:
-#line 5508 "Gmsh.y"
+#line 5425 "Gmsh.y"
     {
       if(gmsh_yysymbols.count((yyvsp[(2) - (4)].c))){
         gmsh_yysymbol &s(gmsh_yysymbols[(yyvsp[(2) - (4)].c)]);
@@ -12637,7 +12554,7 @@ yyreduce:
     break;
 
   case 469:
-#line 5523 "Gmsh.y"
+#line 5440 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (2)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (2)].c));
@@ -12659,7 +12576,7 @@ yyreduce:
     break;
 
   case 470:
-#line 5542 "Gmsh.y"
+#line 5459 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -12682,7 +12599,7 @@ yyreduce:
     break;
 
   case 471:
-#line 5562 "Gmsh.y"
+#line 5479 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -12705,7 +12622,7 @@ yyreduce:
     break;
 
   case 472:
-#line 5582 "Gmsh.y"
+#line 5499 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -12728,7 +12645,7 @@ yyreduce:
     break;
 
   case 473:
-#line 5602 "Gmsh.y"
+#line 5519 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -12751,7 +12668,7 @@ yyreduce:
     break;
 
   case 474:
-#line 5625 "Gmsh.y"
+#line 5542 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), (yyval.d));
       Free((yyvsp[(1) - (3)].c)); Free((yyvsp[(3) - (3)].c));
@@ -12759,7 +12676,7 @@ yyreduce:
     break;
 
   case 475:
-#line 5630 "Gmsh.y"
+#line 5547 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), (yyval.d));
       Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(6) - (6)].c));
@@ -12767,7 +12684,7 @@ yyreduce:
     break;
 
   case 476:
-#line 5635 "Gmsh.y"
+#line 5552 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (4)].c), 0, (yyvsp[(3) - (4)].c), d)){
@@ -12780,7 +12697,7 @@ yyreduce:
     break;
 
   case 477:
-#line 5645 "Gmsh.y"
+#line 5562 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c), d)){
@@ -12793,7 +12710,7 @@ yyreduce:
     break;
 
   case 478:
-#line 5655 "Gmsh.y"
+#line 5572 "Gmsh.y"
     {
       (yyval.d) = Msg::GetValue((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
@@ -12801,7 +12718,7 @@ yyreduce:
     break;
 
   case 479:
-#line 5660 "Gmsh.y"
+#line 5577 "Gmsh.y"
     {
       int matches = 0;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
@@ -12815,7 +12732,7 @@ yyreduce:
     break;
 
   case 480:
-#line 5671 "Gmsh.y"
+#line 5588 "Gmsh.y"
     {
       std::string s((yyvsp[(3) - (6)].c)), substr((yyvsp[(5) - (6)].c));
       if(s.find(substr) != std::string::npos)
@@ -12827,7 +12744,7 @@ yyreduce:
     break;
 
   case 481:
-#line 5680 "Gmsh.y"
+#line 5597 "Gmsh.y"
     {
       (yyval.d) = strlen((yyvsp[(3) - (4)].c));
       Free((yyvsp[(3) - (4)].c));
@@ -12835,7 +12752,7 @@ yyreduce:
     break;
 
   case 482:
-#line 5685 "Gmsh.y"
+#line 5602 "Gmsh.y"
     {
       (yyval.d) = strcmp((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       Free((yyvsp[(3) - (6)].c)); Free((yyvsp[(5) - (6)].c));
@@ -12843,7 +12760,7 @@ yyreduce:
     break;
 
   case 483:
-#line 5690 "Gmsh.y"
+#line 5607 "Gmsh.y"
     {
       int align = 0, font = 0, fontsize = CTX::instance()->glFontSize;
       if(List_Nbr((yyvsp[(3) - (4)].l)) % 2){
@@ -12870,70 +12787,70 @@ yyreduce:
     break;
 
   case 484:
-#line 5717 "Gmsh.y"
+#line 5634 "Gmsh.y"
     {
       memcpy((yyval.v), (yyvsp[(1) - (1)].v), 5*sizeof(double));
     ;}
     break;
 
   case 485:
-#line 5721 "Gmsh.y"
+#line 5638 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 486:
-#line 5725 "Gmsh.y"
+#line 5642 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 487:
-#line 5729 "Gmsh.y"
+#line 5646 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] - (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
   case 488:
-#line 5733 "Gmsh.y"
+#line 5650 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] + (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
   case 489:
-#line 5740 "Gmsh.y"
+#line 5657 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (11)].d);  (yyval.v)[1] = (yyvsp[(4) - (11)].d);  (yyval.v)[2] = (yyvsp[(6) - (11)].d);  (yyval.v)[3] = (yyvsp[(8) - (11)].d); (yyval.v)[4] = (yyvsp[(10) - (11)].d);
     ;}
     break;
 
   case 490:
-#line 5744 "Gmsh.y"
+#line 5661 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (9)].d);  (yyval.v)[1] = (yyvsp[(4) - (9)].d);  (yyval.v)[2] = (yyvsp[(6) - (9)].d);  (yyval.v)[3] = (yyvsp[(8) - (9)].d); (yyval.v)[4] = 1.0;
     ;}
     break;
 
   case 491:
-#line 5748 "Gmsh.y"
+#line 5665 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
     ;}
     break;
 
   case 492:
-#line 5752 "Gmsh.y"
+#line 5669 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
     ;}
     break;
 
   case 493:
-#line 5759 "Gmsh.y"
+#line 5676 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(List_T*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].l)));
@@ -12941,14 +12858,14 @@ yyreduce:
     break;
 
   case 494:
-#line 5764 "Gmsh.y"
+#line 5681 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].l)));
     ;}
     break;
 
   case 495:
-#line 5771 "Gmsh.y"
+#line 5688 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -12956,14 +12873,14 @@ yyreduce:
     break;
 
   case 496:
-#line 5776 "Gmsh.y"
+#line 5693 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 497:
-#line 5780 "Gmsh.y"
+#line 5697 "Gmsh.y"
     {
       // creates an empty list
       (yyval.l) = List_Create(2, 1, sizeof(double));
@@ -12971,14 +12888,14 @@ yyreduce:
     break;
 
   case 498:
-#line 5785 "Gmsh.y"
+#line 5702 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
   case 499:
-#line 5789 "Gmsh.y"
+#line 5706 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -12989,7 +12906,7 @@ yyreduce:
     break;
 
   case 500:
-#line 5797 "Gmsh.y"
+#line 5714 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (5)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -13000,14 +12917,14 @@ yyreduce:
     break;
 
   case 501:
-#line 5808 "Gmsh.y"
+#line 5725 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 502:
-#line 5812 "Gmsh.y"
+#line 5729 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "*") || !strcmp((yyvsp[(1) - (1)].c), "all"))
         (yyval.l) = 0;
@@ -13019,7 +12936,7 @@ yyreduce:
     break;
 
   case 503:
-#line 5824 "Gmsh.y"
+#line 5741 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -13030,7 +12947,7 @@ yyreduce:
     break;
 
   case 504:
-#line 5832 "Gmsh.y"
+#line 5749 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (3)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -13041,7 +12958,7 @@ yyreduce:
     break;
 
   case 505:
-#line 5840 "Gmsh.y"
+#line 5757 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       for(double d = (yyvsp[(1) - (3)].d); ((yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d)) ? (d <= (yyvsp[(3) - (3)].d)) : (d >= (yyvsp[(3) - (3)].d));
@@ -13051,7 +12968,7 @@ yyreduce:
     break;
 
   case 506:
-#line 5847 "Gmsh.y"
+#line 5764 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!(yyvsp[(5) - (5)].d)){  //|| ($1 < $3 && $5 < 0) || ($1 > $3 && $5 > 0)
@@ -13064,7 +12981,7 @@ yyreduce:
     break;
 
   case 507:
-#line 5857 "Gmsh.y"
+#line 5774 "Gmsh.y"
     {
       (yyval.l) = List_Create(3, 1, sizeof(double));
       int tag = (int)(yyvsp[(3) - (4)].d);
@@ -13089,63 +13006,63 @@ yyreduce:
     break;
 
   case 508:
-#line 5879 "Gmsh.y"
+#line 5796 "Gmsh.y"
     {
       (yyval.l) = GetAllElementaryEntityNumbers(0);
     ;}
     break;
 
   case 509:
-#line 5883 "Gmsh.y"
+#line 5800 "Gmsh.y"
     {
       (yyval.l) = GetAllElementaryEntityNumbers(1);
     ;}
     break;
 
   case 510:
-#line 5887 "Gmsh.y"
+#line 5804 "Gmsh.y"
     {
       (yyval.l) = GetAllElementaryEntityNumbers(2);
     ;}
     break;
 
   case 511:
-#line 5891 "Gmsh.y"
+#line 5808 "Gmsh.y"
     {
       (yyval.l) = GetAllElementaryEntityNumbers(3);
     ;}
     break;
 
   case 512:
-#line 5895 "Gmsh.y"
+#line 5812 "Gmsh.y"
     {
       (yyval.l) = GetAllPhysicalEntityNumbers(0);
     ;}
     break;
 
   case 513:
-#line 5899 "Gmsh.y"
+#line 5816 "Gmsh.y"
     {
       (yyval.l) = GetAllPhysicalEntityNumbers(1);
     ;}
     break;
 
   case 514:
-#line 5903 "Gmsh.y"
+#line 5820 "Gmsh.y"
     {
       (yyval.l) = GetAllPhysicalEntityNumbers(2);
     ;}
     break;
 
   case 515:
-#line 5907 "Gmsh.y"
+#line 5824 "Gmsh.y"
     {
       (yyval.l) = GetAllPhysicalEntityNumbers(3);
     ;}
     break;
 
   case 516:
-#line 5911 "Gmsh.y"
+#line 5828 "Gmsh.y"
     {
       // FIXME: physical groups should not be stored in GEO_Internals, but
       // directly in GModel
@@ -13179,7 +13096,7 @@ yyreduce:
     break;
 
   case 517:
-#line 5942 "Gmsh.y"
+#line 5859 "Gmsh.y"
     {
       // FIXME: physical groups should not be stored in GEO_Internals, but
       // directly in GModel
@@ -13213,7 +13130,7 @@ yyreduce:
     break;
 
   case 518:
-#line 5973 "Gmsh.y"
+#line 5890 "Gmsh.y"
     {
       // FIXME: physical groups should not be stored in GEO_Internals, but
       // directly in GModel
@@ -13247,7 +13164,7 @@ yyreduce:
     break;
 
   case 519:
-#line 6004 "Gmsh.y"
+#line 5921 "Gmsh.y"
     {
       // FIXME: physical groups should not be stored in GEO_Internals, but
       // directly in GModel
@@ -13281,7 +13198,7 @@ yyreduce:
     break;
 
   case 520:
-#line 6036 "Gmsh.y"
+#line 5953 "Gmsh.y"
     {
       if(GModel::current()->getOCCInternals()->getChanged())
         GModel::current()->getOCCInternals()->synchronize(GModel::current());
@@ -13299,7 +13216,7 @@ yyreduce:
     break;
 
   case 521:
-#line 6052 "Gmsh.y"
+#line 5969 "Gmsh.y"
     {
       if(GModel::current()->getOCCInternals()->getChanged())
         GModel::current()->getOCCInternals()->synchronize(GModel::current());
@@ -13317,7 +13234,7 @@ yyreduce:
     break;
 
   case 522:
-#line 6068 "Gmsh.y"
+#line 5985 "Gmsh.y"
     {
       if(GModel::current()->getOCCInternals()->getChanged())
         GModel::current()->getOCCInternals()->synchronize(GModel::current());
@@ -13335,7 +13252,7 @@ yyreduce:
     break;
 
   case 523:
-#line 6084 "Gmsh.y"
+#line 6001 "Gmsh.y"
     {
       if(GModel::current()->getOCCInternals()->getChanged())
         GModel::current()->getOCCInternals()->synchronize(GModel::current());
@@ -13353,7 +13270,7 @@ yyreduce:
     break;
 
   case 524:
-#line 6099 "Gmsh.y"
+#line 6016 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -13366,7 +13283,7 @@ yyreduce:
     break;
 
   case 525:
-#line 6109 "Gmsh.y"
+#line 6026 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -13379,7 +13296,7 @@ yyreduce:
     break;
 
   case 526:
-#line 6119 "Gmsh.y"
+#line 6036 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -13392,7 +13309,7 @@ yyreduce:
     break;
 
   case 527:
-#line 6129 "Gmsh.y"
+#line 6046 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -13407,7 +13324,7 @@ yyreduce:
     break;
 
   case 528:
-#line 6141 "Gmsh.y"
+#line 6058 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -13422,7 +13339,7 @@ yyreduce:
     break;
 
   case 529:
-#line 6154 "Gmsh.y"
+#line 6071 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(3) - (4)].c)))
@@ -13437,35 +13354,35 @@ yyreduce:
     break;
 
   case 530:
-#line 6166 "Gmsh.y"
+#line 6083 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
     ;}
     break;
 
   case 531:
-#line 6170 "Gmsh.y"
+#line 6087 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
     ;}
     break;
 
   case 532:
-#line 6174 "Gmsh.y"
+#line 6091 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (6)].l);
     ;}
     break;
 
   case 533:
-#line 6178 "Gmsh.y"
+#line 6095 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (6)].l);
     ;}
     break;
 
   case 534:
-#line 6182 "Gmsh.y"
+#line 6099 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -13486,7 +13403,7 @@ yyreduce:
     break;
 
   case 535:
-#line 6200 "Gmsh.y"
+#line 6117 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -13507,7 +13424,7 @@ yyreduce:
     break;
 
   case 536:
-#line 6218 "Gmsh.y"
+#line 6135 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(double));
       for(int i = 0; i < (int)(yyvsp[(7) - (8)].d); i++) {
@@ -13518,7 +13435,7 @@ yyreduce:
     break;
 
   case 537:
-#line 6226 "Gmsh.y"
+#line 6143 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(double));
       for(int i = 0; i < (int)(yyvsp[(7) - (8)].d); i++) {
@@ -13529,7 +13446,7 @@ yyreduce:
     break;
 
   case 538:
-#line 6234 "Gmsh.y"
+#line 6151 "Gmsh.y"
     {
       Msg::Barrier();
       FILE *File;
@@ -13561,7 +13478,7 @@ yyreduce:
     break;
 
   case 539:
-#line 6263 "Gmsh.y"
+#line 6180 "Gmsh.y"
     {
       double x0 = (yyvsp[(3) - (14)].d), x1 = (yyvsp[(5) - (14)].d), y0 = (yyvsp[(7) - (14)].d), y1 = (yyvsp[(9) - (14)].d), ys = (yyvsp[(11) - (14)].d);
       int N = (int)(yyvsp[(13) - (14)].d);
@@ -13574,7 +13491,7 @@ yyreduce:
     break;
 
   case 540:
-#line 6273 "Gmsh.y"
+#line 6190 "Gmsh.y"
     {
       std::vector<double> tmp;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
@@ -13593,7 +13510,7 @@ yyreduce:
     break;
 
   case 541:
-#line 6292 "Gmsh.y"
+#line 6209 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -13601,21 +13518,21 @@ yyreduce:
     break;
 
   case 542:
-#line 6297 "Gmsh.y"
+#line 6214 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 543:
-#line 6301 "Gmsh.y"
+#line 6218 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].d)));
     ;}
     break;
 
   case 544:
-#line 6305 "Gmsh.y"
+#line 6222 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	double d;
@@ -13627,21 +13544,21 @@ yyreduce:
     break;
 
   case 545:
-#line 6317 "Gmsh.y"
+#line 6234 "Gmsh.y"
     {
       (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (9)].d), (int)(yyvsp[(4) - (9)].d), (int)(yyvsp[(6) - (9)].d), (int)(yyvsp[(8) - (9)].d));
     ;}
     break;
 
   case 546:
-#line 6321 "Gmsh.y"
+#line 6238 "Gmsh.y"
     {
       (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (7)].d), (int)(yyvsp[(4) - (7)].d), (int)(yyvsp[(6) - (7)].d), 255);
     ;}
     break;
 
   case 547:
-#line 6333 "Gmsh.y"
+#line 6250 "Gmsh.y"
     {
       int flag = 0;
       if(gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){
@@ -13661,7 +13578,7 @@ yyreduce:
     break;
 
   case 548:
-#line 6350 "Gmsh.y"
+#line 6267 "Gmsh.y"
     {
       unsigned int val = 0;
       ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val);
@@ -13671,14 +13588,14 @@ yyreduce:
     break;
 
   case 549:
-#line 6360 "Gmsh.y"
+#line 6277 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
   case 550:
-#line 6364 "Gmsh.y"
+#line 6281 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (6)].d));
@@ -13693,7 +13610,7 @@ yyreduce:
     break;
 
   case 551:
-#line 6379 "Gmsh.y"
+#line 6296 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].u)));
@@ -13701,21 +13618,21 @@ yyreduce:
     break;
 
   case 552:
-#line 6384 "Gmsh.y"
+#line 6301 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].u)));
     ;}
     break;
 
   case 553:
-#line 6391 "Gmsh.y"
+#line 6308 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 554:
-#line 6395 "Gmsh.y"
+#line 6312 "Gmsh.y"
     {
       std::string val;
       if(!gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c)))
@@ -13731,7 +13648,7 @@ yyreduce:
     break;
 
   case 555:
-#line 6408 "Gmsh.y"
+#line 6325 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -13748,7 +13665,7 @@ yyreduce:
     break;
 
   case 556:
-#line 6422 "Gmsh.y"
+#line 6339 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -13765,7 +13682,7 @@ yyreduce:
     break;
 
   case 557:
-#line 6436 "Gmsh.y"
+#line 6353 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -13782,7 +13699,7 @@ yyreduce:
     break;
 
   case 558:
-#line 6450 "Gmsh.y"
+#line 6367 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -13799,7 +13716,7 @@ yyreduce:
     break;
 
   case 559:
-#line 6464 "Gmsh.y"
+#line 6381 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), out);
@@ -13810,7 +13727,7 @@ yyreduce:
     break;
 
   case 560:
-#line 6472 "Gmsh.y"
+#line 6389 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), out);
@@ -13821,21 +13738,21 @@ yyreduce:
     break;
 
   case 561:
-#line 6483 "Gmsh.y"
+#line 6400 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 562:
-#line 6487 "Gmsh.y"
+#line 6404 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
   case 563:
-#line 6491 "Gmsh.y"
+#line 6408 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc(32 * sizeof(char));
       time_t now;
@@ -13846,7 +13763,7 @@ yyreduce:
     break;
 
   case 564:
-#line 6499 "Gmsh.y"
+#line 6416 "Gmsh.y"
     {
       std::string exe = Msg::GetExecutableName();
       (yyval.c) = (char *)Malloc(exe.size() + 1);
@@ -13855,7 +13772,7 @@ yyreduce:
     break;
 
   case 565:
-#line 6505 "Gmsh.y"
+#line 6422 "Gmsh.y"
     {
       std::string action = Msg::GetOnelabAction();
       (yyval.c) = (char *)Malloc(action.size() + 1);
@@ -13864,7 +13781,7 @@ yyreduce:
     break;
 
   case 566:
-#line 6511 "Gmsh.y"
+#line 6428 "Gmsh.y"
     {
       const char *env = GetEnvironmentVar((yyvsp[(3) - (4)].c));
       if(!env) env = "";
@@ -13875,7 +13792,7 @@ yyreduce:
     break;
 
   case 567:
-#line 6519 "Gmsh.y"
+#line 6436 "Gmsh.y"
     {
       std::string s = Msg::GetString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -13886,7 +13803,7 @@ yyreduce:
     break;
 
   case 568:
-#line 6527 "Gmsh.y"
+#line 6444 "Gmsh.y"
     {
       std::string s = Msg::GetOnelabString((yyvsp[(3) - (4)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -13896,7 +13813,7 @@ yyreduce:
     break;
 
   case 569:
-#line 6534 "Gmsh.y"
+#line 6451 "Gmsh.y"
     {
       std::string s = Msg::GetOnelabString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -13907,7 +13824,7 @@ yyreduce:
     break;
 
   case 570:
-#line 6542 "Gmsh.y"
+#line 6459 "Gmsh.y"
     {
       int size = 1;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -13925,7 +13842,7 @@ yyreduce:
     break;
 
   case 571:
-#line 6557 "Gmsh.y"
+#line 6474 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -13942,7 +13859,7 @@ yyreduce:
     break;
 
   case 572:
-#line 6571 "Gmsh.y"
+#line 6488 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -13959,7 +13876,7 @@ yyreduce:
     break;
 
   case 573:
-#line 6585 "Gmsh.y"
+#line 6502 "Gmsh.y"
     {
       std::string input = (yyvsp[(3) - (8)].c);
       std::string substr_old = (yyvsp[(5) - (8)].c);
@@ -13974,7 +13891,7 @@ yyreduce:
     break;
 
   case 574:
-#line 6597 "Gmsh.y"
+#line 6514 "Gmsh.y"
     {
       int size = 1;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -13993,7 +13910,7 @@ yyreduce:
     break;
 
   case 575:
-#line 6613 "Gmsh.y"
+#line 6530 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -14005,7 +13922,7 @@ yyreduce:
     break;
 
   case 576:
-#line 6622 "Gmsh.y"
+#line 6539 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -14017,7 +13934,7 @@ yyreduce:
     break;
 
   case 577:
-#line 6631 "Gmsh.y"
+#line 6548 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -14030,7 +13947,7 @@ yyreduce:
     break;
 
   case 578:
-#line 6641 "Gmsh.y"
+#line 6558 "Gmsh.y"
     {
       if((yyvsp[(3) - (8)].d)){
         (yyval.c) = (yyvsp[(5) - (8)].c);
@@ -14044,7 +13961,7 @@ yyreduce:
     break;
 
   case 579:
-#line 6652 "Gmsh.y"
+#line 6569 "Gmsh.y"
     {
       std::string in = (yyvsp[(3) - (8)].c);
       std::string out = in.substr((int)(yyvsp[(5) - (8)].d), (int)(yyvsp[(7) - (8)].d));
@@ -14055,7 +13972,7 @@ yyreduce:
     break;
 
   case 580:
-#line 6660 "Gmsh.y"
+#line 6577 "Gmsh.y"
     {
       std::string in = (yyvsp[(3) - (6)].c);
       std::string out = in.substr((int)(yyvsp[(5) - (6)].d), std::string::npos);
@@ -14066,14 +13983,14 @@ yyreduce:
     break;
 
   case 581:
-#line 6668 "Gmsh.y"
+#line 6585 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
   case 582:
-#line 6672 "Gmsh.y"
+#line 6589 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -14095,7 +14012,7 @@ yyreduce:
     break;
 
   case 583:
-#line 6691 "Gmsh.y"
+#line 6608 "Gmsh.y"
     {
       std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(3) - (4)].c));
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -14105,7 +14022,7 @@ yyreduce:
     break;
 
   case 584:
-#line 6698 "Gmsh.y"
+#line 6615 "Gmsh.y"
     {
       std::string tmp = SplitFileName(GetAbsolutePath(gmsh_yyname))[0];
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -14114,7 +14031,7 @@ yyreduce:
     break;
 
   case 585:
-#line 6704 "Gmsh.y"
+#line 6621 "Gmsh.y"
     {
       std::string tmp = SplitFileName((yyvsp[(3) - (4)].c))[0];
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -14124,7 +14041,7 @@ yyreduce:
     break;
 
   case 586:
-#line 6711 "Gmsh.y"
+#line 6628 "Gmsh.y"
     {
       std::string tmp = GetAbsolutePath((yyvsp[(3) - (4)].c));
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -14134,12 +14051,12 @@ yyreduce:
     break;
 
   case 587:
-#line 6718 "Gmsh.y"
+#line 6635 "Gmsh.y"
     { floatOptions.clear(); charOptions.clear(); ;}
     break;
 
   case 588:
-#line 6720 "Gmsh.y"
+#line 6637 "Gmsh.y"
     {
       std::string val((yyvsp[(3) - (6)].c));
       Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions);
@@ -14150,7 +14067,7 @@ yyreduce:
     break;
 
   case 589:
-#line 6731 "Gmsh.y"
+#line 6648 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(char*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].c)));
@@ -14158,12 +14075,12 @@ yyreduce:
     break;
 
   case 590:
-#line 6736 "Gmsh.y"
+#line 6653 "Gmsh.y"
     { List_Add((yyval.l), &((yyvsp[(3) - (3)].c))); ;}
     break;
 
   case 591:
-#line 6742 "Gmsh.y"
+#line 6659 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -14174,7 +14091,7 @@ yyreduce:
     break;
 
   case 592:
-#line 6751 "Gmsh.y"
+#line 6668 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -14185,23 +14102,23 @@ yyreduce:
     break;
 
   case 593:
-#line 6764 "Gmsh.y"
+#line 6681 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); ;}
     break;
 
   case 594:
-#line 6767 "Gmsh.y"
+#line 6684 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); ;}
     break;
 
   case 595:
-#line 6771 "Gmsh.y"
+#line 6688 "Gmsh.y"
     { (yyval.c) = (yyvsp[(3) - (4)].c); ;}
     break;
 
 
 /* Line 1267 of yacc.c.  */
-#line 14205 "Gmsh.tab.cpp"
+#line 14122 "Gmsh.tab.cpp"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -14415,7 +14332,7 @@ yyreturn:
 }
 
 
-#line 6774 "Gmsh.y"
+#line 6691 "Gmsh.y"
 
 
 void assignVariable(const std::string &name, int index, int assignType,
@@ -14636,6 +14553,7 @@ fullMatrix<double> ListOfListOfDouble2Matrix(List_T *list)
 void ListOfDouble2Vector(List_T *list, std::vector<int> &v)
 {
   v.clear();
+  if(!list) return;
   v.reserve(List_Nbr(list));
   for(int i = 0; i < List_Nbr(list); i++){
     double d;
@@ -14647,6 +14565,7 @@ void ListOfDouble2Vector(List_T *list, std::vector<int> &v)
 void ListOfDouble2Vector(List_T *list, std::vector<double> &v)
 {
   v.clear();
+  if(!list) return;
   v.reserve(List_Nbr(list));
   for(int i = 0; i < List_Nbr(list); i++){
     double d;
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 2012a4837a324ea7e94c22447dfbee7e65aeddb2..fec0d7d85225735f8037369ca9ee25e7d1ed4ea3 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -4347,21 +4347,11 @@ ExtrudeParameter :
     }
   | tHole '(' FExpr ')' tAFFECT ListOfDouble tUsing FExpr tEND
     {
+      std::vector<int> tags; ListOfDouble2Vector($6, tags);
       int num = (int)$3;
-      if(FindSurface(num)){
-	yymsg(0, "Surface %d already exists", num);
-      }
-      else{
-	Surface *s = Create_Surface(num, MSH_SURF_DISCRETE);
-	Tree_Add(GModel::current()->getGEOInternals()->Surfaces, &s);
-	extr.mesh.Holes[num].first = $8;
-	extr.mesh.Holes[num].second.clear();
-	for(int i = 0; i < List_Nbr($6); i++){
-	  double d;
-	  List_Read($6, i, &d);
-	  extr.mesh.Holes[num].second.push_back((int)d);
-	}
-      }
+      GModel::current()->getGEOInternals()->addDiscreteSurface(num);
+      extr.mesh.Holes[num].first = $8;
+      extr.mesh.Holes[num].second = tags;
       List_Delete($6);
     }
   | tUsing tSTRING '[' FExpr ']' tEND
@@ -4686,36 +4676,24 @@ Constraints :
     }
   | tTransfQuadTri ListOfDoubleOrAll tEND
     {
+      // transfinite constraints are also stored in GEO internals, as they can
+      // be copied around during GEO operations
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
       if(!$2){
-  	  List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes);
-        if(List_Nbr(tmp)){
-          for(int i = 0; i < List_Nbr(tmp); i++){
-            Volume *v;
-            List_Read(tmp, i, &v);
-            v->QuadTri = TRANSFINITE_QUADTRI_1;
-          }
-        }
-        else{
-          for(GModel::riter it = GModel::current()->firstRegion();
-              it != GModel::current()->lastRegion(); it++)
-            (*it)->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
-        }
-        List_Delete(tmp);
+        GModel::current()->getGEOInternals()->setTransfiniteVolumeQuadTri(0);
+        for(GModel::riter it = GModel::current()->firstRegion();
+            it != GModel::current()->lastRegion(); it++)
+          (*it)->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
       }
       else{
         for(int i = 0; i < List_Nbr($2); i++){
           double d;
           List_Read($2, i, &d);
-          Volume *v = FindVolume((int)d);
-          if(v)
-            v->QuadTri = TRANSFINITE_QUADTRI_1;
-          else{
-            GRegion *gr = GModel::current()->getRegionByTag((int)d);
-            if(gr)
-              gr->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
-            else
-              yymsg(1, "Unknown model region with tag %d", (int)d);
-          }
+          int tag = (int)d;
+          GModel::current()->getGEOInternals()->setTransfiniteVolumeQuadTri(tag);
+          GRegion *gr = GModel::current()->getRegionByTag(tag);
+          if(gr) gr->meshAttributes.QuadTri = TRANSFINITE_QUADTRI_1;
         }
         List_Delete($2);
       }
@@ -4733,109 +4711,80 @@ Constraints :
     {
       // recombine constraints are also stored in GEO internals, as they can be
       // copied around during GEO operations
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
       if(!$3){
-	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces);
-        if(List_Nbr(tmp)){
-          for(int i = 0; i < List_Nbr(tmp); i++){
-            Surface *s;
-            List_Read(tmp, i, &s);
-            s->Recombine = 1;
-            s->RecombineAngle = $4;
-          }
-        }
-        else{
-          for(GModel::fiter it = GModel::current()->firstFace();
-              it != GModel::current()->lastFace(); it++){
-            (*it)->meshAttributes.recombine = 1;
-            (*it)->meshAttributes.recombineAngle = $4;
-          }
+        GModel::current()->getGEOInternals()->setRecombine(2, 0, $4);
+        for(GModel::fiter it = GModel::current()->firstFace();
+            it != GModel::current()->lastFace(); it++){
+          (*it)->meshAttributes.recombine = 1;
+          (*it)->meshAttributes.recombineAngle = $4;
         }
-        List_Delete(tmp);
       }
       else{
         for(int i = 0; i < List_Nbr($3); i++){
           double d;
           List_Read($3, i, &d);
-          Surface *s = FindSurface((int)d);
-          if(s){
-            s->Recombine = 1;
-            s->RecombineAngle = $4;
-          }
-          else{
-            GFace *gf = GModel::current()->getFaceByTag((int)d);
-            if(gf){
-              gf->meshAttributes.recombine = 1;
-              gf->meshAttributes.recombineAngle = $4;
-            }
-            else
-              yymsg(1, "Unknown model face with tag %d", (int)d);
+          int tag = (int)d;
+          GModel::current()->getGEOInternals()->setRecombine(2, tag, $4);
+          GFace *gf = GModel::current()->getFaceByTag(tag);
+          if(gf){
+            gf->meshAttributes.recombine = 1;
+            gf->meshAttributes.recombineAngle = $4;
           }
         }
         List_Delete($3);
       }
     }
-  | tRecombine tVolume ListOfDoubleOrAll  tEND
+  | tRecombine tVolume ListOfDoubleOrAll tEND
     {
       // recombine constraints are also stored in GEO internals, as they can be
       // copied around during GEO operations
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
       if(!$3){
-	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes);
-        if(List_Nbr(tmp)){
-          for(int i = 0; i < List_Nbr(tmp); i++){
-            Volume *v;
-            List_Read(tmp, i, &v);
-            v->Recombine3D = 1;
-          }
-        }
-        else{
-          for(GModel::riter it = GModel::current()->firstRegion();
-              it != GModel::current()->lastRegion(); it++){
-            (*it)->meshAttributes.recombine3D = 1;
-          }
+        GModel::current()->getGEOInternals()->setRecombine(3, 0, 0.);
+        for(GModel::riter it = GModel::current()->firstRegion();
+            it != GModel::current()->lastRegion(); it++){
+          (*it)->meshAttributes.recombine3D = 1;
         }
-        List_Delete(tmp);
       }
       else{
         for(int i = 0; i < List_Nbr($3); i++){
           double d;
           List_Read($3, i, &d);
-          Volume *v = FindVolume((int)d);
-          if(v){
-            v->Recombine3D = 1;
-          }
-          else{
-            GRegion *gr = GModel::current()->getRegionByTag((int)d);
-            if(gr){
-              gr->meshAttributes.recombine3D = 1;
-            }
-            else
-              yymsg(1, "Unknown model region with tag %d", (int)d);
-          }
+          int tag = (int)d;
+          GModel::current()->getGEOInternals()->setRecombine(3, tag, 0.);
+          GRegion *gr = GModel::current()->getRegionByTag(tag);
+          if(gr) gr->meshAttributes.recombine3D = 1;
         }
         List_Delete($3);
       }
     }
-  | tSmoother tSurface ListOfDouble tAFFECT FExpr tEND
+  | tSmoother tSurface ListOfDoubleOrAll tAFFECT FExpr tEND
     {
       // smoothing constraints are also stored in GEO internals, as they can be
       // copied around during GEO operations
-      for(int i = 0; i < List_Nbr($3); i++){
-        double d;
-        List_Read($3, i, &d);
-        int j = (int)d;
-        Surface *s = FindSurface(j);
-        if(s){
-          s->TransfiniteSmoothing = (int)$5;
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
+      if(!$3){
+        GModel::current()->getGEOInternals()->setSmoothing(0, (int)$5);
+        for(GModel::fiter it = GModel::current()->firstFace();
+            it != GModel::current()->lastFace(); it++){
+          (*it)->meshAttributes.transfiniteSmoothing = (int)$5;
         }
-        else{
-          GFace *gf = GModel::current()->getFaceByTag(j);
-          if(gf)
-            gf->meshAttributes.transfiniteSmoothing = (int)$5;
-          else
-            yymsg(1, "Unknown model face with tag %d", (int)$5);
+      }
+      else{
+        for(int i = 0; i < List_Nbr($3); i++){
+          double d;
+          List_Read($3, i, &d);
+          int tag = (int)d;
+          GModel::current()->getGEOInternals()->setSmoothing(tag, (int)$5);
+          GFace *gf = GModel::current()->getFaceByTag(tag);
+          if(gf) gf->meshAttributes.transfiniteSmoothing = (int)$5;
         }
+        List_Delete($3);
       }
-      List_Delete($3);
     }
   | tPeriodic tLine '{' RecursiveListOfDouble '}' tAFFECT
     '{' RecursiveListOfDouble '}' PeriodicTransform tEND
@@ -5056,39 +5005,23 @@ Constraints :
     {
       // reverse mesh constraints are also stored in GEO internals, as they can
       // be copied around during GEO operations
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
       if(!$3){
-	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces);
-        if(List_Nbr(tmp)){
-          for(int i = 0; i < List_Nbr(tmp); i++){
-            Surface *s;
-            List_Read(tmp, i, &s);
-            s->ReverseMesh = 1;
-          }
-        }
-        else{
-          for(GModel::fiter it = GModel::current()->firstFace();
-              it != GModel::current()->lastFace(); it++){
-            (*it)->meshAttributes.reverseMesh = 1;
-          }
+        GModel::current()->getGEOInternals()->setReverseMesh(2, 0);
+        for(GModel::fiter it = GModel::current()->firstFace();
+            it != GModel::current()->lastFace(); it++){
+          (*it)->meshAttributes.reverseMesh = 1;
         }
-        List_Delete(tmp);
       }
       else{
         for(int i = 0; i < List_Nbr($3); i++){
           double d;
           List_Read($3, i, &d);
-          Surface *s = FindSurface((int)d);
-          if(s){
-            s->ReverseMesh = 1;
-          }
-          else{
-            GFace *gf = GModel::current()->getFaceByTag((int)d);
-            if(gf){
-              gf->meshAttributes.reverseMesh = 1;
-            }
-            else
-              yymsg(1, "Unknown model face with tag %d", (int)d);
-          }
+          int num = (int)d;
+          GModel::current()->getGEOInternals()->setReverseMesh(2, num);
+          GFace *gf = GModel::current()->getFaceByTag(num);
+          if(gf) gf->meshAttributes.reverseMesh = 1;
         }
         List_Delete($3);
       }
@@ -5097,39 +5030,23 @@ Constraints :
     {
       // reverse mesh constraints are also stored in GEO internals, as they can
       // be copied around during GEO operations
+      if(GModel::current()->getOCCInternals()->getChanged())
+        GModel::current()->getOCCInternals()->synchronize(GModel::current());
       if(!$3){
-	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Curves);
-        if(List_Nbr(tmp)){
-          for(int i = 0; i < List_Nbr(tmp); i++){
-            Curve *c;
-            List_Read(tmp, i, &c);
-            c->ReverseMesh = 1;
-          }
-        }
-        else{
-          for(GModel::eiter it = GModel::current()->firstEdge();
-              it != GModel::current()->lastEdge(); it++){
-            (*it)->meshAttributes.reverseMesh = 1;
-          }
+        GModel::current()->getGEOInternals()->setReverseMesh(1, 0);
+        for(GModel::eiter it = GModel::current()->firstEdge();
+            it != GModel::current()->lastEdge(); it++){
+          (*it)->meshAttributes.reverseMesh = 1;
         }
-        List_Delete(tmp);
       }
       else{
         for(int i = 0; i < List_Nbr($3); i++){
           double d;
           List_Read($3, i, &d);
-          Curve *c = FindCurve((int)d);
-          if(c){
-            c->ReverseMesh = 1;
-          }
-          else{
-            GEdge *ge = GModel::current()->getEdgeByTag((int)d);
-            if(ge){
-              ge->meshAttributes.reverseMesh = 1;
-            }
-            else
-              yymsg(1, "Unknown model edge with tag %d", (int)d);
-          }
+          int num = (int)d;
+          GModel::current()->getGEOInternals()->setReverseMesh(1, num);
+          GEdge *ge = GModel::current()->getEdgeByTag(num);
+          if(ge) ge->meshAttributes.reverseMesh = 1;
         }
         List_Delete($3);
       }
@@ -6991,6 +6908,7 @@ fullMatrix<double> ListOfListOfDouble2Matrix(List_T *list)
 void ListOfDouble2Vector(List_T *list, std::vector<int> &v)
 {
   v.clear();
+  if(!list) return;
   v.reserve(List_Nbr(list));
   for(int i = 0; i < List_Nbr(list); i++){
     double d;
@@ -7002,6 +6920,7 @@ void ListOfDouble2Vector(List_T *list, std::vector<int> &v)
 void ListOfDouble2Vector(List_T *list, std::vector<double> &v)
 {
   v.clear();
+  if(!list) return;
   v.reserve(List_Nbr(list));
   for(int i = 0; i < List_Nbr(list); i++){
     double d;