diff --git a/Mesh/BoundaryLayers.cpp b/Mesh/BoundaryLayers.cpp
index 9320f8168032ba8aa3a58b7cf2206dee13e74e2e..a9162df4cc59e29961287c5db75fe23f22e20420 100644
--- a/Mesh/BoundaryLayers.cpp
+++ b/Mesh/BoundaryLayers.cpp
@@ -56,6 +56,32 @@ static void addExtrudeNormals(std::vector<T*> &elements, int invert,
   }
 }
 
+template<class T>
+static void addExtrudeNormals(std::set<T*> &entities, std::map<int, bool> &invert,
+                              std::map<int, int> &useView)
+{
+  for(typename std::set<T*>::iterator it = entities.begin(); it != entities.end(); it++){
+    T *ge = *it;
+    int inv = invert.count(ge->tag());
+      OctreePost *octree = 0;
+#if defined(HAVE_POST)
+      if(useView.count(ge->tag())){
+        int index = useView[ge->tag()];
+        if(index >= 0 && index < PView::list.size())
+          octree = new OctreePost(PView::list[index]);
+        else
+          Msg::Error("Unknown View[%d]: using normals instead", index);
+      }
+#endif
+      if(ge->dim() == 1)
+        addExtrudeNormals(((GEdge*)ge)->lines, inv, octree);
+      else if(ge->dim() == 2){
+        addExtrudeNormals(((GFace*)ge)->triangles, inv, octree);
+        addExtrudeNormals(((GFace*)ge)->quadrangles, inv, octree);
+      }
+  }
+}
+
 int Mesh2DWithBoundaryLayers(GModel *m)
 {
   std::set<GFace*> sourceFaces, otherFaces;
@@ -124,44 +150,10 @@ int Mesh2DWithBoundaryLayers(GModel *m)
   // compute a normal field for all the source edges or faces
   if(ExtrudeParams::normals) delete ExtrudeParams::normals;
   ExtrudeParams::normals = new smooth_data();
-  
-  if(sourceFaces.empty()){
-    for(std::set<GEdge*>::iterator it = sourceEdges.begin(); 
-        it != sourceEdges.end(); it++){
-      GEdge *ge = *it;
-      int invert = sourceEdgeInvert.count(ge->tag());
-      OctreePost *octree = 0;
-#if defined(HAVE_POST)
-      if(sourceEdgeUseView.count(ge->tag())){
-        int index = sourceEdgeUseView[ge->tag()];
-        if(index >= 0 && index < PView::list.size())
-          octree = new OctreePost(PView::list[index]);
-        else
-          Msg::Error("Unknown View[%d]: using normals instead", index);
-      }
-#endif
-      addExtrudeNormals(ge->lines, invert, octree);
-    }
-  }
-  else{
-    for(std::set<GFace*>::iterator it = sourceFaces.begin(); 
-        it != sourceFaces.end(); it++){
-      GFace *gf = *it;
-      int invert = sourceFaceInvert.count(gf->tag());
-      OctreePost *octree = 0;
-#if defined(HAVE_POST)
-      if(sourceFaceUseView.count(gf->tag())){
-        int index = sourceFaceUseView[gf->tag()];
-        if(index >= 0 && index < PView::list.size())
-          octree = new OctreePost(PView::list[index]);
-        else
-          Msg::Error("Unknown View[%d]: using normals instead", index);
-      }
-#endif
-      addExtrudeNormals(gf->triangles, invert, octree);
-      addExtrudeNormals(gf->quadrangles, invert, octree);
-    }
-  }
+  if(sourceFaces.empty())
+    addExtrudeNormals(sourceEdges, sourceEdgeInvert, sourceEdgeUseView);
+  else
+    addExtrudeNormals(sourceFaces, sourceFaceInvert, sourceFaceUseView);
   if(sourceEdgeUseView.empty() && sourceFaceUseView.empty())
     ExtrudeParams::normals->normalize();