diff --git a/Geo/discreteFace.cpp b/Geo/discreteFace.cpp
index 3f3d6b8b185c341c4c67633efa8d4d44f76f6ca1..6808fbb12059fba7865c7e4a273ada80e0805945 100644
--- a/Geo/discreteFace.cpp
+++ b/Geo/discreteFace.cpp
@@ -126,15 +126,14 @@ void discreteFace::createGeometry()
   std::vector<MElement*> tem(triangles.begin(),triangles.end());
 
   triangulation* init = new triangulation(tem,this);  
-  init->my_GEdges = l_edges;
-
+  
   toSplit.push(init);
   //int mygen, compteur=1;//#debug
-  Msg::Info("First Genus Value:");
-  
+  //Msg::Info("First Genus Value:");
   //mygen=1; //#debug
-  if((toSplit.top())->genus()!=0){// (mygen!=0){//#debug
-   
+  //if(mygen!=0){// #debug
+  if((toSplit.top())->genus()!=0){
+    
     while( !toSplit.empty()){
       std::vector<triangulation*> part;
       triangulation* tosplit = toSplit.top();
@@ -142,12 +141,13 @@ void discreteFace::createGeometry()
 
       split(tosplit,part,nPart);
       delete tosplit; // #mark
-
+      
       for(unsigned int i=0; i<part.size(); i++){
 	//Msg::Info("Partition %d Genus:",compteur);//#debug
 	//std::cin>>mygen;//#debug
-	if(part[i]->genus()!=0)// (mygen!=0)//#debug
-	  toSplit.push(part[i]);
+	//if (mygen!=0)//#debug
+	if(part[i]->genus()!=0)
+	  toSplit.push(part[i]);	
 	else{
 	  toParam.push_back(part[i]);
 	  part[i]->idNum=id++;
@@ -161,10 +161,12 @@ void discreteFace::createGeometry()
     toSplit.top()->idNum=id++;
   }
 
+    updateTopology(toParam);
+
   for(unsigned int i=0; i<toParam.size(); i++){
     std::vector<MElement*> mytri = toParam[i]->tri;
     discreteDiskFace *df = new discreteDiskFace (this,toParam[i], order,(_CAD.empty() ? NULL : &_CAD));
-    df->replaceEdges(toParam[i]->my_GEdges);
+    df->replaceEdges(toParam[i]->my_GEdges);    
     _atlas.push_back(df);
   }
 #endif
@@ -218,9 +220,9 @@ void discreteFace::mesh(bool verbose)
 {
 #if defined(HAVE_ANN) && defined(HAVE_SOLVER) && defined(HAVE_MESH)
   if (!CTX::instance()->meshDiscrete) return;
-  for (unsigned int i=0;i<_atlas.size();i++){
+  for (unsigned int i=0;i<_atlas.size();i++)
     _atlas[i]->mesh(verbose);
-  }
+  
   gatherMeshes();
   meshStatistics.status = GFace::DONE;
 #endif
@@ -334,9 +336,7 @@ void discreteFace::splitDiscreteEdge ( GEdge *de , GVertex *gv, discreteEdge* ne
   
   newE[0] = new discreteEdge (de->model(),NEWLINE(),de->getBeginVertex(),gv);
   newE[1] = new discreteEdge (de->model(),NEWLINE(),gv, de->getEndVertex());
-  //de->model()->add(newE[0]);
-  //de->model()->add(newE[1]);
-  
+
   int current = 0;
   std::vector<MLine*> mlines;
   // assumption: the MLine's are sorted
@@ -348,8 +348,7 @@ void discreteFace::splitDiscreteEdge ( GEdge *de , GVertex *gv, discreteEdge* ne
       mlines.clear();// 
       current++;
     }
-  }
-  //for(int ie=0; ie<2; ie++)  newE[ie]->createGeometry();  
+  }  
   de->mesh_vertices.clear();
   de->lines.clear();
   
@@ -373,7 +372,7 @@ void discreteFace::splitDiscreteEdge ( GEdge *de , GVertex *gv, discreteEdge* ne
 	df->l_edges.clear();
 	df->setBoundEdges (df->model(), tagEdges);
       }
-      else Msg::Fatal("discreteFace::splitDiscreteEdge \t This only applies to discrete geometries"); 
+      else Msg::Fatal("discreteFace::splitDiscreteEdge, This only applies to discrete geometries"); 
     }    
   }  
   de->model()->remove(de);  
@@ -471,11 +470,20 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti
   for(int i=0; i<nPartitions; i++)// new triangulation of the connected parts
     partition.push_back(new triangulation(elem[i],this));
 
+
+
+#endif
+}
+
+
+void discreteFace::updateTopology(std::vector<triangulation*>&partition){
   //------------------------------------------------------//
   //---- setting topology, i.e. GEdge's and GVertex's ----//
   //------------------------------------------------------//
+  int nPartitions = partition.size();
   std::set<MVertex*> todelete; // vertices that do not belong to the GFace anymore
-  std::set<GEdge*> gGEdges(trian->my_GEdges.begin(),trian->my_GEdges.end());// current GEdges of the initial (old) triangulation
+  std::set<GEdge*> gGEdges(l_edges.begin(),l_edges.end());// initial GEdges of the GFace (to be updated)
+
   for(int i=0; i<nPartitions; i++){// each part is going ot be compared with the other ones      
     std::set<MEdge,Less_Edge> bordi = partition[i]->borderEdg;// edges defining the border(s) of the i-th new triangulation
     for(int ii=i+1; ii<nPartitions; ii++){// compare to the ii-th partitions, with ii > i since ii < i have already been compared
@@ -512,45 +520,43 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti
 	std::vector<MVertex*> mvt; 
 	mvt.resize(2);
 	mvt[0] = *itf;
-	mvt[1] = cv0;	  
-	for(int imvt=0; imvt<2; imvt++){// creation of the GVertex, for new nonloop GEdge's	  
+	mvt[1] = cv0;
+
+	// creation of the GVertex, for new nonloop GEdge's	  
+	for(int imvt=0; imvt<2; imvt++){
 	  std::set<GEdge*>::iterator oe=gGEdges.begin();// find the old GEdge that has the current new GVertex
-	  while(mvt[imvt]->onWhat() != *oe && mvt[imvt]->onWhat() != (*oe)->getBeginVertex() && mvt[imvt]->onWhat() != (*oe)->getEndVertex() && oe !=gGEdges.end())
+	  while(oe !=gGEdges.end() && mvt[imvt]->onWhat() != *oe && mvt[imvt]->onWhat() != (*oe)->getBeginVertex() && mvt[imvt]->onWhat() != (*oe)->getEndVertex())
 	    ++oe;	  
-	  if (oe == gGEdges.end()) Msg::Error("discreteFace::split \t This Vertex %d is not on a GEdge !",mvt[imvt]->getNum());	    
-	  GEdge* onit = *oe;// the new GVertex can already exist; if it is the case, there is no need to create a new one
-	  if(mvt[imvt] == onit->getBeginVertex()->mesh_vertices[0])
-	    v[imvt] = onit->getBeginVertex();
-	  else if (mvt[imvt] == onit->getEndVertex()->mesh_vertices[0])
-	    v[imvt] = onit->getEndVertex();
-	  else{
+	  
+	  if (oe == gGEdges.end()){// not on an existing GEdge: new internal GVertex
 	    v[imvt] = new discreteVertex (this->model(),NEWPOINT());
-	    setupDiscreteVertex(v[imvt],mvt[imvt],NULL);
-	    printf("dv %d on GEdge (%d,%d)\n",v[imvt]->mesh_vertices[0]->getNum(),onit->getBeginVertex()->mesh_vertices[0]->getNum(),onit->getEndVertex()->mesh_vertices[0]->getNum());
-	    discreteEdge* de[2];	    	   
-	    gGEdges.erase(onit);// updating the GEdge's of the initial triangulation	  
-	    splitDiscreteEdge(onit,v[imvt],de);	    
-	    gGEdges.insert(de[0]);
-	    gGEdges.insert(de[1]);
-	  }// end else    
+	    setupDiscreteVertex(v[imvt],mvt[imvt],&todelete);
+	  }
+	  else{// on an existing GEdge
+	    GEdge* onit = *oe;// the new GVertex can already exist; if it is the case, there is no need to create a new one
+	    if(mvt[imvt] == onit->getBeginVertex()->mesh_vertices[0])
+	      v[imvt] = onit->getBeginVertex();
+	    else if (mvt[imvt] == onit->getEndVertex()->mesh_vertices[0])
+	      v[imvt] = onit->getEndVertex();
+	    else{
+	      v[imvt] = new discreteVertex (this->model(),NEWPOINT());	   
+	      setupDiscreteVertex(v[imvt],mvt[imvt],NULL);
+	      discreteEdge* de[2];
+	      splitDiscreteEdge(onit,v[imvt],de);
+	      gGEdges.insert(de[0]);
+	      gGEdges.insert(de[1]);
+	    }// end if-elseif-else
+	  }// end else oe==end()   
 	}// end imvt
 	// the new GEdge can be created with its GVertex
 	discreteEdge* internalE = new discreteEdge (this->model(),NEWLINE(),v[0],v[1]);
-	setupDiscreteEdge(internalE,myLines,&todelete);		
+	setupDiscreteEdge(internalE,myLines,&todelete);	
 	partition[i]->my_GEdges.push_back(internalE);
 	partition[ii]->my_GEdges.push_back(internalE);	
 
 	first.erase(itf);// next first vertex of a nonloop GEdge
       }//end while first.empty()
-      // adding old-updated GEdge's to the corresponding partitions
-      for(std::set<GEdge*>::iterator le=gGEdges.begin(); le!=gGEdges.end(); ++le){
-	GEdge* ile = *le;
-	MEdge edTest = ile->lines.front()->getEdge(0);
-	if(bordi.find(edTest)!=bordi.end())
-	  partition[i]->my_GEdges.push_back(ile);	      	  
-	else
-	  partition[ii]->my_GEdges.push_back(ile);	     
-      }
+      
       // remaining MLines for 'loop'GEdge's
       while(!v02edg.empty()){
 	discreteVertex* v;	  
@@ -571,6 +577,20 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti
     }//end for ii    
   }// end for i
   
+  
+  // adding old-updated bounding GEdge's to the corresponding partitions
+  for(std::set<GEdge*>::iterator le=gGEdges.begin(); le!=gGEdges.end(); ++le){
+    GEdge* ile = *le;
+    MEdge edTest = ile->lines.front()->getEdge(0);    
+    for(int i=0; i<nPartitions; i++){
+      std::set<MEdge,Less_Edge> bordi = partition[i]->borderEdg;
+      if(bordi.find(edTest)!=bordi.end()){
+	partition[i]->my_GEdges.push_back(ile);
+	break;
+      }
+    }
+  }
+  
   // update GFace mesh_vertices
   std::vector<MVertex*> newMV;
   for(unsigned int imv=0; imv<this->mesh_vertices.size(); imv++){
@@ -580,11 +600,8 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti
   }
   this->mesh_vertices.clear();
   this->mesh_vertices = newMV;
-
-#endif
 }
 
-
 // delete all discrete disk faces
 //void discreteFace::deleteAtlas() {
 //}
diff --git a/Geo/discreteFace.h b/Geo/discreteFace.h
index b8a5709dc00c815f7407c3703709880ee775039a..d043ffc2ba8ac40658d40e78998d7ccf1dbb1e22 100644
--- a/Geo/discreteFace.h
+++ b/Geo/discreteFace.h
@@ -34,6 +34,7 @@ class discreteFace : public GFace {
   void setupDiscreteVertex(GVertex*,MVertex*,std::set<MVertex*>*);
   void setupDiscreteEdge(discreteEdge*,std::vector<MLine*>,std::set<MVertex*>*);
   void splitDiscreteEdge(GEdge*,GVertex*,discreteEdge*[2]);
+  void updateTopology(std::vector<triangulation*>&);
   void split(triangulation*,std::vector<triangulation*>&,int);
   GPoint point(double par1, double par2) const;
   SPoint2 parFromPoint(const SPoint3 &p, bool onSurface=true) const;