diff --git a/src/Makefile b/src/Makefile
index 8b255c9ddc46041411d2021181f65c219b432ce9..155d867b41d7b2cfd579f0959d17938145a527c3 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -26,9 +26,10 @@ LDOPT = -lginac $(TAULIB)
 MPIEXEC = mpiexec
 NP = 5
 
-MPISRC = hierarchical.cpp  masterworker.cpp  mw_addslave.cpp \
+MPISRC = masterworker.cpp  \
          perf.cpp  sequential.cpp  tensormatrix_mpi.cpp      \
-         utils.cpp  utils_parall.cpp profiling.cpp mw_combined.cpp
+         utils.cpp  utils_parall.cpp profiling.cpp
+#mw_combined.cpp mw_addslave.cpp hierarchical.cpp  
 MPIOBJ= $(MPISRC:.cpp=.o)
 
 
diff --git a/src/masterworker.cpp b/src/masterworker.cpp
index 0a79fc8188cba1ec7df7770d3c98427c5d01536b..90ac1b3590467818ebbb9daf73123fa67d144be4 100644
--- a/src/masterworker.cpp
+++ b/src/masterworker.cpp
@@ -14,9 +14,9 @@ namespace gi = GiNaC;
  *                        Parallel 1-level decomposition                       *
  *******************************************************************************/
 
-gi::ex multiply_1level_master( tensor3D_t& T, matrix_int_t& J, unsigned int size, MPI_Comm comm = MPI_COMM_WORLD ) { 
+gi::ex multiply_1level_master( tensor3D_t& T, unsigned int size, MPI_Comm comm = MPI_COMM_WORLD ) { 
     gi::ex Tens = 0;
-    unsigned int a1, a2, a3, b1;
+    unsigned int a1, a2, a4;
     gi::ex A;
     gi::lst symbols;
 
@@ -36,6 +36,7 @@ gi::ex multiply_1level_master( tensor3D_t& T, matrix_int_t& J, unsigned int size
     j = 0;
 
     int receivedresults = 0;
+    unsigned int N = size/2;
 
     std::vector<parameters_t> input;
     std::vector<std::string> results_s;
@@ -43,19 +44,17 @@ gi::ex multiply_1level_master( tensor3D_t& T, matrix_int_t& J, unsigned int size
 
     /* Build a list of argument sets */
     
-    for( a1 = 0 ; a1 < size; a1++ ){
+    for( a4 = 0 ; a4 < N ; a4++ ){
         i=i+1; 
-	for( a2 = 0; a2 < size ; a2++ ){
-	    j=j+1; 
-	    for( a3 = 0 ; a3 < size ; a3++ ){
-		A = T[a1][a2][a3];
-		for( b1 = 0 ; b1 < size ; b1++ ){
-		    parameters_t p( A, a1, a2, a3, b1 );
-		    input.push_back( p );
-		}
+        for( a2 = 0; a2 < N ; a2++ ){
+            j=j+1; 
+            for( a1 = 0 ; a1 < N ; a1++ ){
+                parameters_t p( a4, a2, a1 );
+                input.push_back( p );
+            }
 	    }
 	}
-    }
+
     
     /* Compute the set of symbols */
     /* Could be done while the first slave is working */
@@ -161,9 +160,9 @@ gi::ex multiply_1level_master( tensor3D_t& T, matrix_int_t& J, unsigned int size
     return Tens;
 }
 
-void multiply_1level_slave( tensor3D_t& T, matrix_int_t& J, int size, MPI_Comm comm = MPI_COMM_WORLD ) {
+void multiply_1level_slave( tensor3D_t& T, int size, MPI_Comm comm = MPI_COMM_WORLD ) {
     gi::ex Tens;
-    int  a1, a2, a3, b1;
+    unsigned int  a1, a2, a4;
     //    gi::ex A;
     unsigned int len = 0;
     
@@ -184,13 +183,11 @@ void multiply_1level_slave( tensor3D_t& T, matrix_int_t& J, int size, MPI_Comm c
         MPI_Recv( &params, 1, DT_PARAMETERS, ROOT, MPI_ANY_TAG, comm, &status );
         
         if( status.MPI_TAG == TAG_WORK ){
-            a1 = params.a1;
+            a4 = params.a4;
             a2 = params.a2;
-            a3 = params.a3;
-            b1 = params.b1;
-            gi::symbol A( std::string( params.A  ) );
+            a1 = params.a1;
             
-            Tens = one_level1_product( &T, &J, A, size, a1, a2, a3, b1 );
+            Tens = one_level1_product( &T, size, a4, a2, a1 );
             send_result( Tens );
 
         } else {
@@ -208,7 +205,7 @@ void multiply_1level_slave( tensor3D_t& T, matrix_int_t& J, int size, MPI_Comm c
    W -> M: send an unsigned int (size of the expression), then the expression (table of chars)
 */
         
-gi::ex multiply_1level_mw( tensor3D_t& T, matrix_int_t& J, int size ) {  // simpler: same dimension everywhere
+gi::ex multiply_1level_mw( tensor3D_t& T, int size ) {  // simpler: same dimension everywhere
     int rank;
     gi::ex Tens = 0;
     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
@@ -220,9 +217,9 @@ gi::ex multiply_1level_mw( tensor3D_t& T, matrix_int_t& J, int size ) {  // simp
     /* Here we go */
     
     if( 0 == rank ) {
-        Tens = multiply_1level_master( T, J, size );
+        Tens = multiply_1level_master( T, size );
     } else {
-        multiply_1level_slave( T, J, size );
+        multiply_1level_slave( T, size );
     }
 
     /* Finalize */
diff --git a/src/products.h b/src/products.h
index 3bf3946929d61bff895d2da79ac89cd6eacc26ff..4a6b6de4b7f52715141e41fc9e6cdee1d9f61bfc 100644
--- a/src/products.h
+++ b/src/products.h
@@ -7,8 +7,8 @@
 namespace gi = GiNaC;
 
 // internal (sequential) routines
-gi::ex one_level1_product( tensor3D_t*, matrix_int_t*, gi::ex, int, int, int, int, int );
-gi::ex one_level2_product( tensor3D_t*, matrix_int_t*, gi::ex, int, int, int, int, int, int, int, int, int );
+gi::ex one_level1_product( tensor3D_t*, int, int, int, int );
+gi::ex one_level2_product( tensor3D_t*, int, int, int, int, int );
 gi::ex two_level1_product(  tensor3D_t*, matrix_int_t*, gi::ex, int, int, int, int, int );
 gi::ex two_level2_product(  tensor3D_t*, matrix_int_t*, gi::ex, int, int, int, int, int, int );
 
diff --git a/src/sequential.cpp b/src/sequential.cpp
index e0656cd426f047586966d1411f0b22b2950fed58..cb00a2ba15a52d4658276d6772e71f029b088e8c 100644
--- a/src/sequential.cpp
+++ b/src/sequential.cpp
@@ -99,12 +99,7 @@ gi::ex multiply_1level( tensor3D_t& T, matrix_int_t& J, int size ) {  // simpler
     
     gi::ex Tens = 0;
     gi::ex Tn;
-	int a1, a2, a3, b1;
-    gi::ex A;
-    
- 	int i, j;
-    i = 0;
-    j = 0;
+	int a1, a2, a4;
 
     double time;
 
@@ -112,23 +107,18 @@ gi::ex multiply_1level( tensor3D_t& T, matrix_int_t& J, int size ) {  // simpler
     void* ptr;
     TAU_PROFILER_CREATE( ptr, "b","", TAU_USER );
 #endif
+    
+    int N = size/2;
 
-    for( a1 = 0 ; a1 < size; a1++ ){
-        i=i+1; 
-        //   std::cout << "Tens: " << Tens << std::endl;
-        //		printf("i = %d\n", i); 
-		for( a2 = 0; a2 < size ; a2++ ){
-			j=j+1; 
-            //	printf("j = %d\n", j);
-			for( a3 = 0 ; a3 < size ; a3++ ){
+    for( a4 = 0 ; a4 < N ; a4++ ) {
+        for( a2 = 0 ; a2 < N ; a2++ ) {
 #ifdef TAUPROF
                 TAU_START( "b" );
                 TAU_PROFILER_START( ptr );
 #endif
-				A = T[a1][a2][a3];
                 /* Beyond this point, a2 and a3 are only used in the simplectic matrix */
-				for( b1 = 0 ; b1 < size ; b1++ ){
-                    Tn = one_level1_product( &T, &J, A, size, a1, a2, a3, b1 );
+				for( a1 = 0 ; a1 < N ; a1++ ){
+                    Tn = one_level1_product( &T, size, a4, a2, a1 );
                     Tens += Tn;
                 }
 #ifdef TAUPROF
@@ -156,60 +146,87 @@ gi::ex multiply_1level( tensor3D_t& T, matrix_int_t& J, int size ) {  // simpler
 
 //                time = getTimeSpent( "b" );
 #endif // TAUPROF                
-			}
 		}
 	}
     
     return Tens;
 }
 
-gi::ex one_level1_product( tensor3D_t* T, matrix_int_t *J, gi::ex A, int size, int a1, int a2, int a3, int b1){
-    gi::ex TAB, TABB, TABC, TABCC, TABCD, TABCDD;
-    int b2, b3, c1, c2, c3, d1, d2, d3;
+gi::ex one_level1_product( tensor3D_t* T, int size, int a4, int a2, int a1 ){
 
     gi::ex Tens = 0;
-    gi::ex T0, T1, T2, T3, T4, T5;
+    gi::ex W1, W2, W3, W4, W5, W6, W7;
+    gi::ex Z1, Z2, Z6, t5, tE, t1, t12, t123, t126, t13, t134, t14, t16, t2, t23, t24, t26, t3, t4, X7Y5;
+    gi::ex TE, T1, T2, T3, T4, T5, T12, T13, T14, T16, T23, T24, T26, T123, T126, T134;
     const char timerB[] = "B";
+    
+	int a3, a5, a6;
+    int A1, A2, A3, A4, A5, A6;
+    TE = T1 = T2 = T3 = T4 = T5 = T12 = T13 = T14 = T16 = T23 = T24 = T26 = T123 = T126 = T134 = 0;
 
-    TAB = (*J)[a1][b1]; 
-    for( b2 = 0 ; b2 < size ; b2++ ){
-        for( b3 = 0 ; b3 < size ; b3++ ){
-            TABB =  TAB * A*(*T)[b1][b2][b3];
-            T5 = 0;
-            /* Beyond this point, b1 is not used anymore */
-	    //            TAU_START( timerB );
-            for( c1 = 0 ; c1 < size ; c1++ ){
-                T4 = 0;
-                for( c2 = 0 ; c2 < size ; c2++ ){
-                    TABC = TABB * (*J)[a2][c2];
-                    T3 = 0;
-                    for( c3 = 0 ; c3 < size ; c3++ ){
-                        TABCC = TABC * (*T)[c1][c2][c3] * (*J)[b3][c3] ;
-                        T2 = 0;
-                        for( d1 = 0 ; d1 < size ; d1++ ){
-                            TABCD = TABCC * (*J)[c1][d1];
-                            T1 = 0;
-                            for( d2 = 0 ; d2 < size ; d2++ ){
-                                TABCDD = TABCD * (*J)[b2][d2];
-                                T0 = 0;
-                                for( d3 = 0 ; d3 < size ; d3++ ){
-                                    T0 += TABCDD * (*T)[d1][d2][d3]*(*J)[a3][d3];
-                                }
-                                T1 += T0;
-                            }
-                            T2 += T1;
-                        }
-                        T3 += T2;
-                    }
-                    T4 += T3;
-                }
-                T5 += T4;
+    int N = size/2;
+    
+    A1 = a1 + N;
+    A4 = a4 + N;
+    A2 = a2 + N;
+    for( a6 = 0 ; a6 < N ; a6++ ) {
+        A6 = a6 + N;
+        
+        W1 = (*T)[a4][a2][a6];
+        W2 = (*T)[a4][A2][a6];
+        W3 = (*T)[a4][a2][A6];
+        W4 = (*T)[A4][A2][a6];
+        W5 = (*T)[a4][A2][A6];
+        W6 = (*T)[A4][a2][A6];
+        W7 = (*T)[A4][A2][A6];
+        
+        for( a5 = 0 ; a5 < N ; a5++ ) {
+            A5 = a5 + N;
+            Z1 = (*T)[a1][a5][a6];
+            Z2 = (*T)[A1][a5][a6];
+            Z6 = (*T)[A1][a5][A6];
+            t5 = W3*(*T)[a1][A5][a6];
+            tE = W4*(*T)[A1][A5][A6];
+            t1 = W3*Z2;
+            t13 = t1;
+            t2 = W5*Z1;
+            t23 = t2;
+            t3 = W3*Z1;
+            t4 = W6*Z1;
+            t12 = W5*Z2;
+            t14 = W6*Z2;
+            t134 = t14 ;
+            t16 = W1*Z6;
+            t24 = W7*Z1;
+            t26 = W2*(*T)[a1][a5][A6];
+            t123 = W5*Z2;
+            t126 = W2*Z6;
+            
+            for( a3 = 0 ; a3 < N ; a3++ ) {
+                A3 = a3 + N;
+                TE = TE + tE*(*T)[a1][a2][a3]*(*T)[a4][a5][A3];
+                T5 = T5 + t5*(*T)[A1][A2][A3]*(*T)[A4][a5][a3];
+                X7Y5 = (*T)[a1][A2][A3]*(*T)[A4][A5][a3];
+                T1 = T1 + t1*X7Y5;
+                T16 = T16 + t16*X7Y5;
+                T2 = T2 + t2*(*T)[A1][a2][A3]*(*T)[A4][A5][a3];
+                T3 = T3 + t3*(*T)[A1][A2][a3]*(*T)[A4][A5][A3];
+                T4 = T4 + t4*(*T)[A1][A2][A3]*(*T)[a4][A5][a3];
+                T12 = T12 + t12*(*T)[a1][a2][A3]*(*T)[A4][A5][a3];
+                T13 = T13 + t13*(*T)[a1][A2][a3]*(*T)[A4][A5][A3];
+                T14 = T14 + t14*(*T)[a1][A2][A3]*(*T)[a4][A5][a3];
+                T23 = T23 + t23*(*T)[A1][a2][a3]*(*T)[A4][A5][A3];
+                T24 = T24 + t24*(*T)[A1][a2][A3]*(*T)[a4][A5][a3];
+                T26 = T26 + t26*(*T)[A1][a2][A3]*(*T)[A4][A5][a3];
+                T123 = T123 + t123*(*T)[a1][a2][a3]*(*T)[A4][A5][A3];
+                T126 = T126 + t126*(*T)[a1][a2][A3]*(*T)[A4][A5][a3];
+                T134 = T134 + t134*(*T)[a1][A2][a3]*(*T)[a4][A5][A3];
             }
-            Tens += T5;
-	    //            TAU_STOP( timerB );
         }
     }
 
+    Tens = 4*(TE+T12+T13+T14+T16+T23+T24+T26 - (T1 + T2 + T3 + T4 + T5 +T123 + T126 + T134));
+
 #if 0
     std::ostringstream oss;
     oss << "output_" << getpid();
@@ -224,35 +241,80 @@ gi::ex one_level1_product( tensor3D_t* T, matrix_int_t *J, gi::ex A, int size, i
     return Tens;
 }
 
-gi::ex one_level2_product( tensor3D_t* T, matrix_int_t *J, gi::ex A, int size, int a1, int a2, int a3, int b1, int b2, int b3, int c1, int c2 ){
-    gi::ex TAB, TABB, TABC, TABCC, TABCD, TABCDD;
-    int c3, d1, d2, d3;
+gi::ex one_level2_product( tensor3D_t* T, int size, int a4, int a2, int a1, int a6 ){
+
+    int a3, a5;
+    int A1, A2, A3, A4, A5, A6;
 
     gi::ex Tens = 0;
-    gi::ex T0, T1, T2;
+    gi::ex W1, W2, W3, W4, W5, W6, W7;
+    gi::ex Z1, Z2, Z6, t5, tE, t1, t12, t123, t126, t13, t134, t14, t16, t2, t23, t24, t26, t3, t4, X7Y5;
+    gi::ex TE, T1, T2, T3, T4, T5, T12, T13, T14, T16, T23, T24, T26, T123, T126, T134;
+
+    TE = T1 = T2 = T3 = T4 = T5 = T12 = T13 = T14 = T16 = T23 = T24 = T26 = T123 = T126 = T134 = 0;
+
+    int N = size/2;
+
+    A1 = a1 + N;
+    A4 = a4 + N;
+    A2 = a2 + N;
+    A6 = a6 + N;
     
-    TAB = (*J)[a1][b1]; 
-    TABB =  TAB * A*(*T)[b1][b2][b3];
-    TABC = TABB * (*J)[a2][c2];
-    for( c3 = 0 ; c3 < size ; c3++ ){
-        TABCC = TABC * (*T)[c1][c2][c3] * (*J)[b3][c3] ;
-        T2 = 0;
-        for( d1 = 0 ; d1 < size ; d1++ ){
-            TABCD = TABCC * (*J)[c1][d1];
-            T1 = 0;
-            for( d2 = 0 ; d2 < size ; d2++ ){
-                TABCDD = TABCD * (*J)[b2][d2];
-                T0 = 0;
-                for( d3 = 0 ; d3 < size ; d3++ ){
-                    T0 += TABCDD * (*T)[d1][d2][d3]*(*J)[a3][d3];
-                }
-                T1 += T0;
-            }
-            T2 += T1;
+    W1 = (*T)[a4][a2][a6];
+    W2 = (*T)[a4][A2][a6];
+    W3 = (*T)[a4][a2][A6];
+    W4 = (*T)[A4][A2][a6];
+    W5 = (*T)[a4][A2][A6];
+    W6 = (*T)[A4][a2][A6];
+    W7 = (*T)[A4][A2][A6];
+    
+    
+    for( a5 = 0 ; a5 < N ; a5++ ) {
+        A5 = a5 + N;
+        Z1 = (*T)[a1][a5][a6];
+        Z2 = (*T)[A1][a5][a6];
+        Z6 = (*T)[A1][a5][A6];
+        t5 = W3*(*T)[a1][A5][a6];
+        tE = W4*(*T)[A1][A5][A6];
+        t1 = W3*Z2;
+        t13 = t1;
+        t2 = W5*Z1;
+        t23 = t2;
+        t3 = W3*Z1;
+        t4 = W6*Z1;
+        t12 = W5*Z2;
+        t14 = W6*Z2;
+        t134 = t14 ;
+        t16 = W1*Z6;
+        t24 = W7*Z1;
+        t26 = W2*(*T)[a1][a5][A6];
+        t123 = W5*Z2;
+        t126 = W2*Z6;
+        
+        for( a3 = 0 ; a3 < N ; a3++ ) {
+            A3 = a3 + N;
+            TE = TE + tE*(*T)[a1][a2][a3]*(*T)[a4][a5][A3];
+            T5 = T5 + t5*(*T)[A1][A2][A3]*(*T)[A4][a5][a3];
+            X7Y5 = (*T)[a1][A2][A3]*(*T)[A4][A5][a3];
+            T1 = T1 + t1*X7Y5;
+            T16 = T16 + t16*X7Y5;
+            T2 = T2 + t2*(*T)[A1][a2][A3]*(*T)[A4][A5][a3];
+            T3 = T3 + t3*(*T)[A1][A2][a3]*(*T)[A4][A5][A3];
+            T4 = T4 + t4*(*T)[A1][A2][A3]*(*T)[a4][A5][a3];
+            T12 = T12 + t12*(*T)[a1][a2][A3]*(*T)[A4][A5][a3];
+            T13 = T13 + t13*(*T)[a1][A2][a3]*(*T)[A4][A5][A3];
+            T14 = T14 + t14*(*T)[a1][A2][A3]*(*T)[a4][A5][a3];
+            T23 = T23 + t23*(*T)[A1][a2][a3]*(*T)[A4][A5][A3];
+            T24 = T24 + t24*(*T)[A1][a2][A3]*(*T)[a4][A5][a3];
+            T26 = T26 + t26*(*T)[A1][a2][A3]*(*T)[A4][A5][a3];
+            T123 = T123 + t123*(*T)[a1][a2][a3]*(*T)[A4][A5][A3];
+            T126 = T126 + t126*(*T)[a1][a2][A3]*(*T)[A4][A5][a3];
+            T134 = T134 + t134*(*T)[a1][A2][a3]*(*T)[a4][A5][A3];
         }
-        Tens += T2;
     }
     
+    Tens = 4*(TE+T12+T13+T14+T16+T23+T24+T26 - (T1 + T2 + T3 + T4 + T5 +T123 + T126 + T134));
+    
     return Tens;
 }
 
diff --git a/src/tensormatrix.h b/src/tensormatrix.h
index bcf5d8d86eb90c460db9319bb8b4e5fa99ea5983..069744c68a7556275e7c8b6fc437a1c9ed57d852 100644
--- a/src/tensormatrix.h
+++ b/src/tensormatrix.h
@@ -23,7 +23,7 @@ gi::ex multiply_seq( tensor3D_t&, matrix_int_t&, int );
 gi::ex multiply_1level( tensor3D_t&, matrix_int_t&, int );
 gi::ex multiply_2levels( tensor3D_t&, matrix_int_t&, int );
 // parallel
-gi::ex multiply_1level_mw( tensor3D_t&, matrix_int_t&, int );
+gi::ex multiply_1level_mw( tensor3D_t&, int );
 gi::ex multiply_1level_mw_addslave( tensor3D_t&, matrix_int_t&, int );
 gi::ex multiply_1level_mw_hierarch( tensor3D_t&, matrix_int_t&, int );
 gi::ex multiply_combined( tensor3D_t&, matrix_int_t&, int );
diff --git a/src/tensormatrix_mpi.cpp b/src/tensormatrix_mpi.cpp
index e1ec0feb076237d3ee08ff11466ca8721039e046..f62251d9cec2a4de8e5f1505bd9f43419ed1821f 100644
--- a/src/tensormatrix_mpi.cpp
+++ b/src/tensormatrix_mpi.cpp
@@ -132,9 +132,9 @@ int main( int argc, char** argv ){
     tv_start = getTime();
     switch( tostart ){
     case 'm':
-        Tpara = multiply_1level_mw( T, J, N );
+        Tpara = multiply_1level_mw( T, N );
         break;
-    case 'a':
+        /*    case 'a':
         Tpara = multiply_1level_mw_addslave( T, J, N );
         break;
     case 'h':
@@ -142,16 +142,13 @@ int main( int argc, char** argv ){
         break;
     case 'c':
         Tpara = multiply_combined( T, J, N );
-        break;
+        break;*/
     case 's':
         Tpara = multiply_seq( T, J, N );
         break;
     case '1':
         Tpara = multiply_1level( T, J, N );
         break;
-    case '2':
-        Tpara = multiply_2levels( T, J, N );
-        break;
     default:
         std::cerr << "Wrong function called" << std::endl;
     }
diff --git a/src/utils_parall.cpp b/src/utils_parall.cpp
index 07b9638e66f2275db6f4a18b6ef9a645c077ffc6..0490e7d8bc8e013452fddfefb7888e278bd1ae02 100644
--- a/src/utils_parall.cpp
+++ b/src/utils_parall.cpp
@@ -20,12 +20,10 @@ gi::ex de_linearize_expression( std::string s, gi::lst symbols ){
     return gi::ex( s, symbols );
 }
 
-parameters_t::parameters_t( gi::ex A, unsigned int a1,  unsigned int a2, unsigned int a3, unsigned int b1 ){
-    memcpy( this->A, linearize_expression( A ).c_str(), 6 );
-    this->a1 = a1;
+parameters_t::parameters_t( unsigned int a4,  unsigned int a2, unsigned int a1 ){
+    this->a4 = a4;
     this->a2 = a2;
-    this->a3 = a3;
-    this->b1 = b1;
+    this->a1 = a1;
 }
 
 parameters_2_t::parameters_2_t( gi::ex A, unsigned int a1,  unsigned int a2, unsigned int a3, unsigned int b1, unsigned int b2, unsigned int b3, unsigned int c1, unsigned int c2 ){
@@ -41,38 +39,12 @@ parameters_2_t::parameters_2_t( gi::ex A, unsigned int a1,  unsigned int a2, uns
 }
 
 void create_parameters_datatye(){
-    int structlen = 2;
-    int blocklengths[structlen];
-    MPI_Datatype types[structlen];
-    MPI_Aint displacements[structlen];
-
-    parameters_t par;
-    blocklengths[0] = 6;
-    types[0] = MPI_CHAR;        // A: 6 chars
-    displacements[0] = (size_t)&(par.A) - (size_t)&par;
-    blocklengths[1] = 4;
-    types[1] = MPI_UNSIGNED;    //  a1, a2, a3, b1
-    displacements[1] = (size_t)&(par.a1) - (size_t)&par;
-
-    MPI_Type_create_struct (2, blocklengths, displacements, types, &DT_PARAMETERS );
+    MPI_Type_contiguous( 3, MPI_UNSIGNED, &DT_PARAMETERS );
     MPI_Type_commit( &DT_PARAMETERS );
 }
 
 void create_parameters_datatye_2(){
-    int structlen = 2;
-    int blocklengths[structlen];
-    MPI_Datatype types[structlen];
-    MPI_Aint displacements[structlen];
-
-    parameters_t par;
-    blocklengths[0] = 6;
-    types[0] = MPI_CHAR;        // A: 6 chars
-    displacements[0] = (size_t)&(par.A) - (size_t)&par;
-    blocklengths[1] = 8;
-    types[1] = MPI_UNSIGNED;    //  a1, a2, a3, b1, b2, b3, c1, c2
-    displacements[1] = (size_t)&(par.a1) - (size_t)&par;
-
-    MPI_Type_create_struct (2, blocklengths, displacements, types, &DT_PARAMETERS_2 );
+    MPI_Type_contiguous( 4, MPI_UNSIGNED, &DT_PARAMETERS );
     MPI_Type_commit( &DT_PARAMETERS_2 );
 }
 
@@ -126,7 +98,7 @@ void send_expressions_to_add( std::vector<std::string>& results, int peer ) {
     /* Fill a bogus parameter object */
     int nb = results.size();
     int i;
-    parameters_t p( gi::symbol( "" ), nb, 0, 0, 0 );
+    parameters_t p( 0, 0, 0 );
     char* expr;
 
     MPI_Send( &p, 1, DT_PARAMETERS, peer, TAG_ADD, MPI_COMM_WORLD );
diff --git a/src/utils_parall.h b/src/utils_parall.h
index 94f18ff793f21feb515045b0f0c7e17d9fd50ca1..14d62f978db30b71a430eb26728d74952d55e6b9 100644
--- a/src/utils_parall.h
+++ b/src/utils_parall.h
@@ -10,9 +10,8 @@ namespace gi = GiNaC;
 
 class parameters_t{
 public:
-    char A[6];   // A is always a simple symbol, of form T_xyz. 
-    unsigned int a1, a2, a3, b1;
-    parameters_t( gi::ex, unsigned int,  unsigned int, unsigned int, unsigned int );
+    unsigned int a4, a2, a1;
+    parameters_t( unsigned int, unsigned int, unsigned int );
     parameters_t( void ){};
 };