diff --git a/Geo/CAD.cpp b/Geo/CAD.cpp
index 8cd0a3f2cf91886259900c2590bf94b2ebcf230b..8ce9e4424db880c7b6347a53d3cd5966454626f9 100644
--- a/Geo/CAD.cpp
+++ b/Geo/CAD.cpp
@@ -1,4 +1,4 @@
-// $Id: CAD.cpp,v 1.74 2004-04-13 18:47:10 geuzaine Exp $
+// $Id: CAD.cpp,v 1.75 2004-05-12 22:51:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -1628,10 +1628,11 @@ void MaxNumSurface(void *a, void *b)
 void ReplaceDuplicatePoints(Mesh * m)
 {
   List_T *All;
-  Tree_T *allNonDulpicatedPoints;
+  Tree_T *allNonDuplicatedPoints;
   Vertex *v, **pv, **pv2;
   Curve *c;
   Surface *s;
+  Volume *vol;
   int i, j, start, end;
 
   List_T *points2delete = List_Create(100, 100, sizeof(Vertex *));
@@ -1641,11 +1642,11 @@ void ReplaceDuplicatePoints(Mesh * m)
   start = Tree_Nbr(m->Points);
 
   All = Tree2List(m->Points);
-  allNonDulpicatedPoints = Tree_Create(sizeof(Vertex *), comparePosition);
+  allNonDuplicatedPoints = Tree_Create(sizeof(Vertex *), comparePosition);
   for(i = 0; i < List_Nbr(All); i++) {
     List_Read(All, i, &v);
-    if(!Tree_Search(allNonDulpicatedPoints, &v)) {
-      Tree_Insert(allNonDulpicatedPoints, &v);
+    if(!Tree_Search(allNonDuplicatedPoints, &v)) {
+      Tree_Insert(allNonDuplicatedPoints, &v);
     }
     else {
       Tree_Suppress(m->Points, &v);
@@ -1658,7 +1659,7 @@ void ReplaceDuplicatePoints(Mesh * m)
   end = Tree_Nbr(m->Points);
 
   if(start == end) {
-    Tree_Delete(allNonDulpicatedPoints);
+    Tree_Delete(allNonDuplicatedPoints);
     List_Delete(points2delete);
     return;
   }
@@ -1676,13 +1677,13 @@ void ReplaceDuplicatePoints(Mesh * m)
   All = Tree2List(m->Curves);
   for(i = 0; i < List_Nbr(All); i++) {
     List_Read(All, i, &c);
-    if(!Tree_Query(allNonDulpicatedPoints, &c->beg))
+    if(!Tree_Query(allNonDuplicatedPoints, &c->beg))
       Msg(GERROR, "Weird point %d in Coherence", c->beg->Num);
-    if(!Tree_Query(allNonDulpicatedPoints, &c->end))
+    if(!Tree_Query(allNonDuplicatedPoints, &c->end))
       Msg(GERROR, "Weird point %d in Coherence", c->end->Num);
     for(j = 0; j < List_Nbr(c->Control_Points); j++) {
       pv = (Vertex **) List_Pointer(c->Control_Points, j);
-      if(!(pv2 = (Vertex **) Tree_PQuery(allNonDulpicatedPoints, pv)))
+      if(!(pv2 = (Vertex **) Tree_PQuery(allNonDuplicatedPoints, pv)))
         Msg(GERROR, "Weird point %d in Coherence", (*pv)->Num);
       else
         List_Write(c->Control_Points, j, pv2);
@@ -1697,11 +1698,33 @@ void ReplaceDuplicatePoints(Mesh * m)
     List_Read(All, i, &s);
     for(j = 0; j < List_Nbr(s->Control_Points); j++) {
       pv = (Vertex **) List_Pointer(s->Control_Points, j);
-      if(!(pv2 = (Vertex **) Tree_PQuery(allNonDulpicatedPoints, pv)))
+      if(!(pv2 = (Vertex **) Tree_PQuery(allNonDuplicatedPoints, pv)))
         Msg(GERROR, "Weird point %d in Coherence", (*pv)->Num);
       else
         List_Write(s->Control_Points, j, pv2);
     }
+    for(j = 0; j < List_Nbr(s->TrsfPoints); j++){
+      pv = (Vertex **) List_Pointer(s->TrsfPoints, j);
+      if(!(pv2 = (Vertex **) Tree_PQuery(allNonDuplicatedPoints, pv)))
+	Msg(GERROR, "Weird point %d in Coherence", (*pv)->Num);
+      else
+	List_Write(s->TrsfPoints, j, pv2);
+    }
+  }
+  List_Delete(All);
+  
+  // Replace old points in volumes
+
+  All = Tree2List(m->Volumes);
+  for(i = 0; i < List_Nbr(All); i++) {
+    List_Read(All, i, &vol);
+    for(j = 0; j < List_Nbr(vol->TrsfPoints); j++){
+      pv = (Vertex **) List_Pointer(vol->TrsfPoints, j);
+      if(!(pv2 = (Vertex **) Tree_PQuery(allNonDuplicatedPoints, pv)))
+	Msg(GERROR, "Weird point %d in Coherence", (*pv)->Num);
+      else
+	List_Write(vol->TrsfPoints, j, pv2);
+    }
   }
   List_Delete(All);
 
@@ -1710,7 +1733,7 @@ void ReplaceDuplicatePoints(Mesh * m)
     Free_Vertex(&v, 0);
   }
 
-  Tree_Delete(allNonDulpicatedPoints);
+  Tree_Delete(allNonDuplicatedPoints);
   List_Delete(points2delete);
 
 }
@@ -1718,7 +1741,7 @@ void ReplaceDuplicatePoints(Mesh * m)
 void ReplaceDuplicateCurves(Mesh * m)
 {
   List_T *All;
-  Tree_T *allNonDulpicatedCurves;
+  Tree_T *allNonDuplicatedCurves;
   Curve *c, *c2, **pc, **pc2;
   Surface *s;
   int i, j, start, end;
@@ -1728,18 +1751,18 @@ void ReplaceDuplicateCurves(Mesh * m)
   start = Tree_Nbr(m->Curves);
 
   All = Tree2List(m->Curves);
-  allNonDulpicatedCurves = Tree_Create(sizeof(Curve *), compareTwoCurves);
+  allNonDuplicatedCurves = Tree_Create(sizeof(Curve *), compareTwoCurves);
   for(i = 0; i < List_Nbr(All); i++) {
     List_Read(All, i, &c);
     if(c->Num > 0) {
-      if(!Tree_Search(allNonDulpicatedCurves, &c)) {
-        Tree_Insert(allNonDulpicatedCurves, &c);
+      if(!Tree_Search(allNonDuplicatedCurves, &c)) {
+        Tree_Insert(allNonDuplicatedCurves, &c);
         if(!(c2 = FindCurve(-c->Num, m))) {
           Msg(GERROR, "Unknown Curve %d", -c->Num);
           List_Delete(All);
           return;
         }
-        Tree_Insert(allNonDulpicatedCurves, &c2);
+        Tree_Insert(allNonDuplicatedCurves, &c2);
       }
       else {
         Tree_Suppress(m->Curves, &c);
@@ -1757,7 +1780,7 @@ void ReplaceDuplicateCurves(Mesh * m)
   end = Tree_Nbr(m->Curves);
 
   if(start == end) {
-    Tree_Delete(allNonDulpicatedCurves);
+    Tree_Delete(allNonDuplicatedCurves);
     return;
   }
 
@@ -1775,7 +1798,7 @@ void ReplaceDuplicateCurves(Mesh * m)
     List_Read(All, i, &s);
     for(j = 0; j < List_Nbr(s->Generatrices); j++) {
       pc = (Curve **) List_Pointer(s->Generatrices, j);
-      if(!(pc2 = (Curve **) Tree_PQuery(allNonDulpicatedCurves, pc)))
+      if(!(pc2 = (Curve **) Tree_PQuery(allNonDuplicatedCurves, pc)))
         Msg(GERROR, "Weird curve %d in Coherence", (*pc)->Num);
       else {
         List_Write(s->Generatrices, j, pc2);
@@ -1786,13 +1809,13 @@ void ReplaceDuplicateCurves(Mesh * m)
   }
   List_Delete(All);
 
-  Tree_Delete(allNonDulpicatedCurves);
+  Tree_Delete(allNonDuplicatedCurves);
 }
 
 void ReplaceDuplicateSurfaces(Mesh * m)
 {
   List_T *All;
-  Tree_T *allNonDulpicatedSurfaces;
+  Tree_T *allNonDuplicatedSurfaces;
   Surface *s, **ps, **ps2;
   Volume *vol;
   int i, j, start, end;
@@ -1802,12 +1825,12 @@ void ReplaceDuplicateSurfaces(Mesh * m)
   start = Tree_Nbr(m->Surfaces);
 
   All = Tree2List(m->Surfaces);
-  allNonDulpicatedSurfaces = Tree_Create(sizeof(Curve *), compareTwoSurfaces);
+  allNonDuplicatedSurfaces = Tree_Create(sizeof(Curve *), compareTwoSurfaces);
   for(i = 0; i < List_Nbr(All); i++) {
     List_Read(All, i, &s);
     if(s->Num > 0) {
-      if(!Tree_Search(allNonDulpicatedSurfaces, &s)) {
-        Tree_Insert(allNonDulpicatedSurfaces, &s);
+      if(!Tree_Search(allNonDuplicatedSurfaces, &s)) {
+        Tree_Insert(allNonDuplicatedSurfaces, &s);
       }
       else {
         Tree_Suppress(m->Surfaces, &s);
@@ -1819,7 +1842,7 @@ void ReplaceDuplicateSurfaces(Mesh * m)
   end = Tree_Nbr(m->Surfaces);
 
   if(start == end) {
-    Tree_Delete(allNonDulpicatedSurfaces);
+    Tree_Delete(allNonDuplicatedSurfaces);
     return;
   }
 
@@ -1837,7 +1860,7 @@ void ReplaceDuplicateSurfaces(Mesh * m)
     List_Read(All, i, &vol);
     for(j = 0; j < List_Nbr(vol->Surfaces); j++) {
       ps = (Surface **) List_Pointer(vol->Surfaces, j);
-      if(!(ps2 = (Surface **) Tree_PQuery(allNonDulpicatedSurfaces, ps)))
+      if(!(ps2 = (Surface **) Tree_PQuery(allNonDuplicatedSurfaces, ps)))
         Msg(GERROR, "Weird surface %d in Coherence", (*ps)->Num);
       else
         List_Write(vol->Surfaces, j, ps2);
@@ -1845,7 +1868,7 @@ void ReplaceDuplicateSurfaces(Mesh * m)
   }
   List_Delete(All);
 
-  Tree_Delete(allNonDulpicatedSurfaces);
+  Tree_Delete(allNonDuplicatedSurfaces);
 }
 
 void ReplaceAllDuplicates(Mesh * m)
diff --git a/Mesh/2D_Elliptic.cpp b/Mesh/2D_Elliptic.cpp
index e53dfb1443e390b57dfd8b31a278018d3411d6f2..f415216d560962a229f40b3f7e903d5b9a200ca0 100644
--- a/Mesh/2D_Elliptic.cpp
+++ b/Mesh/2D_Elliptic.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Elliptic.cpp,v 1.16 2004-02-07 01:40:20 geuzaine Exp $
+// $Id: 2D_Elliptic.cpp,v 1.17 2004-05-12 22:51:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -41,21 +41,18 @@ int MeshEllipticSurface(Surface * sur)
     return (0);
 
   nb = List_Nbr(sur->Generatrices);
+
   if(nb < 4)
-    return (0);
+    return 0;
+  
+  if(List_Nbr(sur->TrsfPoints) != 4)
+    return 0;
 
   for(i = 0; i < nb; i++) {
     List_Read(sur->Generatrices, i, &GG[i]);
+    List_Read(sur->TrsfPoints, i, &S[i]);
   }
 
-  if(!(S[0] = FindPoint(sur->ipar[0], THEM)))
-    return 0;
-  if(!(S[1] = FindPoint(sur->ipar[1], THEM)))
-    return 0;
-  if(!(S[2] = FindPoint(sur->ipar[2], THEM)))
-    return 0;
-  if(!(S[3] = FindPoint(sur->ipar[3], THEM)))
-    return 0;
   N1 = N2 = N3 = N4 = 0;
 
   // step 1
diff --git a/Mesh/2D_SMesh.cpp b/Mesh/2D_SMesh.cpp
index 9c94d02415e7ceb043f6ecd086d8fc10170f7139..5cdabaf60738560f2d58496846b11d33f59bbf58 100644
--- a/Mesh/2D_SMesh.cpp
+++ b/Mesh/2D_SMesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_SMesh.cpp,v 1.16 2004-02-07 01:40:21 geuzaine Exp $
+// $Id: 2D_SMesh.cpp,v 1.17 2004-05-12 22:51:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -64,7 +64,7 @@ int MeshTransfiniteSurface(Surface * sur)
   int i, j, k, flag, nb, N1, N2, issphere;
   int nbquad = 0, nbtri = 0;
   Curve *G[4], *GG[4];
-  Vertex V, **vexist, *pV, *c1, *c2, **list, *CP[2];
+  Vertex V, *c1, *c2, **list, *CP[2];
   Simplex *simp;
   double u, v;
   int C_flag[4];
@@ -86,26 +86,17 @@ int MeshTransfiniteSurface(Surface * sur)
 
     nb = List_Nbr(sur->Generatrices);
     if(nb != 3 && nb != 4)
-      return (0);
+      return 0;
+    if(nb != List_Nbr(sur->TrsfPoints))
+      return 0;
 
     for(i = 0; i < 4; i++)
       G[i] = NULL;
 
-    for(i = 0; i < nb; i++) {
-      V.Num = sur->ipar[i];
-      pV = &V;
-      if((vexist = (Vertex **) Tree_PQuery(THEM->Vertices, &pV)) == NULL) {
-        Msg(WARNING, "Unknown Control Point %d in Transfinite Surface %d",
-            V.Num, sur->Num);
-        return (0);
-      }
-      else {
-        S[i] = *vexist;
-      }
-    }
-
-    for(i = 0; i < nb; i++)
+    for(i = 0; i < nb; i++){
+      List_Read(sur->TrsfPoints, i, &S[i]);
       List_Read(sur->Generatrices, i, &GG[i]);
+    }
 
     for(i = 0; i < nb; i++) {
       List_Read(GG[i]->Control_Points, 0, &CP[0]);
diff --git a/Mesh/3D_SMesh.cpp b/Mesh/3D_SMesh.cpp
index 750f4ab0428513fa95fab08a84ba18e38ce74afe..5d7427ca59455cc4ef563bd9666fc88667da26d1 100644
--- a/Mesh/3D_SMesh.cpp
+++ b/Mesh/3D_SMesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_SMesh.cpp,v 1.21 2004-02-07 01:40:21 geuzaine Exp $
+// $Id: 3D_SMesh.cpp,v 1.22 2004-05-12 22:51:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -173,7 +173,7 @@ int MeshTransfiniteVolume(Volume * vol)
   int i, j, k, flag, nbs, nbp, nbg;
   int nbtet = 0, nbpri = 0, nbhex = 0;
   Surface *G[6], *GG[6];
-  Vertex V, **vexist, *pV, *CP[4], **list;
+  Vertex V, *CP[4], **list;
   double u, v, w, dum;
   int F_flag[6];
   int N1, N2, N3;
@@ -209,25 +209,18 @@ int MeshTransfiniteVolume(Volume * vol)
   else if(nbs == 6)
     nbp = 8;
   else
-    return (0);
+    return 0;
+
+  if(List_Nbr(vol->TrsfPoints) != nbp)
+    return 0;
 
   Msg(STATUS3, "Meshing Volume %d", vol->Num);
 
   for(i = 0; i < 6; i++)
     G[i] = NULL;
 
-  for(i = 0; i < nbp; i++) {
-    V.Num = vol->ipar[i];
-    pV = &V;
-    if((vexist = (Vertex **) Tree_PQuery(THEM->Vertices, &pV)) == NULL) {
-      Msg(WARNING, "Unknown control point %d in Transfinite Volume %d",
-          V.Num, vol->Num);
-      return (0);
-    }
-    else {
-      Stmp[i] = *vexist;
-    }
-  }
+  for(i = 0; i < nbp; i++)
+    List_Read(vol->TrsfPoints, i, &Stmp[i]);
 
   if(nbp == 8) {
     for(i = 0; i < 8; i++)
@@ -252,18 +245,11 @@ int MeshTransfiniteVolume(Volume * vol)
   for(i = 0; i < nbs; i++) {
     nbg = List_Nbr(GG[i]->Generatrices);
 
-    for(j = 0; j < nbg; j++) {
-      V.Num = GG[i]->ipar[j];
-      pV = &V;
-      if((vexist = (Vertex **) Tree_PQuery(THEM->Vertices, &pV)) == NULL) {
-        Msg(WARNING, "Unknown control point %d in Transfinite Surface %d",
-            V.Num, GG[i]->Num);
-        return (0);
-      }
-      else {
-        CP[j] = *vexist;
-      }
-    }
+    if(List_Nbr(GG[i]->TrsfPoints) != nbg)
+      return 0;
+
+    for(j = 0; j < nbg; j++)
+      List_Read(GG[i]->TrsfPoints, j, &CP[j]);
 
     if(nbg == 3)
       CP[3] = CP[0];
diff --git a/Mesh/Create.cpp b/Mesh/Create.cpp
index 312c0e99ac5029efbddb26f9dd7760fd8daaeafc..1dd19b89bd6bac4c096e89096e8355b5e552765a 100644
--- a/Mesh/Create.cpp
+++ b/Mesh/Create.cpp
@@ -1,4 +1,4 @@
-// $Id: Create.cpp,v 1.48 2004-02-28 00:48:49 geuzaine Exp $
+// $Id: Create.cpp,v 1.49 2004-05-12 22:51:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -681,6 +681,7 @@ Surface *Create_Surface(int Num, int Typ)
     pS->ipar[i] = 0;
   pS->Recombine = 0;
   pS->RecombineAngle = 30;
+  pS->TrsfPoints = List_Create(4, 4, sizeof(Vertex *));
   pS->Simplexes = Tree_Create(sizeof(Simplex *), compareQuality);
   pS->TrsfSimplexes = List_Create(1, 10, sizeof(Simplex *));
   pS->Vertices = Tree_Create(sizeof(Vertex *), compareVertex);
@@ -700,6 +701,7 @@ void Free_Surface(void *a, void *b)
 {
   Surface *pS = *(Surface **) a;
   if(pS) {
+    List_Delete(pS->TrsfPoints);
     Tree_Action(pS->Simplexes, Free_Simplex);
     Tree_Delete(pS->Simplexes);
     List_Delete(pS->TrsfSimplexes);
@@ -732,6 +734,7 @@ Volume *Create_Volume(int Num, int Typ)
   pV->Method = LIBRE;
   for(i = 0; i < 8; i++)
     pV->ipar[i] = 0;
+  pV->TrsfPoints = List_Create(6, 6, sizeof(Vertex *));
   pV->Surfaces = List_Create(1, 2, sizeof(Surface *));
   pV->Simplexes = Tree_Create(sizeof(Simplex *), compareQuality);
   pV->Vertices = Tree_Create(sizeof(Vertex *), compareVertex);
@@ -749,6 +752,7 @@ void Free_Volume(void *a, void *b)
 {
   Volume *pV = *(Volume **) a;
   if(pV) {
+    List_Delete(pV->TrsfPoints);
     List_Delete(pV->Surfaces);  //surfaces freed elsewhere
     Tree_Action(pV->Simplexes, Free_Simplex);
     Tree_Delete(pV->Simplexes);
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
index c5690c726c25eef796224269ef56a8790420f350..86af1b186cb178d4cfdffa9939524151fe3acdf0 100644
--- a/Mesh/Mesh.h
+++ b/Mesh/Mesh.h
@@ -247,6 +247,7 @@ struct _Surf{
   int Nu, Nv;
   List_T *Generatrices;
   List_T *Control_Points;
+  List_T *TrsfPoints;
   double plan[3][3];
   double invplan[3][3];
   double a, b, c, d;
@@ -309,6 +310,7 @@ typedef struct {
   int Method;
   int ipar[8];
   ExtrudeParams *Extrude;
+  List_T *TrsfPoints;
   List_T *Surfaces;
   Tree_T *Vertices;
   Tree_T *Edges;
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 0ccd3c0ddc6163628552c25650ffe37d9010b77a..9f07cd571ad2525f6f0dd97f18952d54fd169fc9 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -191,7 +191,7 @@
 
 #line 1 "Gmsh.y"
 
-// $Id: Gmsh.tab.cpp,v 1.187 2004-05-12 02:02:21 geuzaine Exp $
+// $Id: Gmsh.tab.cpp,v 1.188 2004-05-12 22:51:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -757,21 +757,21 @@ static const short yyrline[] = { 0,
   2588,  2599,  2604,  2615,  2620,  2631,  2636,  2649,  2667,  2685,
   2703,  2708,  2726,  2731,  2749,  2754,  2775,  2792,  2809,  2826,
   2831,  2848,  2854,  2871,  2877,  2896,  2900,  2905,  2932,  2956,
-  2964,  2983,  3001,  3019,  3042,  3064,  3086,  3100,  3119,  3124,
-  3133,  3135,  3136,  3137,  3138,  3141,  3143,  3144,  3145,  3146,
-  3147,  3148,  3149,  3150,  3157,  3158,  3159,  3160,  3161,  3162,
-  3163,  3164,  3165,  3166,  3167,  3168,  3169,  3170,  3171,  3172,
-  3173,  3174,  3175,  3176,  3177,  3178,  3179,  3180,  3181,  3182,
-  3183,  3184,  3185,  3186,  3187,  3188,  3190,  3191,  3192,  3193,
-  3194,  3195,  3196,  3197,  3198,  3199,  3200,  3201,  3202,  3203,
-  3204,  3205,  3206,  3207,  3208,  3209,  3210,  3215,  3220,  3221,
-  3222,  3226,  3238,  3257,  3270,  3282,  3304,  3321,  3338,  3355,
-  3374,  3379,  3383,  3387,  3391,  3397,  3402,  3406,  3410,  3416,
-  3420,  3425,  3429,  3434,  3438,  3442,  3448,  3454,  3461,  3467,
-  3471,  3475,  3486,  3493,  3504,  3524,  3534,  3544,  3556,  3572,
-  3590,  3613,  3640,  3646,  3650,  3654,  3666,  3671,  3683,  3689,
-  3709,  3714,  3727,  3733,  3739,  3744,  3752,  3766,  3770,  3789,
-  3805
+  2964,  2983,  3001,  3019,  3046,  3072,  3098,  3112,  3131,  3136,
+  3145,  3147,  3148,  3149,  3150,  3153,  3155,  3156,  3157,  3158,
+  3159,  3160,  3161,  3162,  3169,  3170,  3171,  3172,  3173,  3174,
+  3175,  3176,  3177,  3178,  3179,  3180,  3181,  3182,  3183,  3184,
+  3185,  3186,  3187,  3188,  3189,  3190,  3191,  3192,  3193,  3194,
+  3195,  3196,  3197,  3198,  3199,  3200,  3202,  3203,  3204,  3205,
+  3206,  3207,  3208,  3209,  3210,  3211,  3212,  3213,  3214,  3215,
+  3216,  3217,  3218,  3219,  3220,  3221,  3222,  3227,  3232,  3233,
+  3234,  3238,  3250,  3269,  3282,  3294,  3316,  3333,  3350,  3367,
+  3386,  3391,  3395,  3399,  3403,  3409,  3414,  3418,  3422,  3428,
+  3432,  3437,  3441,  3446,  3450,  3454,  3460,  3466,  3473,  3479,
+  3483,  3487,  3498,  3505,  3516,  3536,  3546,  3556,  3568,  3584,
+  3602,  3625,  3652,  3658,  3662,  3666,  3678,  3683,  3695,  3701,
+  3721,  3726,  3739,  3745,  3751,  3756,  3764,  3778,  3782,  3801,
+  3817
 };
 #endif
 
@@ -7661,7 +7661,11 @@ case 334:
 	    double d;
 	    List_Read(yyvsp[-1].l, i, &d);
 	    int j = (int)fabs(d);
-	    s->ipar[i] = j;
+	    Vertex *v = FindPoint(j, THEM);
+	    if(!v)
+	      yymsg(WARNING, "Unknown Point %d", j);
+	    else
+	      List_Add(s->TrsfPoints, &v);
 	  }
 	}
       }
@@ -7669,7 +7673,7 @@ case 334:
     ;
     break;}
 case 335:
-#line 3043 "Gmsh.y"
+#line 3047 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-4].d, THEM);
       if(!s)
@@ -7685,7 +7689,11 @@ case 335:
 	    double d;
 	    List_Read(yyvsp[-1].l, i, &d);
 	    int j = (int)fabs(d);
-	    s->ipar[i] = j;
+	    Vertex *v = FindPoint(j, THEM);
+	    if(!v)
+	      yymsg(WARNING, "Unknown Point %d", j);
+	    else
+	      List_Add(s->TrsfPoints, &v);
 	  }
 	}
       }
@@ -7693,7 +7701,7 @@ case 335:
     ;
     break;}
 case 336:
-#line 3065 "Gmsh.y"
+#line 3073 "Gmsh.y"
 {
       Volume *v = FindVolume((int)yyvsp[-4].d, THEM);
       if(!v)
@@ -7709,7 +7717,11 @@ case 336:
 	    double d;
 	    List_Read(yyvsp[-1].l, i, &d);
 	    int j = (int)fabs(d);
-	    v->ipar[i] = j;
+	    Vertex *vert = FindPoint(j, THEM);
+	    if(!vert)
+	      yymsg(WARNING, "Unknown Point %d", j);
+	    else
+	      List_Add(v->TrsfPoints, &vert);
 	  }
 	}
       }
@@ -7717,7 +7729,7 @@ case 336:
     ;
     break;}
 case 337:
-#line 3087 "Gmsh.y"
+#line 3099 "Gmsh.y"
 {
       for(int i = 0; i < List_Nbr(yyvsp[-3].l); i++){
 	double d;
@@ -7733,7 +7745,7 @@ case 337:
     ;
     break;}
 case 338:
-#line 3101 "Gmsh.y"
+#line 3113 "Gmsh.y"
 {
       for(int i = 0; i < List_Nbr(yyvsp[-1].l); i++){
 	double d;
@@ -7749,71 +7761,71 @@ case 338:
     ;
     break;}
 case 339:
-#line 3121 "Gmsh.y"
+#line 3133 "Gmsh.y"
 { 
       ReplaceAllDuplicates(THEM);
     ;
     break;}
 case 340:
-#line 3125 "Gmsh.y"
+#line 3137 "Gmsh.y"
 { 
       IntersectAllSegmentsTogether();
     ;
     break;}
 case 341:
-#line 3134 "Gmsh.y"
+#line 3146 "Gmsh.y"
 {yyval.i = 1;;
     break;}
 case 342:
-#line 3135 "Gmsh.y"
+#line 3147 "Gmsh.y"
 {yyval.i = 0;;
     break;}
 case 343:
-#line 3136 "Gmsh.y"
+#line 3148 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 344:
-#line 3137 "Gmsh.y"
+#line 3149 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 345:
-#line 3138 "Gmsh.y"
+#line 3150 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 346:
-#line 3142 "Gmsh.y"
+#line 3154 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 347:
-#line 3143 "Gmsh.y"
+#line 3155 "Gmsh.y"
 { yyval.d = yyvsp[-1].d;           ;
     break;}
 case 348:
-#line 3144 "Gmsh.y"
+#line 3156 "Gmsh.y"
 { yyval.d = -yyvsp[0].d;          ;
     break;}
 case 349:
-#line 3145 "Gmsh.y"
+#line 3157 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 350:
-#line 3146 "Gmsh.y"
+#line 3158 "Gmsh.y"
 { yyval.d = !yyvsp[0].d;          ;
     break;}
 case 351:
-#line 3147 "Gmsh.y"
+#line 3159 "Gmsh.y"
 { yyval.d = yyvsp[-2].d - yyvsp[0].d;      ;
     break;}
 case 352:
-#line 3148 "Gmsh.y"
+#line 3160 "Gmsh.y"
 { yyval.d = yyvsp[-2].d + yyvsp[0].d;      ;
     break;}
 case 353:
-#line 3149 "Gmsh.y"
+#line 3161 "Gmsh.y"
 { yyval.d = yyvsp[-2].d * yyvsp[0].d;      ;
     break;}
 case 354:
-#line 3151 "Gmsh.y"
+#line 3163 "Gmsh.y"
 { 
       if(!yyvsp[0].d)
 	yymsg(GERROR, "Division by zero in '%g / %g'", yyvsp[-2].d, yyvsp[0].d);
@@ -7822,235 +7834,235 @@ case 354:
     ;
     break;}
 case 355:
-#line 3157 "Gmsh.y"
+#line 3169 "Gmsh.y"
 { yyval.d = (int)yyvsp[-2].d % (int)yyvsp[0].d;  ;
     break;}
 case 356:
-#line 3158 "Gmsh.y"
+#line 3170 "Gmsh.y"
 { yyval.d = pow(yyvsp[-2].d, yyvsp[0].d);  ;
     break;}
 case 357:
-#line 3159 "Gmsh.y"
+#line 3171 "Gmsh.y"
 { yyval.d = yyvsp[-2].d < yyvsp[0].d;      ;
     break;}
 case 358:
-#line 3160 "Gmsh.y"
+#line 3172 "Gmsh.y"
 { yyval.d = yyvsp[-2].d > yyvsp[0].d;      ;
     break;}
 case 359:
-#line 3161 "Gmsh.y"
+#line 3173 "Gmsh.y"
 { yyval.d = yyvsp[-2].d <= yyvsp[0].d;     ;
     break;}
 case 360:
-#line 3162 "Gmsh.y"
+#line 3174 "Gmsh.y"
 { yyval.d = yyvsp[-2].d >= yyvsp[0].d;     ;
     break;}
 case 361:
-#line 3163 "Gmsh.y"
+#line 3175 "Gmsh.y"
 { yyval.d = yyvsp[-2].d == yyvsp[0].d;     ;
     break;}
 case 362:
-#line 3164 "Gmsh.y"
+#line 3176 "Gmsh.y"
 { yyval.d = yyvsp[-2].d != yyvsp[0].d;     ;
     break;}
 case 363:
-#line 3165 "Gmsh.y"
+#line 3177 "Gmsh.y"
 { yyval.d = yyvsp[-2].d && yyvsp[0].d;     ;
     break;}
 case 364:
-#line 3166 "Gmsh.y"
+#line 3178 "Gmsh.y"
 { yyval.d = yyvsp[-2].d || yyvsp[0].d;     ;
     break;}
 case 365:
-#line 3167 "Gmsh.y"
+#line 3179 "Gmsh.y"
 { yyval.d = yyvsp[-4].d? yyvsp[-2].d : yyvsp[0].d;  ;
     break;}
 case 366:
-#line 3168 "Gmsh.y"
+#line 3180 "Gmsh.y"
 { yyval.d = exp(yyvsp[-1].d);      ;
     break;}
 case 367:
-#line 3169 "Gmsh.y"
+#line 3181 "Gmsh.y"
 { yyval.d = log(yyvsp[-1].d);      ;
     break;}
 case 368:
-#line 3170 "Gmsh.y"
+#line 3182 "Gmsh.y"
 { yyval.d = log10(yyvsp[-1].d);    ;
     break;}
 case 369:
-#line 3171 "Gmsh.y"
+#line 3183 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-1].d);     ;
     break;}
 case 370:
-#line 3172 "Gmsh.y"
+#line 3184 "Gmsh.y"
 { yyval.d = sin(yyvsp[-1].d);      ;
     break;}
 case 371:
-#line 3173 "Gmsh.y"
+#line 3185 "Gmsh.y"
 { yyval.d = asin(yyvsp[-1].d);     ;
     break;}
 case 372:
-#line 3174 "Gmsh.y"
+#line 3186 "Gmsh.y"
 { yyval.d = cos(yyvsp[-1].d);      ;
     break;}
 case 373:
-#line 3175 "Gmsh.y"
+#line 3187 "Gmsh.y"
 { yyval.d = acos(yyvsp[-1].d);     ;
     break;}
 case 374:
-#line 3176 "Gmsh.y"
+#line 3188 "Gmsh.y"
 { yyval.d = tan(yyvsp[-1].d);      ;
     break;}
 case 375:
-#line 3177 "Gmsh.y"
+#line 3189 "Gmsh.y"
 { yyval.d = atan(yyvsp[-1].d);     ;
     break;}
 case 376:
-#line 3178 "Gmsh.y"
+#line 3190 "Gmsh.y"
 { yyval.d = atan2(yyvsp[-3].d, yyvsp[-1].d);;
     break;}
 case 377:
-#line 3179 "Gmsh.y"
+#line 3191 "Gmsh.y"
 { yyval.d = sinh(yyvsp[-1].d);     ;
     break;}
 case 378:
-#line 3180 "Gmsh.y"
+#line 3192 "Gmsh.y"
 { yyval.d = cosh(yyvsp[-1].d);     ;
     break;}
 case 379:
-#line 3181 "Gmsh.y"
+#line 3193 "Gmsh.y"
 { yyval.d = tanh(yyvsp[-1].d);     ;
     break;}
 case 380:
-#line 3182 "Gmsh.y"
+#line 3194 "Gmsh.y"
 { yyval.d = fabs(yyvsp[-1].d);     ;
     break;}
 case 381:
-#line 3183 "Gmsh.y"
+#line 3195 "Gmsh.y"
 { yyval.d = floor(yyvsp[-1].d);    ;
     break;}
 case 382:
-#line 3184 "Gmsh.y"
+#line 3196 "Gmsh.y"
 { yyval.d = ceil(yyvsp[-1].d);     ;
     break;}
 case 383:
-#line 3185 "Gmsh.y"
+#line 3197 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d); ;
     break;}
 case 384:
-#line 3186 "Gmsh.y"
+#line 3198 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d); ;
     break;}
 case 385:
-#line 3187 "Gmsh.y"
+#line 3199 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ;
     break;}
 case 386:
-#line 3188 "Gmsh.y"
+#line 3200 "Gmsh.y"
 { yyval.d = yyvsp[-1].d*(double)rand()/(double)RAND_MAX; ;
     break;}
 case 387:
-#line 3190 "Gmsh.y"
+#line 3202 "Gmsh.y"
 { yyval.d = exp(yyvsp[-1].d);      ;
     break;}
 case 388:
-#line 3191 "Gmsh.y"
+#line 3203 "Gmsh.y"
 { yyval.d = log(yyvsp[-1].d);      ;
     break;}
 case 389:
-#line 3192 "Gmsh.y"
+#line 3204 "Gmsh.y"
 { yyval.d = log10(yyvsp[-1].d);    ;
     break;}
 case 390:
-#line 3193 "Gmsh.y"
+#line 3205 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-1].d);     ;
     break;}
 case 391:
-#line 3194 "Gmsh.y"
+#line 3206 "Gmsh.y"
 { yyval.d = sin(yyvsp[-1].d);      ;
     break;}
 case 392:
-#line 3195 "Gmsh.y"
+#line 3207 "Gmsh.y"
 { yyval.d = asin(yyvsp[-1].d);     ;
     break;}
 case 393:
-#line 3196 "Gmsh.y"
+#line 3208 "Gmsh.y"
 { yyval.d = cos(yyvsp[-1].d);      ;
     break;}
 case 394:
-#line 3197 "Gmsh.y"
+#line 3209 "Gmsh.y"
 { yyval.d = acos(yyvsp[-1].d);     ;
     break;}
 case 395:
-#line 3198 "Gmsh.y"
+#line 3210 "Gmsh.y"
 { yyval.d = tan(yyvsp[-1].d);      ;
     break;}
 case 396:
-#line 3199 "Gmsh.y"
+#line 3211 "Gmsh.y"
 { yyval.d = atan(yyvsp[-1].d);     ;
     break;}
 case 397:
-#line 3200 "Gmsh.y"
+#line 3212 "Gmsh.y"
 { yyval.d = atan2(yyvsp[-3].d, yyvsp[-1].d);;
     break;}
 case 398:
-#line 3201 "Gmsh.y"
+#line 3213 "Gmsh.y"
 { yyval.d = sinh(yyvsp[-1].d);     ;
     break;}
 case 399:
-#line 3202 "Gmsh.y"
+#line 3214 "Gmsh.y"
 { yyval.d = cosh(yyvsp[-1].d);     ;
     break;}
 case 400:
-#line 3203 "Gmsh.y"
+#line 3215 "Gmsh.y"
 { yyval.d = tanh(yyvsp[-1].d);     ;
     break;}
 case 401:
-#line 3204 "Gmsh.y"
+#line 3216 "Gmsh.y"
 { yyval.d = fabs(yyvsp[-1].d);     ;
     break;}
 case 402:
-#line 3205 "Gmsh.y"
+#line 3217 "Gmsh.y"
 { yyval.d = floor(yyvsp[-1].d);    ;
     break;}
 case 403:
-#line 3206 "Gmsh.y"
+#line 3218 "Gmsh.y"
 { yyval.d = ceil(yyvsp[-1].d);     ;
     break;}
 case 404:
-#line 3207 "Gmsh.y"
+#line 3219 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d); ;
     break;}
 case 405:
-#line 3208 "Gmsh.y"
+#line 3220 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d); ;
     break;}
 case 406:
-#line 3209 "Gmsh.y"
+#line 3221 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ;
     break;}
 case 407:
-#line 3210 "Gmsh.y"
+#line 3222 "Gmsh.y"
 { yyval.d = yyvsp[-1].d*(double)rand()/(double)RAND_MAX; ;
     break;}
 case 408:
-#line 3219 "Gmsh.y"
+#line 3231 "Gmsh.y"
 { yyval.d = yyvsp[0].d; ;
     break;}
 case 409:
-#line 3220 "Gmsh.y"
+#line 3232 "Gmsh.y"
 { yyval.d = 3.141592653589793; ;
     break;}
 case 410:
-#line 3221 "Gmsh.y"
+#line 3233 "Gmsh.y"
 { yyval.d = ParUtil::Instance()->rank(); ;
     break;}
 case 411:
-#line 3222 "Gmsh.y"
+#line 3234 "Gmsh.y"
 { yyval.d = ParUtil::Instance()->size(); ;
     break;}
 case 412:
-#line 3227 "Gmsh.y"
+#line 3239 "Gmsh.y"
 {
       Symbol TheSymbol;
       TheSymbol.Name = yyvsp[0].c;
@@ -8064,7 +8076,7 @@ case 412:
     ;
     break;}
 case 413:
-#line 3239 "Gmsh.y"
+#line 3251 "Gmsh.y"
 {
       Symbol TheSymbol;
       TheSymbol.Name = yyvsp[-3].c;
@@ -8085,7 +8097,7 @@ case 413:
     ;
     break;}
 case 414:
-#line 3258 "Gmsh.y"
+#line 3270 "Gmsh.y"
 {
       Symbol TheSymbol;
       TheSymbol.Name = yyvsp[-2].c;
@@ -8100,7 +8112,7 @@ case 414:
     ;
     break;}
 case 415:
-#line 3271 "Gmsh.y"
+#line 3283 "Gmsh.y"
 {
       Symbol TheSymbol;
       TheSymbol.Name = yyvsp[-1].c;
@@ -8114,7 +8126,7 @@ case 415:
     ;
     break;}
 case 416:
-#line 3283 "Gmsh.y"
+#line 3295 "Gmsh.y"
 {
       Symbol TheSymbol;
       TheSymbol.Name = yyvsp[-4].c;
@@ -8135,7 +8147,7 @@ case 416:
     ;
     break;}
 case 417:
-#line 3305 "Gmsh.y"
+#line 3317 "Gmsh.y"
 {
       double (*pNumOpt)(int num, int action, double value);
       StringXNumber *pNumCat;
@@ -8154,7 +8166,7 @@ case 417:
     ;
     break;}
 case 418:
-#line 3322 "Gmsh.y"
+#line 3334 "Gmsh.y"
 {
       double (*pNumOpt)(int num, int action, double value);
       StringXNumber *pNumCat;
@@ -8173,7 +8185,7 @@ case 418:
     ;
     break;}
 case 419:
-#line 3339 "Gmsh.y"
+#line 3351 "Gmsh.y"
 {
       double (*pNumOpt)(int num, int action, double value);
       StringXNumber *pNumCat;
@@ -8192,7 +8204,7 @@ case 419:
     ;
     break;}
 case 420:
-#line 3356 "Gmsh.y"
+#line 3368 "Gmsh.y"
 {
       double (*pNumOpt)(int num, int action, double value);
       StringXNumber *pNumCat;
@@ -8211,130 +8223,130 @@ case 420:
     ;
     break;}
 case 421:
-#line 3376 "Gmsh.y"
+#line 3388 "Gmsh.y"
 {
       memcpy(yyval.v, yyvsp[0].v, 5*sizeof(double));
     ;
     break;}
 case 422:
-#line 3380 "Gmsh.y"
+#line 3392 "Gmsh.y"
 {
       for(int i = 0; i < 5; i++) yyval.v[i] = -yyvsp[0].v[i];
     ;
     break;}
 case 423:
-#line 3384 "Gmsh.y"
+#line 3396 "Gmsh.y"
 { 
       for(int i = 0; i < 5; i++) yyval.v[i] = yyvsp[0].v[i];
     ;
     break;}
 case 424:
-#line 3388 "Gmsh.y"
+#line 3400 "Gmsh.y"
 { 
       for(int i = 0; i < 5; i++) yyval.v[i] = yyvsp[-2].v[i] - yyvsp[0].v[i];
     ;
     break;}
 case 425:
-#line 3392 "Gmsh.y"
+#line 3404 "Gmsh.y"
 {
       for(int i = 0; i < 5; i++) yyval.v[i] = yyvsp[-2].v[i] + yyvsp[0].v[i];
     ;
     break;}
 case 426:
-#line 3399 "Gmsh.y"
+#line 3411 "Gmsh.y"
 { 
       yyval.v[0] = yyvsp[-9].d;  yyval.v[1] = yyvsp[-7].d;  yyval.v[2] = yyvsp[-5].d;  yyval.v[3] = yyvsp[-3].d; yyval.v[4] = yyvsp[-1].d;
     ;
     break;}
 case 427:
-#line 3403 "Gmsh.y"
+#line 3415 "Gmsh.y"
 { 
       yyval.v[0] = yyvsp[-7].d;  yyval.v[1] = yyvsp[-5].d;  yyval.v[2] = yyvsp[-3].d;  yyval.v[3] = yyvsp[-1].d; yyval.v[4] = 1.0;
     ;
     break;}
 case 428:
-#line 3407 "Gmsh.y"
+#line 3419 "Gmsh.y"
 {
       yyval.v[0] = yyvsp[-5].d;  yyval.v[1] = yyvsp[-3].d;  yyval.v[2] = yyvsp[-1].d;  yyval.v[3] = 0.0; yyval.v[4] = 1.0;
     ;
     break;}
 case 429:
-#line 3411 "Gmsh.y"
+#line 3423 "Gmsh.y"
 {
       yyval.v[0] = yyvsp[-5].d;  yyval.v[1] = yyvsp[-3].d;  yyval.v[2] = yyvsp[-1].d;  yyval.v[3] = 0.0; yyval.v[4] = 1.0;
     ;
     break;}
 case 430:
-#line 3418 "Gmsh.y"
+#line 3430 "Gmsh.y"
 {
     ;
     break;}
 case 431:
-#line 3421 "Gmsh.y"
+#line 3433 "Gmsh.y"
 {
     ;
     break;}
 case 432:
-#line 3427 "Gmsh.y"
+#line 3439 "Gmsh.y"
 {
     ;
     break;}
 case 433:
-#line 3430 "Gmsh.y"
+#line 3442 "Gmsh.y"
 {
     ;
     break;}
 case 434:
-#line 3436 "Gmsh.y"
+#line 3448 "Gmsh.y"
 {
     ;
     break;}
 case 435:
-#line 3439 "Gmsh.y"
+#line 3451 "Gmsh.y"
 {
        yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 436:
-#line 3443 "Gmsh.y"
+#line 3455 "Gmsh.y"
 {
        yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 437:
-#line 3450 "Gmsh.y"
+#line 3462 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(List_T*));
       List_Add(yyval.l, &(yyvsp[0].l));
     ;
     break;}
 case 438:
-#line 3455 "Gmsh.y"
+#line 3467 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].l));
     ;
     break;}
 case 439:
-#line 3463 "Gmsh.y"
+#line 3475 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       List_Add(yyval.l, &(yyvsp[0].d));
     ;
     break;}
 case 440:
-#line 3468 "Gmsh.y"
+#line 3480 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l;
     ;
     break;}
 case 441:
-#line 3472 "Gmsh.y"
+#line 3484 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 442:
-#line 3476 "Gmsh.y"
+#line 3488 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
       double *pd;
@@ -8345,7 +8357,7 @@ case 442:
     ;
     break;}
 case 443:
-#line 3488 "Gmsh.y"
+#line 3500 "Gmsh.y"
 { 
       yyval.l = List_Create(2, 1, sizeof(double)); 
       for(double d = yyvsp[-2].d; (yyvsp[-2].d < yyvsp[0].d) ? (d <= yyvsp[0].d) : (d >= yyvsp[0].d); (yyvsp[-2].d < yyvsp[0].d) ? (d += 1.) : (d -= 1.)) 
@@ -8353,7 +8365,7 @@ case 443:
     ;
     break;}
 case 444:
-#line 3494 "Gmsh.y"
+#line 3506 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double)); 
       if(!yyvsp[0].d || (yyvsp[-4].d < yyvsp[-2].d && yyvsp[0].d < 0) || (yyvsp[-4].d > yyvsp[-2].d && yyvsp[0].d > 0)){
@@ -8366,7 +8378,7 @@ case 444:
    ;
     break;}
 case 445:
-#line 3505 "Gmsh.y"
+#line 3517 "Gmsh.y"
 {
       // Returns the coordinates of a point and fills a list with it.
       // This allows to ensure e.g. that relative point positions are
@@ -8388,7 +8400,7 @@ case 445:
     ;
     break;}
 case 446:
-#line 3525 "Gmsh.y"
+#line 3537 "Gmsh.y"
 {
       yyval.l = List_Create(List_Nbr(yyvsp[0].l), 1, sizeof(double));
       for(int i = 0; i < List_Nbr(yyvsp[0].l); i++){
@@ -8400,7 +8412,7 @@ case 446:
     ;
     break;}
 case 447:
-#line 3535 "Gmsh.y"
+#line 3547 "Gmsh.y"
 {
       yyval.l = List_Create(List_Nbr(yyvsp[0].l), 1, sizeof(double));
       for(int i = 0; i < List_Nbr(yyvsp[0].l); i++){
@@ -8412,7 +8424,7 @@ case 447:
     ;
     break;}
 case 448:
-#line 3545 "Gmsh.y"
+#line 3557 "Gmsh.y"
 {
       // FIXME: The syntax for this is ugly: we get double semi-colons
       // at the end of the line
@@ -8426,7 +8438,7 @@ case 448:
     ;
     break;}
 case 449:
-#line 3557 "Gmsh.y"
+#line 3569 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       Symbol TheSymbol;
@@ -8444,7 +8456,7 @@ case 449:
     ;
     break;}
 case 450:
-#line 3573 "Gmsh.y"
+#line 3585 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       Symbol TheSymbol;
@@ -8464,7 +8476,7 @@ case 450:
     ;
     break;}
 case 451:
-#line 3591 "Gmsh.y"
+#line 3603 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       Symbol TheSymbol;
@@ -8489,7 +8501,7 @@ case 451:
     ;
     break;}
 case 452:
-#line 3614 "Gmsh.y"
+#line 3626 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       Symbol TheSymbol;
@@ -8516,26 +8528,26 @@ case 452:
     ;
     break;}
 case 453:
-#line 3642 "Gmsh.y"
+#line 3654 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double));
       List_Add(yyval.l, &(yyvsp[0].d));
     ;
     break;}
 case 454:
-#line 3647 "Gmsh.y"
+#line 3659 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l;
     ;
     break;}
 case 455:
-#line 3651 "Gmsh.y"
+#line 3663 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].d));
     ;
     break;}
 case 456:
-#line 3655 "Gmsh.y"
+#line 3667 "Gmsh.y"
 {
       for(int i = 0; i < List_Nbr(yyvsp[0].l); i++){
 	double d;
@@ -8546,19 +8558,19 @@ case 456:
     ;
     break;}
 case 457:
-#line 3668 "Gmsh.y"
+#line 3680 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-7].d, (int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d);
     ;
     break;}
 case 458:
-#line 3672 "Gmsh.y"
+#line 3684 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d, 255);
     ;
     break;}
 case 459:
-#line 3684 "Gmsh.y"
+#line 3696 "Gmsh.y"
 {
       int flag;
       yyval.u = Get_ColorForString(ColorString, -1, yyvsp[0].c, &flag);
@@ -8566,7 +8578,7 @@ case 459:
     ;
     break;}
 case 460:
-#line 3690 "Gmsh.y"
+#line 3702 "Gmsh.y"
 {
       unsigned int (*pColOpt)(int num, int action, unsigned int value);
       StringXColor *pColCat;
@@ -8586,13 +8598,13 @@ case 460:
     ;
     break;}
 case 461:
-#line 3711 "Gmsh.y"
+#line 3723 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 462:
-#line 3715 "Gmsh.y"
+#line 3727 "Gmsh.y"
 {
       yyval.l = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = Get_ColorTable((int)yyvsp[-3].d);
@@ -8605,26 +8617,26 @@ case 462:
     ;
     break;}
 case 463:
-#line 3729 "Gmsh.y"
+#line 3741 "Gmsh.y"
 {
       yyval.l = List_Create(256, 10, sizeof(unsigned int));
       List_Add(yyval.l, &(yyvsp[0].u));
     ;
     break;}
 case 464:
-#line 3734 "Gmsh.y"
+#line 3746 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].u));
     ;
     break;}
 case 465:
-#line 3741 "Gmsh.y"
+#line 3753 "Gmsh.y"
 {
       yyval.c = yyvsp[0].c;
     ;
     break;}
 case 466:
-#line 3745 "Gmsh.y"
+#line 3757 "Gmsh.y"
 {
       yyval.c = (char *)Malloc((strlen(yyvsp[-3].c)+strlen(yyvsp[-1].c)+1)*sizeof(char));
       strcpy(yyval.c, yyvsp[-3].c);  
@@ -8634,7 +8646,7 @@ case 466:
     ;
     break;}
 case 467:
-#line 3753 "Gmsh.y"
+#line 3765 "Gmsh.y"
 {
       yyval.c = (char *)Malloc((strlen(yyvsp[-1].c)+1)*sizeof(char));
       int i;
@@ -8650,13 +8662,13 @@ case 467:
     ;
     break;}
 case 468:
-#line 3767 "Gmsh.y"
+#line 3779 "Gmsh.y"
 {
       yyval.c = yyvsp[-1].c;
     ;
     break;}
 case 469:
-#line 3771 "Gmsh.y"
+#line 3783 "Gmsh.y"
 {
       char tmpstring[1024];
       int i = PrintListOfDouble(yyvsp[-3].c, yyvsp[-1].l, tmpstring);
@@ -8677,7 +8689,7 @@ case 469:
     ;
     break;}
 case 470:
-#line 3790 "Gmsh.y"
+#line 3802 "Gmsh.y"
 { 
       char* (*pStrOpt)(int num, int action, char *value);
       StringXString *pStrCat;
@@ -8695,7 +8707,7 @@ case 470:
     ;
     break;}
 case 471:
-#line 3806 "Gmsh.y"
+#line 3818 "Gmsh.y"
 { 
       char* (*pStrOpt)(int num, int action, char *value);
       StringXString *pStrCat;
@@ -8934,7 +8946,7 @@ yyerrhandle:
     }
   return 1;
 }
-#line 3823 "Gmsh.y"
+#line 3835 "Gmsh.y"
 
 
 void DeleteSymbol(void *a, void *b){
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index e82a9c80d8991efc9e393df9a625c67f7fa7a497..d0c89f9055a9812e0d0ee6c5f05dc72ebc0e95a8 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1,5 +1,5 @@
 %{
-// $Id: Gmsh.y,v 1.163 2004-04-19 07:42:25 geuzaine Exp $
+// $Id: Gmsh.y,v 1.164 2004-05-12 22:51:09 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -3033,7 +3033,11 @@ Transfinite :
 	    double d;
 	    List_Read($7, i, &d);
 	    int j = (int)fabs(d);
-	    s->ipar[i] = j;
+	    Vertex *v = FindPoint(j, THEM);
+	    if(!v)
+	      yymsg(WARNING, "Unknown Point %d", j);
+	    else
+	      List_Add(s->TrsfPoints, &v);
 	  }
 	}
       }
@@ -3055,7 +3059,11 @@ Transfinite :
 	    double d;
 	    List_Read($7, i, &d);
 	    int j = (int)fabs(d);
-	    s->ipar[i] = j;
+	    Vertex *v = FindPoint(j, THEM);
+	    if(!v)
+	      yymsg(WARNING, "Unknown Point %d", j);
+	    else
+	      List_Add(s->TrsfPoints, &v);
 	  }
 	}
       }
@@ -3077,7 +3085,11 @@ Transfinite :
 	    double d;
 	    List_Read($7, i, &d);
 	    int j = (int)fabs(d);
-	    v->ipar[i] = j;
+	    Vertex *vert = FindPoint(j, THEM);
+	    if(!vert)
+	      yymsg(WARNING, "Unknown Point %d", j);
+	    else
+	      List_Add(v->TrsfPoints, &vert);
 	  }
 	}
       }
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
index c110ccc830863bb5dea69a921c88e02e039f14ed..e4eb29735e7547dc0c41ba9a7802c93b10ea1a8c 100644
--- a/Parser/Gmsh.yy.cpp
+++ b/Parser/Gmsh.yy.cpp
@@ -2,7 +2,7 @@
 /* A lexical scanner generated by flex */
 
 /* Scanner skeleton version:
- * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.186 2004-05-12 02:02:29 geuzaine Exp $
+ * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.187 2004-05-12 22:51:09 geuzaine Exp $
  */
 
 #define FLEX_SCANNER
@@ -1014,7 +1014,7 @@ char *yytext;
 #line 1 "Gmsh.l"
 #define INITIAL 0
 #line 2 "Gmsh.l"
-// $Id: Gmsh.yy.cpp,v 1.186 2004-05-12 02:02:29 geuzaine Exp $
+// $Id: Gmsh.yy.cpp,v 1.187 2004-05-12 22:51:09 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //