diff --git a/Common/GmshDefines.h b/Common/GmshDefines.h
index 81c12c2be6b235dc715f4fca7df80b15ae160a96..8a3b64770bdc54d84d064bb9bd9b188c7d7da64f 100644
--- a/Common/GmshDefines.h
+++ b/Common/GmshDefines.h
@@ -212,8 +212,9 @@
 #define MSH_TET_SUB 136
 #define MSH_TET_16  137
 #define MSH_TRI_MINI 138
+#define MSH_TET_MINI 139
 
-#define MSH_NUM_TYPE 138
+#define MSH_NUM_TYPE 139
 
 // Geometric entities
 #define ENT_NONE     0
diff --git a/Numeric/BasisFactory.cpp b/Numeric/BasisFactory.cpp
index 5e28c6fb00bb17399966e69251524d430dffd467..a265c36db9f85eea24688ae8c2603bbb78b6ec49 100644
--- a/Numeric/BasisFactory.cpp
+++ b/Numeric/BasisFactory.cpp
@@ -30,9 +30,10 @@ const nodalBasis* BasisFactory::getNodalBasis(int tag)
   // Get the parent type to see which kind of basis
   // we want to create
   nodalBasis* F = NULL;
-  if (tag == MSH_TRI_MINI) {
-    F = new miniBasis();
-  }
+  if (tag == MSH_TRI_MINI)
+    F = new miniBasisTri();
+  else if (tag == MSH_TET_MINI)
+    F = new miniBasisTet();
   else {
     int parentType = ElementType::ParentTypeFromTag(tag);
     switch(parentType) {
diff --git a/Numeric/ElementType.cpp b/Numeric/ElementType.cpp
index c6acfa37bdf4b2cba2304e78f5e40bc98cc7e453..4cf8a204774617dbe5ecda6fb1d46e6d32773b11 100644
--- a/Numeric/ElementType.cpp
+++ b/Numeric/ElementType.cpp
@@ -91,6 +91,7 @@ int ElementType::ParentTypeFromTag(int tag)
     case(MSH_TRI_SUB):  case(MSH_TET_SUB):
       return TYPE_XFEM;
     case(MSH_TRI_MINI):
+    case(MSH_TET_MINI):
       return TYPE_MINI;
     default:
       Msg::Error("Unknown element tag %i for parent type, returning -1.", tag);
@@ -132,6 +133,7 @@ int ElementType::OrderFromTag(int tag)
   case MSH_TRI_24  : return 8;
   case MSH_TRI_27  : return 9;
   case MSH_TRI_30  : return 10;
+  case MSH_TRI_MINI  : return 1;
   case MSH_POLYG_  : return 1;
   case MSH_POLYG_B : return 1;
   case MSH_TET_1   : return 0;
@@ -153,6 +155,7 @@ int ElementType::OrderFromTag(int tag)
   case MSH_TET_46  : return 8;
   case MSH_TET_52  : return 9;
   case MSH_TET_58  : return 10;
+  case MSH_TET_MINI  : return 1;
   case MSH_QUA_1   : return 0;
   case MSH_QUA_4   : return 1;
   case MSH_QUA_9   : return 2;
@@ -259,7 +262,7 @@ int ElementType::DimensionFromTag(int tag)
     case(MSH_TRI_21I):  case(MSH_TRI_24):
     case(MSH_TRI_27):   case(MSH_TRI_30):
     case(MSH_TRI_B):    case(MSH_TRI_1):
-    case(MSH_TRI_SUB):
+    case(MSH_TRI_SUB):  case(MSH_TRI_MINI):
 
     case(MSH_QUA_4):    case(MSH_QUA_9):
     case(MSH_QUA_8):    case(MSH_QUA_16):
@@ -285,6 +288,7 @@ int ElementType::DimensionFromTag(int tag)
     case(MSH_TET_46):   case(MSH_TET_52):
     case(MSH_TET_58):   case(MSH_TET_1):
     case(MSH_TET_16):   case(MSH_TET_SUB):
+    case(MSH_TET_MINI):
 
     case(MSH_PYR_5):    case(MSH_PYR_14):
     case(MSH_PYR_13):   case(MSH_PYR_30):
diff --git a/Numeric/miniBasis.cpp b/Numeric/miniBasis.cpp
index b893ebc0c2830ae39f8adbc364061aee015a0462..b82b1081ceec8071f2fd9110f1e9214a58277cca 100644
--- a/Numeric/miniBasis.cpp
+++ b/Numeric/miniBasis.cpp
@@ -1,6 +1,6 @@
 #include "miniBasis.h"
 #include "BasisFactory.h"
-miniBasis::miniBasis()
+miniBasisTri::miniBasisTri()
 {
   type = MSH_TRI_MINI;
   parentType = TYPE_TRI;
@@ -21,6 +21,20 @@ miniBasis::miniBasis()
   points(1, 0) = 1.; points(1, 1) = 0.;
   points(2, 0) = 0.; points(2, 1) = 1.;
   points(3, 0) = 1./3; points(3, 1) = 1./3;
+  /*
+  monomials :
+    0 : 1
+    1 : x
+    2 : y
+    3 : xy
+    4 : x²y
+    5 : xy²
+  fs :
+    0 : 1 -1 -1  0  0  0 : 1 - x - y
+    1 : 1  0  0  0  0  0 : x
+    2 : 0  1  0  0  0  0 : y
+    3 : 0  0  0  1 -1 -1 : xy - x²y - xy² = (1 - x - y) x y
+  */
   monomials.resize(6, 2);
   monomials(0, 0) = 0.; monomials(0, 1) = 0.;
   monomials(1, 0) = 1.; monomials(1, 1) = 0.;
@@ -35,3 +49,59 @@ miniBasis::miniBasis()
   coefficients(2, 2) = 1.;
   coefficients(3, 3) = 1.; coefficients(3, 4) = -1.; coefficients(3, 5) = -1.; 
 }
+
+miniBasisTet::miniBasisTet()
+{
+  type = MSH_TET_MINI;
+  parentType = TYPE_TET;
+  order = 3;
+  dimension = 3;
+  numFaces = 4;
+  serendip = false;
+  const nodalBasis &p1 = *BasisFactory::getNodalBasis(MSH_TET_4);
+  closures = p1.closures;
+  fullClosures = p1.fullClosures;
+  for(size_t i = 0; i < fullClosures.size(); ++i) {
+    fullClosures[i].push_back(4);
+  }
+  closureRef = p1.closureRef;
+  points.resize(5, 3);
+  for (int i = 0; i < 4; ++i)
+    for (int j = 0; j < 3; ++j)
+      points(i, j) = p1.points(i, j);
+  points(4, 0) = points(4, 1) = points(4, 2) = 1./4;
+
+  /*
+  monomials :
+    0 : 1
+    1 : x
+    2 : y
+    3 : z
+    4 : xyz
+    5 : x²yz
+    6 : xy²z
+    7 : xyz²
+  sf :
+    0 : 1 -1 -1 -1  0  0  0  0 : 1 - x - y - z
+    1 : 0  1  0  0  0  0  0  0 : x
+    2 : 0  0  1  0  0  0  0  0 : y
+    3 : 0  0  0  1  0  0  0  0 : z
+    4 : 0  0  0  0  1 -1 -1 -1 : xyz - x²yz - xy²z - xyz² = (1 - x - y - z) x y z
+  */
+  monomials.resize(8, 3);
+  monomials(0, 0) = 0.; monomials(0, 1) = 0.; monomials(0, 2) = 0.;
+  monomials(1, 0) = 1.; monomials(1, 1) = 0.; monomials(1, 2) = 0.;
+  monomials(2, 0) = 0.; monomials(2, 1) = 1.; monomials(2, 2) = 0.;
+  monomials(3, 0) = 0.; monomials(3, 1) = 0.; monomials(3, 2) = 1.;
+  monomials(4, 0) = 1.; monomials(4, 1) = 1.; monomials(4, 2) = 1.;
+  monomials(5, 0) = 2.; monomials(5, 1) = 1.; monomials(5, 2) = 1.;
+  monomials(6, 0) = 1.; monomials(6, 1) = 2.; monomials(6, 2) = 1.;
+  monomials(7, 0) = 1.; monomials(7, 1) = 1.; monomials(7, 2) = 2.;
+  coefficients.resize(5, 8);
+  coefficients.setAll(0.);
+  coefficients(0, 0) = 1.; coefficients(0, 1) = -1.; coefficients(0, 2) = -1.; coefficients(0, 3) = -1.;
+  coefficients(1, 1) = 1.;
+  coefficients(2, 2) = 1.;
+  coefficients(3, 3) = 1.;
+  coefficients(4, 4) = 1.; coefficients(4, 5) = -1.; coefficients(4, 6) = -1.; coefficients(4, 7) = -1.;
+}
diff --git a/Numeric/miniBasis.h b/Numeric/miniBasis.h
index 631980ab31cdc26ee008b173c45d6dd4f87ae961..df2b8df0c30c395978af4ae259304189d5ca19f3 100644
--- a/Numeric/miniBasis.h
+++ b/Numeric/miniBasis.h
@@ -1,8 +1,13 @@
 #ifndef _MINI_BASIS_H_
 #define _MINI_BASIS_H_
 #include "polynomialBasis.h"
-class miniBasis : public polynomialBasis { // mini is NOT a real nodal basis but in GMSH, only the nodal basis have closure and mini have closure so...
+ // mini is NOT a real nodal basis but in GMSH, only the nodal basis have closure and mini have closure so...
+class miniBasisTri : public polynomialBasis {
   public:
-    miniBasis();
+    miniBasisTri();
+};
+class miniBasisTet : public polynomialBasis {
+  public:
+    miniBasisTet();
 };
 #endif