diff --git a/Geo/Cell.cpp b/Geo/Cell.cpp
index 906262739f5b77b7ea8e471c681d58a7f875e963..6f97ea643498802b85dd4c35cd5e839d320347c3 100755
--- a/Geo/Cell.cpp
+++ b/Geo/Cell.cpp
@@ -103,7 +103,7 @@ int Cell::getFacetOri(std::vector<MVertex*> &v)
 
 void Cell::printCell() 
 {
-  printf("%d-cell %d: \n" , getDim(), getNum());
+  printf("%d-cell: \n" , getDim());
   printf("Vertices: ");
   for(int i = 0; i < this->getNumVertices(); i++){
     printf("%d ", this->getSortedVertex(i));
@@ -205,14 +205,6 @@ bool Cell::hasCoboundary(Cell* cell, bool org)
   } 
 }
 
-void Cell::makeDualCell()
-{ 
-  std::map<Cell*, int, Less_Cell > temp = _boundary;
-  _boundary = _coboundary;
-  _coboundary = temp;
-  _dim = 3-_dim;     
-}
-
 void Cell::printBoundary(bool org) 
 {  
   for(biter it = firstBoundary(org); it != lastBoundary(org); it++){
diff --git a/Geo/Cell.h b/Geo/Cell.h
index 60d0b1742c201d6e3f3edf9bb0b473e35d577d4f..ccf6213b31d3937356ff2a2993b83016c29bf304 100644
--- a/Geo/Cell.h
+++ b/Geo/Cell.h
@@ -87,10 +87,6 @@ class Cell
   virtual int getDim() const { return _dim; };
   virtual int getIndex() const { return _index; };
   virtual void setIndex(int index) { _index = index; };
-  virtual int getNum() const { return _image->getNum(); }
-  virtual int getType() const { return _image->getType(); }
-  virtual int getTypeForMSH() const { return _image->getTypeForMSH(); }
-  virtual int getPartition() const { return _image->getPartition(); }
   virtual void setImmune(bool immune) { _immune = immune; };
   virtual bool getImmune() const { return _immune; };
   virtual bool inSubdomain() const { return _inSubdomain; }
@@ -146,10 +142,7 @@ class Cell
   virtual void clearBoundary() { _boundary.clear(); }
   virtual void clearCoboundary() { _coboundary.clear(); }
   
-   // algebraic dual of the cell
-  virtual void makeDualCell();
-  
-  // print cell info
+  // print cell debug info
   virtual void printCell();
   virtual void printBoundary(bool org=false);
   virtual void printCoboundary(bool org=false);
@@ -160,14 +153,14 @@ class Cell
   virtual void getFacetVertices(const int num, std::vector<MVertex*> &v) const;
   
   // get boundary cell orientation
+  virtual int getFacetOri(std::vector<MVertex*> &v); 
   virtual int getFacetOri(Cell* cell) { 
     std::vector<MVertex*> v; 
     for(int i = 0; i < cell->getNumVertices(); i++) {
       v.push_back(cell->getVertex(i));
     }
     return getFacetOri(v);
-  } 
-  virtual int getFacetOri(std::vector<MVertex*> &v); 
+  }   
   
   // tools for combined cells
   virtual bool isCombined() { return _combined; }
diff --git a/Geo/CellComplex.cpp b/Geo/CellComplex.cpp
index c38226ccad226d9f54462d8711469fae03c676da..49e5b626001d2cfa10883af0279c0881245608ba 100644
--- a/Geo/CellComplex.cpp
+++ b/Geo/CellComplex.cpp
@@ -9,37 +9,21 @@
 
 #if defined(HAVE_KBIPACK)
 
-CellComplex::CellComplex( std::vector<GEntity*> domain, 
-			  std::vector<GEntity*> subdomain)
+CellComplex::CellComplex( std::vector<MElement*>& domainElements, 
+			  std::vector<MElement*>& subdomainElements)
 {
-  _domain = domain;
-  _subdomain = subdomain;
- 
   _dim = 0;
   _simplicial = true;
-  
-  _multidim = false;
-  int dim = 0;
-  for(unsigned int i = 0; i < domain.size(); i++){
-    GEntity* entity = domain.at(i);
-    if(i == 0) dim = entity->dim();
-    if(dim != entity->dim()){
-      _multidim = true;
-      //printf("Warning: Domain is not a manifold.");
-      break;
-    }
-  }
-  
+
   // insert cells into cell complex
-  // subdomain need to be inserted first!
-  if(!insert_cells(_subdomain, true)){ panic_exit(); return; }
-  if(!insert_cells(_domain, false)) { panic_exit(); return; }
+  // subdomain needs to be inserted first!
+  if(!insert_cells(subdomainElements, true)){ panic_exit(); return; }
+  if(!insert_cells(domainElements, false)) { panic_exit(); return; }
 
   for(int i = 0; i < 4; i++){
     _ocells[i] = _cells[i];
     if(getSize(i) > _dim) _dim = i;
-  }
-  
+  }  
 }
 
 void CellComplex::panic_exit(){
@@ -53,68 +37,50 @@ void CellComplex::panic_exit(){
   }
   for(unsigned int i = 0; i < _newcells.size(); i++) delete _newcells.at(i);
   _newcells.clear();
-  _domain.clear();
-  _subdomain.clear();
 }
 
-bool CellComplex::insert_cells(std::vector<GEntity*>& domain, bool subdomain)
+bool CellComplex::insert_cells(std::vector<MElement*>& elements,
+			       bool subdomain)
 {
   std::vector<MVertex*> vertices;
   std::pair<citer, bool> insertInfo;
 
   // add highest dimensional cells
-  for(unsigned int j=0; j < domain.size(); j++) {
-    for(unsigned int i=0; i < domain.at(j)->getNumMeshElements(); i++){
-      vertices.clear();
-      MElement* element = domain.at(j)->getMeshElement(i);
-
-      for(int k=0; k < element->getNumVertices(); k++){
-        MVertex* vertex = element->getVertex(k);
-        vertices.push_back(vertex);
-      }
-      
-      int dim = element->getDim();
-      int type = element->getTypeForMSH();
+  for(unsigned int i=0; i < elements.size(); i++){
+    vertices.clear();
+    MElement* element = elements.at(i);
+    
+    for(int k=0; k < element->getNumVertices(); k++){
+      MVertex* vertex = element->getVertex(k);
+      vertices.push_back(vertex);
+    }
       
-      Cell* cell;
-      // simplex types
-      if(type == MSH_LIN_2 || type == MSH_TRI_3 || type == MSH_TET_4
-	 || type == MSH_LIN_3 || type == MSH_TRI_6 || type == MSH_TET_10 
-	 || type == MSH_PNT || type == MSH_TRI_9 || type == MSH_TRI_10 
-	 || type == MSH_TRI_12 || type == MSH_TRI_15 || type == MSH_TRI_15I 
-	 || type == MSH_TRI_21 || type == MSH_LIN_4 || type == MSH_LIN_5 
-	 || type == MSH_LIN_6 || type == MSH_TET_20 || type == MSH_TET_35 
-	 || type == MSH_TET_56
-         || type == MSH_TET_34 || type == MSH_TET_52 ){
-        cell = new Cell(element);
-      }
-      else if(type == MSH_QUA_4 || type == MSH_QUA_8 || type == MSH_QUA_9){
-        cell = new Cell(element);
-        _simplicial = false;
-      }     
-      else if(type == MSH_HEX_8 || type == MSH_HEX_27 || type == MSH_HEX_20){
-        cell = new Cell(element);
-        _simplicial = false;
-      }
-      else if(type == MSH_PRI_6 || type == MSH_PRI_18 || type == MSH_PRI_15){
-        cell = new Cell(element);
-        _simplicial = false;
-      }/* FIXME: no getFaceInfo methods for these MElements
-      else if(type == MSH_PYR_5 || type == MSH_PYR_14 || type == MSH_PYR_13){
-        cell = new Cell(element, subdomain, boundary);
-        _simplicial = false;
-      }*/
-      else {
-	//printf("Error: mesh element %d not implemented yet! \n", type); 
-	return false;
-      }
-      cell->setImmune(false);
-      cell->setInSubdomain(subdomain);
-      insertInfo = _cells[dim].insert(cell);
-      if(!insertInfo.second) delete cell;
+    int dim = element->getDim();
+    int type = element->getTypeForMSH();
+    
+    Cell* cell = new Cell(element);
+    // simplex types
+    if( !(type == MSH_PNT
+	  || type == MSH_LIN_2 || type == MSH_TRI_3 || type == MSH_TET_4
+	  || type == MSH_LIN_3 || type == MSH_TRI_6 || type == MSH_TET_10 
+	  || type == MSH_PNT || type == MSH_TRI_9 || type == MSH_TRI_10 
+	  || type == MSH_TRI_12 || type == MSH_TRI_15 || type == MSH_TRI_15I 
+	  || type == MSH_TRI_21 || type == MSH_LIN_4 || type == MSH_LIN_5 
+	  || type == MSH_LIN_6 || type == MSH_TET_20 || type == MSH_TET_35 
+	  || type == MSH_TET_56 || type == MSH_TET_34 || type == MSH_TET_52) ){
+      _simplicial = false;
     }
+    /* FIXME: no getFaceInfo methods for these MElements */
+    if(type == MSH_PYR_5 || type == MSH_PYR_14 || type == MSH_PYR_13){
+      //printf("Error: mesh element %d not implemented yet! \n", type);
+      return false;
+    }
+    cell->setImmune(false);
+    cell->setInSubdomain(subdomain);
+    insertInfo = _cells[dim].insert(cell);
+    if(!insertInfo.second) delete cell;  
   }
-
+  
   // add lower dimensional cells recursively
   MElementFactory factory;
   for (int dim = 3; dim > 0; dim--){
@@ -123,7 +89,7 @@ bool CellComplex::insert_cells(std::vector<GEntity*>& domain, bool subdomain)
       std::vector<MVertex*> vertices;
       for(int i = 0; i < cell->getNumFacets(); i++){ 
         cell->getFacetVertices(i, vertices);
-        int type = cell->getTypeForMSH();
+        int type = cell->getImageMElement()->getTypeForMSH();
         int newtype = 0;
         //FIXME: add missing boundary cell type relations
         //FIXME: high order meshes don't work
@@ -131,30 +97,34 @@ bool CellComplex::insert_cells(std::vector<GEntity*>& domain, bool subdomain)
           if(type == MSH_TET_4) newtype = MSH_TRI_3;
           /*else if(type == MSH_TET_10) newtype = MSH_TRI_6;
           else if(type == MSH_TET_20) newtype = MSH_TRI_9;*/
-          else if(type == MSH_HEX_8) newtype = MSH_QUA_4;
+	  /*else if(type == MSH_HEX_8) newtype = MSH_QUA_4;*/
           /*else if(type == MSH_HEX_20) newtype = MSH_QUA_8;
           else if(type == MSH_HEX_27) newtype = MSH_QUA_9;*/
-	  else if(type == MSH_PRI_6 && vertices.size() == 3) newtype = MSH_TRI_3;
-	  else if(type == MSH_PRI_6 && vertices.size() == 4) newtype = MSH_QUA_4;
+	  else if(type == MSH_PRI_6 
+		  && vertices.size() == 3) newtype = MSH_TRI_3;
+	  else if(type == MSH_PRI_6 
+		  && vertices.size() == 4) newtype = MSH_QUA_4;
         }
         else if(dim == 2){
-           if(type == MSH_TRI_3 || type == MSH_QUA_4) newtype = MSH_LIN_2;
-           /*else if(type == MSH_TRI_6 || type == MSH_QUA_8) newtype = MSH_LIN_3;
-           else if(type == MSH_TRI_9) newtype = MSH_LIN_4;
-           else if(type == MSH_QUA_9) newtype = MSH_LIN_3;*/
-        }
-        else if(dim == 1){
-           if(type == MSH_LIN_2) newtype = MSH_PNT;
-           /*else if(type == MSH_LIN_3 || type == MSH_LIN_4 ||
-                   type == MSH_LIN_5 || type == MSH_LIN_6) newtype = MSH_PNT;*/
-        }  
-        if(newtype == 0){
+	  if(type == MSH_TRI_3 || type == MSH_QUA_4) newtype = MSH_LIN_2;
+	  /*else if(type == MSH_TRI_6 
+	    || type == MSH_QUA_8) newtype = MSH_LIN_3;
+	    else if(type == MSH_TRI_9) newtype = MSH_LIN_4;
+	    else if(type == MSH_QUA_9) newtype = MSH_LIN_3;*/
+	}
+	else if(dim == 1){
+	  if(type == MSH_LIN_2) newtype = MSH_PNT;
+	  /*else if(type == MSH_LIN_3 || type == MSH_LIN_4 ||
+	    type == MSH_LIN_5 || type == MSH_LIN_6) newtype = MSH_PNT;*/
+	}  
+	if(newtype == 0){
 	  //printf("Error: mesh element %d not implemented yet! \n", type);
 	  return false;
 	}
 	
 	MElement* element = factory.create(newtype, vertices, 0, 
-					   cell->getPartition());
+					   cell->getImageMElement()->
+					   getPartition());
         Cell* newCell = new Cell(element);
         newCell->setImmune(cell->getImmune());
 	newCell->setInSubdomain(subdomain);
diff --git a/Geo/CellComplex.h b/Geo/CellComplex.h
index 05586ac5ea7d909acf28dc865b08fa8a632ba31f..30df99cfeae572e2fa2cbd8cda364667374560c9 100644
--- a/Geo/CellComplex.h
+++ b/Geo/CellComplex.h
@@ -20,7 +20,7 @@
 #include "Cell.h"
 #include "MElement.h"
 #include "ChainComplex.h"
-#include "GModel.h"
+//#include "GModel.h"
 
 class Cell;
 
@@ -28,16 +28,6 @@ class Cell;
 class CellComplex
 {
  private:
-  
-  // the domain in the model which this cell complex covers
-  std::vector<GEntity*> _domain;
-  // a subdomain of the given domain
-  // used in relative homology computation, may be empty
-  std::vector<GEntity*> _subdomain;
-   
-  // entities on the boundary of the homology computation domain
-  std::vector<GEntity*> _boundary;
-  
   // sorted containers of unique cells in this cell complex 
   // one for each dimension
   std::set<Cell*, Less_Cell>  _cells[4];
@@ -56,9 +46,6 @@ class CellComplex
   // is the cell complex simplicial
   bool _simplicial;
   
-  // does the domain contain entities of different dimensions
-  bool _multidim;
-  
   // enqueue cells in queue if they are not there already
   void enqueueCells(std::map<Cell*, int, Less_Cell>& cells, 
 		    std::queue<Cell*>& Q, std::set<Cell*, Less_Cell>& Qset);
@@ -66,7 +53,7 @@ class CellComplex
   void removeCellQset(Cell* cell, std::set<Cell*, Less_Cell>& Qset);
   
   // for constructor 
-  bool insert_cells(std::vector<GEntity*>& domain, bool subdomain);
+  bool insert_cells(std::vector<MElement*>& elements, bool subdomain);
   void panic_exit();
 
   // insert/remove a cell from this cell complex
@@ -78,13 +65,10 @@ class CellComplex
   
  public: 
   
-  CellComplex( std::vector<GEntity*> domain, std::vector<GEntity*> subdomain);
-  //CellComplex(CellComplex* cellComplex)
+  CellComplex( std::vector<MElement*>& domainElements, 
+	       std::vector<MElement*>& subdomainElements);
   ~CellComplex();
 
-  std::vector<GEntity*> getDomain() const { return _domain; }
-  std::vector<GEntity*> getSubdomain() const { return _subdomain; }
-
   // get the number of certain dimensional cells
   int getSize(int dim, bool org=false){ 
     if(!org) return _cells[dim].size();
diff --git a/Geo/Homology.cpp b/Geo/Homology.cpp
index 929e3e838268b5087b7d4b2a2058918b97ed0f88..7b0cd2bab4cb4d5c95be6d34f7ab99c39c27e83a 100644
--- a/Geo/Homology.cpp
+++ b/Geo/Homology.cpp
@@ -69,8 +69,24 @@ CellComplex* Homology::createCellComplex(std::vector<GEntity*>& domainEntities,
   if(domainEntities.empty()) Msg::Error("Domain is empty.");
   if(subdomainEntities.empty()) Msg::Info("Subdomain is empty.");
   
-  CellComplex* cellComplex =  new CellComplex(domainEntities, 
-					      subdomainEntities);
+  std::vector<MElement*> domainElements;
+  std::vector<MElement*> subdomainElements;
+  for(unsigned int j=0; j < domainEntities.size(); j++) {
+    for(unsigned int i=0; i < domainEntities.at(j)->getNumMeshElements(); i++){
+      MElement* element = domainEntities.at(j)->getMeshElement(i);
+      domainElements.push_back(element);
+    }
+  }
+  for(unsigned int j=0; j < subdomainEntities.size(); j++) {
+    for(unsigned int i=0; i < subdomainEntities.at(j)->getNumMeshElements();
+	i++){
+      MElement* element = subdomainEntities.at(j)->getMeshElement(i);
+      subdomainElements.push_back(element);
+    }
+  }
+
+  CellComplex* cellComplex =  new CellComplex(domainElements, 
+					      subdomainElements);
 
   if(cellComplex->getSize(0) == 0){ 
     Msg::Error("Cell Complex is empty!");
@@ -94,7 +110,8 @@ Homology::~Homology()
 
 void Homology::findGenerators()
 {
-  CellComplex* cellComplex = createCellComplex(_domainEntities, _subdomainEntities);
+  CellComplex* cellComplex = createCellComplex(_domainEntities, 
+					       _subdomainEntities);
   std::string domainString = getDomainString(_domain, _subdomain);
 
   Msg::Info("Reducing the Cell Complex...");
@@ -320,9 +337,8 @@ void Homology::findDualGenerators()
 }
 
 void Homology::findHomSequence(){
-
-  CellComplex* cellComplex = new CellComplex(_domainEntities, 
-					     _subdomainEntities);
+  CellComplex* cellComplex = createCellComplex(_domainEntities, 
+					       _subdomainEntities);
   Msg::Info("Reducing the Cell Complex...");
   Msg::StatusBar(1, false, "Reducing...");
   double t1 = Cpu();
@@ -718,7 +734,7 @@ int Chain::writeChainMSH(const std::string &name)
   for(citer cit = _cells.begin(); cit != _cells.end(); cit++){
     Cell* cell = (*cit).first;
     int coeff = (*cit).second;
-    fprintf(fp, "%d %d \n", cell->getNum(), coeff );
+    fprintf(fp, "%d %d \n", cell->getImageMElement()->getNum(), coeff );
   }
   
   fprintf(fp, "$EndElementData\n");
diff --git a/Geo/Homology.h b/Geo/Homology.h
index 88a630ea2ccf56b1a961f765b5b92d2076a5cf5e..705a27bfff223d442d52a2aba219363fef3ea40e 100644
--- a/Geo/Homology.h
+++ b/Geo/Homology.h
@@ -12,6 +12,7 @@
 #include "CellComplex.h"
 #include "ChainComplex.h"
 #include "OS.h"
+#include "GModel.h"
 #include "PView.h"
 #include "Options.h"