diff --git a/Geo/GModelIO_GEO.cpp b/Geo/GModelIO_GEO.cpp
index 754bef927e13e8ed5175e23e0ecab1f60e4808f8..b3fdeea8085710f556154158288b989e8915c28c 100644
--- a/Geo/GModelIO_GEO.cpp
+++ b/Geo/GModelIO_GEO.cpp
@@ -143,25 +143,30 @@ int GModel::importGEOInternals()
   }
   if(Tree_Nbr(_geo_internals->Curves)) {
     List_T *curves = Tree2List(_geo_internals->Curves);
+
+    // generate all curves except compounds 
+
     for(int i = 0; i < List_Nbr(curves); i++){
       Curve *c;
       List_Read(curves, i, &c);
       if(c->Num >= 0){
         GEdge *e = getEdgeByTag(c->Num);
         if(!e && c->Typ == MSH_SEGM_COMPOUND){
-          std::vector<GEdge*> comp;
-          for(unsigned int j = 0; j < c->compound.size(); j++){
-            GEdge *ge = getEdgeByTag(c->compound[j]);
-            if(ge) comp.push_back(ge);
-          }
-          e = new GEdgeCompound(this, c->Num, comp);
-          e->meshAttributes.method = c->Method;
-          e->meshAttributes.nbPointsTransfinite = c->nbPointsTransfinite;
-          e->meshAttributes.typeTransfinite = c->typeTransfinite;
-          e->meshAttributes.coeffTransfinite = c->coeffTransfinite;
-          e->meshAttributes.extrude = c->Extrude;
-          e->meshAttributes.reverseMesh = c->ReverseMesh;
-          add(e);
+          Msg::Debug("Postpone creation of compound edge %d"
+                     "until all others have been created",c->Num);
+          // std::vector<GEdge*> comp;
+          // for(unsigned int j = 0; j < c->compound.size(); j++){
+          //   GEdge *ge = getEdgeByTag(c->compound[j]);
+          //   if(ge) comp.push_back(ge);
+          // }
+          // e = new GEdgeCompound(this, c->Num, comp);
+          // e->meshAttributes.method = c->Method;
+          // e->meshAttributes.nbPointsTransfinite = c->nbPointsTransfinite;
+          // e->meshAttributes.typeTransfinite = c->typeTransfinite;
+          // e->meshAttributes.coeffTransfinite = c->coeffTransfinite;
+          // e->meshAttributes.extrude = c->Extrude;
+          // e->meshAttributes.reverseMesh = c->ReverseMesh;
+          // add(e);
         }
         else if(!e && c->beg && c->end){
           e = new gmshEdge(this, c,
@@ -184,6 +189,50 @@ int GModel::importGEOInternals()
         }
       }
     }
+    
+    // now generate the compound curves
+
+    for(int i = 0; i < List_Nbr(curves); i++){
+      Curve *c;
+      List_Read(curves, i, &c);
+      if(c->Num >= 0){
+        GEdge *e = getEdgeByTag(c->Num);
+        if(!e && c->Typ == MSH_SEGM_COMPOUND){
+          std::vector<GEdge*> comp;
+          for(unsigned int j = 0; j < c->compound.size(); j++){
+            GEdge *ge = getEdgeByTag(c->compound[j]);
+            if(ge) comp.push_back(ge);
+          }
+          e = new GEdgeCompound(this, c->Num, comp);
+          e->meshAttributes.method = c->Method;
+          e->meshAttributes.nbPointsTransfinite = c->nbPointsTransfinite;
+          e->meshAttributes.typeTransfinite = c->typeTransfinite;
+          e->meshAttributes.coeffTransfinite = c->coeffTransfinite;
+          e->meshAttributes.extrude = c->Extrude;
+          e->meshAttributes.reverseMesh = c->ReverseMesh;
+          add(e);
+        }
+        // else if(!e && c->beg && c->end){
+        //   e = new gmshEdge(this, c,
+        //       getVertexByTag(c->beg->Num),
+        //       getVertexByTag(c->end->Num));
+        //   add(e);
+        // }
+        // else if(!e){
+        //   e = new gmshEdge(this, c, 0, 0);
+        //   add(e);
+        // }
+        // else{
+        //   e->resetMeshAttributes();
+        // }
+
+        if(!c->Visible) e->setVisibility(0);
+        if(c->Color.type) e->setColor(c->Color.mesh);
+        if(c->degenerated) {
+          e->setTooSmall(true);
+        }
+      }
+    }
     List_Delete(curves);
   }
   if(Tree_Nbr(_geo_internals->Surfaces)) {
diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp
index eddc492417d89c3b78a61aafbd148c7bbdd51a8d..47c91e1d186e79d4093914dd23b13cb14387a523 100644
--- a/Geo/Geo.cpp
+++ b/Geo/Geo.cpp
@@ -427,6 +427,61 @@ void End_Curve(Curve *c)
     }
 
   }
+  
+  if (c->Typ == MSH_SEGM_COMPOUND) {
+
+    std::list<Curve*> tmp;
+    for (std::vector<int>::const_iterator cIter=c->compound.begin();
+         cIter!=c->compound.end();++cIter) {
+      Curve* comp = FindCurve(*cIter);
+      if (!comp) Msg::Error("Could not find curve %d as part of compound edge %d",*cIter,c->Num);
+      tmp.push_back(comp);
+    }
+
+    std::list<int> ordered;
+
+    Curve* c0 = *(tmp.begin());
+    tmp.pop_front();
+  
+    ordered.push_back(c0->Num);
+    std::pair<Vertex*,Vertex*> vtcs(c0->beg,c0->end);
+    
+    while (tmp.size() != 0) {
+      unsigned nbCurrent = tmp.size();
+      for (std::list<Curve*>::iterator tIter=tmp.begin();tIter!=tmp.end();tIter++) {
+        Curve* c1 = *tIter;
+        if (c1->beg == vtcs.first) {
+          vtcs.first = c1->end;
+          ordered.push_front(c1->Num);
+          tmp.erase(tIter);
+          break;
+        }
+        if (c1->end == vtcs.first) {
+          vtcs.first = c1->beg;
+          ordered.push_front(c1->Num);
+          tmp.erase(tIter);
+          break;
+        }
+        if (c1->beg == vtcs.second) {
+          vtcs.second = c1->end;
+          ordered.push_back(c1->Num);
+          tmp.erase(tIter);
+          break;
+        }
+        if (c1->end == vtcs.second) {
+          vtcs.second = c1->beg;
+          ordered.push_back(c1->Num);
+          tmp.erase(tIter);
+          break;
+        }
+      } 
+      if (tmp.size() == nbCurrent) Msg::Error("Could not order compound edge %d to find begin and end vertex", c->Num);
+    }
+    c->beg = vtcs.first;
+    c->end = vtcs.second;
+    c->compound.clear();
+    c->compound.insert(c->compound.end(),ordered.begin(),ordered.end());
+  }
 }
 
 void End_Surface(Surface *s)
@@ -1552,6 +1607,10 @@ Curve *CreateReversedCurve(Curve *c)
       newc->k[c->degre + List_Nbr(c->Control_Points) - i] = c->k[i];
   }
 
+  if(c->Typ == MSH_SEGM_COMPOUND) {
+    newc->compound.insert(newc->compound.end(),c->compound.rbegin(),c->compound.rend());
+  }
+
   if(c->Typ == MSH_SEGM_CIRC)
     newc->Typ = MSH_SEGM_CIRC_INV;
   if(c->Typ == MSH_SEGM_CIRC_INV)