diff --git a/dune/foamgrid/foamgrid.hh b/dune/foamgrid/foamgrid.hh
index 91c68a080b6c59038bbb289637913514a9475234..050af06ae1398fcff5e83fc9bf09f2ba2e075135 100644
--- a/dune/foamgrid/foamgrid.hh
+++ b/dune/foamgrid/foamgrid.hh
@@ -134,10 +134,7 @@ class FoamGrid :
           globalRefined(0),
           numBoundarySegments_(0),
           growing_(false)
-    {
-        //static_assert(dimgrid == 2, "FoamGrid currently only works for 2D in nD");
-        std::fill(freeIdCounter_.begin(), freeIdCounter_.end(), 0);
-    }
+    {}
 
         //! Destructor
         ~FoamGrid()
@@ -648,6 +645,14 @@ class FoamGrid :
     //! compute the grid indices and ids
     void setIndices();
 
+    /** \brief Produce an entity id that has not been used in this grid before.
+     *  \note Every entity, no matter which codimension, gets a unique id in the whole grid.
+     */
+    unsigned int getNextFreeId()
+    {
+      return freeIdCounter_++;
+    }
+
     //! Compute the codim 2-0 connectivity useful for removal of elements
     void computeTwoZeroConnectivity()
     {
@@ -702,8 +707,8 @@ class FoamGrid :
     //! The id set
     FoamGridIdSet<const FoamGrid > idSet_;
 
-    /** \brief Counters that always provide the next free id for each dimension */
-    std::array<unsigned int, dimgrid+1> freeIdCounter_;
+    /** \brief a counter that always provides the next free unique id for an entity */
+    unsigned int freeIdCounter_;
 
     /** \brief How many times was the leaf level globally refined. */
     int globalRefined;
diff --git a/dune/foamgrid/foamgrid/foamgrid.cc b/dune/foamgrid/foamgrid/foamgrid.cc
index 0b622907f99453887eda27ce1a4be105ffa34230..47d324c0f00c987dca73e61adeb6a44b0141ecae 100644
--- a/dune/foamgrid/foamgrid/foamgrid.cc
+++ b/dune/foamgrid/foamgrid/foamgrid.cc
@@ -585,7 +585,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2
       //create midpoint
       std::get<0>(entityImps_[nextLevel])
         .push_back(FoamGridEntityImp<0, dimgrid, dimworld>(nextLevel, midPoint,
-                                               freeIdCounter_[0]++));
+                                               getNextFreeId()));
       FoamGridEntityImp<0, dimgrid, dimworld>& midVertex =
         std::get<0>(entityImps_[nextLevel]).back();
       nextLevelVertices[vertexIndex++]=&midVertex;
@@ -602,7 +602,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2
       // create the facets and publish them in the father
       std::get<1>(entityImps_[nextLevel])
         .push_back(FoamGridEntityImp<1, dimgrid, dimworld>(nextLevelVertices[facetVertexMapping[facetIndex/2].first], &midVertex,
-                                                 nextLevel, freeIdCounter_[1]++, *facet));
+                                                 nextLevel, getNextFreeId(), *facet));
       (*facet)->sons_[0] = &std::get<1>(entityImps_[nextLevel]).back();
       ++((*facet)->nSons_);
       // Inherit the boundaryId and SegmentIndex (are treated as the same for now)
@@ -618,7 +618,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2
       assert((*facet)->vertex_[1]->sons_[0]!=nullptr);
       std::get<1>(entityImps_[nextLevel])
         .push_back(FoamGridEntityImp<1, dimgrid, dimworld>(&midVertex, nextLevelVertices[facetVertexMapping[facetIndex/2].second],
-                                                 nextLevel, freeIdCounter_[1]++, *facet));
+                                                 nextLevel, getNextFreeId(), *facet));
       (*facet)->sons_[1] = &std::get<1>(entityImps_[nextLevel]).back();
       ++((*facet)->nSons_);
       // Inherit the boundaryId and SegmentIndex (are treated as the same for now)
@@ -662,21 +662,21 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2
   std::get<1>(entityImps_[nextLevel])
     .push_back(FoamGridEntityImp<1, dimgrid, dimworld>(nextLevelVertices[3],
                                              nextLevelVertices[4], nextLevel,
-                                             freeIdCounter_[1]++));
+                                             getNextFreeId()));
   nextLevelFacets[facetIndex++]=&std::get<1>(entityImps_[nextLevel]).back();
 
   // the one opposite to father vertex 1
   std::get<1>(entityImps_[nextLevel])
     .push_back(FoamGridEntityImp<1, dimgrid, dimworld>(nextLevelVertices[3],
                                              nextLevelVertices[5], nextLevel,
-                                             freeIdCounter_[1]++));
+                                             getNextFreeId()));
   nextLevelFacets[facetIndex++]=&std::get<1>(entityImps_[nextLevel]).back();
 
   // and the one opposite to father vertex 2
   std::get<1>(entityImps_[nextLevel])
     .push_back(FoamGridEntityImp<1, dimgrid, dimworld>(nextLevelVertices[4],
                                              nextLevelVertices[5], nextLevel,
-                                             freeIdCounter_[1]++));
+                                             getNextFreeId()));
   nextLevelFacets[facetIndex++]=&std::get<1>(entityImps_[nextLevel]).back();
 
   assert(facetIndex==nextLevelFacets.size());
@@ -686,7 +686,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2
   // create the new triangles that lie in the corners
   // First the one that contains vertex 0 of the father.
   std::get<2>(entityImps_[nextLevel])
-    .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, freeIdCounter_[2]++));
+    .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, getNextFreeId()));
 
   FoamGridEntityImp<dimgrid, dimgrid, dimworld>* newElement = &(std::get<dimgrid>(entityImps_[nextLevel]).back());
   newElement->isNew_=true;
@@ -707,7 +707,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2
 
   // Next the one that contains vertex 1 of the father.
   std::get<2>(entityImps_[nextLevel])
-    .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, freeIdCounter_[2]++));
+    .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, getNextFreeId()));
   newElement = &(std::get<dimgrid>(entityImps_[nextLevel]).back());
   newElement->isNew_=true;
   newElement->father_=&element;
@@ -727,7 +727,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2
 
   // Last the one that contains vertex 2 of the father.
   std::get<dimgrid>(entityImps_[nextLevel])
-    .push_back(FoamGridEntityImp<dimgrid, dimgrid ,dimworld>(nextLevel, freeIdCounter_[2]++));
+    .push_back(FoamGridEntityImp<dimgrid, dimgrid ,dimworld>(nextLevel, getNextFreeId()));
   newElement = &(std::get<2>(entityImps_[nextLevel]).back());
   newElement->isNew_=true;
   newElement->father_=&element;
@@ -747,7 +747,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2
 
   // create the triangle in the center
   std::get<dimgrid>(entityImps_[nextLevel])
-    .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, freeIdCounter_[2]++));
+    .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, getNextFreeId()));
   newElement = &(std::get<2>(entityImps_[nextLevel]).back());
   newElement->isNew_=true;
   newElement->father_=&element;
@@ -869,7 +869,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<1
     element.elementParametrization_->evaluate(localMidPoint, midPoint);
   }
   // Create element midpoint
-  std::get<0>(entityImps_[nextLevel]).push_back(FoamGridEntityImp<0, dimgrid, dimworld>(nextLevel, midPoint, freeIdCounter_[0]++));
+  std::get<0>(entityImps_[nextLevel]).push_back(FoamGridEntityImp<0, dimgrid, dimworld>(nextLevel, midPoint, getNextFreeId()));
   FoamGridEntityImp<0, dimgrid, dimworld>& midVertex = std::get<0>(entityImps_[nextLevel]).back();
   nextLevelVertices[vertexIndex++]=&midVertex;
 
@@ -880,7 +880,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<1
   // create the elements
   // First the one that contains vertex 0 of the father.
   std::get<dimgrid>(entityImps_[nextLevel])
-    .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, freeIdCounter_[dimgrid]++));
+    .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, getNextFreeId()));
 
   FoamGridEntityImp<dimgrid, dimgrid, dimworld>* newElement = &(std::get<dimgrid>(entityImps_[nextLevel]).back());
   newElement->isNew_=true;
@@ -900,7 +900,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<1
 
   // Next the one that contains vertex 1 of the father.
   std::get<dimgrid>(entityImps_[nextLevel])
-    .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, freeIdCounter_[dimgrid]++));
+    .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, getNextFreeId()));
   newElement = &(std::get<dimgrid>(entityImps_[nextLevel]).back());
   newElement->isNew_=true;
   newElement->father_=&element;
@@ -1113,7 +1113,7 @@ bool Dune::FoamGrid<dimgrid, dimworld>::grow()
         if(!insertedMap.count(*vIt))
         {
           // add the vertex to the grid
-          (*vIt)->id_ = freeIdCounter_[0]++;
+          (*vIt)->id_ = getNextFreeId();
           std::get<0>(entityImps_[level]).push_back(*(*vIt));
 
           // add a map entry so we know this new vertex was already inserted
@@ -1137,7 +1137,7 @@ bool Dune::FoamGrid<dimgrid, dimworld>::grow()
     }
 
     // We are ready to insert the element into the grid
-    eIt->id_ = freeIdCounter_[dimgrid]++;
+    eIt->id_ = getNextFreeId();
     std::get<dimgrid>(entityImps_[level]).push_back(*eIt);
     newEntities = true;
   }
@@ -1320,7 +1320,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::addNewFacet(FoamGridEntityImp<1, dimgrid
                                                     std::array<FoamGridEntityImp<0, dimgrid, dimworld>*,dimgrid> vertexArray,
                                                     int level)
 {
-  std::get<1>(entityImps_[level]).push_back(FoamGridEntityImp<1, 2, dimworld>(vertexArray[0], vertexArray[1], level, freeIdCounter_[1]++));
+  std::get<1>(entityImps_[level]).push_back(FoamGridEntityImp<1, 2, dimworld>(vertexArray[0], vertexArray[1], level, getNextFreeId()));
   facet = &*std::get<1>(entityImps_[level]).rbegin();
 }
 
diff --git a/dune/foamgrid/foamgrid/foamgridfactory.hh b/dune/foamgrid/foamgrid/foamgridfactory.hh
index bc36f9c3cfd1ec60462df72945697b34fa3cb7df..6cef7c85f73ac71d981b5c57d3e98ddc087508a3 100644
--- a/dune/foamgrid/foamgrid/foamgridfactory.hh
+++ b/dune/foamgrid/foamgrid/foamgridfactory.hh
@@ -69,7 +69,7 @@ template <int dimgrid, int dimworld>
         virtual void insertVertex(const FieldVector<ctype,dimworld>& pos) {
             std::get<0>(grid_->entityImps_[0]).push_back(FoamGridEntityImp<0, dimgrid, dimworld> (0,   // level
                                                                          pos,  // position
-                                                                         grid_->freeIdCounter_[0]++));
+                                                                         grid_->getNextFreeId()));
             vertexArray_.push_back(&*std::get<0>(grid_->entityImps_[0]).rbegin());
         }
 
@@ -159,7 +159,7 @@ template <int dimworld>
             FoamGridEntityImp<1, dimgrid, dimworld> newElement(this->vertexArray_[vertices[0]],
                                                                this->vertexArray_[vertices[1]],
                                                                0,
-                                                               this->grid_->freeIdCounter_[1]++);
+                                                               this->grid_->getNextFreeId());
 
             std::get<1>(this->grid_->entityImps_[0]).push_back(newElement);
 
@@ -178,7 +178,7 @@ template <int dimworld>
             FoamGridEntityImp<1, dimgrid, dimworld> newElement(this->vertexArray_[vertices[0]],
                                                                this->vertexArray_[vertices[1]],
                                                                0,
-                                                               this->grid_->freeIdCounter_[1]++);
+                                                               this->grid_->getNextFreeId());
             // save the pointer to the element parametrization
             newElement.elementParametrization_ = elementParametrization;
 
@@ -269,7 +269,7 @@ template <int dimworld>
             assert(type.isTriangle());
 
             FoamGridEntityImp<dimgrid, dimgrid, dimworld> newElement(0,   // level
-                                       this->grid_->freeIdCounter_[dimgrid]++);  // id
+                                       this->grid_->getNextFreeId());  // id
             newElement.vertex_[0] = this->vertexArray_[vertices[0]];
             newElement.vertex_[1] = this->vertexArray_[vertices[1]];
             newElement.vertex_[2] = this->vertexArray_[vertices[2]];
@@ -288,7 +288,7 @@ template <int dimworld>
         {
             assert(type.isTriangle());
             FoamGridEntityImp<dimgrid, dimgrid, dimworld> newElement(0,   // level
-                                       this->grid_->freeIdCounter_[dimgrid]++);  // id
+                                       this->grid_->getNextFreeId());  // id
             newElement.vertex_[0] = this->vertexArray_[vertices[0]];
             newElement.vertex_[1] = this->vertexArray_[vertices[1]];
             newElement.vertex_[2] = this->vertexArray_[vertices[2]];
@@ -350,8 +350,8 @@ template <int dimworld>
                         // The current edge has not been inserted already.  We do that now.
                         std::get<1>(this->grid_->entityImps_[0]).push_back(FoamGridEntityImp<1, dimgrid, dimworld>(v0,
                                                                                                     v1,
-                                                                                                    0,   // level
-                                                                                                    this->grid_->freeIdCounter_[1]++    // id
+                                                                                                    0, // level
+                                                                                                    this->grid_->getNextFreeId() // id
                                                                                                     ));
 
                         existingEdge = &*std::get<1>(this->grid_->entityImps_[0]).rbegin();