diff --git a/spm.h b/spm.h
index 71fd46984fa014bdee1eb995297d11adb207c9b2..971fc622c5fe4836e774f998e2719e4c06373099 100644
--- a/spm.h
+++ b/spm.h
@@ -99,6 +99,7 @@ pastix_int_t  spmSymmetrize( pastix_spm_t *spm );
 
 pastix_spm_t *spmCheckAndCorrect( pastix_spm_t *spm );
 
+void spmExpand(pastix_spm_t* spm);
 void dofVar(pastix_spm_t* spm);//tmp
 
 #endif /* _SPM_H_ */
diff --git a/spm_expand.c b/spm_expand.c
index 6dead986a5be667ed3d5cbd0327960fd32b7e4e5..ac66de235f7ccf912cc54c1faf2ac1a1abe5d7b3 100644
--- a/spm_expand.c
+++ b/spm_expand.c
@@ -15,25 +15,30 @@
  **/
 #include "common.h"
 #include "spm.h"
+
 #include "z_spm.h"
+#include "c_spm.h"
+#include "d_spm.h"
+#include "s_spm.h"
+#include "p_spm.h"
 
 void
-spmExpandCSC(pastix_spm_t* spm)
+spmExpand(pastix_spm_t* spm)
 {
     switch(spm->flttype)
     {
     case PastixFloat:
-        s_extandCSC(spm);
+        s_spmExpand(spm);
         break;
     case PastixComplex32:
-        c_extandCSC(spm);
+        c_spmExpand(spm);
         break;
     case PastixComplex64:
-        z_extandCSC(spm);
+        z_spmExpand(spm);
         break;
     case PastixDouble:
     default:
-        d_extandCSC(spm);
+        d_spmExpand(spm);
         break;
     }
 }
@@ -141,7 +146,7 @@ dofCst(pastix_spm_t* spm,pastix_int_t dof)
     for(i=0;i<spm->n+1;i++)
         dofs[i]=dof*i;
 
-    spmExpandCSC(spm);
+    spmExpand(spm);
 }
 
 
@@ -194,7 +199,7 @@ dofVar(pastix_spm_t* spm)
     pastix_int_t* tab = computeCorrespondIndex(dofs,spm->n);
 
     spm->dofs   = tab;
-    spmExpandCSC(spm);
+    spmExpand(spm);
 
     /*
     print_tab_int(spm->colptr,spm->n);
diff --git a/z_spm.h b/z_spm.h
index 886f39e90f5bc44a54728afc376c50d684e13d27..0c4ae86c7a2524d08556c68873b646f1cbd84349 100644
--- a/z_spm.h
+++ b/z_spm.h
@@ -18,6 +18,9 @@
 #ifndef _z_spm_H_
 #define _z_spm_H_
 
+/**
+ * Conversion routines
+ */
 int z_spmConvertCSC2CSR( pastix_spm_t *spm );
 int z_spmConvertCSC2IJV( pastix_spm_t *spm );
 int z_spmConvertCSR2CSC( pastix_spm_t *spm );
@@ -25,10 +28,21 @@ int z_spmConvertCSR2IJV( pastix_spm_t *spm );
 int z_spmConvertIJV2CSC( pastix_spm_t *spm );
 int z_spmConvertIJV2CSR( pastix_spm_t *spm );
 
+void z_spmConvertColMaj2RowMaj(pastix_spm_t *spm);
+void z_spmConvertRowMaj2ColMaj(pastix_spm_t *spm);
+
+pastix_complex64_t *z_spm2dense( const pastix_spm_t *spm );
+
+/**
+ * Matrix-Vector product routines
+ */
 int    z_spmGeCSCv(int trans, pastix_complex64_t alpha, const pastix_spm_t *csc, const pastix_complex64_t *x, pastix_complex64_t beta, pastix_complex64_t *y);
 int    z_spmSyCSCv(           pastix_complex64_t alpha, const pastix_spm_t *csc, const pastix_complex64_t *x, pastix_complex64_t beta, pastix_complex64_t *y);
 int    z_spmHeCSCv(           pastix_complex64_t alpha, const pastix_spm_t *csc, const pastix_complex64_t *x, pastix_complex64_t beta, pastix_complex64_t *y);
 
+/**
+ * Extra routines
+ */
 double       z_spmNorm( int ntype, const pastix_spm_t *csc );
 void         z_spmSort( pastix_spm_t *csc );
 pastix_int_t z_spmMergeDuplicate( pastix_spm_t *csc );
@@ -37,15 +51,14 @@ pastix_int_t z_spmSymmetrize( pastix_spm_t *csc );
 int z_spmGenRHS(int type, int nrhs, const pastix_spm_t *spm, void *x, int ldx, void *b, int ldb );
 int z_spmCheckAxb( int nrhs, const pastix_spm_t *spm, void *x0, int ldx0, void *b, int ldb, const void *x, int ldx );
 
-pastix_complex64_t *z_spm2dense( const pastix_spm_t *spm );
+/**
+ * Output routines
+ */
 void z_spmDensePrint( pastix_int_t m, pastix_int_t n, pastix_complex64_t *A, pastix_int_t lda );
 void z_spmPrint( const pastix_spm_t *spm );
 
-void z_spmConvertColMaj2RowMaj(pastix_spm_t *spm);
-void z_spmConvertRowMaj2ColMaj(pastix_spm_t *spm);
-
-void z_extandCSC(pastix_spm_t *spm);
 
+void z_spmExpand(pastix_spm_t *spm);
 void z_spmDofs2Flat(pastix_spm_t *spm);
 
 #endif /* _z_spm_H_ */
diff --git a/z_spm_expand.c b/z_spm_expand.c
index 8167b0c537ae154e49c418a2dcb9c14253769042..3e461691f3f83794c7bba99e16ea75c615e4b78c 100644
--- a/z_spm_expand.c
+++ b/z_spm_expand.c
@@ -8,7 +8,6 @@
  *
  * @version 5.1.0
  * @author Mathieu Faverge
- * @author Theophile Terraz
  * @author Alban Bellot
  * @date 2015-01-01
  *
@@ -18,29 +17,49 @@
 #include "spm.h"
 #include "z_spm.h"
 
-
-void z_extandCSC(pastix_spm_t* spm)
+/**
+ * TODO: This function is incorrect
+ */
+int
+z_spmExpand(pastix_spm_t* spm)
 {
-  pastix_int_t col, row, i, cpt, dofj, dofi, baseval;
-  cpt=0;
-
-  pastix_complex64_t *valptr = (pastix_complex64_t*)spm->values;
-  pastix_complex64_t *newval = calloc(spm->nnzexp,sizeof(pastix_complex64_t));
-
-  baseval=spmFindBase( spm );
-
-  for( col=0; col<spm->n; col++)
-  {
-      for( row=spm->colptr[col]-baseval; row<spm->colptr[col+1]-baseval; row++)
-      {
-          dofi = ( spm->dof > 0 ) ? spm->dof : spm->dofs[col+1] - spm->dofs[col];
-          dofj = ( spm->dof > 0 ) ? spm->dof : spm->dofs[spm->rowptr[row]-baseval+1] - spm->dofs[spm->rowptr[row]-baseval];
-	  for( i=0; i<dofi*dofj; i++)
-          {
-              newval[cpt] = valptr[row] / ((i/dofj) + (i%dofj) + 2); // Col major
-	      cpt++;
-          }
-      }
-  }
-  spm->values=newval;
+    pastix_int_t i, col, row, cpt, dofj, dofi, baseval;
+    pastix_complex64_t *oldvalptr;
+    pastix_complex64_t *newvalptr;
+
+    if (1) {
+        return PASTIX_ERR_NOTIMPLEMENTED;
+    }
+
+    baseval = spmFindBase( spm );
+
+    oldvalptr = (pastix_complex64_t*)spm->values;
+    spm->values = malloc( spm->nnzexp * sizeof(pastix_complex64_t) );
+    newvalptr = (pastix_complex64_t*)spm->values;
+
+    cpt = 0;
+    dofi = spm->dof;
+    dofj = spm->dof;
+
+    for( col=0; col<spm->n; col++)
+    {
+        if ( spm->dof <= 0 ) {
+            dofi = spm->dofs[col+1] - spm->dofs[col];
+        }
+
+        for( row=spm->colptr[col]-baseval; row<spm->colptr[col+1]-baseval; row++)
+        {
+            if ( spm->dof <= 0 ) {
+                dofj = spm->dofs[spm->rowptr[row]-baseval+1] - spm->dofs[spm->rowptr[row]-baseval];
+            }
+
+            for( i=0; i<dofi*dofj; i++)
+            {
+                newvalptr[cpt] = oldvalptr[row] / ((i/dofj) + (i%dofj) + 2); // Col major
+                cpt++;
+            }
+        }
+    }
+
+    free( oldvalptr );
 }