diff --git a/Geo/CellComplex.cpp b/Geo/CellComplex.cpp
index 176260c60b7c6b70ca4959c0c2e6c2e50359c804..bf2ccd4894a582d67a1c1988dcb2c5c227a2403a 100644
--- a/Geo/CellComplex.cpp
+++ b/Geo/CellComplex.cpp
@@ -365,7 +365,7 @@ int CellComplex::reduction(int dim){
 }
 
  
-int CellComplex::reduceComplex(bool omitHighdim){
+int CellComplex::reduceComplex(int omit){
   printf("Cell complex before reduction: %d volumes, %d faces, %d edges and %d vertices.\n",
          getSize(3), getSize(2), getSize(1), getSize(0));
 
@@ -375,14 +375,17 @@ int CellComplex::reduceComplex(bool omitHighdim){
  
   
   int omitted = 0;
-  if(count == 0 && omitHighdim){
+  if(omit > getDim()) omit = getDim();
+  for(int i = 0; i < omit; i++){
+  //if(count == 0 && omit > 0){
     
     CellComplex::removeSubdomain();
     CellComplex::removeSubdomain();
     std::set<Cell*, Less_Cell> generatorCells;
  
-    while (getSize(getDim()) != 0){
-      citer cit = firstCell(getDim());
+    
+    while (getSize(getDim()-i) != 0){
+      citer cit = firstCell(getDim()-i);
  
       Cell* cell = *cit;
       generatorCells.insert(cell);
@@ -400,7 +403,7 @@ int CellComplex::reduceComplex(bool omitHighdim){
       Cell* cell = *cit;
       cell->clearBoundary();
       cell->clearCoboundary();
-      _cells[getDim()].insert(cell);
+      _cells[getDim()-i].insert(cell);
     }
     
     
@@ -429,7 +432,7 @@ void CellComplex::removeSubdomain(){
 }
 
 
-int CellComplex::coreduceComplex(bool omitLowdim){
+int CellComplex::coreduceComplex(int omit){
 
   printf("Cell complex before coreduction: %d volumes, %d faces, %d edges and %d vertices.\n",
          getSize(3), getSize(2), getSize(1), getSize(0));
@@ -450,14 +453,16 @@ int CellComplex::coreduceComplex(bool omitLowdim){
   } 
   
   int omitted = 0;
-  if(count == 0 && omitLowdim){
+  //if(count == 0 && omit > 0){
+  if(omit > getDim()) omit = getDim();
+  for(int i = 0; i < omit; i++){
     std::set<Cell*, Less_Cell> generatorCells;
-    while (getSize(0) != 0){
-      citer cit = firstCell(0);
+    while (getSize(i) != 0){
+      citer cit = firstCell(i);
       Cell* cell = *cit;
       generatorCells.insert(cell);
       removeCell(cell);
-      coreduceComplex(false);
+      coreduceComplex(0);
       //coreduction(cell);
       omitted++;
     }
@@ -466,10 +471,9 @@ int CellComplex::coreduceComplex(bool omitLowdim){
       Cell* cell = *cit;
       cell->clearBoundary();
       cell->clearCoboundary();
-      _cells[0].insert(cell);
+      _cells[i].insert(cell);
     }
     
-    
   }
     
   printf("Cell complex after coreduction: %d volumes, %d faces, %d edges and %d vertices.\n",
diff --git a/Geo/CellComplex.h b/Geo/CellComplex.h
index 021437788976d355e60784612fc9f889c2bb3b7e..b83d700c7900c3e788ea7d508fbd7b7a9a843517 100644
--- a/Geo/CellComplex.h
+++ b/Geo/CellComplex.h
@@ -766,8 +766,8 @@ class CellComplex
      
    
    // useful functions for (co)reduction of cell complex
-   int reduceComplex(bool omitHighdim = false);
-   int coreduceComplex(bool omitlowDim = false);
+   int reduceComplex(int omit = 0);
+   int coreduceComplex(int omit = 0);
    
    
    // add every volume, face and edge its missing boundary cells
diff --git a/Geo/Homology.cpp b/Geo/Homology.cpp
index 39b7eba797efbc2a5017d84590e77e7961fdaf6b..657de3d120ca474c1184c0f2129540511ec998ed 100644
--- a/Geo/Homology.cpp
+++ b/Geo/Homology.cpp
@@ -15,6 +15,7 @@ Homology::Homology(GModel* model, std::vector<int> physicalDomain, std::vector<i
   
   _model = model;
   _combine = true;
+  _omit = 1;
   
   Msg::Info("Creating a Cell Complex...");
   double t1 = Cpu();
@@ -76,7 +77,7 @@ void Homology::findGenerators(std::string fileName){
   
   Msg::Info("Reducing Cell Complex...");
   double t1 = Cpu();
-  int omitted = _cellComplex->reduceComplex(true);
+  int omitted = _cellComplex->reduceComplex(_omit);
   
   if(getCombine()){
     _cellComplex->combine(3);
@@ -129,7 +130,7 @@ void Homology::findGenerators(std::string fileName){
   Msg::Info("H1 = %d", HRank[1]);
   Msg::Info("H2 = %d", HRank[2]);
   Msg::Info("H3 = %d", HRank[3]);
-  if(omitted != 0) Msg::Info("Computation of %dD generators was omitted.", _cellComplex->getDim());
+  if(omitted != 0) Msg::Info("Computation of generators in %d highest dimensions was omitted.", _omit);
   
   Msg::Info("Wrote results to %s.", fileName.c_str());
   
@@ -149,7 +150,7 @@ void Homology::findThickCuts(std::string fileName){
   
   Msg::Info("Reducing Cell Complex...");
   double t1 = Cpu();
-  int omitted = _cellComplex->coreduceComplex(true);
+  int omitted = _cellComplex->coreduceComplex(_omit);
   //for(int i = 0; i < 4; i++) { printf("Dim %d: \n", i); _cellComplex->printComplex(i); }
   //_cellComplex->coreduceComplex(false);
   //_cellComplex->checkCoherence();
@@ -207,7 +208,7 @@ void Homology::findThickCuts(std::string fileName){
   Msg::Info("H1 = %d", HRank[1]);
   Msg::Info("H2 = %d", HRank[2]);
   Msg::Info("H3 = %d", HRank[3]);
-  if(omitted != 0) Msg::Info("Computation of %dD thick cuts was omitted.", dim);
+  if(omitted != 0) Msg::Info("Computation of %d highest dimension thick cuts was omitted.", _omit);
   
   Msg::Info("Wrote results to %s.", fileName.c_str());
   
diff --git a/Geo/Homology.h b/Geo/Homology.h
index e53ca8bd8d30693880b4c4f4240d1045126b4ec6..fd572aeb9699c74f12c79e1941a24b5bda5e01e9 100644
--- a/Geo/Homology.h
+++ b/Geo/Homology.h
@@ -29,6 +29,7 @@ class Homology
    GModel* _model;
    
    bool _combine;
+   int _omit;
    
   public:
    
@@ -42,7 +43,16 @@ class Homology
    void findThickCuts(std::string fileName);
       
    void swapSubdomain() { _cellComplex->swapSubdomain(); }
-      
+
+   int getOmit() {return _omit; }
+   void setOmit(int omit) { 
+     if(omit > _cellComplex->getDim() || omit < 0) {
+       Msg::Error("Invalid number of dimensions to omit. Must be between 0 - %d.", _cellComplex->getDim());
+       Msg::Warning("Set to omit 1 dimension.");
+       _omit = 1;
+     }
+     else _omit = omit;
+   }
 };
 
 #endif
diff --git a/Plugin/HomologyComputation.cpp b/Plugin/HomologyComputation.cpp
index 41d6e8cbfb984c774ac5c3e323f965f75bfb776e..6968bdf1bd305529224c12632d4c0a250c0cf0a5 100644
--- a/Plugin/HomologyComputation.cpp
+++ b/Plugin/HomologyComputation.cpp
@@ -21,8 +21,7 @@ StringXNumber HomologyComputationOptions_Number[] = {
   {GMSH_FULLRC, "2. Physical group for subdomain", NULL, 0.},
   {GMSH_FULLRC, "Compute generators", NULL, 1.},
   {GMSH_FULLRC, "Compute thick cuts", NULL, 0.},
-  {GMSH_FULLRC, "Swap subdomain", NULL, 0.},
-  {GMSH_FULLRC, "Combine cells", NULL, 1.}
+  {GMSH_FULLRC, "Omit dimensions", NULL, 1.},
 };
 
 StringXString HomologyComputationOptions_String[] = {
@@ -98,16 +97,18 @@ PView *GMSH_HomologyComputationPlugin::execute(PView *v)
 
   int gens = (int)HomologyComputationOptions_Number[4].def;
   int cuts = (int)HomologyComputationOptions_Number[5].def;
-  int swap = (int)HomologyComputationOptions_Number[6].def;
-  int combine = (int)HomologyComputationOptions_Number[7].def;
+  int omit = (int)HomologyComputationOptions_Number[6].def;
+  //int combine = (int)HomologyComputationOptions_Number[7].def;
+  
 
   GModel *m = GModel::current();
   
   Homology* homology = new Homology(m, domain, subdomain);
-  if(combine == 0) homology->setCombine(false); 
+  //if(combine == 0) homology->setCombine(false); 
+  homology->setOmit(omit);
   
+  //if(swap == 1) homology->swapSubdomain();
   
-  if(swap == 1) homology->swapSubdomain();
   if(gens == 1 && cuts != 1) {
     homology->findGenerators(fileName);
     GmshMergeFile(fileName);