diff --git a/Solver/TESTCASES/Stommel.lua b/Solver/TESTCASES/Stommel.lua
index e420a01be00b27003d001b9b569c2fd2bd6a281d..bc3c89380dabf3c86b86db405f0d251dae8d9d13 100644
--- a/Solver/TESTCASES/Stommel.lua
+++ b/Solver/TESTCASES/Stommel.lua
@@ -1,8 +1,9 @@
 
+order = 3
 model = GModel()
 model:load ('stommel_square.msh')
 dg = dgSystemOfEquations (model)
-dg:setOrder (1)
+dg:setOrder (order)
 dg:setConservationLaw('ShallowWater2d')
 dg:addBoundaryCondition('Wall','Wall')
 dg:setup()
@@ -10,9 +11,11 @@ dg:setup()
 dg:exportSolution('output/solution_00000')
 
 for i=1,1000 do
-  norm = dg:RK44(50)
-  if ( i%100 ==0 ) then
+  norm = dg:RK44(80*(3/(2.*order+1)))
+  if ( i%10 ==0 ) then
     print ('iter ', i, norm)
+  end
+  if ( i%100 ==0 ) then
     dg:exportSolution(string.format('output/solution-%05d',i))
   end
 end
diff --git a/Solver/TESTCASES/WavePulse.lua b/Solver/TESTCASES/WavePulse.lua
index 3d33870d1f04b3cde3d4ca3ef53945793572daee..0d5c1e189a8978cfddfb3439c4273b7f55021c6f 100644
--- a/Solver/TESTCASES/WavePulse.lua
+++ b/Solver/TESTCASES/WavePulse.lua
@@ -19,7 +19,7 @@ end
      Example of a lua program driving the DG code
 --]]
 
-order = 1
+order = 5
 print'*** Loading the mesh and the model ***'
 myModel   = GModel  ()
 myModel:load ('square.geo')
@@ -43,7 +43,7 @@ DG:exportSolution('output/solution_000')
 
 print'*** solve ***'
 
-dt = 0.005;
+dt = 0.00125;
 for i=1,1000 do
     norm = DG:RK44(dt)
     print('*** ITER ***',i,norm)
diff --git a/Solver/dgConservationLaw.h b/Solver/dgConservationLaw.h
index dbd7cdf68b683a7f6d1ff2b49d99384908cadcc1..f8c9f840ecfc6842f2fa95211b20dab1dfe46696 100644
--- a/Solver/dgConservationLaw.h
+++ b/Solver/dgConservationLaw.h
@@ -55,10 +55,10 @@ class dgConservationLaw {
 
 dgConservationLaw *dgNewConservationLawAdvection(const std::string vname,const std::string nuname);
 dgConservationLaw *dgNewConservationLawShallowWater2d();
-dgConservationLaw *dgNewConservationLawWaveEquation();
+dgConservationLaw *dgNewConservationLawWaveEquation(int);
 dgConservationLaw *dgNewPerfectGasLaw2d();
 
-dgBoundaryCondition *dgNewBoundaryConditionWaveEquationWall();
+dgBoundaryCondition *dgNewBoundaryConditionWaveEquationWall(int);
 dgBoundaryCondition *dgNewBoundaryConditionShallowWater2dWall();
 dgBoundaryCondition *dgNewBoundaryConditionPerfectGasLaw2dWall();
 dgBoundaryCondition *dgNewBoundaryConditionPerfectGasLaw2dFreeStream(std::string&);
diff --git a/Solver/dgConservationLawPerfectGas.cpp b/Solver/dgConservationLawPerfectGas.cpp
index eb0dae9ed034c3ebb5fde2e985b083d44027ac98..e90235a0d4da4bdd6e2b250e58f6ad6571756d1c 100644
--- a/Solver/dgConservationLawPerfectGas.cpp
+++ b/Solver/dgConservationLawPerfectGas.cpp
@@ -225,7 +225,7 @@ class dgPerfectGasLaw2d : public dgConservationLaw {
   }
   dgPerfectGasLaw2d() 
   {
-    _nbf = 4; // H U(=Hu) V(=Hv)
+    _nbf = 4; // \rho \rho u \rho v \rho e
   }
 };
 
diff --git a/Solver/dgConservationLawWaveEquation.cpp b/Solver/dgConservationLawWaveEquation.cpp
index b5d2e457fb56c5a4d3729c536d27678392de23a7..ab6447ed281d3b2b34a67fc283610e1bfb76dddd 100644
--- a/Solver/dgConservationLawWaveEquation.cpp
+++ b/Solver/dgConservationLawWaveEquation.cpp
@@ -5,78 +5,74 @@
 // dv/dt + 1/rho  dp/dy = 0
 static double c=1;
 static double rho=1;
+
 class dgConservationLawWaveEquation : public dgConservationLaw {
+  int _DIM;
   class hyperbolicFlux : public dataCacheDouble {
     dataCacheDouble /
+    const int _DIM,_nbf;    
     public:
-    hyperbolicFlux(dataCacheMap &cacheMap):
-      sol(cacheMap.get("Solution",this))
+    hyperbolicFlux(dataCacheMap &cacheMap,int DIM):
+      sol(cacheMap.get("Solution",this)),_DIM(DIM),_nbf(DIM+1)
       {};
-    void _eval () { 
+    void _eval () {
       int nQP = sol().size1();
       if(_value.size1() != nQP)
-        _value=fullMatrix<double>(nQP,9);
+        _value=fullMatrix<double>(nQP,3*_nbf);
+      _value.scale(0.);
       for(int i=0; i< nQP; i++) {
-        double p = sol(i,0);
-        double u = sol(i,1);
-        double v = sol(i,2);
-        // flux_x
-        _value(i,0) = c*c*rho*u;
-        _value(i,1) = p/rho; 
-        _value(i,2) = 0;
-        // flux_y
-        _value(i,3) = c*c*rho*v;
-        _value(i,4) = 0;
-        _value(i,5) = p/rho;
-        // flux_z
-        _value(i,6) = 0;
-        _value(i,7) = 0;
-        _value(i,8) = 0;
+        const double p = sol(i,0);	
+	for (int j=0;j<_DIM;j++){
+	  _value(i,0  +j*_nbf) = c*c*rho*sol(i,j+1);
+	  _value(i,j+1+j*_nbf) = p/rho;
+	}
       }
     }
   };
   class riemann : public dataCacheDouble {
     dataCacheDouble &normals, &solL, &solR;
+    const int _DIM,_nbf;
     public:
-    riemann(dataCacheMap &cacheMapLeft, dataCacheMap &cacheMapRight):
+    riemann(dataCacheMap &cacheMapLeft, dataCacheMap &cacheMapRight, int DIM):
       normals(cacheMapLeft.get("Normals", this)),
       solL(cacheMapLeft.get("Solution", this)),
-      solR(cacheMapRight.get("Solution", this))
+      solR(cacheMapRight.get("Solution", this)),
+      _DIM(DIM),_nbf(DIM+1)
       {};
     void _eval () { 
       int nQP = solL().size1();
       if(_value.size1() != nQP)
-        _value = fullMatrix<double>(nQP,6);
+        _value = fullMatrix<double>(nQP,2*_nbf);
       for(int i=0; i< nQP; i++) {
-        double nx = normals(0,i);
-        double ny = normals(1,i);
-        double unL = nx*solL(i,1) + ny*solL(i,2);
-        double unR = nx*solR(i,1) + ny*solR(i,2);
-        double pR = solR(i,0);
+	const double n[3] = {normals(0,i),normals(1,i),normals(2,i)};
+	double unL=0,unR=0;
+	for (int j=0;j<_DIM;j++){	  
+	  unL += n[j]*solL(i,j+1);
+	  unR += n[j]*solR(i,j+1);
+	}
+	double pR = solR(i,0);
         double pL = solL(i,0);
 
-        double pRiemann =  0.5 * (pL+pR + (unL-unR)*(rho*c));
+        double pRiemann  =  0.5 * (pL+pR + (unL-unR)*(rho*c));
         double unRiemann =  0.5 * (unL+unR + (pL-pR)/(rho*c));
 
         double Fp = -rho*c*c*unRiemann;
         double Fun = -pRiemann/rho;
 
         _value(i,0) = Fp;
-        _value(i,1) = Fun*nx;
-        _value(i,2) = Fun*ny;
-
-        _value(i,3) = -_value(i,0);
-        _value(i,4) = -_value(i,1);
-        _value(i,5) = -_value(i,2);
+	for (int j=0;j<_DIM;j++)
+	  _value(i,j+1) = Fun*n[j];
+	for (int j=0;j<_nbf;j++)
+	  _value(i,j+_nbf) = -_value(i,j);	
       }
     }
   };
   public:
   dataCacheDouble *newConvectiveFlux( dataCacheMap &cacheMap) const {
-    return new hyperbolicFlux(cacheMap);
+    return new hyperbolicFlux(cacheMap,_DIM);
   }
   dataCacheDouble *newRiemannSolver( dataCacheMap &cacheMapLeft, dataCacheMap &cacheMapRight) const {
-    return new riemann(cacheMapLeft, cacheMapRight);
+    return new riemann(cacheMapLeft, cacheMapRight,_DIM);
   }
   dataCacheDouble *newDiffusiveFlux( dataCacheMap &cacheMap) const {
     return 0;
@@ -84,44 +80,45 @@ class dgConservationLawWaveEquation : public dgConservationLaw {
   dataCacheDouble *newSourceTerm (dataCacheMap &cacheMap) const {
     return 0;
   }
-  dgConservationLawWaveEquation() 
+  dgConservationLawWaveEquation(int DIM) : _DIM(DIM)
   {
-    _nbf = 3; // H U(=Hu) V(=Hv)
+    _nbf = 1 + _DIM; // H U(=Hu) V(=Hv)
   }
 };
 
 class dgBoundaryConditionWaveEquationWall : public dgBoundaryCondition {
+  int _DIM;
   class term : public dataCacheDouble {
-    dataCacheDouble &sol,&normals;
+    int _DIM;
+    dataCacheDouble &sol,&normals;    
     public:
-    term(dataCacheMap &cacheMap):
+    term(dataCacheMap &cacheMap, int DIM):
     sol(cacheMap.get("Solution",this)),
-    normals(cacheMap.get("Normals",this)){}
+    normals(cacheMap.get("Normals",this)),
+    _DIM(DIM){}
     void _eval () { 
       int nQP = sol().size1();
       if(_value.size1() != nQP)
-        _value = fullMatrix<double>(nQP,3);
+        _value = fullMatrix<double>(nQP,_DIM+1);
       for(int i=0; i< nQP; i++) {
-        double nx = normals(0,i);
-        double ny = normals(1,i);
-        double p = sol(i,0);
-
+	const double n[3] = {normals(0,i),normals(1,i),normals(2,i)};
+        double p = sol(i,0);	
         _value(i,0) = 0;
-        _value(i,1) = -p/rho*nx;
-        _value(i,2) = -p/rho*ny;
+	for (int j=0;j<_DIM;j++)
+	  _value(i,j+1) = -p/rho*n[j];
       }
     }
   };
   public:
-  dgBoundaryConditionWaveEquationWall(){}
+  dgBoundaryConditionWaveEquationWall(int DIM):_DIM(DIM){}
   dataCacheDouble *newBoundaryTerm(dataCacheMap &cacheMapLeft) const {
-    return new term(cacheMapLeft);
+    return new term(cacheMapLeft,_DIM);
   }
 };
 
-dgConservationLaw *dgNewConservationLawWaveEquation() {
-  return new dgConservationLawWaveEquation();
+dgConservationLaw *dgNewConservationLawWaveEquation(int DIM) {
+  return new dgConservationLawWaveEquation(DIM);
 }
-dgBoundaryCondition *dgNewBoundaryConditionWaveEquationWall() {
-  return new dgBoundaryConditionWaveEquationWall();
+dgBoundaryCondition *dgNewBoundaryConditionWaveEquationWall(int DIM) {
+  return new dgBoundaryConditionWaveEquationWall(DIM);
 }
diff --git a/Solver/dgGroupOfElements.cpp b/Solver/dgGroupOfElements.cpp
index 62778f75d2fdab635841205bf3232d05e9290836..b2c8a303d62dfa9b7eed5dae9a2a650a4f50486a 100644
--- a/Solver/dgGroupOfElements.cpp
+++ b/Solver/dgGroupOfElements.cpp
@@ -150,6 +150,7 @@ void dgGroupOfFaces::addFace(const MFace &topoFace, int iElLeft, int iElRight){
   for (int j=0; j<geomClosure.size() ; j++)
     vertices.push_back( elLeft.getVertex(geomClosure[j]) );
   // triangular face
+  printf("the topological face has %d vertices and the geometrical %d\n",topoFace.getNumVertices(),vertices.size());
   if (topoFace.getNumVertices() == 3){
     switch(vertices.size()){
       case 3  : _faces.push_back(new MTriangle (vertices) ); break;
@@ -161,7 +162,9 @@ void dgGroupOfFaces::addFace(const MFace &topoFace, int iElLeft, int iElRight){
     }
   }
   // quad face 2 do
-  else throw;
+  else {
+    throw;
+  }
 }
 
 void dgGroupOfFaces::addEdge(const MEdge &topoEdge, int iElLeft, int iElRight) {
diff --git a/Solver/dgSystemOfEquations.cpp b/Solver/dgSystemOfEquations.cpp
index 12add17a2b79cd69dcbfdd1945570a14b547fcce..6372d32deae57b24eb77b89ebab6d36459d0a4c8 100644
--- a/Solver/dgSystemOfEquations.cpp
+++ b/Solver/dgSystemOfEquations.cpp
@@ -63,7 +63,7 @@ int dgSystemOfEquations::setConservationLaw(lua_State *L){
   //int argc = (int)luaL_checknumber(L,0);
   _cLawName = std::string (luaL_checkstring(L, 1));
   if (_cLawName == "WaveEquation")
-    _claw = dgNewConservationLawWaveEquation();
+    _claw = dgNewConservationLawWaveEquation(_dimension);
   else if (_cLawName == "ShallowWater2d")
     _claw = dgNewConservationLawShallowWater2d(); 
   else if  (_cLawName == "PerfectGas2d")
@@ -94,7 +94,7 @@ int dgSystemOfEquations::addBoundaryCondition (lua_State *L){
   //specific boundary conditions
   else if (_cLawName == "WaveEquation"){
     if (bcName == "Wall"){
-      _claw->addBoundaryCondition(physicalName,dgNewBoundaryConditionWaveEquationWall());
+      _claw->addBoundaryCondition(physicalName,dgNewBoundaryConditionWaveEquationWall(_dimension));
     }
     else throw;
   }