diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 0df920fcc2b77ba291e4a40d337c64d0709a7dbb..960880109d1b06b4bc99d5e640a83917055cf70b 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -1078,12 +1078,12 @@ static const yytype_uint16 yyrline[] =
     4360,  4378,  4383,  4389,  4401,  4418,  4436,  4457,  4462,  4467,
     4477,  4487,  4492,  4501,  4506,  4533,  4537,  4541,  4545,  4549,
     4556,  4560,  4564,  4568,  4575,  4580,  4587,  4592,  4596,  4601,
-    4605,  4613,  4624,  4628,  4640,  4648,  4656,  4663,  4673,  4693,
-    4697,  4701,  4705,  4709,  4738,  4767,  4796,  4825,  4835,  4845,
-    4857,  4869,  4890,  4895,  4899,  4903,  4915,  4919,  4931,  4938,
-    4948,  4952,  4967,  4972,  4979,  4983,  4996,  5004,  5015,  5019,
-    5027,  5033,  5041,  5049,  5064,  5078,  5092,  5104,  5120,  5124,
-    5144,  5143,  5156,  5161,  5167,  5176,  5189,  5192
+    4605,  4613,  4624,  4628,  4640,  4648,  4656,  4663,  4673,  4702,
+    4706,  4710,  4714,  4718,  4747,  4776,  4805,  4834,  4844,  4854,
+    4866,  4878,  4899,  4904,  4908,  4912,  4924,  4928,  4940,  4947,
+    4957,  4961,  4976,  4981,  4988,  4992,  5005,  5013,  5024,  5028,
+    5036,  5042,  5050,  5058,  5073,  5087,  5101,  5113,  5129,  5133,
+    5153,  5152,  5165,  5170,  5176,  5185,  5198,  5201
 };
 #endif
 
@@ -10133,11 +10133,20 @@ yyreduce:
       Vertex *v = FindPoint((int)(yyvsp[(3) - (4)].d));
       (yyval.l) = List_Create(3, 1, sizeof(double));
       if(!v) {
-	yymsg(0, "Unknown point '%d'", (int)(yyvsp[(3) - (4)].d));
-	double d = 0.0;
-	List_Add((yyval.l), &d);
-	List_Add((yyval.l), &d);
-	List_Add((yyval.l), &d);
+        GVertex *gv = GModel::current()->getVertexByTag((int)(yyvsp[(3) - (4)].d));
+        if(gv){
+          double x = gv->x(), y = gv->y(), z = gv->z();
+          List_Add((yyval.l), &x);
+          List_Add((yyval.l), &y);
+          List_Add((yyval.l), &z);
+        }
+        else{
+          yymsg(0, "Unknown point '%d'", (int)(yyvsp[(3) - (4)].d));
+          double d = 0.0;
+          List_Add((yyval.l), &d);
+          List_Add((yyval.l), &d);
+          List_Add((yyval.l), &d);
+        }
       }
       else{
 	List_Add((yyval.l), &v->Pos.X);
@@ -10149,7 +10158,7 @@ yyreduce:
 
   case 419:
 /* Line 1787 of yacc.c  */
-#line 4694 "Gmsh.y"
+#line 4703 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(0);
     }
@@ -10157,7 +10166,7 @@ yyreduce:
 
   case 420:
 /* Line 1787 of yacc.c  */
-#line 4698 "Gmsh.y"
+#line 4707 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(1);
     }
@@ -10165,7 +10174,7 @@ yyreduce:
 
   case 421:
 /* Line 1787 of yacc.c  */
-#line 4702 "Gmsh.y"
+#line 4711 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(2);
     }
@@ -10173,7 +10182,7 @@ yyreduce:
 
   case 422:
 /* Line 1787 of yacc.c  */
-#line 4706 "Gmsh.y"
+#line 4715 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(3);
     }
@@ -10181,7 +10190,7 @@ yyreduce:
 
   case 423:
 /* Line 1787 of yacc.c  */
-#line 4710 "Gmsh.y"
+#line 4719 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10214,7 +10223,7 @@ yyreduce:
 
   case 424:
 /* Line 1787 of yacc.c  */
-#line 4739 "Gmsh.y"
+#line 4748 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10247,7 +10256,7 @@ yyreduce:
 
   case 425:
 /* Line 1787 of yacc.c  */
-#line 4768 "Gmsh.y"
+#line 4777 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10280,7 +10289,7 @@ yyreduce:
 
   case 426:
 /* Line 1787 of yacc.c  */
-#line 4797 "Gmsh.y"
+#line 4806 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10313,7 +10322,7 @@ yyreduce:
 
   case 427:
 /* Line 1787 of yacc.c  */
-#line 4826 "Gmsh.y"
+#line 4835 "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++){
@@ -10327,7 +10336,7 @@ yyreduce:
 
   case 428:
 /* Line 1787 of yacc.c  */
-#line 4836 "Gmsh.y"
+#line 4845 "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++){
@@ -10341,7 +10350,7 @@ yyreduce:
 
   case 429:
 /* Line 1787 of yacc.c  */
-#line 4846 "Gmsh.y"
+#line 4855 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -10357,7 +10366,7 @@ yyreduce:
 
   case 430:
 /* Line 1787 of yacc.c  */
-#line 4858 "Gmsh.y"
+#line 4867 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(3) - (4)].c)))
@@ -10373,7 +10382,7 @@ yyreduce:
 
   case 431:
 /* Line 1787 of yacc.c  */
-#line 4870 "Gmsh.y"
+#line 4879 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -10395,7 +10404,7 @@ yyreduce:
 
   case 432:
 /* Line 1787 of yacc.c  */
-#line 4891 "Gmsh.y"
+#line 4900 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -10404,7 +10413,7 @@ yyreduce:
 
   case 433:
 /* Line 1787 of yacc.c  */
-#line 4896 "Gmsh.y"
+#line 4905 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     }
@@ -10412,7 +10421,7 @@ yyreduce:
 
   case 434:
 /* Line 1787 of yacc.c  */
-#line 4900 "Gmsh.y"
+#line 4909 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].d)));
     }
@@ -10420,7 +10429,7 @@ yyreduce:
 
   case 435:
 /* Line 1787 of yacc.c  */
-#line 4904 "Gmsh.y"
+#line 4913 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	double d;
@@ -10433,7 +10442,7 @@ yyreduce:
 
   case 436:
 /* Line 1787 of yacc.c  */
-#line 4916 "Gmsh.y"
+#line 4925 "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));
     }
@@ -10441,7 +10450,7 @@ yyreduce:
 
   case 437:
 /* Line 1787 of yacc.c  */
-#line 4920 "Gmsh.y"
+#line 4929 "Gmsh.y"
     {
       (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (7)].d), (int)(yyvsp[(4) - (7)].d), (int)(yyvsp[(6) - (7)].d), 255);
     }
@@ -10449,7 +10458,7 @@ yyreduce:
 
   case 438:
 /* Line 1787 of yacc.c  */
-#line 4932 "Gmsh.y"
+#line 4941 "Gmsh.y"
     {
       int flag;
       (yyval.u) = GetColorForString(-1, (yyvsp[(1) - (1)].c), &flag);
@@ -10460,7 +10469,7 @@ yyreduce:
 
   case 439:
 /* Line 1787 of yacc.c  */
-#line 4939 "Gmsh.y"
+#line 4948 "Gmsh.y"
     {
       unsigned int val = 0;
       ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val);
@@ -10471,7 +10480,7 @@ yyreduce:
 
   case 440:
 /* Line 1787 of yacc.c  */
-#line 4949 "Gmsh.y"
+#line 4958 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     }
@@ -10479,7 +10488,7 @@ yyreduce:
 
   case 441:
 /* Line 1787 of yacc.c  */
-#line 4953 "Gmsh.y"
+#line 4962 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (6)].d));
@@ -10495,7 +10504,7 @@ yyreduce:
 
   case 442:
 /* Line 1787 of yacc.c  */
-#line 4968 "Gmsh.y"
+#line 4977 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].u)));
@@ -10504,7 +10513,7 @@ yyreduce:
 
   case 443:
 /* Line 1787 of yacc.c  */
-#line 4973 "Gmsh.y"
+#line 4982 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].u)));
     }
@@ -10512,7 +10521,7 @@ yyreduce:
 
   case 444:
 /* Line 1787 of yacc.c  */
-#line 4980 "Gmsh.y"
+#line 4989 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     }
@@ -10520,7 +10529,7 @@ yyreduce:
 
   case 445:
 /* Line 1787 of yacc.c  */
-#line 4984 "Gmsh.y"
+#line 4993 "Gmsh.y"
     {
       if(!gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown string variable '%s'", (yyvsp[(1) - (1)].c));
@@ -10537,7 +10546,7 @@ yyreduce:
 
   case 446:
 /* Line 1787 of yacc.c  */
-#line 4997 "Gmsh.y"
+#line 5006 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), out);
@@ -10549,7 +10558,7 @@ yyreduce:
 
   case 447:
 /* Line 1787 of yacc.c  */
-#line 5005 "Gmsh.y"
+#line 5014 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), out);
@@ -10561,7 +10570,7 @@ yyreduce:
 
   case 448:
 /* Line 1787 of yacc.c  */
-#line 5016 "Gmsh.y"
+#line 5025 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     }
@@ -10569,7 +10578,7 @@ yyreduce:
 
   case 449:
 /* Line 1787 of yacc.c  */
-#line 5020 "Gmsh.y"
+#line 5029 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc(32 * sizeof(char));
       time_t now;
@@ -10581,7 +10590,7 @@ yyreduce:
 
   case 450:
 /* Line 1787 of yacc.c  */
-#line 5028 "Gmsh.y"
+#line 5037 "Gmsh.y"
     {
       std::string action = Msg::GetGmshOnelabAction();
       (yyval.c) = (char *)Malloc(action.size() + 1);
@@ -10591,7 +10600,7 @@ yyreduce:
 
   case 451:
 /* Line 1787 of yacc.c  */
-#line 5034 "Gmsh.y"
+#line 5043 "Gmsh.y"
     {
       const char *env = GetEnvironmentVar((yyvsp[(3) - (4)].c));
       if(!env) env = "";
@@ -10603,7 +10612,7 @@ yyreduce:
 
   case 452:
 /* Line 1787 of yacc.c  */
-#line 5042 "Gmsh.y"
+#line 5051 "Gmsh.y"
     {
       std::string s = Msg::GetString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -10615,7 +10624,7 @@ yyreduce:
 
   case 453:
 /* Line 1787 of yacc.c  */
-#line 5050 "Gmsh.y"
+#line 5059 "Gmsh.y"
     {
       int size = 1;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -10634,7 +10643,7 @@ yyreduce:
 
   case 454:
 /* Line 1787 of yacc.c  */
-#line 5065 "Gmsh.y"
+#line 5074 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -10652,7 +10661,7 @@ yyreduce:
 
   case 455:
 /* Line 1787 of yacc.c  */
-#line 5079 "Gmsh.y"
+#line 5088 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -10670,7 +10679,7 @@ yyreduce:
 
   case 456:
 /* Line 1787 of yacc.c  */
-#line 5093 "Gmsh.y"
+#line 5102 "Gmsh.y"
     {
       std::string input = (yyvsp[(3) - (8)].c);
       std::string substr_old = (yyvsp[(5) - (8)].c);
@@ -10686,7 +10695,7 @@ yyreduce:
 
   case 457:
 /* Line 1787 of yacc.c  */
-#line 5105 "Gmsh.y"
+#line 5114 "Gmsh.y"
     {
       int size = 1;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -10706,7 +10715,7 @@ yyreduce:
 
   case 458:
 /* Line 1787 of yacc.c  */
-#line 5121 "Gmsh.y"
+#line 5130 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     }
@@ -10714,7 +10723,7 @@ yyreduce:
 
   case 459:
 /* Line 1787 of yacc.c  */
-#line 5125 "Gmsh.y"
+#line 5134 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -10737,13 +10746,13 @@ yyreduce:
 
   case 460:
 /* Line 1787 of yacc.c  */
-#line 5144 "Gmsh.y"
+#line 5153 "Gmsh.y"
     { floatOptions.clear(); charOptions.clear(); }
     break;
 
   case 461:
 /* Line 1787 of yacc.c  */
-#line 5146 "Gmsh.y"
+#line 5155 "Gmsh.y"
     {
       std::string val((yyvsp[(3) - (6)].c));
       Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions);
@@ -10755,7 +10764,7 @@ yyreduce:
 
   case 462:
 /* Line 1787 of yacc.c  */
-#line 5157 "Gmsh.y"
+#line 5166 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(char*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].c)));
@@ -10764,13 +10773,13 @@ yyreduce:
 
   case 463:
 /* Line 1787 of yacc.c  */
-#line 5162 "Gmsh.y"
+#line 5171 "Gmsh.y"
     { List_Add((yyval.l), &((yyvsp[(3) - (3)].c))); }
     break;
 
   case 464:
 /* Line 1787 of yacc.c  */
-#line 5168 "Gmsh.y"
+#line 5177 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -10782,7 +10791,7 @@ yyreduce:
 
   case 465:
 /* Line 1787 of yacc.c  */
-#line 5177 "Gmsh.y"
+#line 5186 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -10794,19 +10803,19 @@ yyreduce:
 
   case 466:
 /* Line 1787 of yacc.c  */
-#line 5190 "Gmsh.y"
+#line 5199 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); }
     break;
 
   case 467:
 /* Line 1787 of yacc.c  */
-#line 5193 "Gmsh.y"
+#line 5202 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); }
     break;
 
 
 /* Line 1787 of yacc.c  */
-#line 10810 "Gmsh.tab.cpp"
+#line 10819 "Gmsh.tab.cpp"
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -11038,7 +11047,7 @@ yyreturn:
 
 
 /* Line 2050 of yacc.c  */
-#line 5197 "Gmsh.y"
+#line 5206 "Gmsh.y"
 
 
 void assignVariable(const std::string &name, int index, int assignType,
@@ -11266,4 +11275,5 @@ void yymsg(int level, const char *fmt, ...)
   }
   else
     Msg::Warning("'%s', line %d : %s", gmsh_yyname.c_str(), gmsh_yylineno - 1, tmp);
+
 }
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 367cccb1f830b155d290f0e28195a70efaab96d4..c3d93e2ed30cc42d991a3cbc4aeca820e4b5c075 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -4678,11 +4678,20 @@ FExpr_Multi :
       Vertex *v = FindPoint((int)$3);
       $$ = List_Create(3, 1, sizeof(double));
       if(!v) {
-	yymsg(0, "Unknown point '%d'", (int)$3);
-	double d = 0.0;
-	List_Add($$, &d);
-	List_Add($$, &d);
-	List_Add($$, &d);
+        GVertex *gv = GModel::current()->getVertexByTag((int)$3);
+        if(gv){
+          double x = gv->x(), y = gv->y(), z = gv->z();
+          List_Add($$, &x);
+          List_Add($$, &y);
+          List_Add($$, &z);
+        }
+        else{
+          yymsg(0, "Unknown point '%d'", (int)$3);
+          double d = 0.0;
+          List_Add($$, &d);
+          List_Add($$, &d);
+          List_Add($$, &d);
+        }
       }
       else{
 	List_Add($$, &v->Pos.X);
@@ -5421,4 +5430,5 @@ void yymsg(int level, const char *fmt, ...)
   }
   else
     Msg::Warning("'%s', line %d : %s", gmsh_yyname.c_str(), gmsh_yylineno - 1, tmp);
+
 }