From e77c8bf5dd7c17cfe6e187321d917101606b2c32 Mon Sep 17 00:00:00 2001
From: Tomas Oberhuber <tomas.oberhuber@fjfi.cvut.cz>
Date: Sat, 15 Aug 2015 11:48:49 +0200
Subject: [PATCH] Mesh config and config validator were added.

---
 TODO                                          |   7 +-
 src/core/arrays/tnlStaticArray.h              |   8 ++
 src/core/arrays/tnlStaticArray1D_impl.h       |   7 +
 src/core/arrays/tnlStaticArray2D_impl.h       |   7 +
 src/core/arrays/tnlStaticArray3D_impl.h       |   8 ++
 src/core/arrays/tnlStaticArray_impl.h         |  14 +-
 src/mesh/CMakeLists.txt                       |   1 +
 src/mesh/config/CMakeLists.txt                |   3 +-
 src/mesh/config/tnlMeshConfigBase.h           |  51 ++++++-
 src/mesh/config/tnlMeshConfigValidator.h      | 105 ++++++++++++++
 src/mesh/layers/tnlMeshStorageLayer.h         |  86 ++++++------
 .../layers/tnlMeshSubentityStorageLayer.h     |  62 ++++----
 .../layers/tnlMeshSuperentityStorageLayer.h   |  80 +++++------
 ...lDimensionsTraits.h => tnlDimensionsTag.h} |  21 +--
 src/mesh/tnlMesh.h                            |  50 +++----
 src/mesh/tnlMeshEntity.h                      |  73 ++++++----
 src/mesh/tnlMeshEntityInitializer.h           |  68 ++++-----
 src/mesh/tnlMeshEntityKey.h                   |   4 +-
 src/mesh/tnlMeshInitializer.h                 |  92 ++++++------
 src/mesh/tnlMeshIntegrityChecker.h            |   6 +-
 src/mesh/tnlMeshIntegrityCheckerLayer.h       |  26 ++--
 src/mesh/tnlMeshReaderNetgen.h                |  74 +++++++++-
 src/mesh/tnlMeshSuperentityInitializerLayer.h |  12 +-
 src/mesh/tnlMeshWriterVTKLegacy.h             |  65 ++++++++-
 src/mesh/traits/CMakeLists.txt                |   3 +-
 src/mesh/traits/tnlMeshConfigTraits.h         |  63 +++++++++
 src/mesh/traits/tnlMeshEntitiesTag.h          |  10 +-
 src/mesh/traits/tnlMeshEntitiesTraits.h       |  11 +-
 src/mesh/traits/tnlMeshSubentitiesTraits.h    |   9 +-
 src/mesh/traits/tnlMeshSuperentitiesTraits.h  |  11 +-
 src/mesh/traits/tnlMeshTraits.h               |   8 +-
 tests/unit-tests/mesh/tnlMeshEntityTester.h   |  53 +++++--
 tests/unit-tests/mesh/tnlMeshTester.h         |  76 ++++------
 tools/src/tnl-mesh-convert.h                  | 132 +++++++++---------
 tools/src/tnl-view.cpp                        |   2 +-
 35 files changed, 853 insertions(+), 455 deletions(-)
 create mode 100644 src/mesh/config/tnlMeshConfigValidator.h
 rename src/mesh/{traits/tnlDimensionsTraits.h => tnlDimensionsTag.h} (71%)
 create mode 100644 src/mesh/traits/tnlMeshConfigTraits.h

diff --git a/TODO b/TODO
index c8ed457124..d885b32df7 100644
--- a/TODO
+++ b/TODO
@@ -1,8 +1,13 @@
+TODO: Mesh
+ * vsechny traits zkusit presunout do jednotneho MeshTraits, tj. temer MeshConfigTraits ale pojmenovat jako MeshTraits
+ * zrusit tnlDimesnionsTag
+ * prejmenovat Tagy v topologies na Topology zrejme
+ * zrusit tnlStorageTraits
+
 TODO: v tnlMeshResolver se provadi preklad pro vsechny mozne sablonove parametry => prorezat
 
 TODO: napsat FunctionDiscretizer pro jednotne rozhrani RightHandSide
 
-TODO: doplnit mesh travelsals pro jine mesh entity nez cell
 TODO: implementace maticovych resicu
       * Gaussova eliminace
       * SOR metoda
diff --git a/src/core/arrays/tnlStaticArray.h b/src/core/arrays/tnlStaticArray.h
index 6ac9811433..c83d809d36 100644
--- a/src/core/arrays/tnlStaticArray.h
+++ b/src/core/arrays/tnlStaticArray.h
@@ -100,6 +100,8 @@ class tnlStaticArray
    bool load( tnlFile& file);
 
    void sort();
+   
+   ostream& write( ostream& str, const char* separator = " " ) const;
 
    protected:
    Element data[ Size ];
@@ -192,6 +194,8 @@ class tnlStaticArray< 1, Element >
    bool load( tnlFile& file);
 
    void sort();
+   
+   ostream& write( ostream& str, const char* separator = " " ) const;
 
    protected:
    Element data[ size ];
@@ -301,6 +305,8 @@ class tnlStaticArray< 2, Element >
    bool load( tnlFile& file);
 
    void sort();
+   
+   ostream& write( ostream& str, const char* separator = " " ) const;
 
    protected:
    Element data[ size ];
@@ -422,6 +428,8 @@ class tnlStaticArray< 3, Element >
    bool load( tnlFile& file);
 
    void sort();
+   
+   ostream& write( ostream& str, const char* separator = " " ) const;
 
    protected:
    Element data[ size ];
diff --git a/src/core/arrays/tnlStaticArray1D_impl.h b/src/core/arrays/tnlStaticArray1D_impl.h
index 170488b655..e7779e9eae 100644
--- a/src/core/arrays/tnlStaticArray1D_impl.h
+++ b/src/core/arrays/tnlStaticArray1D_impl.h
@@ -202,6 +202,13 @@ void tnlStaticArray< 1, Element >::sort()
 {
 }
 
+template< typename Element >
+ostream& tnlStaticArray< 1, Element >::write( ostream& str, const char* separator ) const
+{
+   str << data[ 0 ];
+   return str;
+}
+
 #ifdef TEMPLATE_EXPLICIT_INSTANTIATION
 
 // TODO: it does not work with CUDA
diff --git a/src/core/arrays/tnlStaticArray2D_impl.h b/src/core/arrays/tnlStaticArray2D_impl.h
index 3e3cd35820..dcbe0cfce8 100644
--- a/src/core/arrays/tnlStaticArray2D_impl.h
+++ b/src/core/arrays/tnlStaticArray2D_impl.h
@@ -239,6 +239,13 @@ void tnlStaticArray< 2, Element >::sort()
       Swap( data[ 0 ], data[ 1 ] );
 }
 
+template< typename Element >
+ostream& tnlStaticArray< 2, Element >::write( ostream& str, const char* separator ) const
+{
+   str << data[ 0 ] << separator << data[ 1 ];
+   return str;
+}
+
 #ifdef TEMPLATE_EXPLICIT_INSTANTIATION
 
 // TODO: it does not work with CUDA
diff --git a/src/core/arrays/tnlStaticArray3D_impl.h b/src/core/arrays/tnlStaticArray3D_impl.h
index 5b9755f028..95740a73de 100644
--- a/src/core/arrays/tnlStaticArray3D_impl.h
+++ b/src/core/arrays/tnlStaticArray3D_impl.h
@@ -270,6 +270,14 @@ void tnlStaticArray< 3, Element >::sort()
       Swap( data[ 0 ], data[ 1 ] );
 }
 
+template< typename Element >
+ostream& tnlStaticArray< 3, Element >::write( ostream& str, const char* separator ) const
+{
+   str << data[ 0 ] << separator << data[ 1 ] << separator << data[ 2 ];
+   return str;
+}
+
+
 #ifdef TEMPLATE_EXPLICIT_INSTANTIATION
 
 // TODO: it does not work with CUDA
diff --git a/src/core/arrays/tnlStaticArray_impl.h b/src/core/arrays/tnlStaticArray_impl.h
index 08c5606e4f..e2abac44e2 100644
--- a/src/core/arrays/tnlStaticArray_impl.h
+++ b/src/core/arrays/tnlStaticArray_impl.h
@@ -203,15 +203,25 @@ void tnlStaticArray< Size, Element >::sort()
             Swap( data[ i ], data[ i+1 ] );
 }
 
+template< int Size, typename Element >
+ostream& tnlStaticArray< Size, Element >::write( ostream& str, const char* separator ) const
+{
+   for( int i = 0; i < Size - 1; i++ )
+      str << data[ i ] << separator;
+   str << data[ Size - 1 ];
+   return str;
+}
+
 
 template< int Size, typename Element >
 ostream& operator << ( ostream& str, const tnlStaticArray< Size, Element >& a )
 {
-   for( int i = 0; i < Size - 1; i ++ )
+   a.write( str, "," );
+   /*for( int i = 0; i < Size - 1; i ++ )
    {
       str << a[ i ] << ", ";
    }
-   str << a[ Size - 1 ];
+   str << a[ Size - 1 ];*/
    return str;
 };
 
diff --git a/src/mesh/CMakeLists.txt b/src/mesh/CMakeLists.txt
index e8ce9f1ba6..5c0ebc1e85 100755
--- a/src/mesh/CMakeLists.txt
+++ b/src/mesh/CMakeLists.txt
@@ -11,6 +11,7 @@ SET( headers tnlGrid.h
              tnlGrid3D.h
              tnlGrid3D_impl.h
              tnlDummyMesh.h
+             tnlDimensionsTag.h
              tnlGnuplotWriter.h
              tnlMesh.h
              tnlMeshEntity.h
diff --git a/src/mesh/config/CMakeLists.txt b/src/mesh/config/CMakeLists.txt
index 5da9330921..db2417314f 100755
--- a/src/mesh/config/CMakeLists.txt
+++ b/src/mesh/config/CMakeLists.txt
@@ -1,3 +1,4 @@
-SET( headers tnlMeshConfigBase.h )
+SET( headers tnlMeshConfigBase.h
+             tnlMeshConfigValidator.h )
 
 INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/mesh/config )
\ No newline at end of file
diff --git a/src/mesh/config/tnlMeshConfigBase.h b/src/mesh/config/tnlMeshConfigBase.h
index 0bbe28780d..d27d5183fb 100644
--- a/src/mesh/config/tnlMeshConfigBase.h
+++ b/src/mesh/config/tnlMeshConfigBase.h
@@ -32,22 +32,65 @@ template< typename Cell,
           typename Id = void >
 struct tnlMeshConfigBase
 {
-   typedef Cell        CellTag;
+   typedef Cell        CellType;
    typedef Real        RealType;
    typedef GlobalIndex GlobalIndexType;
    typedef LocalIndex  LocalIndexType;
    typedef Id          IdType;
 
-   enum { worldDimensions = WorldDimensions };
+   static const int worldDimensions = WorldDimensions;
+   static const int cellDimensions = Cell::dimensions;
 
    static tnlString getType()
    {
       return tnlString( "tnlMeshConfigBase< >");
    };
+   
+   /****
+    * Storage of mesh entities.
+    */
+	static constexpr bool entityStorage( int dimensions )
+	{
+      /****
+       *  Vertices and cells must always be stored
+       */ 
+		return ( dimensions == 0 || dimensions == cellDimensions );
+	}
+   
+   /****
+    *  Storage of subentities of mesh entities
+    */
+	template< typename MeshEntity >
+	static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions )
+	{
+      /****
+       *  Vertices must always be stored
+       */
+		return ( SubentityDimensions == 0 );
+	}
 
-   tnlStaticAssert( WorldDimensions >= Cell::dimensions, "The number of the cell dimensions cannot be larger than the world dimension." );
+	/****
+    * Storage of subentity orientations of mesh entities
+    */
+	template< typename MeshEntity >
+	static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions )
+	{
+		return false;
+	}
+
+	/****
+    *  Storage of superentities of mesh entities
+    */
+	template< typename MeshEntity >
+	static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions )
+	{
+		return false;
+	}
+   
+   static_assert( WorldDimensions >= Cell::dimensions, "The number of the cell dimensions cannot be larger than the world dimension." );
 };
 
+#ifdef UNDEF
 /****
  * Explicit storage of all mesh entities by default.
  * To disable it, write your own specialization with given
@@ -85,4 +128,6 @@ struct tnlMeshSuperentityStorage
    enum { enabled = false };
 };
 
+#endif
+
 #endif /* TNLMESHCONFIGBASE_H_ */
diff --git a/src/mesh/config/tnlMeshConfigValidator.h b/src/mesh/config/tnlMeshConfigValidator.h
new file mode 100644
index 0000000000..29606e2225
--- /dev/null
+++ b/src/mesh/config/tnlMeshConfigValidator.h
@@ -0,0 +1,105 @@
+/***************************************************************************
+                          tnlMeshConfigValidator.h  -  description
+                             -------------------
+    begin                : Aug 14, 2015
+    copyright            : (C) 2015 by Tomas Oberhuber et al.
+    email                : tomas.oberhuber@fjfi.cvut.cz
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef TNLMESHCONFIGVALIDATOR_H
+#define	TNLMESHCONFIGVALIDATOR_H
+
+#include <core/tnlAssert.h>
+
+/*
+template< typename MeshConfig,
+          typename MeshEntity,
+          int dimensions >
+class tnlMeshConfigValidatorSubtopologyLayer :
+   public tnlMeshConfigValidatorSubtopologyLayer< MeshConfig, MeshEntity, dimensions - 1 >
+{
+   static_assert( ! MeshConfig::subentityStorage( MeshEntity(), dimensions ) || 
+                    MeshConfig::entityStorage( MeshEntity::dimensions ), "entities of which subentities are stored must be stored" );
+   static_assert( ! MeshConfig::subentityStorage( MeshEntity(), dimensions ) ||
+                    MeshConfig::entityStorage( dimensions ), "entities that are stored as subentities must be stored");
+   // TODO: fix this 
+   //static_assert( ! MeshConfig::subentityOrientationStorage(TTopology(), TDim()) || TConfig::subentityStorage(TTopology(), TDim()), "orientation can be stored only for subentities that are stored");
+};
+
+template< typename MeshConfig,
+          typename MeshEntity >
+class tnlMeshConfigValidatorSubtopologyLayer< MeshConfig, MeshEntity, 0 >
+{
+   static_assert( ! MeshConfig::subentityStorage( MeshEntity(), 0 ) ||
+                    MeshConfig::entityStorage( 0 ), "entities that are stored as subentities must be stored" );
+   static_assert( ! MeshConfig::subentityOrientationStorage( MeshEntity(), 0 ), "storage of vertex orientation does not make sense" );
+};
+
+
+template< typename MeshConfig,
+          typename MeshEntity,
+          int dimensions >
+class tnlMeshConfigValidatorSupertopologyLayer :
+ public tnlMeshConfigValidatorSupertopologyLayer< MeshConfig, MeshEntity, dimensions - 1 >
+{
+   static_assert( ! MeshConfig::superentityStorage( MeshEntity(), 0 ) || MeshConfig::entityStorage( MeshEntity::dimensions ), "entities of which superentities are stored must be stored");
+   static_assert( ! MeshConfig::superentityStorage( MeshEntity(), 0 ) || MeshConfig::entityStorage( dimensions ), "entities that are stored as superentities must be stored");
+};
+
+template< typename MeshConfig,
+          typename MeshEntity >
+class tnlMeshConfigValidatorSupertopologyLayer< MeshConfig, MeshEntity, MeshEntity::dimensions >
+{};
+*/
+
+template< typename MeshConfig, int dimensions >
+class tnlMeshConfigValidatorLayer :
+ public tnlMeshConfigValidatorLayer< MeshConfig, dimensions - 1 >//,
+ //public ConfigValidatorSubtopologyLayer< MeshConfig, typename Subtopology<typename TConfig::TCellTopology, TDim::VALUE>::TTopology, typename TDim::Decrement>,
+ //public ConfigValidatorSupertopologyLayer< MeshConfig, typename Subtopology<typename TConfig::TCellTopology, TDim::VALUE>::TTopology, Dim<TConfig::TCellTopology::DIMENSION>>
+{
+	//typedef typename Subtopology<typename TConfig::TCellTopology, TDim::VALUE>::TTopology TTopology;
+
+//	static_assert( ! MeshConfig::entityStorage( dimensions ) || MeshConfig::subentityStorage( TTopology(), Dim<0>()), "subvertices of all stored entities must be stored");
+};
+
+template< typename MeshConfig >
+class tnlMeshConfigValidatorLayer< MeshConfig, 0 >
+{
+};
+
+template< typename MeshConfig >
+class tnlMeshConfigValidatorLayerCell :
+   public tnlMeshConfigValidatorLayer< MeshConfig, MeshConfig::CellType::dimensions - 1 >//,
+//   public tnlMeshConfigValidatorSubtopologyLayer< MeshConfig, typename MeshConfig::CellType, MeshConfig::CellType::dimensions - 1 >
+{
+	typedef typename MeshConfig::CellType    CellType;
+ 	static const int dimensions =  CellType::dimensions;
+
+	static_assert( !MeshConfig::entityStorage( dimensions ) || MeshConfig::subentityStorage( CellType(), 0 ), "subvertices of all stored entities must be stored");
+};
+
+template<typename MeshConfig >
+class tnlMeshConfigValidator : public tnlMeshConfigValidatorLayerCell< MeshConfig >
+{
+	static const int meshDimensions = MeshConfig::CellType::dimensions;
+
+	static_assert(1 <= meshDimensions, "zero dimensional meshes are not supported");
+	static_assert( meshDimensions <= MeshConfig::worldDimensions, "world dimension must not be less than mesh dimension");
+
+	static_assert( MeshConfig::entityStorage( 0 ), "mesh vertices must be stored");
+	static_assert( MeshConfig::entityStorage( meshDimensions ), "mesh cells must be stored");
+};
+
+
+#endif	/* TNLMESHCONFIGVALIDATOR_H */
+
diff --git a/src/mesh/layers/tnlMeshStorageLayer.h b/src/mesh/layers/tnlMeshStorageLayer.h
index 405a9799de..f09ba30a1a 100644
--- a/src/mesh/layers/tnlMeshStorageLayer.h
+++ b/src/mesh/layers/tnlMeshStorageLayer.h
@@ -23,38 +23,38 @@
 #include <mesh/traits/tnlMeshEntitiesTraits.h>
 #include <mesh/traits/tnlStorageTraits.h>
 
-template< typename DimensionsTraits,
+template< typename DimensionsTag,
           typename Device,
           typename ConfigTag,
           typename EntityStorageTag = typename tnlMeshEntitiesTraits< ConfigTag,
-                                                                      DimensionsTraits >::EntityStorageTag >
+                                                                      DimensionsTag >::EntityStorageTag >
 class tnlMeshStorageTag;
 
 template< typename ConfigTag,
-          typename DimensionsTraits,
+          typename DimensionsTag,
           typename EntityStorageTag = typename tnlMeshEntitiesTraits< ConfigTag,
-                                                                      DimensionsTraits >::EntityStorageTag >
+                                                                      DimensionsTag >::EntityStorageTag >
 class tnlMeshStorageLayer;
 
 
 template< typename ConfigTag >
 class tnlMeshStorageLayers
    : public tnlMeshStorageLayer< ConfigTag,
-                                 typename tnlMeshTraits< ConfigTag >::DimensionsTraits >
+                                 typename tnlMeshTraits< ConfigTag >::DimensionsTag >
 {};
 
 
 template< typename ConfigTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshStorageLayer< ConfigTag,
-                           DimensionsTraits,
+                           DimensionsTag,
                            tnlStorageTraits< true > >
-   : public tnlMeshStorageLayer< ConfigTag, typename DimensionsTraits::Previous >
+   : public tnlMeshStorageLayer< ConfigTag, typename DimensionsTag::Decrement >
 {
    typedef tnlMeshStorageLayer< ConfigTag,
-                                typename DimensionsTraits::Previous >   BaseType;
+                                typename DimensionsTag::Decrement >   BaseType;
 
-   typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >         Tag;
+   typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTag >         Tag;
    typedef typename Tag::ContainerType                                  ContainerType;
    typedef typename Tag::SharedContainerType                            SharedContainerType;
    typedef typename ContainerType::IndexType                            GlobalIndexType;
@@ -70,16 +70,16 @@ class tnlMeshStorageLayer< ConfigTag,
 
    tnlMeshStorageLayer()
    {
-      this->entities.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::entities" );
-      this->sharedEntities.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::sharedEntities" );
+      this->entities.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::entities" );
+      this->sharedEntities.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::sharedEntities" );
    }
 
    /*~tnlMeshStorageLayer()
    {
-      cout << "Destroying mesh storage layer with " << DimensionsTraits::value << " dimensions and " << this->entities.getSize() << " entities." << endl;
+      cout << "Destroying mesh storage layer with " << DimensionsTag::value << " dimensions and " << this->entities.getSize() << " entities." << endl;
    }*/
 
-   bool setNumberOfEntities( DimensionsTraits, const GlobalIndexType size )
+   bool setNumberOfEntities( DimensionsTag, const GlobalIndexType size )
    {
       if( ! this->entities.setSize( size ) )
          return false;
@@ -87,36 +87,36 @@ class tnlMeshStorageLayer< ConfigTag,
       return true;
    }
 
-   GlobalIndexType getNumberOfEntities( DimensionsTraits ) const
+   GlobalIndexType getNumberOfEntities( DimensionsTag ) const
    {
       return this->entities.getSize();
    }
 
-   void setEntity( DimensionsTraits,
+   void setEntity( DimensionsTag,
                    const GlobalIndexType entityIndex,
                    const EntityType& entity ) const
    {
       this->entities.setElement( entityIndex, entity );
    }
 
-   EntityType& getEntity( DimensionsTraits,
+   EntityType& getEntity( DimensionsTag,
                           const GlobalIndexType entityIndex )
    {
       return this->entities[ entityIndex ];
    }
 
-   const EntityType& getEntity( DimensionsTraits,
+   const EntityType& getEntity( DimensionsTag,
                                 const GlobalIndexType entityIndex ) const
    {
       return this->entities[ entityIndex ];
    }
 
-   SharedContainerType& getEntities( DimensionsTraits )
+   SharedContainerType& getEntities( DimensionsTag )
    {
       return this->sharedEntities;
    }
 
-   const SharedContainerType& getEntities( DimensionsTraits ) const
+   const SharedContainerType& getEntities( DimensionsTag ) const
    {
       return this->sharedEntities;
    }
@@ -126,7 +126,7 @@ class tnlMeshStorageLayer< ConfigTag,
       if( ! BaseType::save( file ) ||
           ! this->entities.save( file ) )
       {
-         cerr << "Saving of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl;
+         cerr << "Saving of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl;
          return false;
       }
       return true;
@@ -134,11 +134,11 @@ class tnlMeshStorageLayer< ConfigTag,
 
    bool load( tnlFile& file )
    {
-      //cout << "Loading mesh layer with dimensions " << DimensionsTraits::value << endl;
+      //cout << "Loading mesh layer with dimensions " << DimensionsTag::value << endl;
       if( ! BaseType::load( file ) ||
           ! this->entities.load( file ) )
       {
-         cerr << "Loading of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl;
+         cerr << "Loading of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl;
          return false;
       }
       this->sharedEntities.bind( this->entities );
@@ -148,7 +148,7 @@ class tnlMeshStorageLayer< ConfigTag,
    void print( ostream& str ) const
    {
       BaseType::print( str );
-      str << "The entities with " << DimensionsTraits::value << " dimensions are: " << endl;
+      str << "The entities with " << DimensionsTag::value << " dimensions are: " << endl;
       for( GlobalIndexType i = 0; i < entities.getSize();i ++ )
       {
          str << i << " ";
@@ -170,24 +170,24 @@ class tnlMeshStorageLayer< ConfigTag,
 };
 
 template< typename ConfigTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshStorageLayer< ConfigTag,
-                           DimensionsTraits,
+                           DimensionsTag,
                            tnlStorageTraits< false > >
    : public tnlMeshStorageLayer< ConfigTag,
-                                 typename DimensionsTraits::Previous >
+                                 typename DimensionsTag::Decrement >
 {
 };
 
 template< typename ConfigTag >
 class tnlMeshStorageLayer< ConfigTag,
-                           tnlDimensionsTraits< 0 >,
+                           tnlDimensionsTag< 0 >,
                            tnlStorageTraits< true > >
 {
-   typedef tnlDimensionsTraits< 0 >                        DimensionsTraits;
+   typedef tnlDimensionsTag< 0 >                        DimensionsTag;
 
    typedef tnlMeshEntitiesTraits< ConfigTag,
-                                  DimensionsTraits >       Tag;
+                                  DimensionsTag >       Tag;
    typedef typename Tag::ContainerType                     ContainerType;
    typedef typename Tag::SharedContainerType               SharedContainerType;
    typedef typename ContainerType::IndexType               GlobalIndexType;
@@ -198,13 +198,13 @@ class tnlMeshStorageLayer< ConfigTag,
 
    tnlMeshStorageLayer()
    {
-      this->vertices.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::vertices" );
-      this->sharedVertices.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::sharedVertices" );
+      this->vertices.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::vertices" );
+      this->sharedVertices.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::sharedVertices" );
    }
 
    /*~tnlMeshStorageLayer()
    {
-        cout << "mesh storage layer: dimensions = " << DimensionsTraits::value << " entities = " << this->vertices.getSize() << endl;
+        cout << "mesh storage layer: dimensions = " << DimensionsTag::value << " entities = " << this->vertices.getSize() << endl;
    }*/
 
 
@@ -248,43 +248,43 @@ class tnlMeshStorageLayer< ConfigTag,
     * This is only for the completeness and compatibility
     * with higher dimensions entities storage layers.
     */
-   bool setNumberOfEntities( DimensionsTraits,
+   bool setNumberOfEntities( DimensionsTag,
                              const GlobalIndexType size )
    {
       return this->vertices.setSize( size );
    }
 
-   GlobalIndexType getNumberOfEntities( DimensionsTraits ) const
+   GlobalIndexType getNumberOfEntities( DimensionsTag ) const
    {
       return this->vertices.getSize();
    }
 
-   void setEntity( DimensionsTraits,
+   void setEntity( DimensionsTag,
                    const GlobalIndexType entityIndex,
                    const VertexType& entity ) const
    {
       this->vertices.setElement( entityIndex, entity );
    }
 
-   VertexType& getEntity( DimensionsTraits,
+   VertexType& getEntity( DimensionsTag,
                           const GlobalIndexType entityIndex )
    {
       return this->vertices[ entityIndex ];
    }
 
    
-   const VertexType& getEntity( DimensionsTraits,
+   const VertexType& getEntity( DimensionsTag,
                                 const GlobalIndexType entityIndex ) const
    {
       return this->vertices.getElement( entityIndex );
    }
 
-   SharedContainerType& getEntities( DimensionsTraits )
+   SharedContainerType& getEntities( DimensionsTag )
    {
       return this->sharedVertices;
    }
 
-   const SharedContainerType& getEntities( DimensionsTraits ) const
+   const SharedContainerType& getEntities( DimensionsTag ) const
    {
       return this->sharedVertices;
    }
@@ -293,7 +293,7 @@ class tnlMeshStorageLayer< ConfigTag,
    {
       if( ! this->vertices.save( file ) )
       {
-         cerr << "Saving of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl;
+         cerr << "Saving of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl;
          return false;
       }
       return true;
@@ -303,7 +303,7 @@ class tnlMeshStorageLayer< ConfigTag,
    {
       if( ! this->vertices.load( file ) )
       {
-         cerr << "Loading of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl;
+         cerr << "Loading of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl;
          return false;
       }
       this->sharedVertices.bind( this->vertices );
@@ -336,7 +336,7 @@ class tnlMeshStorageLayer< ConfigTag,
  */
 template< typename ConfigTag >
 class tnlMeshStorageLayer< ConfigTag,
-                           tnlDimensionsTraits< 0 >,
+                           tnlDimensionsTag< 0 >,
                            tnlStorageTraits< false > >
 {
    protected:
diff --git a/src/mesh/layers/tnlMeshSubentityStorageLayer.h b/src/mesh/layers/tnlMeshSubentityStorageLayer.h
index ce7e54c82e..a8ff2ac889 100644
--- a/src/mesh/layers/tnlMeshSubentityStorageLayer.h
+++ b/src/mesh/layers/tnlMeshSubentityStorageLayer.h
@@ -19,14 +19,14 @@
 #define TNLMESHSUBENTITYSTORAGELAYER_H_
 
 #include <core/tnlFile.h>
-#include <mesh/traits/tnlDimensionsTraits.h>
+#include <mesh/tnlDimensionsTag.h>
 #include <mesh/traits/tnlStorageTraits.h>
 #include <mesh/traits/tnlMeshSubentitiesTraits.h>
 
 template< typename ConfigTag,
           typename EntityTag,
           typename DimensionTraits,
-          typename SubentityStorageTag =
+          typename SubentityStorageTag = 
                    typename tnlMeshSubentitiesTraits< ConfigTag,
                                                       EntityTag,
                                                       DimensionTraits >::SubentityStorageTag >
@@ -38,29 +38,29 @@ template< typename ConfigTag,
 class tnlMeshSubentityStorageLayers
    : public tnlMeshSubentityStorageLayer< ConfigTag,
                                           EntityTag,
-                                          tnlDimensionsTraits< EntityTag::dimensions - 1 > >
+                                          tnlDimensionsTag< EntityTag::dimensions - 1 > >
 {
 };
 
 
 template< typename ConfigTag,
           typename EntityTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshSubentityStorageLayer< ConfigTag,
                                     EntityTag,
-                                    DimensionsTraits,
+                                    DimensionsTag,
                                     tnlStorageTraits< true > >
    : public tnlMeshSubentityStorageLayer< ConfigTag,
                                           EntityTag,
-                                          typename DimensionsTraits::Previous >
+                                          typename DimensionsTag::Decrement >
 {
    typedef tnlMeshSubentityStorageLayer< ConfigTag,
                                          EntityTag,
-                                         typename DimensionsTraits::Previous > BaseType;
+                                         typename DimensionsTag::Decrement > BaseType;
 
    typedef tnlMeshSubentitiesTraits< ConfigTag,
                                      EntityTag,
-                                     DimensionsTraits > SubentityTraits;
+                                     DimensionsTag > SubentityTraits;
 
    protected:
 
@@ -79,7 +79,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag,
 
    /*~tnlMeshSubentityStorageLayer()
    {
-      cout << "      Destroying " << this->sharedSubentitiesIndices.getSize() << " subentities with "<< DimensionsTraits::value << " dimensions." << endl;
+      cout << "      Destroying " << this->sharedSubentitiesIndices.getSize() << " subentities with "<< DimensionsTag::value << " dimensions." << endl;
    }*/
 
    tnlMeshSubentityStorageLayer& operator = ( const tnlMeshSubentityStorageLayer& layer )
@@ -94,7 +94,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag,
       if( ! BaseType::save( file ) ||
           ! this->subentitiesIndices.save( file ) )
       {
-         cerr << "Saving of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl;
+         cerr << "Saving of the entity subentities layer with " << DimensionsTag::value << " failed." << endl;
          return false;
       }
       return true;
@@ -105,7 +105,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag,
       if( ! BaseType::load( file ) ||
           ! this->subentitiesIndices.load( file ) )
       {
-         cerr << "Loading of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl;
+         cerr << "Loading of the entity subentities layer with " << DimensionsTag::value << " failed." << endl;
          return false;
       }
       this->sharedSubentitiesIndices.bind( this->subentitiesIndices );
@@ -116,7 +116,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag,
    {
       BaseType::print( str );
       str << endl;
-      str << "\t Subentities with " << DimensionsTraits::value << " dimensions are: " << subentitiesIndices << ".";
+      str << "\t Subentities with " << DimensionsTag::value << " dimensions are: " << subentitiesIndices << ".";
    }
 
    bool operator==( const tnlMeshSubentityStorageLayer& layer  ) const
@@ -135,26 +135,26 @@ class tnlMeshSubentityStorageLayer< ConfigTag,
    /****
     * Define setter/getter for the current level of the subentities
     */
-   void setSubentityIndex( DimensionsTraits,
+   void setSubentityIndex( DimensionsTag,
                            const LocalIndexType localIndex,
                            const GlobalIndexType globalIndex )
    {
       this->subentitiesIndices[ localIndex ] = globalIndex;
    }
 
-   GlobalIndexType getSubentityIndex( DimensionsTraits,
+   GlobalIndexType getSubentityIndex( DimensionsTag,
                                       const LocalIndexType localIndex ) const
    {
       return this->subentitiesIndices[ localIndex ];
    }
 
-   SharedContainerType& getSubentitiesIndices( DimensionsTraits )
+   SharedContainerType& getSubentitiesIndices( DimensionsTag )
    {
       tnlAssert( this->subentitiesIndices.getData() == this->sharedSubentitiesIndices.getData(), );
       return this->sharedSubentitiesIndices;
    }
 
-   const SharedContainerType& getSubentitiesIndices( DimensionsTraits ) const
+   const SharedContainerType& getSubentitiesIndices( DimensionsTag ) const
    {
       tnlAssert( this->subentitiesIndices.getData() == this->sharedSubentitiesIndices.getData(), );
       return this->sharedSubentitiesIndices;
@@ -170,14 +170,14 @@ class tnlMeshSubentityStorageLayer< ConfigTag,
 
 template< typename ConfigTag,
           typename EntityTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshSubentityStorageLayer< ConfigTag,
                                     EntityTag,
-                                    DimensionsTraits,
+                                    DimensionsTag,
                                     tnlStorageTraits< false > >
    : public tnlMeshSubentityStorageLayer< ConfigTag,
                                           EntityTag,
-                                          typename DimensionsTraits::Previous >
+                                          typename DimensionsTag::Decrement >
 {
 };
 
@@ -186,14 +186,14 @@ template< typename ConfigTag,
           typename EntityTag >
 class tnlMeshSubentityStorageLayer< ConfigTag,
                                     EntityTag,
-                                    tnlDimensionsTraits< 0 >,
+                                    tnlDimensionsTag< 0 >,
                                     tnlStorageTraits< true > >
 {
-   typedef tnlDimensionsTraits< 0 >                           DimensionsTraits;
+   typedef tnlDimensionsTag< 0 >                           DimensionsTag;
 
    typedef tnlMeshSubentitiesTraits< ConfigTag,
                                      EntityTag,
-                                     DimensionsTraits > SubentityTraits;
+                                     DimensionsTag > SubentityTraits;
 
    protected:
 
@@ -210,7 +210,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag,
 
    /*~tnlMeshSubentityStorageLayer()
    {
-      cout << "      Destroying " << this->sharedVerticesIndices.getSize() << " subentities with "<< DimensionsTraits::value << " dimensions." << endl;
+      cout << "      Destroying " << this->sharedVerticesIndices.getSize() << " subentities with "<< DimensionsTag::value << " dimensions." << endl;
    }*/
 
 
@@ -224,7 +224,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag,
    {
       if( ! this->verticesIndices.save( file ) )
       {
-         cerr << "Saving of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl;
+         cerr << "Saving of the entity subentities layer with " << DimensionsTag::value << " failed." << endl;
          return false;
       }
       return true;
@@ -234,7 +234,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag,
    {
       if( ! this->verticesIndices.load( file ) )
       {
-         cerr << "Loading of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl;
+         cerr << "Loading of the entity subentities layer with " << DimensionsTag::value << " failed." << endl;
          return false;
       }
       this->sharedVerticesIndices.bind( this->verticesIndices );
@@ -243,7 +243,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag,
 
    void print( ostream& str ) const
    {
-      str << "\t Subentities with " << DimensionsTraits::value << " dimensions are: " << this->verticesIndices << ".";
+      str << "\t Subentities with " << DimensionsTag::value << " dimensions are: " << this->verticesIndices << ".";
    }
 
    bool operator==( const tnlMeshSubentityStorageLayer& layer  ) const
@@ -251,25 +251,25 @@ class tnlMeshSubentityStorageLayer< ConfigTag,
       return ( verticesIndices == layer.verticesIndices );
    }
 
-   GlobalIndexType getSubentityIndex( DimensionsTraits,
+   GlobalIndexType getSubentityIndex( DimensionsTag,
                                       const LocalIndexType localIndex ) const
    {
       return this->verticesIndices[ localIndex ];
    }
-   void setSubentityIndex( DimensionsTraits,
+   void setSubentityIndex( DimensionsTag,
                            const LocalIndexType localIndex,
                            const GlobalIndexType globalIndex )
    {
       this->verticesIndices[ localIndex ] = globalIndex;
    }
 
-   SharedContainerType& getSubentitiesIndices( DimensionsTraits )
+   SharedContainerType& getSubentitiesIndices( DimensionsTag )
    {
       tnlAssert( this->verticesIndices.getData() == this->sharedVerticesIndices.getData(), );
       return this->sharedVerticesIndices;
    }
 
-   const SharedContainerType& getSubentitiesIndices( DimensionsTraits ) const
+   const SharedContainerType& getSubentitiesIndices( DimensionsTag ) const
    {
       tnlAssert( this->verticesIndices.getData() == this->sharedVerticesIndices.getData(), );
       return this->sharedVerticesIndices;
@@ -286,7 +286,7 @@ template< typename ConfigTag,
           typename EntityTag >
 class tnlMeshSubentityStorageLayer< ConfigTag,
                                     EntityTag,
-                                    tnlDimensionsTraits< 0 >,
+                                    tnlDimensionsTag< 0 >,
                                     tnlStorageTraits< false > >
 {
    public:
diff --git a/src/mesh/layers/tnlMeshSuperentityStorageLayer.h b/src/mesh/layers/tnlMeshSuperentityStorageLayer.h
index d7184117c9..7a9046a4af 100644
--- a/src/mesh/layers/tnlMeshSuperentityStorageLayer.h
+++ b/src/mesh/layers/tnlMeshSuperentityStorageLayer.h
@@ -19,18 +19,18 @@
 #define TNLMESHSUPERENTITYSTORAGELAYER_H_
 
 #include <core/tnlFile.h>
-#include <mesh/traits/tnlDimensionsTraits.h>
+#include <mesh/tnlDimensionsTag.h>
 #include <mesh/traits/tnlStorageTraits.h>
 #include <mesh/traits/tnlMeshTraits.h>
 #include <mesh/traits/tnlMeshSuperentitiesTraits.h>
 
 template< typename ConfigTag,
           typename EntityTag,
-          typename DimensionsTraits,
+          typename DimensionsTag,
           typename SuperentityStorageTag =
              typename tnlMeshSuperentitiesTraits< ConfigTag,
                                                   EntityTag,
-                                                  DimensionsTraits >::SuperentityStorageTag >
+                                                  DimensionsTag >::SuperentityStorageTag >
 class tnlMeshSuperentityStorageLayer;
 
 template< typename ConfigTag,
@@ -38,28 +38,28 @@ template< typename ConfigTag,
 class tnlMeshSuperentityStorageLayers
    : public tnlMeshSuperentityStorageLayer< ConfigTag,
                                             EntityTag,
-                                            typename tnlMeshTraits< ConfigTag >::DimensionsTraits >
+                                            typename tnlMeshTraits< ConfigTag >::DimensionsTag >
 {
 };
 
 template< typename ConfigTag,
           typename EntityTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshSuperentityStorageLayer< ConfigTag,
                                       EntityTag,
-                                      DimensionsTraits,
+                                      DimensionsTag,
                                       tnlStorageTraits< true > >
    : public tnlMeshSuperentityStorageLayer< ConfigTag,
                                             EntityTag,
-                                            typename DimensionsTraits::Previous >
+                                            typename DimensionsTag::Decrement >
 {
    typedef
       tnlMeshSuperentityStorageLayer< ConfigTag,
                                       EntityTag,
-                                      typename DimensionsTraits::Previous >  BaseType;
+                                      typename DimensionsTag::Decrement >  BaseType;
 
    typedef
-      tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, DimensionsTraits >          SuperentityTag;
+      tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, DimensionsTag >          SuperentityTag;
 
    protected:
 
@@ -79,13 +79,13 @@ class tnlMeshSuperentityStorageLayer< ConfigTag,
 
     tnlMeshSuperentityStorageLayer()
     {
-       this->superentitiesIndices.setName( tnlString( "tnlMeshSuperentityStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::superentitiesIndices" );
-       this->sharedSuperentitiesIndices.setName( tnlString( "tnlMeshSuperentityStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::sharedSuperentitiesIndices" );
+       this->superentitiesIndices.setName( tnlString( "tnlMeshSuperentityStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::superentitiesIndices" );
+       this->sharedSuperentitiesIndices.setName( tnlString( "tnlMeshSuperentityStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::sharedSuperentitiesIndices" );
     }
 
     /*~tnlMeshSuperentityStorageLayer()
     {
-       cerr << "      Destroying " << this->superentitiesIndices.getSize() << " superentities with "<< DimensionsTraits::value << " dimensions." << endl;
+       cerr << "      Destroying " << this->superentitiesIndices.getSize() << " superentities with "<< DimensionsTag::value << " dimensions." << endl;
        cerr << "         this->superentitiesIndices.getName() = " << this->superentitiesIndices.getName() << endl;
        cerr << "         this->sharedSuperentitiesIndices.getName() = " << this->sharedSuperentitiesIndices.getName() << endl;
     }*/
@@ -101,7 +101,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag,
     /****
      * Define setter/getter for the current level of the superentities
      */
-    bool setNumberOfSuperentities( DimensionsTraits,
+    bool setNumberOfSuperentities( DimensionsTag,
                                    const LocalIndexType size )
     {
        if( ! this->superentitiesIndices.setSize( size ) )
@@ -111,30 +111,30 @@ class tnlMeshSuperentityStorageLayer< ConfigTag,
        return true;
     }
 
-    LocalIndexType getNumberOfSuperentities( DimensionsTraits ) const
+    LocalIndexType getNumberOfSuperentities( DimensionsTag ) const
     {
        return this->superentitiesIndices.getSize();
     }
 
-    void setSuperentityIndex( DimensionsTraits,
+    void setSuperentityIndex( DimensionsTag,
                               const LocalIndexType localIndex,
                               const GlobalIndexType globalIndex )
     {
        this->superentitiesIndices[ localIndex ] = globalIndex;
     }
 
-    GlobalIndexType getSuperentityIndex( DimensionsTraits,
+    GlobalIndexType getSuperentityIndex( DimensionsTag,
                                          const LocalIndexType localIndex ) const
     {
        return this->superentitiesIndices[ localIndex ];
     }
 
-    SharedContainerType& getSuperentitiesIndices( DimensionsTraits )
+    SharedContainerType& getSuperentitiesIndices( DimensionsTag )
     {
        return this->sharedSuperentitiesIndices;
     }
 
-    const SharedContainerType& getSuperentitiesIndices( DimensionsTraits ) const
+    const SharedContainerType& getSuperentitiesIndices( DimensionsTag ) const
     {
        return this->sharedSuperentitiesIndices;
     }
@@ -144,7 +144,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag,
        if( ! BaseType::save( file ) ||
            ! this->superentitiesIndices.save( file ) )
        {
-          //cerr << "Saving of the entity superentities layer with " << DimensionsTraits::value << " failed." << endl;
+          //cerr << "Saving of the entity superentities layer with " << DimensionsTag::value << " failed." << endl;
           return false;
        }
        return true;
@@ -155,7 +155,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag,
        if( ! BaseType::load( file ) ||
            ! this->superentitiesIndices.load( file ) )
        {
-          //cerr << "Loading of the entity superentities layer with " << DimensionsTraits::value << " failed." << endl;
+          //cerr << "Loading of the entity superentities layer with " << DimensionsTag::value << " failed." << endl;
           return false;
        }
        return true;
@@ -164,7 +164,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag,
     void print( ostream& str ) const
     {
        BaseType::print( str );
-       str << endl << "\t Superentities with " << DimensionsTraits::value << " dimensions are: " << this->superentitiesIndices << ".";
+       str << endl << "\t Superentities with " << DimensionsTag::value << " dimensions are: " << this->superentitiesIndices << ".";
     }
 
     bool operator==( const tnlMeshSuperentityStorageLayer& layer  ) const
@@ -182,14 +182,14 @@ class tnlMeshSuperentityStorageLayer< ConfigTag,
 
 template< typename ConfigTag,
           typename EntityTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshSuperentityStorageLayer< ConfigTag,
                                       EntityTag,
-                                      DimensionsTraits,
+                                      DimensionsTag,
                                       tnlStorageTraits< false > >
    : public tnlMeshSuperentityStorageLayer< ConfigTag,
                                             EntityTag,
-                                            typename DimensionsTraits::Previous >
+                                            typename DimensionsTag::Decrement >
 {
    public:
 
@@ -199,18 +199,18 @@ template< typename ConfigTag,
           typename EntityTag >
 class tnlMeshSuperentityStorageLayer< ConfigTag,
                                       EntityTag,
-                                      tnlDimensionsTraits< EntityTag::dimensions >,
+                                      tnlDimensionsTag< EntityTag::dimensions >,
                                       tnlStorageTraits< false > >
 {
-   typedef tnlDimensionsTraits< EntityTag::dimensions >        DimensionsTraits;
+   typedef tnlDimensionsTag< EntityTag::dimensions >        DimensionsTag;
 
    typedef tnlMeshSuperentitiesTraits< ConfigTag,
                                        EntityTag,
-                                       DimensionsTraits >      SuperentityTag;
+                                       DimensionsTag >      SuperentityTag;
 
    typedef tnlMeshSuperentityStorageLayer< ConfigTag,
                                            EntityTag,
-                                           DimensionsTraits,
+                                           DimensionsTag,
                                            tnlStorageTraits< false > > ThisType;
 
    protected:
@@ -222,12 +222,12 @@ class tnlMeshSuperentityStorageLayer< ConfigTag,
    /****
     * These methods are due to 'using BaseType::...;' in the derived classes.
     */
-   bool setNumberOfSuperentities( DimensionsTraits,
+   bool setNumberOfSuperentities( DimensionsTag,
                                    const LocalIndexType size );
-   LocalIndexType getNumberOfSuperentities( DimensionsTraits ) const;
-   GlobalIndexType getSuperentityIndex( DimensionsTraits,
+   LocalIndexType getNumberOfSuperentities( DimensionsTag ) const;
+   GlobalIndexType getSuperentityIndex( DimensionsTag,
                                         const LocalIndexType localIndex ){}
-   void setSuperentityIndex( DimensionsTraits,
+   void setSuperentityIndex( DimensionsTag,
                              const LocalIndexType localIndex,
                              const GlobalIndexType globalIndex ) {}
 
@@ -258,17 +258,17 @@ template< typename ConfigTag,
           typename EntityTag >
 class tnlMeshSuperentityStorageLayer< ConfigTag,
                                       EntityTag,
-                                      tnlDimensionsTraits< EntityTag::dimensions >,
+                                      tnlDimensionsTag< EntityTag::dimensions >,
                                       tnlStorageTraits< true > >
 {
-   typedef tnlDimensionsTraits< EntityTag::dimensions >        DimensionsTraits;
+   typedef tnlDimensionsTag< EntityTag::dimensions >        DimensionsTag;
 
    typedef tnlMeshSuperentitiesTraits< ConfigTag,
                                        EntityTag,
-                                       DimensionsTraits >      SuperentityTag;
+                                       DimensionsTag >      SuperentityTag;
    typedef tnlMeshSuperentityStorageLayer< ConfigTag,
                                            EntityTag,
-                                           DimensionsTraits,
+                                           DimensionsTag,
                                            tnlStorageTraits< true > > ThisType;
 
    protected:
@@ -280,12 +280,12 @@ class tnlMeshSuperentityStorageLayer< ConfigTag,
    /****
     * These methods are due to 'using BaseType::...;' in the derived classes.
     */
-   bool setNumberOfSuperentities( DimensionsTraits,
+   bool setNumberOfSuperentities( DimensionsTag,
                                    const LocalIndexType size );
-   LocalIndexType getNumberOfSuperentities( DimensionsTraits ) const;
-   GlobalIndexType getSuperentityIndex( DimensionsTraits,
+   LocalIndexType getNumberOfSuperentities( DimensionsTag ) const;
+   GlobalIndexType getSuperentityIndex( DimensionsTag,
                                         const LocalIndexType localIndex ){}
-   void setSuperentityIndex( DimensionsTraits,
+   void setSuperentityIndex( DimensionsTag,
                              const LocalIndexType localIndex,
                              const GlobalIndexType globalIndex ) {}
 
diff --git a/src/mesh/traits/tnlDimensionsTraits.h b/src/mesh/tnlDimensionsTag.h
similarity index 71%
rename from src/mesh/traits/tnlDimensionsTraits.h
rename to src/mesh/tnlDimensionsTag.h
index 25bfbc5db6..852c0f6ae9 100644
--- a/src/mesh/traits/tnlDimensionsTraits.h
+++ b/src/mesh/tnlDimensionsTag.h
@@ -1,5 +1,5 @@
 /***************************************************************************
-                          tnlDimensionsTraits.h  -  description
+                          tnlDimensionsTag.h  -  description
                              -------------------
     begin                : Feb 11, 2014
     copyright            : (C) 2014 by Tomas Oberhuber
@@ -15,28 +15,29 @@
  *                                                                         *
  ***************************************************************************/
 
-#ifndef TNLDIMENSIONSTRAITS_H_
-#define TNLDIMENSIONSTRAITS_H_
+#ifndef TNLDIMENSIONSTAG_H_
+#define TNLDIMENSIONSTAG_H_
 
 #include <core/tnlAssert.h>
 
 template< int Dimensions >
-class tnlDimensionsTraits
+class tnlDimensionsTag
 {
    public:
 
-   enum { value = Dimensions };
+      static const int value = Dimensions;
 
-   typedef tnlDimensionsTraits< Dimensions - 1 > Previous;
+      typedef tnlDimensionsTag< Dimensions - 1 > Decrement;
 
-   tnlStaticAssert( value >= 0, "The value of the dimensions cannot be negative." );
+      tnlStaticAssert( value >= 0, "The value of the dimensions cannot be negative." );
 };
 
 template<>
-class tnlDimensionsTraits< 0 >
+class tnlDimensionsTag< 0 >
 {
    public:
-   enum { value = 0 };
+   
+      static const int value = 0;
 };
 
-#endif /* TNLDIMENSIONSTRAITS_H_ */
+#endif /* TNLDIMENSIONSTAG_H_ */
diff --git a/src/mesh/tnlMesh.h b/src/mesh/tnlMesh.h
index 6455c7d03e..449fc8f24a 100644
--- a/src/mesh/tnlMesh.h
+++ b/src/mesh/tnlMesh.h
@@ -21,17 +21,18 @@
 #include <core/tnlObject.h>
 #include <mesh/tnlMeshEntity.h>
 #include <mesh/layers/tnlMeshStorageLayer.h>
+#include <mesh/config/tnlMeshConfigValidator.h>
 
-template< typename ConfigTag >
+template< typename MeshConfig >
 class tnlMesh : public tnlObject,
-                public tnlMeshStorageLayers< ConfigTag >
+                public tnlMeshStorageLayers< MeshConfig >
 {
-   typedef tnlMeshStorageLayers< ConfigTag >                BaseType;
+   typedef tnlMeshStorageLayers< MeshConfig >                BaseType;
 
    public:
-   typedef ConfigTag                                        Config;
-   typedef typename tnlMeshTraits< ConfigTag >::PointType   PointType;
-   enum { dimensions = tnlMeshTraits< ConfigTag >::meshDimensions };
+   typedef MeshConfig                                        Config;
+   typedef typename tnlMeshTraits< MeshConfig >::PointType   PointType;
+   enum { dimensions = tnlMeshTraits< MeshConfig >::meshDimensions };
 
    /*~tnlMesh()
    {
@@ -40,7 +41,7 @@ class tnlMesh : public tnlObject,
 
    static tnlString getType()
    {
-      return tnlString( "tnlMesh< ") + ConfigTag::getType() + " >";
+      return tnlString( "tnlMesh< ") + MeshConfig::getType() + " >";
    }
 
    virtual tnlString getTypeVirtual() const
@@ -76,15 +77,16 @@ class tnlMesh : public tnlObject,
    template< int Dimensions >
    struct EntitiesTraits
    {
-      typedef tnlDimensionsTraits< Dimensions >                       DimensionsTraits;
-      typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >    MeshEntitiesTraits;
+      typedef tnlDimensionsTag< Dimensions >                       DimensionsTag;
+      typedef tnlMeshEntitiesTraits< MeshConfig, DimensionsTag >    MeshEntitiesTraits;
       typedef typename MeshEntitiesTraits::Type                       Type;
       typedef typename MeshEntitiesTraits::ContainerType              ContainerType;
       typedef typename MeshEntitiesTraits::SharedContainerType        SharedContainerType;
       typedef typename ContainerType::IndexType                       GlobalIndexType;
       typedef typename ContainerType::ElementType                     EntityType;
-      enum { available = tnlMeshEntityStorage< ConfigTag, Dimensions >::enabled };
+      static const bool available = MeshConfig::entityStorage( Dimensions );
    };
+   typedef EntitiesTraits< dimensions > CellTraits;
 
    using BaseType::setNumberOfVertices;
    using BaseType::getNumberOfVertices;
@@ -100,74 +102,74 @@ class tnlMesh : public tnlObject,
    template< int Dimensions >
    bool setNumberOfEntities( typename EntitiesTraits< Dimensions >::GlobalIndexType size )
    {
-      return BaseType::setNumberOfEntities( tnlDimensionsTraits< Dimensions >(), size );
+      return BaseType::setNumberOfEntities( tnlDimensionsTag< Dimensions >(), size );
    }
 
    template< int Dimensions >
    typename EntitiesTraits< Dimensions >::GlobalIndexType getNumberOfEntities() const
    {
-      return BaseType::getNumberOfEntities( tnlDimensionsTraits< Dimensions >() );
+      return BaseType::getNumberOfEntities( tnlDimensionsTag< Dimensions >() );
    }
 
    bool setNumberOfCells( typename EntitiesTraits< dimensions >::GlobalIndexType size )
    {
-      return BaseType::setNumberOfEntities( tnlDimensionsTraits< dimensions >(), size );
+      return BaseType::setNumberOfEntities( tnlDimensionsTag< dimensions >(), size );
    }
 
    typename EntitiesTraits< dimensions >::GlobalIndexType getNumberOfCells() const
    {
-      return BaseType::getNumberOfEntities( tnlDimensionsTraits< dimensions >() );
+      return BaseType::getNumberOfEntities( tnlDimensionsTag< dimensions >() );
    }
 
    template< int Dimensions >
       typename EntitiesTraits< Dimensions >::EntityType&
          getEntity( const typename EntitiesTraits< Dimensions >::GlobalIndexType entityIndex )
    {
-      return BaseType::getEntity( tnlDimensionsTraits< Dimensions >(), entityIndex );
+      return BaseType::getEntity( tnlDimensionsTag< Dimensions >(), entityIndex );
    }
 
    template< int Dimensions >
       const typename EntitiesTraits< Dimensions >::EntityType&
          getEntity( const typename EntitiesTraits< Dimensions >::GlobalIndexType entityIndex ) const
    {
-      return BaseType::getEntity( tnlDimensionsTraits< Dimensions >(), entityIndex );
+      return BaseType::getEntity( tnlDimensionsTag< Dimensions >(), entityIndex );
    }
 
    template< int Dimensions >
       void setEntity( const typename EntitiesTraits< Dimensions >::GlobalIndexType entityIndex,
                       const typename EntitiesTraits< Dimensions >::EntityType& entity )
    {
-      BaseType::setEntity( tnlDimensionsTraits< Dimensions >(), entityIndex, entity );
+      BaseType::setEntity( tnlDimensionsTag< Dimensions >(), entityIndex, entity );
    }
 
    template< int Dimensions >
    typename EntitiesTraits< Dimensions >::SharedContainerType& getEntities()
    {
-      return BaseType::getEntities( tnlDimensionsTraits< Dimensions >() );
+      return BaseType::getEntities( tnlDimensionsTag< Dimensions >() );
    }
 
    template< int Dimensions >
    const typename EntitiesTraits< Dimensions >::SharedContainerType& getEntities() const
    {
-      return BaseType::getEntities( tnlDimensionsTraits< Dimensions >() );
+      return BaseType::getEntities( tnlDimensionsTag< Dimensions >() );
    }
 
    typename EntitiesTraits< dimensions >::EntityType&
       getCell( const typename EntitiesTraits< dimensions >::GlobalIndexType entityIndex )
    {
-      return BaseType::getEntity( tnlDimensionsTraits< dimensions >(), entityIndex );
+      return BaseType::getEntity( tnlDimensionsTag< dimensions >(), entityIndex );
    }
 
    const typename EntitiesTraits< dimensions >::EntityType&
       getCell( const typename EntitiesTraits< dimensions >::GlobalIndexType entityIndex ) const
    {
-      return BaseType::getEntity( tnlDimensionsTraits< dimensions >(), entityIndex );
+      return BaseType::getEntity( tnlDimensionsTag< dimensions >(), entityIndex );
    }
 
    void setCell( const typename EntitiesTraits< dimensions >::GlobalIndexType entityIndex,
                  const typename EntitiesTraits< dimensions >::EntityType& entity )
    {
-      BaseType::setEntity( tnlDimensionsTraits< dimensions >(), entityIndex, entity );
+      BaseType::setEntity( tnlDimensionsTag< dimensions >(), entityIndex, entity );
    }
 
    void print( ostream& str ) const
@@ -184,9 +186,7 @@ class tnlMesh : public tnlObject,
 
    void init();
 
-   tnlStaticAssert( dimensions > 0, "The mesh dimesnions must be greater than 0." );
-   tnlStaticAssert( EntitiesTraits< 0 >::available, "Vertices must always be stored" );
-   tnlStaticAssert( EntitiesTraits< dimensions >::available, "Cells must always be stored" );
+   tnlMeshConfigValidator< MeshConfig > configValidator;
 };
 
 
diff --git a/src/mesh/tnlMeshEntity.h b/src/mesh/tnlMeshEntity.h
index 5abc50fb81..6a42ce9c6b 100644
--- a/src/mesh/tnlMeshEntity.h
+++ b/src/mesh/tnlMeshEntity.h
@@ -22,7 +22,7 @@
 #include <core/tnlDynamicTypeTag.h>
 #include <mesh/tnlMeshEntityId.h>
 #include <mesh/traits/tnlMeshTraits.h>
-#include <mesh/traits/tnlDimensionsTraits.h>
+#include <mesh/tnlDimensionsTag.h>
 #include <mesh/topologies/tnlMeshVertexTag.h>
 #include <mesh/layers/tnlMeshSubentityStorageLayer.h>
 #include <mesh/layers/tnlMeshSuperentityStorageLayer.h>
@@ -105,10 +105,11 @@ class tnlMeshEntity
    template< int Dimensions >
    struct SubentitiesTraits
    {
-      typedef tnlDimensionsTraits< Dimensions >                 DimensionsTraits;
+      static_assert( Dimensions < meshDimensions, "Asking for subentities with more or the same number of dimensions then the mesh itself." );
+      typedef tnlDimensionsTag< Dimensions >                 DimensionsTag;
       typedef tnlMeshSubentitiesTraits< ConfigTag,
                                         EntityTag,
-                                        DimensionsTraits >      SubentityTraits;
+                                        DimensionsTag >      SubentityTraits;
       typedef typename SubentityTraits::ContainerType           ContainerType;
       typedef typename SubentityTraits::SharedContainerType     SharedContainerType;
       typedef typename ContainerType::ElementType               GlobalIndexType;
@@ -116,9 +117,10 @@ class tnlMeshEntity
 
       // TODO: make this as:
       // typedef typename Type::IndexType   LocalIndexType
-      enum { available = tnlMeshSubentityStorage< ConfigTag,
+      /*enum { available = tnlMeshSubentityStorage< ConfigTag,
                                                   EntityTag,
-                                                  Dimensions >::enabled };
+                                                  Dimensions >::enabled };*/
+      static const bool available = ConfigTag::template subentityStorage( EntityTag(), Dimensions );
       enum { subentitiesCount = SubentityTraits::count };
    };
 
@@ -138,13 +140,14 @@ class tnlMeshEntity
    void setSubentityIndex( const typename SubentitiesTraits< Dimensions >::LocalIndexType localIndex,
                            const typename SubentitiesTraits< Dimensions >::GlobalIndexType globalIndex )
    {
+      static_assert( SubentitiesTraits< Dimensions >::available, "You try to set subentity which is not configured for storage." );
       tnlAssert( 0 <= localIndex &&
                  localIndex < SubentitiesTraits< Dimensions >::subentitiesCount,
                  cerr << "localIndex = " << localIndex
                       << " subentitiesCount = "
                       << SubentitiesTraits< Dimensions >::subentitiesCount );
       typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag >  SubentityBaseType;
-      SubentityBaseType::setSubentityIndex( tnlDimensionsTraits< Dimensions >(),
+      SubentityBaseType::setSubentityIndex( tnlDimensionsTag< Dimensions >(),
                                             localIndex,
                                             globalIndex );
    }
@@ -153,13 +156,14 @@ class tnlMeshEntity
    typename SubentitiesTraits< Dimensions >::GlobalIndexType
       getSubentityIndex( const typename SubentitiesTraits< Dimensions >::LocalIndexType localIndex) const
       {
+         static_assert( SubentitiesTraits< Dimensions >::available, "You try to get subentity which is not configured for storage." );
          tnlAssert( 0 <= localIndex &&
                     localIndex < SubentitiesTraits< Dimensions >::subentitiesCount,
                     cerr << "localIndex = " << localIndex
                          << " subentitiesCount = "
                          << SubentitiesTraits< Dimensions >::subentitiesCount );
          typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag >  SubentityBaseType;
-         return SubentityBaseType::getSubentityIndex( tnlDimensionsTraits< Dimensions >(),
+         return SubentityBaseType::getSubentityIndex( tnlDimensionsTag< Dimensions >(),
                                                       localIndex );
       }
 
@@ -167,16 +171,18 @@ class tnlMeshEntity
       typename SubentitiesTraits< Dimensions >::SharedContainerType&
          getSubentitiesIndices()
    {
+      static_assert( SubentitiesTraits< Dimensions >::available, "You try to get subentities which are not configured for storage." );
       typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag >  SubentityBaseType;
-      return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() );
+      return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTag< Dimensions >() );
    }
 
    template< int Dimensions >
       const typename SubentitiesTraits< Dimensions >::SharedContainerType&
          getSubentitiesIndices() const
    {
+      static_assert( SubentitiesTraits< Dimensions >::available, "You try to set subentities which are not configured for storage." );
       typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag >  SubentityBaseType;
-      return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() );
+      return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTag< Dimensions >() );
    }
 
    /****
@@ -185,47 +191,52 @@ class tnlMeshEntity
    template< int Dimensions >
    struct SuperentitiesTraits
    {
-      typedef tnlDimensionsTraits< Dimensions >                 DimensionsTraits;
+      static_assert( Dimensions <= meshDimensions, "Asking for subentities with more dimensions then the mesh itself." );
+      typedef tnlDimensionsTag< Dimensions >                 DimensionsTag;
       typedef tnlMeshSuperentitiesTraits< ConfigTag,
                                           EntityTag,
-                                          DimensionsTraits >    SuperentityTraits;
+                                          DimensionsTag >    SuperentityTraits;
       typedef typename SuperentityTraits::ContainerType         ContainerType;
       typedef typename SuperentityTraits::SharedContainerType   SharedContainerType;
       typedef typename ContainerType::ElementType               GlobalIndexType;
       typedef int                                               LocalIndexType;
       // TODO: make this as:
       // typedef typename Type::IndexType   LocalIndexType
-      enum { available = tnlMeshSuperentityStorage< ConfigTag,
+      /*enum { available = tnlMeshSuperentityStorage< ConfigTag,
                                                     EntityTag,
-                                                    Dimensions >::enabled };
+                                                    Dimensions >::enabled };*/
+      static const bool available = ConfigTag::template superentityStorage( EntityTag(), Dimensions );
    };
 
    template< int Dimensions >
    bool setNumberOfSuperentities( const typename SuperentitiesTraits< Dimensions >::LocalIndexType size )
    {
+      static_assert( SuperentitiesTraits< Dimensions >::available, "You try to set number of superentities which are not configured for storage." );
       tnlAssert( size >= 0,
                  cerr << "size = " << size << endl; );
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag >  SuperentityBaseType;
-      return SuperentityBaseType::setNumberOfSuperentities( tnlDimensionsTraits< Dimensions >(),
+      return SuperentityBaseType::setNumberOfSuperentities( tnlDimensionsTag< Dimensions >(),
                                                             size );
    }
 
    template< int Dimensions >
    typename SuperentitiesTraits< Dimensions >::LocalIndexType getNumberOfSuperentities() const
    {
+      static_assert( SuperentitiesTraits< Dimensions >::available, "You try to get number of superentities which are not configured for storage." );
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag >  SuperentityBaseType;
-      return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTraits< Dimensions >() );
+      return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTag< Dimensions >() );
    }
 
    template< int Dimensions >
    void setSuperentityIndex( const typename SuperentitiesTraits< Dimensions >::LocalIndexType localIndex,
                              const typename SuperentitiesTraits< Dimensions >::GlobalIndexType globalIndex )
    {
+      static_assert( SuperentitiesTraits< Dimensions >::available, "You try to set superentity which is not configured for storage." );
       tnlAssert( localIndex < this->getNumberOfSuperentities< Dimensions >(),
                  cerr << " localIndex = " << localIndex
                       << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; );
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag >  SuperentityBaseType;
-      SuperentityBaseType::setSuperentityIndex( tnlDimensionsTraits< Dimensions >(),
+      SuperentityBaseType::setSuperentityIndex( tnlDimensionsTag< Dimensions >(),
                                                 localIndex,
                                                 globalIndex );
    }
@@ -234,26 +245,29 @@ class tnlMeshEntity
    typename SuperentitiesTraits< Dimensions >::GlobalIndexType 
       getSuperentityIndex( const typename SuperentitiesTraits< Dimensions >::LocalIndexType localIndex ) const
    {
+      static_assert( SuperentitiesTraits< Dimensions >::available, "You try to get superentity which is not configured for storage." );
       tnlAssert( localIndex < this->getNumberOfSuperentities< Dimensions >(),
                  cerr << " localIndex = " << localIndex
                       << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; );
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag >  SuperentityBaseType;
-      return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTraits< Dimensions >(),
+      return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTag< Dimensions >(),
                                                        localIndex );
    }
 
    template< int Dimensions >
       typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndices()
    {
+      static_assert( SuperentitiesTraits< Dimensions >::available, "You try to get superentities which are not configured for storage." );
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag >  SuperentityBaseType;
-      return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTraits< Dimensions >() );
+      return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTag< Dimensions >() );
    }
 
    template< int Dimensions >
       const typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndices() const
    {
+      static_assert( SuperentitiesTraits< Dimensions >::available, "You try to get superentities which are not configured for storage." );
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag >  SuperentityBaseType;
-      return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() );
+      return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTag< Dimensions >() );
    }
 
    /****
@@ -370,19 +384,20 @@ class tnlMeshEntity< ConfigTag, tnlMeshVertexTag >
    template< int Dimensions >
    struct SuperentitiesTraits
    {
-      typedef tnlDimensionsTraits< Dimensions >                 DimensionsTraits;
+      typedef tnlDimensionsTag< Dimensions >                 DimensionsTag;
       typedef tnlMeshSuperentitiesTraits< ConfigTag,
                                           tnlMeshVertexTag,
-                                          DimensionsTraits >    SuperentityTraits;
+                                          DimensionsTag >    SuperentityTraits;
       typedef typename SuperentityTraits::ContainerType         ContainerType;
       typedef typename SuperentityTraits::SharedContainerType   SharedContainerType;
       typedef typename ContainerType::ElementType               GlobalIndexType;
       typedef int                                               LocalIndexType;
       // TODO: make this as:
       // typedef typename Type::IndexType   LocalIndexType
-      enum { available = tnlMeshSuperentityStorage< ConfigTag,
+      /*enum { available = tnlMeshSuperentityStorage< ConfigTag,
                                                     tnlMeshVertexTag,
-                                                    Dimensions >::enabled };
+                                                    Dimensions >::enabled };*/
+      static const bool available = ConfigTag::template superentityStorage< tnlMeshVertexTag >( Dimensions );
    };
    template< int Dimensions >
    bool setNumberOfSuperentities( const typename SuperentitiesTraits< Dimensions >::LocalIndexType size )
@@ -390,7 +405,7 @@ class tnlMeshEntity< ConfigTag, tnlMeshVertexTag >
       tnlAssert( size >= 0,
                  cerr << "size = " << size << endl; );
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag >  SuperentityBaseType;
-      return SuperentityBaseType::setNumberOfSuperentities( tnlDimensionsTraits< Dimensions >(),
+      return SuperentityBaseType::setNumberOfSuperentities( tnlDimensionsTag< Dimensions >(),
                                                             size );
    }
 
@@ -398,21 +413,21 @@ class tnlMeshEntity< ConfigTag, tnlMeshVertexTag >
    typename SuperentitiesTraits< Dimensions >::LocalIndexType getNumberOfSuperentities() const
    {
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag >  SuperentityBaseType;
-      return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTraits< Dimensions >() );
+      return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTag< Dimensions >() );
    }
 
    template< int Dimensions >
       typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndices()
    {
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag >  SuperentityBaseType;
-      return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTraits< Dimensions >() );
+      return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTag< Dimensions >() );
    }
 
    template< int Dimensions >
       const typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndeces() const
    {
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag >  SuperentityBaseType;
-      return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() );
+      return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTag< Dimensions >() );
    }
 
    template< int Dimensions >
@@ -423,7 +438,7 @@ class tnlMeshEntity< ConfigTag, tnlMeshVertexTag >
                  cerr << " localIndex = " << localIndex
                       << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; );
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag >  SuperentityBaseType;
-      SuperentityBaseType::setSuperentityIndex( tnlDimensionsTraits< Dimensions >(),
+      SuperentityBaseType::setSuperentityIndex( tnlDimensionsTag< Dimensions >(),
                                                 localIndex,
                                                 globalIndex );
    }
@@ -436,7 +451,7 @@ class tnlMeshEntity< ConfigTag, tnlMeshVertexTag >
                  cerr << " localIndex = " << localIndex
                       << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; );
       typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag >  SuperentityBaseType;
-      return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTraits< Dimensions >(),
+      return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTag< Dimensions >(),
                                                        localIndex );
    }
 
diff --git a/src/mesh/tnlMeshEntityInitializer.h b/src/mesh/tnlMeshEntityInitializer.h
index 9647efd67c..4e3daa5f96 100644
--- a/src/mesh/tnlMeshEntityInitializer.h
+++ b/src/mesh/tnlMeshEntityInitializer.h
@@ -26,15 +26,15 @@ class tnlMeshInitializer;
 
 template<typename ConfigTag,
          typename EntityTag,
-         typename DimensionsTraits,
+         typename DimensionsTag,
          typename SubentityStorageTag = typename tnlMeshSubentitiesTraits< ConfigTag,
                                                                            EntityTag,
-                                                                           DimensionsTraits >::SubentityStorageTag,
+                                                                           DimensionsTag >::SubentityStorageTag,
          typename SuperentityStorageTag = typename tnlMeshSuperentitiesTraits< ConfigTag,
                                                                                typename tnlMeshSubentitiesTraits< ConfigTag,
                                                                                                                   EntityTag,
-                                                                                                                  DimensionsTraits >::SubentityTag,
-                                                                               tnlDimensionsTraits< EntityTag::dimensions > >::SuperentityStorageTag >
+                                                                                                                  DimensionsTag >::SubentityTag,
+                                                                               tnlDimensionsTag< EntityTag::dimensions > >::SuperentityStorageTag >
 class tnlMeshEntityInitializerLayer;
 
 template< typename ConfigTag,
@@ -42,29 +42,29 @@ template< typename ConfigTag,
 class tnlMeshEntityInitializer
    : public tnlMeshEntityInitializerLayer< ConfigTag,
                                            EntityTag, 
-                                           tnlDimensionsTraits< EntityTag::dimensions - 1 > >,
+                                           tnlDimensionsTag< EntityTag::dimensions - 1 > >,
      public tnlMeshSuperentityInitializerLayer< ConfigTag,
                                                 EntityTag,
-                                                typename tnlMeshTraits< ConfigTag >::DimensionsTraits >
+                                                typename tnlMeshTraits< ConfigTag >::DimensionsTag >
 {
-   typedef tnlDimensionsTraits< EntityTag::dimensions >                                 DimensionsTraits;
+   typedef tnlDimensionsTag< EntityTag::dimensions >                                 DimensionsTag;
    private:
 
    typedef
       tnlMeshEntityInitializerLayer< ConfigTag,
                                      EntityTag,
-                                     tnlDimensionsTraits< EntityTag::dimensions - 1 > >   SubentityBaseType;
+                                     tnlDimensionsTag< EntityTag::dimensions - 1 > >   SubentityBaseType;
    typedef
       tnlMeshSuperentityInitializerLayer< ConfigTag,
                                           EntityTag,
                                           typename
-                                          tnlMeshTraits< ConfigTag >::DimensionsTraits > SuperentityBaseType;
+                                          tnlMeshTraits< ConfigTag >::DimensionsTag > SuperentityBaseType;
 
-   typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >::Type               EntityType;
+   typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTag >::Type               EntityType;
    typedef typename tnlMeshEntitiesTraits< ConfigTag,
-                                           DimensionsTraits >::ContainerType::IndexType      GlobalIndexType;
+                                           DimensionsTag >::ContainerType::IndexType      GlobalIndexType;
 
-   typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, tnlDimensionsTraits< 0 > >        SubvertexTag;
+   typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, tnlDimensionsTag< 0 > >        SubvertexTag;
    typedef typename SubvertexTag::ContainerType::ElementType                                 VertexGlobalIndexType;
    typedef typename SubvertexTag::ContainerType::IndexType                                   VertexLocalIndexType;
 
@@ -181,7 +181,7 @@ class tnlMeshEntityInitializer
       enum { subentitiesCount       = Tag::count };
       enum { subentityVerticesCount = tnlMeshSubentitiesTraits< ConfigTag,
                                                                 SubentityTag,
-                                                                tnlDimensionsTraits< 0 > >::count };
+                                                                tnlDimensionsTag< 0 > >::count };
 
       public:
       static void createSubentities( SubentityContainerType& subentities,
@@ -227,16 +227,16 @@ template< typename ConfigTag >
 class tnlMeshEntityInitializer< ConfigTag, tnlMeshVertexTag >
    : public tnlMeshSuperentityInitializerLayer< ConfigTag,
                                                 tnlMeshVertexTag,
-                                                typename tnlMeshTraits< ConfigTag >::DimensionsTraits >
+                                                typename tnlMeshTraits< ConfigTag >::DimensionsTag >
 {
-   typedef tnlDimensionsTraits< 0 >                                                                     DimensionsTraits;
+   typedef tnlDimensionsTag< 0 >                                                                     DimensionsTag;
 
    typedef tnlMeshSuperentityInitializerLayer< ConfigTag,
                                                tnlMeshVertexTag,
-                                               typename tnlMeshTraits< ConfigTag >::DimensionsTraits >     SuperentityBaseType;
+                                               typename tnlMeshTraits< ConfigTag >::DimensionsTag >     SuperentityBaseType;
 
-   typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >::Type                          EntityType;
-   typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >::ContainerType::IndexType      GlobalIndexType;
+   typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTag >::Type                          EntityType;
+   typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTag >::ContainerType::IndexType      GlobalIndexType;
 
    typedef tnlMeshInitializer< ConfigTag >                                                              InitializerType;
 
@@ -301,11 +301,11 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
                                      tnlStorageTraits< true > >
    : public tnlMeshEntityInitializerLayer< ConfigTag,
                                            EntityTag,
-                                           typename DimensionsTag::Previous >
+                                           typename DimensionsTag::Decrement >
 {
    typedef tnlMeshEntityInitializerLayer< ConfigTag,
                                           EntityTag,
-                                          typename DimensionsTag::Previous >                   BaseType;
+                                          typename DimensionsTag::Decrement >                   BaseType;
 
    typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, DimensionsTag >                     SubentitiesTraits;
    typedef typename SubentitiesTraits::SubentityContainerType                                  SubentityContainerType;
@@ -314,7 +314,7 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
 
    typedef tnlMeshInitializer< ConfigTag >                                                     InitializerType;
    typedef tnlMeshEntityInitializer< ConfigTag, EntityTag >                                    EntityInitializerType;
-   typedef tnlDimensionsTraits< EntityTag::dimensions >                                        EntityDimensionsTraits;
+   typedef tnlDimensionsTag< EntityTag::dimensions >                                        EntityDimensionsTag;
 
    protected:
    void initSubentities( EntityInitializerType& entityInitializer,
@@ -333,7 +333,7 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
          GlobalIndexType superentityIndex = entityInitializer.getEntityIndex();
          subentityContainer[ i ] = subentityIndex;
          //cout << "       Setting " << i << "-th subentity to " << subentityContainer[ i ] << endl;
-         meshInitializer.getEntityInitializer( DimensionsTag(), subentityIndex ).addSuperentity( EntityDimensionsTraits(), superentityIndex );
+         meshInitializer.getEntityInitializer( DimensionsTag(), subentityIndex ).addSuperentity( EntityDimensionsTag(), superentityIndex );
       }
 
       BaseType::initSubentities( entityInitializer, meshInitializer );
@@ -350,11 +350,11 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
                                      tnlStorageTraits< false > >
    : public tnlMeshEntityInitializerLayer< ConfigTag,
                                            EntityTag,
-                                           typename DimensionsTag::Previous >
+                                           typename DimensionsTag::Decrement >
 {
    typedef tnlMeshEntityInitializerLayer< ConfigTag,
                                           EntityTag,
-                                          typename DimensionsTag::Previous >                   BaseType;
+                                          typename DimensionsTag::Decrement >                   BaseType;
 
    typedef typename tnlMeshSubentitiesTraits< ConfigTag,
                                               EntityTag,
@@ -396,11 +396,11 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
                                      tnlStorageTraits< true > >
    : public tnlMeshEntityInitializerLayer< ConfigTag,
                                            EntityTag,
-                                           typename DimensionsTag::Previous >
+                                           typename DimensionsTag::Decrement >
 {
    typedef tnlMeshEntityInitializerLayer< ConfigTag,
                                           EntityTag,
-                                          typename DimensionsTag::Previous >                BaseType;
+                                          typename DimensionsTag::Decrement >                BaseType;
 
    typedef typename tnlMeshSubentitiesTraits< ConfigTag,
                                               EntityTag,
@@ -412,7 +412,7 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
 
    typedef tnlMeshInitializer< ConfigTag >                                                   InitializerType;
    typedef tnlMeshEntityInitializer< ConfigTag, EntityTag >                                  EntityInitializerType;
-   typedef tnlDimensionsTraits< EntityTag::dimensions >                                      EntityDimensionsTag;
+   typedef tnlDimensionsTag< EntityTag::dimensions >                                      EntityDimensionsTag;
 
    protected:
    void initSubentities( EntityInitializerType& entityInitializer,
@@ -445,18 +445,18 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
                                      tnlStorageTraits< false > >
    : public tnlMeshEntityInitializerLayer< ConfigTag,
                                            EntityTag,
-                                           typename DimensionsTag::Previous >
+                                           typename DimensionsTag::Decrement >
 {};
 
 template< typename ConfigTag,
           typename EntityTag >
 class tnlMeshEntityInitializerLayer< ConfigTag,
                                      EntityTag,
-                                     tnlDimensionsTraits< 0 >,
+                                     tnlDimensionsTag< 0 >,
                                      tnlStorageTraits< true >,
                                      tnlStorageTraits< true > >
 {
-   typedef tnlDimensionsTraits< 0 >                                  DimensionsTag;
+   typedef tnlDimensionsTag< 0 >                                  DimensionsTag;
    typedef tnlMeshSubentitiesTraits< ConfigTag,
                                      EntityTag,
                                      DimensionsTag >                 SubentitiesTraits;
@@ -466,7 +466,7 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
 
    typedef tnlMeshInitializer< ConfigTag >                           InitializerType;
    typedef tnlMeshEntityInitializer< ConfigTag, EntityTag >          EntityInitializerType;
-   typedef tnlDimensionsTraits< EntityTag::dimensions >              EntityDimensionsTag;
+   typedef tnlDimensionsTag< EntityTag::dimensions >              EntityDimensionsTag;
 
    protected:
    void initSubentities( EntityInitializerType &entityInitializer,
@@ -491,7 +491,7 @@ template< typename ConfigTag,
           typename EntityTag >
 class tnlMeshEntityInitializerLayer< ConfigTag,
                                      EntityTag,
-                                     tnlDimensionsTraits< 0 >,
+                                     tnlDimensionsTag< 0 >,
                                      tnlStorageTraits< true >,
                                      tnlStorageTraits< false > >
 {
@@ -508,7 +508,7 @@ template< typename ConfigTag,
           typename EntityTag >
 class tnlMeshEntityInitializerLayer< ConfigTag,
                                      EntityTag,
-                                     tnlDimensionsTraits< 0 >,
+                                     tnlDimensionsTag< 0 >,
                                      tnlStorageTraits< false >,
                                      tnlStorageTraits< true > > // Forces termination of recursive inheritance (prevents compiler from generating huge error logs)
 {
@@ -523,7 +523,7 @@ template< typename ConfigTag,
           typename EntityTag >
 class tnlMeshEntityInitializerLayer< ConfigTag,
                                      EntityTag,
-                                     tnlDimensionsTraits< 0 >,
+                                     tnlDimensionsTag< 0 >,
                                      tnlStorageTraits< false >,
                                      tnlStorageTraits< false > > // Forces termination of recursive inheritance (prevents compiler from generating huge error logs)
 {
diff --git a/src/mesh/tnlMeshEntityKey.h b/src/mesh/tnlMeshEntityKey.h
index 0937caaa98..925994f361 100644
--- a/src/mesh/tnlMeshEntityKey.h
+++ b/src/mesh/tnlMeshEntityKey.h
@@ -20,7 +20,7 @@
 
 #include <mesh/tnlMeshEntity.h>
 #include <mesh/traits/tnlMeshSubentitiesTraits.h>
-#include <mesh/traits/tnlDimensionsTraits.h>
+#include <mesh/tnlDimensionsTag.h>
 
 /****
  * Unique identification of a mesh entity by its vertices.
@@ -36,7 +36,7 @@ class tnlMeshEntityKey
    typedef typename
       tnlMeshSubentitiesTraits< ConfigTag,
                                 EntityTag,
-                                tnlDimensionsTraits< 0 > >::ContainerType ContainerType;
+                                tnlDimensionsTag< 0 > >::ContainerType ContainerType;
 
    public:
 
diff --git a/src/mesh/tnlMeshInitializer.h b/src/mesh/tnlMeshInitializer.h
index 897aa59014..1f91e8458c 100644
--- a/src/mesh/tnlMeshInitializer.h
+++ b/src/mesh/tnlMeshInitializer.h
@@ -19,7 +19,7 @@
 #define TNLMESHINITIALIZER_H_
 
 #include <mesh/traits/tnlMeshEntitiesTraits.h>
-#include <mesh/traits/tnlDimensionsTraits.h>
+#include <mesh/tnlDimensionsTag.h>
 #include <mesh/traits/tnlMeshSubentitiesTraits.h>
 #include <mesh/traits/tnlMeshSuperentitiesTraits.h>
 #include <mesh/tnlMeshEntityInitializer.h>
@@ -27,9 +27,9 @@
 #include <mesh/traits/tnlStorageTraits.h>
 
 template< typename ConfigTag,
-          typename DimensionsTraits,
+          typename DimensionsTag,
           typename EntityStorageTag = typename tnlMeshEntitiesTraits< ConfigTag,
-                                                                      DimensionsTraits >::EntityStorageTag >
+                                                                      DimensionsTag >::EntityStorageTag >
 class tnlMeshInitializerLayer;
 
 
@@ -40,7 +40,7 @@ class tnlMeshEntityInitializer;
 template< typename ConfigTag >
 class tnlMeshInitializer
    : public tnlMeshInitializerLayer< ConfigTag,
-                                     typename tnlMeshTraits< ConfigTag >::DimensionsTraits >
+                                     typename tnlMeshTraits< ConfigTag >::DimensionsTag >
 {
    typedef tnlMesh< ConfigTag > MeshType;
 
@@ -77,17 +77,17 @@ class tnlMeshInitializer
 
 template< typename ConfigTag >
 class tnlMeshInitializerLayer< ConfigTag,
-                               typename tnlMeshTraits< ConfigTag >::DimensionsTraits,
+                               typename tnlMeshTraits< ConfigTag >::DimensionsTag,
                                tnlStorageTraits< true > >
    : public tnlMeshInitializerLayer< ConfigTag,
-                                     typename tnlMeshTraits< ConfigTag >::DimensionsTraits::Previous >
+                                     typename tnlMeshTraits< ConfigTag >::DimensionsTag::Decrement >
 {
-   typedef typename tnlMeshTraits< ConfigTag >::DimensionsTraits        DimensionsTraits;
+   typedef typename tnlMeshTraits< ConfigTag >::DimensionsTag        DimensionsTag;
 
    typedef tnlMeshInitializerLayer< ConfigTag,
-                                    typename DimensionsTraits::Previous >   BaseType;
+                                    typename DimensionsTag::Decrement >   BaseType;
 
-   typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >         Tag;
+   typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTag >         Tag;
    typedef typename Tag::Tag                                            EntityTag;
    typedef typename Tag::ContainerType                                  ContainerType;
    typedef typename ContainerType::IndexType                            GlobalIndexType;
@@ -98,7 +98,7 @@ class tnlMeshInitializerLayer< ConfigTag,
 
    public:
    using BaseType::getEntityInitializer;
-   CellInitializerType& getEntityInitializer( DimensionsTraits, GlobalIndexType index )
+   CellInitializerType& getEntityInitializer( DimensionsTag, GlobalIndexType index )
    {
       return cellInitializerContainer[ index ];
    }
@@ -135,7 +135,7 @@ class tnlMeshInitializerLayer< ConfigTag,
 
    void createEntitiesFromCells( bool verbose )
    {
-      //cout << " Creating entities with " << DimensionsTraits::value << " dimensions..." << endl;
+      //cout << " Creating entities with " << DimensionsTag::value << " dimensions..." << endl;
       cellInitializerContainer.setSize( this->getMesh().getNumberOfCells() );
       for( GlobalIndexType cell = 0;
            cell < this->getMesh().getNumberOfCells();
@@ -155,12 +155,12 @@ class tnlMeshInitializerLayer< ConfigTag,
 
    void initEntities( InitializerType& meshInitializer )
    {
-      //cout << " Initiating entities with " << DimensionsTraits::value << " dimensions..." << endl;
+      //cout << " Initiating entities with " << DimensionsTag::value << " dimensions..." << endl;
       for( typename CellInitializerContainerType::IndexType i = 0;
            i < cellInitializerContainer.getSize();
            i++ )
       {
-         //cout << "  Initiating entity " << i << " with " << DimensionsTraits::value << " dimensions..." << endl;
+         //cout << "  Initiating entity " << i << " with " << DimensionsTag::value << " dimensions..." << endl;
          cellInitializerContainer[ i ].initEntity( meshInitializer );
       }
       cellInitializerContainer.reset();
@@ -173,17 +173,17 @@ class tnlMeshInitializerLayer< ConfigTag,
 
 
 template< typename ConfigTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshInitializerLayer< ConfigTag,
-                               DimensionsTraits,
+                               DimensionsTag,
                                tnlStorageTraits< true > >
    : public tnlMeshInitializerLayer< ConfigTag,
-                                     typename DimensionsTraits::Previous >
+                                     typename DimensionsTag::Decrement >
 {
    typedef tnlMeshInitializerLayer< ConfigTag,
-                                    typename DimensionsTraits::Previous >  BaseType;
+                                    typename DimensionsTag::Decrement >  BaseType;
 
-   typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >            Tag;
+   typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTag >            Tag;
    typedef typename Tag::Tag                                               EntityTag;
    typedef typename Tag::Type                                              EntityType;
    typedef typename Tag::ContainerType                                     ContainerType;
@@ -192,14 +192,14 @@ class tnlMeshInitializerLayer< ConfigTag,
 
    typedef tnlMeshInitializer< ConfigTag >                                 InitializerType;
    typedef tnlMeshEntityInitializer< ConfigTag,
-                                     typename ConfigTag::CellTag >         CellInitializerType;
+                                     typename ConfigTag::CellType >         CellInitializerType;
    typedef tnlMeshEntityInitializer< ConfigTag, EntityTag >                EntityInitializerType;
    typedef tnlArray< EntityInitializerType, tnlHost, GlobalIndexType >     EntityInitializerContainerType;
 
    typedef typename
       tnlMeshSubentitiesTraits< ConfigTag,
-                                typename ConfigTag::CellTag,
-                                DimensionsTraits >::SubentityContainerType SubentitiesContainerType;
+                                typename ConfigTag::CellType,
+                                DimensionsTag >::SubentityContainerType SubentitiesContainerType;
 
    public:
 
@@ -214,7 +214,7 @@ class tnlMeshInitializerLayer< ConfigTag,
    }
 
    using BaseType::getEntityInitializer;
-   EntityInitializerType& getEntityInitializer( DimensionsTraits, GlobalIndexType index )
+   EntityInitializerType& getEntityInitializer( DimensionsTag, GlobalIndexType index )
    {
       return entityInitializerContainer[ index ];
    }
@@ -223,9 +223,9 @@ class tnlMeshInitializerLayer< ConfigTag,
 
    void createEntitiesFromCells( const CellInitializerType& cellInitializer )
    {
-      //cout << " Creating entities with " << DimensionsTraits::value << " dimensions..." << endl;
+      //cout << " Creating entities with " << DimensionsTag::value << " dimensions..." << endl;
       SubentitiesContainerType subentities;
-      cellInitializer.template createSubentities< DimensionsTraits >( subentities );
+      cellInitializer.template createSubentities< DimensionsTag >( subentities );
       for( typename SubentitiesContainerType::IndexType i = 0;
            i < subentities.getSize();
            i++ )
@@ -233,7 +233,7 @@ class tnlMeshInitializerLayer< ConfigTag,
          //cout << "      Inserting subentity " << endl << subentities[ i ] << endl;
          uniqueContainer.insert( subentities[ i ] );
       }
-      //cout << " Container with entities with " << DimensionsTraits::value << " dimensions has: " << endl << this->uniqueContainer << endl;
+      //cout << " Container with entities with " << DimensionsTag::value << " dimensions has: " << endl << this->uniqueContainer << endl;
       BaseType::createEntitiesFromCells( cellInitializer );
    }
 
@@ -245,23 +245,23 @@ class tnlMeshInitializerLayer< ConfigTag,
 
    void initEntities( InitializerType &meshInitializer )
    {
-      //cout << " Initiating entities with " << DimensionsTraits::value << " dimensions..." << endl;
-      //cout << " Container with entities with " << DimensionsTraits::value << " dimensions has: " << endl << this->uniqueContainer << endl;
+      //cout << " Initiating entities with " << DimensionsTag::value << " dimensions..." << endl;
+      //cout << " Container with entities with " << DimensionsTag::value << " dimensions has: " << endl << this->uniqueContainer << endl;
       const GlobalIndexType numberOfEntities = uniqueContainer.getSize();
-      this->getMesh().template setNumberOfEntities< DimensionsTraits::value >( numberOfEntities );
-      uniqueContainer.toArray( this->getMesh().template getEntities< DimensionsTraits::value >() );
+      this->getMesh().template setNumberOfEntities< DimensionsTag::value >( numberOfEntities );
+      uniqueContainer.toArray( this->getMesh().template getEntities< DimensionsTag::value >() );
       uniqueContainer.reset();
-      //cout << "  this->getMesh().template getEntities< DimensionsTraits::value >() has: " << this->getMesh().template getEntities< DimensionsTraits::value >() << endl;
+      //cout << "  this->getMesh().template getEntities< DimensionsTag::value >() has: " << this->getMesh().template getEntities< DimensionsTag::value >() << endl;
 
-      //ContainerType& entityContainer = this->getMesh().entityContainer(DimensionsTraits());
+      //ContainerType& entityContainer = this->getMesh().entityContainer(DimensionsTag());
       for( GlobalIndexType i = 0;
            i < numberOfEntities;
            i++)
       {
-         //cout << "Initiating entity " << i << " with " << DimensionsTraits::value << " dimensions..." << endl;
+         //cout << "Initiating entity " << i << " with " << DimensionsTag::value << " dimensions..." << endl;
          EntityInitializerType& entityInitializer = entityInitializerContainer[ i ];
-         //cout << "Initiating with entity " << this->getMesh().template getEntity< DimensionsTraits::value >( i ) << endl;
-         entityInitializer.init( this->getMesh().template getEntity< DimensionsTraits::value >( i ), i );
+         //cout << "Initiating with entity " << this->getMesh().template getEntity< DimensionsTag::value >( i ) << endl;
+         entityInitializer.init( this->getMesh().template getEntity< DimensionsTag::value >( i ), i );
          entityInitializer.initEntity( meshInitializer );
       }
 
@@ -276,24 +276,24 @@ class tnlMeshInitializerLayer< ConfigTag,
 };
 
 template< typename ConfigTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshInitializerLayer< ConfigTag,
-                               DimensionsTraits,
+                               DimensionsTag,
                                tnlStorageTraits< false > >
    : public tnlMeshInitializerLayer< ConfigTag,
-                                     typename DimensionsTraits::Previous >
+                                     typename DimensionsTag::Decrement >
 {};
 
 
 template< typename ConfigTag >
 class tnlMeshInitializerLayer< ConfigTag,
-                               tnlDimensionsTraits< 0 >,
+                               tnlDimensionsTag< 0 >,
                                tnlStorageTraits< true > >
 {
    typedef tnlMesh< ConfigTag >                                        MeshType;
-   typedef tnlDimensionsTraits< 0 >                                    DimensionsTraits;
+   typedef tnlDimensionsTag< 0 >                                    DimensionsTag;
 
-   typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >        Tag;
+   typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTag >        Tag;
    typedef typename Tag::Tag                                           EntityTag;
    typedef typename Tag::ContainerType                                 ContainerType;
    typedef typename Tag::SharedContainerType                           SharedContainerType;
@@ -303,7 +303,7 @@ class tnlMeshInitializerLayer< ConfigTag,
 
    typedef tnlMeshInitializer< ConfigTag >                             InitializerType;
    typedef tnlMeshEntityInitializer< ConfigTag, 
-                                     typename ConfigTag::CellTag >     CellInitializerType;
+                                     typename ConfigTag::CellType >     CellInitializerType;
    typedef tnlMeshEntityInitializer< ConfigTag, EntityTag >            VertexInitializerType;
    typedef tnlArray< VertexInitializerType, tnlHost, GlobalIndexType > VertexInitializerContainerType;
 
@@ -320,7 +320,7 @@ class tnlMeshInitializerLayer< ConfigTag,
       return *( this->mesh );
    }
 
-   VertexInitializerType& getEntityInitializer( DimensionsTraits, GlobalIndexType index )
+   VertexInitializerType& getEntityInitializer( DimensionsTag, GlobalIndexType index )
    {
       tnlAssert( index >= 0 && index < vertexInitializerContainer.getSize(),
                cerr << " index = " << index
@@ -334,18 +334,18 @@ class tnlMeshInitializerLayer< ConfigTag,
 
    void createEntityInitializers()
    {
-      vertexInitializerContainer.setSize( this->getMesh().template getNumberOfEntities< DimensionsTraits::value >() );
+      vertexInitializerContainer.setSize( this->getMesh().template getNumberOfEntities< DimensionsTag::value >() );
    }
 
    void initEntities( InitializerType& meshInitializer )
    {
-      //cout << " Initiating entities with " << DimensionsTraits::value << " dimensions..." << endl;
-      SharedContainerType& vertexContainer = this->getMesh().template getEntities< DimensionsTraits::value >();
+      //cout << " Initiating entities with " << DimensionsTag::value << " dimensions..." << endl;
+      SharedContainerType& vertexContainer = this->getMesh().template getEntities< DimensionsTag::value >();
       for( GlobalIndexType i = 0;
            i < vertexContainer.getSize();
            i++ )
       {
-         //cout << "Initiating entity " << i << " with " << DimensionsTraits::value << " dimensions..." << endl;
+         //cout << "Initiating entity " << i << " with " << DimensionsTag::value << " dimensions..." << endl;
          VertexInitializerType& vertexInitializer = vertexInitializerContainer[ i ];
          vertexInitializer.init( vertexContainer[ i ], i );
          vertexInitializer.initEntity( meshInitializer );
diff --git a/src/mesh/tnlMeshIntegrityChecker.h b/src/mesh/tnlMeshIntegrityChecker.h
index 86f0de4dfb..9cfd9e97ef 100644
--- a/src/mesh/tnlMeshIntegrityChecker.h
+++ b/src/mesh/tnlMeshIntegrityChecker.h
@@ -24,10 +24,10 @@
 template< typename MeshType >
 class tnlMeshIntegrityChecker
 : public tnlMeshIntegrityCheckerLayer< MeshType,
-                                       tnlDimensionsTraits< MeshType::Config::CellTag::dimensions > >
+                                       tnlDimensionsTag< MeshType::Config::CellType::dimensions > >
 {
-      typedef tnlDimensionsTraits< MeshType::Config::CellTag::dimensions > DimensionsTraits;
-      typedef tnlMeshIntegrityCheckerLayer< MeshType, DimensionsTraits > BaseType;
+      typedef tnlDimensionsTag< MeshType::Config::CellType::dimensions > DimensionsTag;
+      typedef tnlMeshIntegrityCheckerLayer< MeshType, DimensionsTag > BaseType;
 
    public:
       static bool checkMesh( const MeshType& mesh )
diff --git a/src/mesh/tnlMeshIntegrityCheckerLayer.h b/src/mesh/tnlMeshIntegrityCheckerLayer.h
index a67a844230..9966a26081 100644
--- a/src/mesh/tnlMeshIntegrityCheckerLayer.h
+++ b/src/mesh/tnlMeshIntegrityCheckerLayer.h
@@ -19,27 +19,27 @@
 #define TNLMESHINTEGRITYCHECKERLAYER_H_
 
 #include <mesh/traits/tnlMeshEntitiesTraits.h>
-#include <mesh/traits/tnlDimensionsTraits.h>
+#include <mesh/tnlDimensionsTag.h>
 #include <mesh/traits/tnlStorageTraits.h>
 
 template< typename MeshType,
-          typename DimensionsTraits,
+          typename DimensionsTag,
           typename EntityStorageTag = typename tnlMeshEntitiesTraits< typename MeshType::Config,
-                                                                      DimensionsTraits >::EntityStorageTag >
+                                                                      DimensionsTag >::EntityStorageTag >
 class tnlMeshIntegrityCheckerLayer;
 
 template< typename MeshType,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshIntegrityCheckerLayer< MeshType,
-                                    DimensionsTraits,
+                                    DimensionsTag,
                                     tnlStorageTraits< true > >
    : public tnlMeshIntegrityCheckerLayer< MeshType,
-                                          typename DimensionsTraits::Previous >
+                                          typename DimensionsTag::Decrement >
 {
    public:
       typedef tnlMeshIntegrityCheckerLayer< MeshType, 
-                                            typename DimensionsTraits::Previous >     BaseType;
-      enum { dimensions = DimensionsTraits::value };
+                                            typename DimensionsTag::Decrement >     BaseType;
+      enum { dimensions = DimensionsTag::value };
 
       static bool checkEntities( const MeshType& mesh )
       {         
@@ -61,7 +61,7 @@ class tnlMeshIntegrityCheckerLayer< MeshType,
 
 template< typename MeshType >
 class tnlMeshIntegrityCheckerLayer< MeshType,
-                                    tnlDimensionsTraits< 0 >,
+                                    tnlDimensionsTag< 0 >,
                                     tnlStorageTraits< true > >
 {
    public:
@@ -85,19 +85,19 @@ class tnlMeshIntegrityCheckerLayer< MeshType,
 };
 
 template< typename MeshType,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshIntegrityCheckerLayer< MeshType,
-                                    DimensionsTraits,
+                                    DimensionsTag,
                                     tnlStorageTraits< false > >
    : public tnlMeshIntegrityCheckerLayer< MeshType,
-                                          typename DimensionsTraits::Previous >
+                                          typename DimensionsTag::Decrement >
 {
 
 };
 
 template< typename MeshType >
 class tnlMeshIntegrityCheckerLayer< MeshType,
-                                    tnlDimensionsTraits< 0 >,
+                                    tnlDimensionsTag< 0 >,
                                     tnlStorageTraits< false > >
 {
 
diff --git a/src/mesh/tnlMeshReaderNetgen.h b/src/mesh/tnlMeshReaderNetgen.h
index e694b10269..a9e813ae06 100644
--- a/src/mesh/tnlMeshReaderNetgen.h
+++ b/src/mesh/tnlMeshReaderNetgen.h
@@ -28,8 +28,10 @@ class tnlMeshReaderNetgen
 {
    public:
 
-   static bool detectDimensions( const tnlString& fileName,
-                                 int& dimensions )
+      tnlMeshReaderNetgen()
+      : dimensions( 0 ){}
+      
+   bool detectMesh( const tnlString& fileName )
    {
       fstream inputFile( fileName.getString() );
       if( ! inputFile )
@@ -52,6 +54,11 @@ class tnlMeshReaderNetgen
       if( ! inputFile )
          return false;
       getline( inputFile, line );
+      iss.str( line );
+      long int numberOfVertices;
+      iss >> numberOfVertices;
+      
+      //cout << "There are " << numberOfVertices << " vertices." << endl;
 
       /****
        * Read the first vertex and compute number of components
@@ -59,14 +66,60 @@ class tnlMeshReaderNetgen
       if( ! inputFile )
          return false;
       getline( inputFile, line );
+      iss.clear();
       iss.str( line );
-      dimensions = -1;
+      this->dimensions = -1;
       while( iss )
       {
          double aux;
          iss >> aux;
-         dimensions++;
+         this->dimensions++;
+      }
+      
+      /****
+       * Skip vertices
+       */
+      long int verticesRead( 1 );
+      while( verticesRead < numberOfVertices )
+      {
+         getline( inputFile, line );
+         if( ! inputFile )
+         {
+            cerr << "The mesh file " << fileName << " is probably corrupted, some vertices are missing." << endl;
+            return false;
+         }
+         verticesRead++;
+      }
+      
+      /****
+       * Skip whitespaces
+       */
+      inputFile >> ws;
+         
+      /****
+       * Get number of cells
+       */
+      long int numberOfCells;
+      getline( inputFile, line );
+      iss.clear();
+      iss.str( line );
+      iss >> numberOfCells;
+      //cout << "There are " << numberOfCells << " cells." << endl;
+      
+      /****
+       * Get number of vertices in a cell
+       */
+      getline( inputFile, line );
+      iss.clear();
+      iss.str( line );
+      this->verticesInCell = -2;
+      while( iss )
+      {
+         int aux;
+         iss >> aux;
+         this->verticesInCell++;
       }
+      //cout << "There are " << this->verticesInCell << " vertices in cell ..." << endl;
       return true;
    }
 
@@ -156,7 +209,7 @@ class tnlMeshReaderNetgen
           iss.str( line );
           int subdomainIndex;
           iss >> subdomainIndex;
-          for( int cellVertex = 0; cellVertex < dimensions + 1; cellVertex++ )
+          for( int cellVertex = 0; cellVertex < mesh.getCell( i ).getNumberOfVertices(); cellVertex++ )
           {
              VertexIndexType vertexIdx;
              iss >> vertexIdx;
@@ -170,8 +223,19 @@ class tnlMeshReaderNetgen
        return true;
    }
 
+   int getDimensions() const 
+   {
+      return this->dimensions;      
+   }
+   
+   int getVerticesInCell() const
+   {
+      return this->verticesInCell;
+   }
+   
    protected:
 
+      int dimensions, verticesInCell;
 
 };
 
diff --git a/src/mesh/tnlMeshSuperentityInitializerLayer.h b/src/mesh/tnlMeshSuperentityInitializerLayer.h
index dd0025712c..0232ac4214 100644
--- a/src/mesh/tnlMeshSuperentityInitializerLayer.h
+++ b/src/mesh/tnlMeshSuperentityInitializerLayer.h
@@ -19,7 +19,7 @@
 #define TNLMESHSUPERENTITYINITIALIZERLAYER_H_
 
 #include <mesh/traits/tnlStorageTraits.h>
-#include <mesh/traits/tnlDimensionsTraits.h>
+#include <mesh/tnlDimensionsTag.h>
 
 template< typename ConfigTag,
           typename EntityTag >
@@ -40,11 +40,11 @@ class tnlMeshSuperentityInitializerLayer< ConfigTag,
                                           tnlStorageTraits< true > >
    : public tnlMeshSuperentityInitializerLayer< ConfigTag,
                                                 EntityTag,
-                                                typename DimensionsTag::Previous >
+                                                typename DimensionsTag::Decrement >
 {
    typedef tnlMeshSuperentityInitializerLayer< ConfigTag,
                                                EntityTag,
-                                               typename DimensionsTag::Previous >      BaseType;
+                                               typename DimensionsTag::Decrement >      BaseType;
 
    typedef typename tnlMeshSuperentitiesTraits< ConfigTag,
                                                 EntityTag,
@@ -85,7 +85,7 @@ class tnlMeshSuperentityInitializerLayer< ConfigTag,
                                           tnlStorageTraits< false > >
    : public tnlMeshSuperentityInitializerLayer< ConfigTag,
                                                 EntityTag,
-                                                typename DimensionsTag::Previous >
+                                                typename DimensionsTag::Decrement >
 {
 };
 
@@ -93,7 +93,7 @@ template< typename ConfigTag,
           typename EntityTag >
 class tnlMeshSuperentityInitializerLayer< ConfigTag,
                                           EntityTag,
-                                          tnlDimensionsTraits< EntityTag::dimensions >,
+                                          tnlDimensionsTag< EntityTag::dimensions >,
                                           tnlStorageTraits< true > >
 {
    typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType;
@@ -107,7 +107,7 @@ template< typename ConfigTag,
           typename EntityTag >
 class tnlMeshSuperentityInitializerLayer< ConfigTag,
                                           EntityTag,
-                                          tnlDimensionsTraits< EntityTag::dimensions >,
+                                          tnlDimensionsTag< EntityTag::dimensions >,
                                           tnlStorageTraits< false > >
 {
    typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType;
diff --git a/src/mesh/tnlMeshWriterVTKLegacy.h b/src/mesh/tnlMeshWriterVTKLegacy.h
index ab5d84c7a0..2b854936c2 100644
--- a/src/mesh/tnlMeshWriterVTKLegacy.h
+++ b/src/mesh/tnlMeshWriterVTKLegacy.h
@@ -24,16 +24,46 @@
 #include <sstream>
 #include <iomanip>
 
+#include <mesh/topologies/tnlMeshTriangleTag.h>
+#include <mesh/topologies/tnlMeshQuadrilateralTag.h>
+#include <mesh/topologies/tnlMeshTetrahedronTag.h>
+#include <mesh/topologies/tnlMeshHexahedronTag.h>
+#include <mesh/tnlMeshEntity.h>
+
+
 using namespace std;
 
+enum tnlVTKMeshEntities { tnlVTKVertex = 1,
+                          tnlVTKPolyVertex = 2,
+                          tnlVTKLine = 3,
+                          tnlVTKPolyLine = 4,
+                          tnlVTKTriangle = 5,
+                          tnlVTKTriangleStrip = 6,
+                          tnlVTKPolygon = 7,
+                          tnlVTKPixel = 8,
+                          tnlVTKQuad = 9,
+                          tnlVTKTetra = 10,
+                          tnlVTKVoxel = 11,
+                          tnlVTKHexahedron = 12,
+                          tnlVTKWedge = 13,
+                          tnlVTKPyramid = 14 };
+
+template< typename MeshEntity >
+struct tnlMeshEntityVTKType{};
+
+template< typename ConfigTag > struct tnlMeshEntityVTKType< tnlMeshEntity< ConfigTag, tnlMeshTriangleTag > >     { enum { VTKType = tnlVTKTriangle }; };
+template< typename ConfigTag > struct tnlMeshEntityVTKType< tnlMeshEntity< ConfigTag, tnlMeshQuadrilateralTag > >{ enum { VTKType = tnlVTKQuad }; };
+template< typename ConfigTag > struct tnlMeshEntityVTKType< tnlMeshEntity< ConfigTag, tnlMeshTetrahedronTag > >  { enum { VTKType = tnlVTKTetra }; };
+template< typename ConfigTag > struct tnlMeshEntityVTKType< tnlMeshEntity< ConfigTag, tnlMeshHexahedronTag > >   { enum { VTKType = tnlVTKHexahedron }; };
+
 class tnlMeshWriterVTKLegacy
 {
    public:
 
    template< typename MeshType >
    static bool write( const tnlString& fileName,
-                          MeshType& mesh,
-                          bool verbose )
+                      MeshType& mesh,
+                      bool verbose )
    {
       if( MeshType::dimensions > 3 )
       {
@@ -60,16 +90,43 @@ class tnlMeshWriterVTKLegacy
                           MeshType& mesh,
                           bool verbose )
    {
+      typedef typename MeshType::CellTraits MeshEntitiesTraits;
+      typedef typename MeshEntitiesTraits::Type CellType;
       file << "# vtk DataFile Version 2.0" << endl;
       file << "TNL Mesh" << endl;
       file << "ASCII" << endl;
       file << "DATASET UNSTRUCTURED_GRID" << endl;
       file << endl;
-      file << "POINTS " << mesh.template getNumberOfEntities< 0 >() << " float" << endl;
+      file << "POINTS " << mesh.template getNumberOfEntities< 0 >() << " double" << endl;
       for( int i = 0; i < mesh.template getNumberOfEntities< 0 >(); i++ )
       {
-         file << mesh.template getEntity< 0 >( i ).getPoint();
+         mesh.template getEntity< 0 >( i ).getPoint().write( file );
+         for( int j = MeshType::dimensions; j < 3; j++ )
+            file << " 0.0";
+         file << endl;
       }
+      file << endl;
+      file << "CELLS " << mesh.template getNumberOfCells();
+      long int listSize( 0 );
+      for( int i = 0; i < mesh.template getNumberOfCells(); i++ )
+         listSize += mesh.getCell( i ).template getNumberOfSubentities< 0 >() + 1;
+      file << " " << listSize << endl;
+      for( int i = 0; i < mesh.template getNumberOfCells(); i++ )
+      {
+         int numberOfVertices = mesh.getCell( i ).template getNumberOfSubentities< 0 >();
+         file << numberOfVertices << " ";
+         for( int j = 0; j < numberOfVertices - 1; j++ )
+            file << mesh.getCell( i ).template getSubentityIndex< 0 >( j ) << " ";
+         file << mesh.getCell( i ).template getSubentityIndex< 0 >( numberOfVertices - 1 ) << endl;
+      }
+      file << endl;
+      file << "CELL_TYPES " <<  mesh.template getNumberOfCells() << endl;      
+      for( int i = 0; i < mesh.template getNumberOfCells(); i++ )      
+      {
+         file << tnlMeshEntityVTKType< CellType >::VTKType << endl;
+      }
+      file << endl;
+      return true;
    }
 
 
diff --git a/src/mesh/traits/CMakeLists.txt b/src/mesh/traits/CMakeLists.txt
index acf4304f70..4730c8c295 100755
--- a/src/mesh/traits/CMakeLists.txt
+++ b/src/mesh/traits/CMakeLists.txt
@@ -1,5 +1,4 @@
-SET( headers tnlDimensionsTraits.h
-             tnlMeshTraits.h
+SET( headers tnlMeshTraits.h
              tnlStorageTraits.h
              tnlMeshEntitiesTraits.h
              tnlMeshEntitiesTag.h
diff --git a/src/mesh/traits/tnlMeshConfigTraits.h b/src/mesh/traits/tnlMeshConfigTraits.h
new file mode 100644
index 0000000000..7f2525ef1f
--- /dev/null
+++ b/src/mesh/traits/tnlMeshConfigTraits.h
@@ -0,0 +1,63 @@
+/***************************************************************************
+                          tnlMeshConfigTraits.h  -  description
+                             -------------------
+    begin                : Aug 14, 2015
+    copyright            : (C) 2015 by Tomas Oberhuber et al.
+    email                : tomas.oberhuber@fjfi.cvut.cz
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef TNLMESHCONFIGTRAITS_H
+#define	TNLMESHCONFIGTRAITS_H
+
+#include <mesh/traits/tnlMeshEntitiesTraits.h>
+#include <mesh/traits/tnlMeshSubentitiesTraits.h>
+#include <mesh/traits/tnlMeshSuperentitiesTraits.h>
+
+template< typename MeshConfig >
+class tnlMeshConfigTraits
+{
+   public:
+      static const int meshDimensions = MeshConfig::CellType::dimensions;
+      static const int worldDimensions = MeshConfig::worldDimensions;
+
+      typedef typename MeshConfig::RealType                                     RealType;
+      typedef typename MeshConfig::GlobalIndexType                              GlobalIndexType;
+      typedef typename MeshConfig::LocalIndexType                               LocalIndexType;
+      typedef typename tnlMeshEntitiesTag< MeshConfig, 
+                                           tnlDimensionsTag< 0 > >::Tag         VertexType;
+      typedef typename MeshConfig::CellType                                     CellType;
+
+      typedef tnlDimensionsTag< meshDimensions >                                MeshDimensions;
+      typedef typename tnlMeshTraits< MeshConfig >::PointType                   Point;
+      /*typedef Entity<TConfig, TVertexTopology>                                  TVertex;
+      typedef Entity<TConfig, TCellTopology>                                    TCell;
+      typedef EntitySeed<TConfig, TCellTopology>                                TCellSeed;*/
+
+      // TODO: to asi presunout do implementace, stejne to bude vazane na TNL
+      typedef tnlArrayArray< GlobalIndexType, GlobalIndexType >                 GlobalIdArrayType;
+      typedef tnlSharedArray< GlobalIndexType, LocalIndexType >                 IdArrayAccessorType;
+      typedef tnlSharedArray< LocalIndexType, LocalIndexType >                  IdPermutationArrayAccessorType;
+      typedef tnlArray< Point, GlobalIndexType>                                 PointArrayType;
+      //typedef tnlArray<TCellSeed, TGlobalIndex>                         TCellSeedArray;
+
+      template< typename Dimensions > using EntityTraits = 
+         tnlMeshEntitiesTraits< MeshConfig, Dimensions >;
+      
+      template< typename MeshEntity, typename SubDimensions > using SubentityTraits =
+         tnlMeshSubentitiesTraits< MeshConfig, MeshEntity, SubDimensions >;
+      
+      template< typename MeshEntityy, typename SuperDimensions > using SuperentityTraits =
+         tnlMeshSuperentitiesTraits< MeshConfig, MeshEntity, SuperDimensions >;
+};
+
+#endif	/* TNLMESHCONFIGTRAITS_H */
+
diff --git a/src/mesh/traits/tnlMeshEntitiesTag.h b/src/mesh/traits/tnlMeshEntitiesTag.h
index 001d9b2fa3..26f14cd35b 100644
--- a/src/mesh/traits/tnlMeshEntitiesTag.h
+++ b/src/mesh/traits/tnlMeshEntitiesTag.h
@@ -22,22 +22,22 @@
 #include <mesh/traits/tnlMeshTraits.h>
 
 template< typename ConfigTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshEntitiesTag
 {
    public:
 
-   typedef typename tnlSubentities< typename ConfigTag::CellTag,
-                                    DimensionsTraits::value >::Tag Tag;
+   typedef typename tnlSubentities< typename ConfigTag::CellType,
+                                    DimensionsTag::value >::Tag Tag;
 };
 
 template< typename ConfigTag >
 class tnlMeshEntitiesTag< ConfigTag,
-                          typename tnlMeshTraits< ConfigTag >::DimensionsTraits >
+                          typename tnlMeshTraits< ConfigTag >::DimensionsTag >
 {
    public:
 
-   typedef typename ConfigTag::CellTag Tag;
+   typedef typename ConfigTag::CellType Tag;
 };
 
 
diff --git a/src/mesh/traits/tnlMeshEntitiesTraits.h b/src/mesh/traits/tnlMeshEntitiesTraits.h
index bc6217b57c..bcd95070e8 100644
--- a/src/mesh/traits/tnlMeshEntitiesTraits.h
+++ b/src/mesh/traits/tnlMeshEntitiesTraits.h
@@ -26,16 +26,17 @@
 #include <mesh/tnlMeshEntityKey.h>
 
 template< typename ConfigTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshEntitiesTraits
-{
-   enum { storageEnabled = tnlMeshEntityStorage< ConfigTag,
-                                                 DimensionsTraits::value>::enabled };
+{   
+   /*enum { storageEnabled = tnlMeshEntityStorage< ConfigTag,
+                                                 DimensionsTag::value>::enabled };*/
+   static const bool storageEnabled = ConfigTag::entityStorage( DimensionsTag::value );
 
    typedef typename ConfigTag::GlobalIndexType                    GlobalIndexType;
    typedef typename ConfigTag::LocalIndexType                     LocalIndexType;
    typedef typename tnlMeshEntitiesTag< ConfigTag,
-                                        DimensionsTraits >::Tag   EntityTag;
+                                        DimensionsTag >::Tag   EntityTag;
    typedef tnlMeshEntityKey< ConfigTag, EntityTag >               Key;
 
    public:
diff --git a/src/mesh/traits/tnlMeshSubentitiesTraits.h b/src/mesh/traits/tnlMeshSubentitiesTraits.h
index b520d32f4a..a5bcf83429 100644
--- a/src/mesh/traits/tnlMeshSubentitiesTraits.h
+++ b/src/mesh/traits/tnlMeshSubentitiesTraits.h
@@ -26,16 +26,17 @@
 
 template< typename ConfigTag,
           typename EntityTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshSubentitiesTraits
 {
-   enum { storageEnabled = tnlMeshSubentityStorage< ConfigTag,
+   /*enum { storageEnabled = tnlMeshSubentityStorage< ConfigTag,
                                                     EntityTag,
-                                                    DimensionsTraits::value >::enabled };
+                                                    DimensionsTag::value >::enabled };*/
+   static const bool storageEnabled = ConfigTag::subentityStorage( EntityTag(), DimensionsTag::value );
 
    typedef typename ConfigTag::GlobalIndexType                  GlobalIndexType;
    typedef typename ConfigTag::LocalIndexType                   LocalIndexType;
-   typedef tnlSubentities< EntityTag, DimensionsTraits::value > Tag;
+   typedef tnlSubentities< EntityTag, DimensionsTag::value > Tag;
 
 public:
    typedef tnlMeshEntity< ConfigTag, EntityTag >                 EntityType;
diff --git a/src/mesh/traits/tnlMeshSuperentitiesTraits.h b/src/mesh/traits/tnlMeshSuperentitiesTraits.h
index 3946114bd5..c07e9ca2f0 100644
--- a/src/mesh/traits/tnlMeshSuperentitiesTraits.h
+++ b/src/mesh/traits/tnlMeshSuperentitiesTraits.h
@@ -28,12 +28,13 @@
 
 template< typename ConfigTag,
           typename EntityTag,
-          typename DimensionsTraits >
+          typename DimensionsTag >
 class tnlMeshSuperentitiesTraits
 {
-   enum { storageEnabled = tnlMeshSuperentityStorage< ConfigTag,
+   /*enum { storageEnabled = tnlMeshSuperentityStorage< ConfigTag,
                                                       EntityTag,
-                                                      DimensionsTraits::value >::enabled };
+                                                      DimensionsTag::value >::enabled };*/
+   static const bool storageEnabled = ConfigTag::template superentityStorage< EntityTag >( EntityTag(), DimensionsTag::value );
 
    typedef typename ConfigTag::GlobalIndexType                              GlobalIndexType;
    typedef typename ConfigTag::LocalIndexType                               LocalIndexType;
@@ -43,10 +44,10 @@ class tnlMeshSuperentitiesTraits
    typedef tnlMeshEntity< ConfigTag, EntityTag >                            EntityType;
    typedef typename
       tnlMeshEntitiesTraits< ConfigTag,
-                             DimensionsTraits >::Tag                        SuperentityTag;
+                             DimensionsTag >::Tag                        SuperentityTag;
    typedef typename
       tnlMeshEntitiesTraits< ConfigTag,
-                             DimensionsTraits >::Type                       SuperentityType;
+                             DimensionsTag >::Type                       SuperentityType;
 
    typedef tnlStorageTraits< storageEnabled >                               SuperentityStorageTag;
 
diff --git a/src/mesh/traits/tnlMeshTraits.h b/src/mesh/traits/tnlMeshTraits.h
index f324e03c10..595e3f82a2 100644
--- a/src/mesh/traits/tnlMeshTraits.h
+++ b/src/mesh/traits/tnlMeshTraits.h
@@ -19,7 +19,7 @@
 #define TNLMESHTRAITS_H_
 
 #include <core/vectors/tnlStaticVector.h>
-#include <mesh/traits/tnlDimensionsTraits.h>
+#include <mesh/tnlDimensionsTag.h>
 
 template< typename ConfigTag,
           typename EntityTag >
@@ -30,13 +30,13 @@ class tnlMeshTraits
 {
    public:
 
-   enum { meshDimensions = ConfigTag::CellTag::dimensions };
+   enum { meshDimensions = ConfigTag::CellType::dimensions };
 
    enum { worldDimensions = ConfigTag::worldDimensions };
 
-   typedef tnlDimensionsTraits< meshDimensions >                            DimensionsTraits;
+   typedef tnlDimensionsTag< meshDimensions >                            DimensionsTag;
    typedef tnlStaticVector< worldDimensions, typename ConfigTag::RealType > PointType;
-   typedef tnlMeshEntity< ConfigTag, typename ConfigTag::CellTag >          CellType;
+   typedef tnlMeshEntity< ConfigTag, typename ConfigTag::CellType >          CellType;
 };
 
 
diff --git a/tests/unit-tests/mesh/tnlMeshEntityTester.h b/tests/unit-tests/mesh/tnlMeshEntityTester.h
index fdf5221e2a..bc0f709b84 100644
--- a/tests/unit-tests/mesh/tnlMeshEntityTester.h
+++ b/tests/unit-tests/mesh/tnlMeshEntityTester.h
@@ -31,20 +31,42 @@
 #include <mesh/topologies/tnlMeshTriangleTag.h>
 #include <mesh/topologies/tnlMeshTetrahedronTag.h>
     
-typedef tnlMeshConfigBase< tnlMeshTriangleTag, 2, double, int, int, void > TestTriangleEntityTag;
+//typedef tnlMeshConfigBase< tnlMeshTriangleTag, 2, double, int, int, void > TestTriangleEntityTag;
 typedef tnlMeshConfigBase< tnlMeshEdgeTag, 2, double, int, int, void > TestEdgeEntityTag;
 typedef tnlMeshConfigBase< tnlMeshVertexTag, 2, double, int, int, void > TestVertexEntityTag;
 
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestTriangleEntityTag, tnlMeshVertexTag, Dimensions >
+class TestTriangleMeshConfig : public tnlMeshConfigBase< tnlMeshTriangleTag >
 {
-   enum { enabled = true };
+   public:
+      
+      template< typename MeshEntity >
+      static constexpr bool subentityStorage( MeshEntity entity, int subentityDimensions )
+      {
+         return true;
+      }  
+      
+      template< typename MeshEntity >
+      static constexpr bool superentityStorage( MeshEntity entity, int superentityDimensions )
+      {
+         return true;
+      }  
 };
 
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestTriangleEntityTag, tnlMeshEdgeTag, Dimensions >
+class TestTetrahedronMeshConfig : public tnlMeshConfigBase< tnlMeshTetrahedronTag >
 {
-   enum { enabled = true };
+   public:
+      
+      template< typename MeshEntity >
+      static constexpr bool subentityStorage( MeshEntity entity, int subentityDimensions )
+      {
+         return true;
+      }  
+      
+      template< typename MeshEntity >
+      static constexpr bool superentityStorage( MeshEntity entity, int superentityDimensions )
+      {
+         return true;
+      }  
 };
 
 template< typename RealType, typename Device, typename IndexType >
@@ -155,7 +177,10 @@ class tnlMeshEntityTester : public CppUnit :: TestCase
 
    void triangleMeshEntityTest()
    {
-      typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshTriangleTag > TriangleMeshEntityType;
+      typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTag > TriangleMeshEntityType;
+
+      static_assert( TriangleMeshEntityType::SubentitiesTraits< 1 >::available, "Testing triangular mesh does not store edges as required." );
+      static_assert( TriangleMeshEntityType::SubentitiesTraits< 0 >::available, "" );
       typedef tnlMeshEntity< TestEdgeEntityTag, tnlMeshEdgeTag > EdgeMeshEntityType;
       typedef tnlMeshEntity< TestVertexEntityTag, tnlMeshVertexTag > VertexMeshEntityType;
       typedef typename VertexMeshEntityType::PointType PointType;
@@ -213,13 +238,13 @@ class tnlMeshEntityTester : public CppUnit :: TestCase
 
    void tetrahedronMeshEntityTest()
    {
-      typedef tnlMeshConfigBase< tnlMeshTetrahedronTag, 3, RealType, IndexType, IndexType, void > TestTetrahedronEntityTag;
+      //typedef tnlMeshConfigBase< tnlMeshTetrahedronTag, 3, RealType, IndexType, IndexType, void > TestTetrahedronEntityTag;
       typedef tnlMeshConfigBase< tnlMeshTriangleTag, 3, RealType, IndexType, IndexType, void > TestTriangleEntityTag;
       typedef tnlMeshConfigBase< tnlMeshEdgeTag, 3, RealType, IndexType, IndexType, void > TestEdgeEntityTag;
       typedef tnlMeshConfigBase< tnlMeshVertexTag, 3, RealType, IndexType, IndexType, void > TestVertexEntityTag;
 
-      typedef tnlMeshEntity< TestTetrahedronEntityTag, tnlMeshTetrahedronTag > TetrahedronMeshEntityType;
-      typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshTriangleTag > TriangleMeshEntityType;
+      typedef tnlMeshEntity< TestTetrahedronMeshConfig, tnlMeshTetrahedronTag > TetrahedronMeshEntityType;
+      typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTag > TriangleMeshEntityType;
       typedef tnlMeshEntity< TestEdgeEntityTag, tnlMeshEdgeTag > EdgeMeshEntityType;
       typedef tnlMeshEntity< TestVertexEntityTag, tnlMeshVertexTag > VertexMeshEntityType;
       typedef typename VertexMeshEntityType::PointType PointType;
@@ -339,9 +364,9 @@ class tnlMeshEntityTester : public CppUnit :: TestCase
    void twoTrianglesTest()
    {
 
-       typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshTriangleTag > TriangleMeshEntityType;
-       typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshEdgeTag > EdgeMeshEntityType;
-       typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshVertexTag > VertexMeshEntityType;
+       typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTag > TriangleMeshEntityType;
+       typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshEdgeTag > EdgeMeshEntityType;
+       typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshVertexTag > VertexMeshEntityType;
        typedef typename VertexMeshEntityType::PointType PointType;
        CPPUNIT_ASSERT( PointType::getType() == ( tnlStaticVector< 2, RealType >::getType() ) );
 
diff --git a/tests/unit-tests/mesh/tnlMeshTester.h b/tests/unit-tests/mesh/tnlMeshTester.h
index efc5858d7f..acb8406d94 100644
--- a/tests/unit-tests/mesh/tnlMeshTester.h
+++ b/tests/unit-tests/mesh/tnlMeshTester.h
@@ -35,72 +35,44 @@
 #include <mesh/topologies/tnlMeshHexahedronTag.h>
 #include <mesh/tnlMeshInitializer.h>
 
-typedef tnlMeshConfigBase< tnlMeshTriangleTag, 2, double, int, int, void > TestTriangleMeshConfig;
-
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestTriangleMeshConfig, tnlMeshVertexTag, Dimensions >
-{
-   enum { enabled = true };
-};
-
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestTriangleMeshConfig, tnlMeshEdgeTag, Dimensions >
+class TestTriangleMeshConfig : public tnlMeshConfigBase< tnlMeshTriangleTag >
 {
-   enum { enabled = true };
-};
- 
-typedef tnlMeshConfigBase< tnlMeshQuadrilateralTag, 2, double, int, int, void > TestQuadrilateralMeshConfig;
-
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestQuadrilateralMeshConfig, tnlMeshVertexTag, Dimensions >
-{
-   enum { enabled = true };
-};
+   public:
 
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestQuadrilateralMeshConfig, tnlMeshEdgeTag, Dimensions >
-{
-   enum { enabled = true };
+      static constexpr bool entityStorage( int dimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; };
 };
 
-typedef tnlMeshConfigBase< tnlMeshTetrahedronTag, 3, double, int, int, void > TestTetrahedronMeshConfig;
-
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestTetrahedronMeshConfig, tnlMeshVertexTag, Dimensions >
+class TestQuadrilateralMeshConfig : public tnlMeshConfigBase< tnlMeshQuadrilateralTag >
 {
-   enum { enabled = true };
-};
+   public:
 
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestTetrahedronMeshConfig, tnlMeshEdgeTag, Dimensions >
-{
-   enum { enabled = true };
+      static constexpr bool entityStorage( int dimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; };
 };
 
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestTetrahedronMeshConfig, tnlMeshTriangleTag, Dimensions >
+class TestTetrahedronMeshConfig : public tnlMeshConfigBase< tnlMeshTetrahedronTag >
 {
-    enum { enabled = true };
-};
-
-typedef tnlMeshConfigBase< tnlMeshHexahedronTag, 3, double, int, int, void > TestHexahedronMeshConfig;
+   public:
 
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestHexahedronMeshConfig, tnlMeshVertexTag, Dimensions >
-{
-  enum { enabled = true };
+      static constexpr bool entityStorage( int dimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; };
 };
 
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestHexahedronMeshConfig, tnlMeshEdgeTag, Dimensions >
+class TestHexahedronMeshConfig : public tnlMeshConfigBase< tnlMeshHexahedronTag >
 {
-  enum { enabled = true };
-};
+   public:
 
-template< int Dimensions >
-struct tnlMeshSuperentityStorage< TestHexahedronMeshConfig, tnlMeshTriangleTag, Dimensions >
-{
-   enum { enabled = true };
+      static constexpr bool entityStorage( int dimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return true; };
+      template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; };
 };
 
 template< typename RealType, typename Device, typename IndexType >
diff --git a/tools/src/tnl-mesh-convert.h b/tools/src/tnl-mesh-convert.h
index bd0b694b7b..cef12af4bf 100644
--- a/tools/src/tnl-mesh-convert.h
+++ b/tools/src/tnl-mesh-convert.h
@@ -29,72 +29,85 @@
 #include <mesh/tnlMeshIntegrityChecker.h>
 #include <core/mfilename.h>
 
-template< int Dimensions >
-bool readMeshWithDimensions( const tnlParameterContainer& parameters )
+template< typename MeshReader,
+          typename MeshType >
+bool convertMesh( const tnlParameterContainer& parameters )
 {
    const tnlString& inputFileName = parameters.getParameter< tnlString >( "input-file" );
    const tnlString& outputFileName = parameters.getParameter< tnlString >( "output-file" );
-   const tnlString inputFileExt = getFileExtension( inputFileName );
    const tnlString outputFileExt = getFileExtension( outputFileName );
 
-   if( Dimensions == 2 )
-   {
-      typedef tnlMesh< tnlMeshConfigBase< tnlMeshTriangleTag > > MeshType;
-      MeshType mesh;
-      if( inputFileExt == "ng" &&
-          ! tnlMeshReaderNetgen::readMesh<>( inputFileName, mesh, true ) )
-         return false;
-      tnlMeshInitializer< tnlMeshConfigBase< tnlMeshTriangleTag > > meshInitializer;
-      meshInitializer.setVerbose( true );
-      if( ! meshInitializer.initMesh( mesh ) )
-         return false;
-      if( ! tnlMeshIntegrityChecker< MeshType >::checkMesh( mesh ) )
+   MeshType mesh;
+   if( ! MeshReader::readMesh( inputFileName, mesh, true ) )
+      return false;
+   tnlMeshInitializer< typename MeshType::Config > meshInitializer;
+   meshInitializer.setVerbose( true );
+   if( ! meshInitializer.initMesh( mesh ) )
+      return false;
+   if( ! tnlMeshIntegrityChecker< MeshType >::checkMesh( mesh ) )
+      return false;
+   cout << "Writing the mesh to a file " << outputFileName << "." << endl;
+   if( outputFileExt == "tnl" )
+   {         
+      if( ! mesh.save( outputFileName ) )
+      {
+         cerr << "I am not able to write the mesh into the file " << outputFileName << "." << endl;
          return false;
-      tnlString outputFile;
-      cout << "Writing the 2D mesh to the file " << outputFile << "." << endl;
-      if( outputFileExt == "tnl" )
-      {         
-         if( ! mesh.save( outputFile ) )
-         {
-            cerr << "I am not able to write the mesh into the file " << outputFile << "." << endl;
-            return false;
-         }
       }
-      if( outputFileExt == "vtk" )
+   }
+   if( outputFileExt == "vtk" )
+   {
+      if( ! tnlMeshWriterVTKLegacy::write( outputFileName, mesh, true ) )
+      {
+         cerr << "I am not able to write the mesh into the file " << outputFileName << "." << endl;
+         return false;         
+      }
+      return true;
+   }   
+}
+
+bool readNetgenMesh( const tnlParameterContainer& parameters )
+{
+   const tnlString& inputFileName = parameters.getParameter< tnlString >( "input-file" );
+   
+   tnlMeshReaderNetgen meshReader;
+   if( ! meshReader.detectMesh( inputFileName ) )
+      return false;
+
+   cout << "Reading mesh with " << meshReader.getDimensions() << " dimensions..." << endl;
+   
+   if( meshReader.getDimensions() == 2 )
+   {
+      if( meshReader.getVerticesInCell() == 3 )
       {
-         if( ! tnlMeshWriterVTKLegacy::write( outputFileName, mesh, true ) )
-         {
-            cerr << "I am not able to write the mesh into the file " << outputFile << "." << endl;
-            return false;         
-         }
+         typedef tnlMesh< tnlMeshConfigBase< tnlMeshTriangleTag > > MeshType;
+         cout << "Mesh consisting of triangles was detected ... " << endl;
+         return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters );
       }
+      if( meshReader.getVerticesInCell() == 4 )
+      {
+         typedef tnlMesh< tnlMeshConfigBase< tnlMeshQuadrilateralTag > > MeshType;
+         cout << "Mesh consisting of quadrilaterals was detected ... " << endl;
+         return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters );
+      }            
    }
-   if( Dimensions == 3 )
+   if( meshReader.getDimensions() == 3 )
    {
-      typedef tnlMesh< tnlMeshConfigBase< tnlMeshTetrahedronTag > > MeshType;
-      MeshType mesh;
-      if( inputFileExt == "ng" &&
-          ! tnlMeshReaderNetgen::readMesh<>( inputFileName, mesh, true ) )
-         return false;
-      tnlMeshInitializer< tnlMeshConfigBase< tnlMeshTetrahedronTag > > meshInitializer;
-      meshInitializer.setVerbose( true );
-      if( ! meshInitializer.initMesh( mesh ) )
-         return false;
-      if( ! tnlMeshIntegrityChecker< MeshType >::checkMesh( mesh ) )
-         return false;
-      tnlString outputFile;
-      if( parameters.getParameter< tnlString >( "output-file", outputFile ) )
+      if( meshReader.getVerticesInCell() == 4 )
       {
-         cout << "Writing the 3D mesh to the file " << outputFile << "." << endl;
-         if( ! mesh.save( outputFile ) )
-         {
-            cerr << "I am not able to safe the mesh into the file " << outputFile << "." << endl;
-            return false;
-         }
+         typedef tnlMesh< tnlMeshConfigBase< tnlMeshTetrahedronTag > > MeshType;
+         cout << "Mesh consisting of tetrahedrons was detected ... " << endl;
+         return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters );
+      }
+      if( meshReader.getVerticesInCell() == 8 )
+      {
+         typedef tnlMesh< tnlMeshConfigBase< tnlMeshHexahedronTag > > MeshType;
+         cout << "Mesh consisting of hexahedrons was detected ... " << endl;
+         return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters );
       }
    }
-
-   return true;
+   cerr << "Wrong mesh dimensions were detected ( " << meshReader.getDimensions() << " )." << endl;
+   return false;
 }
 
 bool convertMesh( const tnlParameterContainer& parameters )
@@ -103,19 +116,8 @@ bool convertMesh( const tnlParameterContainer& parameters )
 
    const tnlString fileExt = getFileExtension( inputFileName );
    if( fileExt == "ng" )
-   {
-      int dimensions;
-      if( ! tnlMeshReaderNetgen::detectDimensions( inputFileName, dimensions ) )
-         return false;
-      if( dimensions == 2 &&
-          ! readMeshWithDimensions< 2 >( parameters ) )
-         return false;
-      if( dimensions == 3 &&
-          ! readMeshWithDimensions< 3 >( parameters ) )
-         return false;
-   }
-
-   return true;
+      return readNetgenMesh( parameters );
 }
 
+
 #endif /* TNL_MESH_CONVERT_H_ */
diff --git a/tools/src/tnl-view.cpp b/tools/src/tnl-view.cpp
index 45a285f2fd..99e32b54d0 100644
--- a/tools/src/tnl-view.cpp
+++ b/tools/src/tnl-view.cpp
@@ -119,7 +119,7 @@ int main( int argc, char* argv[] )
       /*tnlString meshFile = parameters. getParameter< tnlString >( "mesh" );
       struct MeshConfig : public tnlMeshConfigBase< 2 >
       {
-         typedef tnlMeshTriangleTag CellTag;
+         typedef tnlMeshTriangleTag CellType;
       };
       tnlMesh< MeshConfig > mesh;
       if( ! mesh.load( meshFile ) )
-- 
GitLab