diff --git a/CMakeLists.txt b/CMakeLists.txt
index 151785ec096737e334d27730b542817fec8e7543..62ef6f15e21dce1ac4b0858994416f6e2efbd4f9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -95,7 +95,7 @@ opt(WRAP_PYTHON "Enable generation of Python wrappers" OFF)
 
 set(GMSH_MAJOR_VERSION 2)
 set(GMSH_MINOR_VERSION 9)
-set(GMSH_PATCH_VERSION 3)
+set(GMSH_PATCH_VERSION 4)
 set(GMSH_EXTRA_VERSION "" CACHE STRING "Gmsh extra version string")
 
 set(GMSH_VERSION "${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}")
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 92cd79977e152b53a5e810c20f415e6cea80ebd0..af580608d61a1506637bbdb6696a7cdf3c0ad5f3 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -1699,7 +1699,7 @@ StringXColor GeneralOptions_Color[] = {
     {245, 245, 245, 255}, {255, 255, 255, 255}, {245, 245, 245, 255}, {50, 50, 50, 255},
     "Background color" },
   { F|O, "BackgroundGradient" , opt_general_color_background_gradient ,
-    {165, 165, 165, 255}, {208, 215, 255, 255}, {165, 165, 165, 255}, {50, 50, 50, 255},
+    {185, 185, 185, 255}, {208, 215, 255, 255}, {185, 185, 185, 255}, {50, 50, 50, 255},
     "Background gradient color" },
   { F|O, "Foreground" , opt_general_color_foreground ,
     {85, 85, 85, 255}, {85, 85, 85, 255}, {85, 85, 85, 255}, {170, 170, 170, 255},
diff --git a/Common/rtree.h b/Common/rtree.h
index c4ea149046a5b9a12dbefd0b94e787bd757177f1..619038aadb030496ec4e1ef750b75100abc435ef 100644
--- a/Common/rtree.h
+++ b/Common/rtree.h
@@ -940,6 +940,9 @@ bool RTREE_QUAL::InsertRectRec(Rect* a_rect, const DATATYPE& a_id, Node* a_node,
   if(a_node->m_level > a_level)
   {
     index = PickBranch(a_rect, a_node);
+
+    if(index < 0) return false; // Added for Gmsh
+
     if (!InsertRectRec(a_rect, a_id, a_node->m_branch[index].m_child, &otherNode, a_level))
     {
       // Child was not split
@@ -1434,6 +1437,7 @@ void RTREE_QUAL::Classify(int a_index, int a_group, PartitionVars* a_parVars)
 {
   ASSERT(a_parVars);
   ASSERT(!a_parVars->m_taken[a_index]);
+  ASSERT(a_index >= 0); // Added for Gmsh
 
   a_parVars->m_partition[a_index] = a_group;
   a_parVars->m_taken[a_index] = true;
diff --git a/Geo/GFaceCompound.cpp b/Geo/GFaceCompound.cpp
index f11549ca8d73c6cc45c97f2abc9e2e496f7640a6..fdd3479dcc9004198b1367e717563ef70a879b7c 100644
--- a/Geo/GFaceCompound.cpp
+++ b/Geo/GFaceCompound.cpp
@@ -2878,21 +2878,31 @@ void GFaceCompound::printStuff(int iNewton) const
   }
   FILE * uvy = Fopen(name2,"w");
   if(!uvy){
+    fclose(uvx);
     Msg::Error("Could not open file '%s'", name2);
     return;
   }
   FILE * uvz = Fopen(name3,"w");
   if(!uvz){
+    fclose(uvx);
+    fclose(uvy);
     Msg::Error("Could not open file '%s'", name3);
     return;
   }
   FILE * xyzu = Fopen(name4,"w");
   if(!xyzu){
+    fclose(uvx);
+    fclose(uvy);
+    fclose(uvz);
     Msg::Error("Could not open file '%s'", name4);
     return;
   }
   FILE * xyzv = Fopen(name5,"w");
   if(!xyzv){
+    fclose(uvx);
+    fclose(uvy);
+    fclose(uvz);
+    fclose(xyzu);
     Msg::Error("Could not open file '%s'", name5);
     return;
   }
diff --git a/Geo/GenericFace.cpp b/Geo/GenericFace.cpp
index a8047b26937efefec7de844e65b09518f422a848..94a5360c8761ab6f40dbe657dfe33f5de583ae93 100644
--- a/Geo/GenericFace.cpp
+++ b/Geo/GenericFace.cpp
@@ -53,7 +53,7 @@ SVector3 GenericFace::normal(const SPoint2 &param) const
 {
   std::vector<double> res(3,0.);
   std::vector<double> par(2,0.);
-  for (int i=0;i<3;i++) par[i] = param[i];
+  for (int i = 0; i < 2; i++) par[i] = param[i];
   if (!FaceEvalNormal) Msg::Fatal("Genericface::ERROR: Callback FaceEvalNormal not set");
   bool ok = FaceEvalNormal(id,par,res);
   if (!ok) Msg::Error("GenericFace::ERROR from FaceEvalNormal ! " );
@@ -66,7 +66,7 @@ Pair<SVector3,SVector3> GenericFace::firstDer(const SPoint2 &param) const
   std::vector<double> deru(3,0.);
   std::vector<double> derv(3,0.);
   std::vector<double> par(2,0.);
-  for (int i=0;i<3;i++) par[i] = param[i];
+  for (int i = 0; i < 2; i++) par[i] = param[i];
   bool ok = FaceFirstDer(id,par,deru,derv);
   if (!ok) Msg::Error("GenericFace::ERROR from FaceFirstDer ! " );
   return Pair<SVector3,SVector3>(SVector3(deru[0],deru[1],deru[2]),
@@ -79,7 +79,7 @@ void GenericFace::secondDer(const SPoint2 &param,SVector3 *dudu, SVector3 *dvdv,
   std::vector<double> dervv(3,0.);
   std::vector<double> deruv(3,0.);
   std::vector<double> par(2,0.);
-  for (int i=0;i<2;i++) par[i] = param[i];
+  for (int i = 0; i < 2; i++) par[i] = param[i];
   if (!FaceSecondDer) Msg::Fatal("Genericface::ERROR: Callback FaceSecondDer not set");
   bool ok = FaceSecondDer(id,par,deruu,dervv,deruv);
   if (!ok) Msg::Error("GenericFace::ERROR from FaceSecondDer ! " );
@@ -190,7 +190,7 @@ double GenericFace::curvatureMax(const SPoint2 &param) const
   std::vector<double> dirMin(3,0.);
   double curvMax,curvMin;
   std::vector<double> par(2,0.);
-  for (int i=0;i<2;i++) par[i] = param[i];
+  for (int i = 0; i < 2; i++) par[i] = param[i];
   if (!FaceCurvatures) Msg::Fatal("Genericface::ERROR: Callback FaceCurvatures not set");
   bool ok = FaceCurvatures(id,par,dirMax,dirMin,curvMax,curvMin);
   if (!ok) Msg::Error("GenericFace::ERROR from FaceCurvatures ! " );
@@ -201,7 +201,7 @@ double GenericFace::curvatures(const SPoint2 &_param,SVector3 *_dirMax,SVector3
                                double *curvMax,double *curvMin) const
 {
   std::vector<double> param(2,0.);
-  for (int i=0;i<2;i++) param[i] = _param[i];
+  for (int i = 0; i < 2; i++) param[i] = _param[i];
   std::vector<double> dirMax(3,0.);
   std::vector<double> dirMin(3,0.);
 
@@ -218,7 +218,7 @@ bool GenericFace::containsPoint(const SPoint3 &pt) const
 {
   bool res;
   std::vector<double> queryPoint(3,0.);
-  for (int i=0;i<3;i++) queryPoint[i] = pt[i];
+  for (int i = 0; i < 3; i++) queryPoint[i] = pt[i];
   if (!FaceContainsPointFromXYZ) Msg::Fatal("Genericface::ERROR: Callback FaceContainsPointFromXYZ not set");
   bool ok = FaceContainsPointFromXYZ(id,queryPoint,res);
   if (!ok) Msg::Error("GenericFace::containsPoint::ERROR from FaceContainsPointFromXYZ ! " );
@@ -239,7 +239,7 @@ void GenericFace::createLoops()
   l_dirs.clear();
 
   for (std::set<int>::iterator it_loop = loopsnumber.begin();
-       it_loop!=loopsnumber.end();it_loop++){// for each loop
+       it_loop != loopsnumber.end(); it_loop++){// for each loop
     std::pair<std::multimap<int, std::pair<GEdge*,int> >::iterator,
               std::multimap<int, std::pair<GEdge*,int> >::iterator>
       range = bnd.equal_range(*it_loop);
diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index daeaf2f3f9e98a5e320824bf688e1ff50247f26f..30ab454e94596facad10cb56cb0c6b58decd4b91 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -270,8 +270,9 @@ static void PrintMesh2dStatistics(GModel *m)
   else
     return;
 
-  if(statreport){
-    Msg::Error("Could not open file '%s'", CTX::instance()->meshStatReportFileName.c_str());
+  if(!statreport){
+    Msg::Error("Could not open file '%s'",
+               CTX::instance()->meshStatReportFileName.c_str());
     return;
   }
 
diff --git a/Plugin/FaultZone.cpp b/Plugin/FaultZone.cpp
index e42e251286047bcea436fcb2a706adbf0d82e282..516fac0653ae47cc435c599ebbf8f774cf4def03 100644
--- a/Plugin/FaultZone.cpp
+++ b/Plugin/FaultZone.cpp
@@ -565,7 +565,7 @@ void GMSH_FaultZoneMesher::CreateJointElements(GModel* gModel, GFace* gFace,
         continue;
 
       SPoint3 bary = mElem->barycenter();
-      MVertex* mVerts[8];
+      std::vector<MVertex*> mVerts(8, NULL);
 
       // check orientation
       SVector3 nor = _vectNormByFissure[gEdge];
@@ -579,11 +579,11 @@ void GMSH_FaultZoneMesher::CreateJointElements(GModel* gModel, GFace* gFace,
       for(int i = 0; i < mElem->getNumVertices(); i++){
         MVertex *mVert = mElem->getVertex(i);
 
-        int j = (changeOri && i<2)?!i:i;
-        if (j<2) // adding intern node
+        int j = (changeOri && i < 2) ? !i : i;
+        if (j < 2) // adding intern node
           mVerts[_numNodeJoint[j]] = _nodeJointByHeavOrJunctionNode[mVert];
 
-        if (_nodeByHeavNode.find( mVert ) != _nodeByHeavNode.end()){
+        if (_nodeByHeavNode.find(mVert) != _nodeByHeavNode.end()){
           // adding upper and under nodes
           mVerts[_numNodeHeavInf[j]] = mVert;
           mVerts[_numNodeHeavSup[j]] = _nodeByHeavNode[mVert];
@@ -619,7 +619,7 @@ void GMSH_FaultZoneMesher::CreateJointElements(GModel* gModel, GFace* gFace,
       // the new GEntity (created here)
       for(int j =0; j<8; j++){
         MVertex *mVert = mVerts[j];
-        assert(mVert!= NULL);
+        assert(mVert != NULL);
         if (mVert->onWhat() == 0){
           mVert->setEntity(jointFace);
           jointFace->addMeshVertex(mVert);