diff --git a/spm.c b/spm.c
index c8cd8df87628289dbfa496ddd57b781725a5bd1e..1f35b85e729b60b87024d2b0ae3a4090cf7dc738 100644
--- a/spm.c
+++ b/spm.c
@@ -303,6 +303,7 @@ spmConvert( int ofmttype, pastix_spm_t *spm )
 {
     if ( conversionTable[spm->fmttype][ofmttype][spm->flttype] ) {
         if ( spm->dof != 1 ) {
+            //pastix_error_print( "spmConvert: Conversion of non unique dof not yet implemented\n");
             return PASTIX_ERR_NOTIMPLEMENTED;
         }
         return conversionTable[spm->fmttype][ofmttype][spm->flttype]( spm );
diff --git a/spm.h b/spm.h
index 37daba94d1ac87327212a0bb6f164911d0f23855..d065d9116fb8f08e47ce94b86a54af622f7ef67b 100644
--- a/spm.h
+++ b/spm.h
@@ -60,7 +60,7 @@ typedef enum pastix_driver_e {
  *
  */
 struct pastix_spm_s {
-    int                mtxtype;/**< Matrix structure: PastixGeneral, PastixSymmetric
+    int               mtxtype; /**< Matrix structure: PastixGeneral, PastixSymmetric
                                     or PastixHermitian.                                         */
     pastix_coeftype_t flttype; /**< avals datatype: PastixPattern, PastixFloat, PastixDouble,
                                     PastixComplex32 or PastixComplex64                          */
diff --git a/z_spm_2dense.c b/z_spm_2dense.c
index bbb23463edcca23c75b1434c122a2ae935765c67..03f06c3d21b8043a7b259a0bd1cfc7863883ebe8 100644
--- a/z_spm_2dense.c
+++ b/z_spm_2dense.c
@@ -523,13 +523,7 @@ z_spmDensePrint( FILE *f, pastix_int_t m, pastix_int_t n, pastix_complex64_t *A,
         for(i=0; i<m; i++)
         {
             if ( cabs( A[ j * lda + i ] ) != 0. ) {
-#if defined(PRECISION_z) || defined(PRECISION_c)
-                fprintf( f, "%ld %ld (%e, %e)\n",
-                         i, j, creal(A[lda * j + i]), cimag(A[lda * j + i]) );
-#else
-                fprintf( f, "%ld %ld %e\n",
-                         i, j, A[lda * j + i] );
-#endif
+                z_spmPrintElt( f, i, j, A[lda * j + i] );
             }
         }
     }
diff --git a/z_spm_dof_extend.c b/z_spm_dof_extend.c
index 0808013ed21ef87c3fd48243ec57317b9c200036..7e03fce0d7d8ce73f0c4befe756020cf0b8ba56f 100644
--- a/z_spm_dof_extend.c
+++ b/z_spm_dof_extend.c
@@ -34,6 +34,11 @@ z_spmDofExtend(pastix_spm_t *spm)
 
     switch(spm->fmttype)
     {
+    case PastixCSR:
+        /* Swap pointers to call CSC */
+        colptr = spm->rowptr;
+        rowptr = spm->colptr;
+
     case PastixCSC:
         /**
          * Loop on col
@@ -60,32 +65,32 @@ z_spmDofExtend(pastix_spm_t *spm)
             }
         }
         break;
-    case PastixCSR:
-        /**
-         * Loop on row
-         */
-        for(i=0; i<spm->n; i++, rowptr++)
-        {
-            dofi = ( spm->dof > 0 ) ? spm->dof : dofs[i+1] - dofs[i];
+    /* case PastixCSR: */
+    /*     /\** */
+    /*      * Loop on row */
+    /*      *\/ */
+    /*     for(i=0; i<spm->n; i++, rowptr++) */
+    /*     { */
+    /*         dofi = ( spm->dof > 0 ) ? spm->dof : dofs[i+1] - dofs[i]; */
 
-            /**
-             * Loop on cols
-             */
-            for(k=rowptr[0]; k<rowptr[1]; k++, colptr++, oldval++)
-            {
-                j = *colptr - baseval;
-                dofj = ( spm->dof > 0 ) ? spm->dof : dofs[j+1] - dofs[j];
+    /*         /\** */
+    /*          * Loop on cols */
+    /*          *\/ */
+    /*         for(k=rowptr[0]; k<rowptr[1]; k++, colptr++, oldval++) */
+    /*         { */
+    /*             j = *colptr - baseval; */
+    /*             dofj = ( spm->dof > 0 ) ? spm->dof : dofs[j+1] - dofs[j]; */
 
-                for(jj=0; jj<dofj; jj++)
-                {
-                    for(ii=0; ii<dofi; ii++, newval++)
-                    {
-                        *newval = *oldval;
-                    }
-                }
-            }
-        }
-        break;
+    /*             for(jj=0; jj<dofj; jj++) */
+    /*             { */
+    /*                 for(ii=0; ii<dofi; ii++, newval++) */
+    /*                 { */
+    /*                     *newval = *oldval; */
+    /*                 } */
+    /*             } */
+    /*         } */
+    /*     } */
+    /*     break; */
     case PastixIJV:
         /**
          * Loop on coordinates
diff --git a/z_spm_expand.c b/z_spm_expand.c
index d10ccae515b243d7583e7874d8a96dfbd9fbc92d..41948aca2bda5d185d8e8fabb4c58f1581528743 100644
--- a/z_spm_expand.c
+++ b/z_spm_expand.c
@@ -39,15 +39,22 @@ z_spmCSCExpand(const pastix_spm_t *spm)
     memcpy( newspm, spm, sizeof(pastix_spm_t) );
 
     baseval = spmFindBase( spm );
-    oldcol = spm->colptr;
-    oldrow = spm->rowptr;
+    newspm->n = spm->nexp;
     dofs   = spm->dofs;
 #if !defined(PRECISION_p)
     oldval = oldval2 = (pastix_complex64_t*)(spm->values);
 #endif
 
-    newspm->n = spm->nexp;
-    newspm->colptr = newcol = malloc(sizeof(pastix_int_t)*(spm->nexp+1));
+    if ( spm->fmttype == PastixCSC ) {
+        oldcol = spm->colptr;
+        oldrow = spm->rowptr;
+        newspm->colptr = newcol = malloc(sizeof(pastix_int_t)*(spm->nexp+1));
+    }
+    else {
+        oldcol = spm->rowptr;
+        oldrow = spm->colptr;
+        newspm->rowptr = newcol = malloc(sizeof(pastix_int_t)*(spm->nexp+1));
+    }
 
     /**
      * First loop to compute the new colptr
@@ -87,17 +94,26 @@ z_spmCSCExpand(const pastix_spm_t *spm)
             ((spm->mtxtype != PastixGeneral) && ((newcol[0]-baseval) <= spm->nnzexp)) );
 
     newspm->nnz = newcol[0] - baseval;
-    newspm->rowptr = newrow = malloc(sizeof(pastix_int_t)*newspm->nnz);
 #if !defined(PRECISION_p)
     newspm->values = newval = malloc(sizeof(pastix_complex64_t)*newspm->nnz);
 #endif
 
+    if (spm->fmttype == PastixCSC) {
+        newspm->rowptr = newrow = malloc(sizeof(pastix_int_t)*newspm->nnz);
+        oldcol = spm->colptr;
+        oldrow = spm->rowptr;
+        newcol = newspm->colptr;
+    }
+    else {
+        newspm->colptr = newrow = malloc(sizeof(pastix_int_t)*newspm->nnz);
+        oldcol = spm->rowptr;
+        oldrow = spm->colptr;
+        newcol = newspm->rowptr;
+    }
+
     /**
      * Second loop to compute the new rowptr and valptr
      */
-    oldcol = spm->colptr;
-    oldrow = spm->rowptr;
-    newcol = newspm->colptr;
     for(j=0, col=0; j<spm->n; j++, oldcol++)
     {
         /**
@@ -233,7 +249,7 @@ z_spmCSRExpand(const pastix_spm_t *spm)
         height = newrow[1] - newrow[0];
         newrow++;
 
-        /* Add extra rowumns */
+        /* Add extra rownumns */
         for(ii=1; ii<dofi; ii++, newrow++)
         {
             newrow[1] = newrow[0] + height;
@@ -420,22 +436,24 @@ z_spmIJVExpand(const pastix_spm_t *spm)
         }
         else {
             dofi = dofs[i+1] - dofs[i];
-            row  = dofs[i];
+            row  = dofs[i] - baseval;
             dofj = dofs[j+1] - dofs[j];
-            col  = dofs[j];
+            col  = dofs[j] - baseval;
         }
 
         if ( spm->layout == PastixColMajor ) {
             for(jj=0; jj<dofj; jj++, col++)
             {
-                for(ii=0; ii<dofi; ii++, row++, oldval++)
+                for(ii=0; ii<dofi; ii++, oldval++)
                 {
                     if ( (spm->mtxtype == PastixGeneral) ||
                          (i != j) ||
-                         ((i == j) && (row >= col)) )
+                         ((i == j) && (row + ii >= col)) )
                     {
+                        assert( col      < newspm->n );
+                        assert( row + ii < newspm->n );
                         (*newcol) = col + baseval; newcol++;
-                        (*newrow) = row + baseval; newrow++;
+                        (*newrow) = row + ii + baseval; newrow++;
 #if !defined(PRECISION_p)
                         (*newval) = *oldval; newval++;
 #endif
@@ -446,13 +464,15 @@ z_spmIJVExpand(const pastix_spm_t *spm)
         else {
             for(ii=0; ii<dofi; ii++, row++)
             {
-                for(jj=0; jj<dofj; jj++, col++, oldval++)
+                for(jj=0; jj<dofj; jj++, oldval++)
                 {
                     if ( (spm->mtxtype == PastixGeneral) ||
                          (i != j) ||
-                         ((i == j) && (row >= col)) )
+                         ((i == j) && (row >= col + jj)) )
                     {
-                        (*newcol) = col + baseval; newcol++;
+                        assert( col + jj < newspm->n );
+                        assert( row < newspm->n );
+                        (*newcol) = col + jj + baseval; newcol++;
                         (*newrow) = row + baseval; newrow++;
 #if !defined(PRECISION_p)
                         (*newval) = *oldval; newval++;
@@ -462,6 +482,8 @@ z_spmIJVExpand(const pastix_spm_t *spm)
             }
         }
     }
+    assert( newcol - newspm->colptr == newspm->nnz );
+    assert( newrow - newspm->rowptr == newspm->nnz );
 
     newspm->gN      = newspm->n;
     newspm->gnnz    = newspm->nnz;