diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index aacb75f4686d5572759ea9fc666e3997bc3a029d..e4a13b1f3f5f58addf443275fbef4412c7a5e0b2 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -408,9 +408,6 @@ static void Mesh2D(GModel *m)
     }
   }
   
-  // use "full quad" subdivision
-  if(CTX.mesh.algo_subdivide == 1) RefineMesh(m, false, true);
-
   // gmshCollapseSmallEdges (*m);
 
   double t2 = Cpu();
@@ -456,9 +453,6 @@ static void Mesh3D(GModel *m)
   for(unsigned int i = 0; i < connected.size(); i++)
     MeshDelaunayVolume(connected[i]);
 
-  // Use "full hexa" subdivision?
-  if(CTX.mesh.algo_subdivide == 2) RefineMesh(m, false, false, true);
-
   double t2 = Cpu();
   CTX.mesh_timer[2] = t2 - t1;
   Msg::Info("Mesh 3D complete (%g s)", CTX.mesh_timer[2]);
@@ -564,6 +558,12 @@ void GenerateMesh(GModel *m, int ask)
       if(CTX.mesh.optimize_netgen > i) OptimizeMeshNetgen(m);
     }
   }
+
+  // Subdivide into quads or hexas
+  if(m->getMeshStatus() == 2 && CTX.mesh.algo_subdivide == 1) 
+    RefineMesh(m, false, true);
+  else if(m->getMeshStatus() == 3 && CTX.mesh.algo_subdivide == 2) 
+    RefineMesh(m, false, false, true);
   
   // Create high order elements
   if(m->getMeshStatus() && CTX.mesh.order > 1)