diff --git a/src/mw_addslave4.cpp b/src/mw_addslave4.cpp
index 6505442f42420464e48f0f0db1eed22b19ada348..07b78de2421b829aedd61037d7571d637ee054fb 100644
--- a/src/mw_addslave4.cpp
+++ b/src/mw_addslave4.cpp
@@ -77,27 +77,35 @@ gi::ex add_expressions_parall( std::vector<std::string> expressions, gi::lst sym
        for( auto s: expressions  ) {
             chunk = ceil( s.length() / size );
 
+            end = 0;
             for( peer = 0 ; peer < size ; peer++ ) {
 
                 if( 0 == peer ) {
-                    displ[ expr ] = 0;
+                    displ[ peer * nb + expr] = 0;
                     end = chunk;
                 } else {
+                    displ[ peer * nb + expr] = end + 1;
                     end = displ[ peer * nb + expr] + chunk;
                 }
                 /* How much are we going to send: stop at a + or - sign (and keep the sign) */
                 
-                while( !( s[end] == '+' || s[end] == '-' || end == (int)s.length() - 1) ){
+                while( ( end < (int)s.length() - 1) && !( s[end] == '+' || s[end] == '-' || end == (int)s.length() - 1 )) {
                     end++;
                 }
                 end--;
+                // std::cout << s[end-4] <<  s[end-3] <<  s[end-2] <<  s[end-1] <<  s[end] << std::endl;
                 if( 0 == peer ) {
                     lengths[ expr ] = end + 1;
                 } else {
                     //   std::cout << "peer " << peer << " expr " << expr << " end " << end << std::endl;
                     lengths[ peer * nb + expr ] = end - displ[ peer  * nb + expr ] + 1;
                 }
-                if( peer < size - 1 ) displ[ ( peer + 1 ) * nb + expr] = end;
+                //                if( peer < size - 1 ) displ[ ( peer + 1 ) * nb + expr] = end;
+               
+                //   std::cout << "Disp " << displ[ peer * nb + expr] << std::endl;
+                //                std::cout << s << std::endl;
+                //  std::cout << s[ displ[ peer * nb + expr] ] << s[ displ[ peer * nb + expr] + 1 ] << s[ displ[ peer * nb + expr] + 2 ] << s[ displ[ peer * nb + expr] + 3 ] << s[ displ[ peer * nb + expr] + 4 ] << std::endl;
+
             }
 
             expr++;
@@ -171,13 +179,22 @@ gi::ex add_expressions_parall( std::vector<std::string> expressions, gi::lst sym
         expr_c[len ] = '\0';    // The master sends C++ strings, which do not contain the final '\0'
         results_s.push_back( std::string( expr_c ) );
 
+        //        if( rank == 0 ){
+            //            for( peer = 0 ; peer < size ; peer++ ) {
+                //                std::cout << "==" << toto[ m_disp[peer] ] << toto[ m_disp[peer] +1] << toto[ m_disp[peer] +2] << toto[ m_disp[peer] +3] << toto[ m_disp[peer] +4] << std::endl;
+            //            }
+            //        }
+
+        //        std::cout << expr_c << std::endl;
+        
         /* TODO: this can be overlapped with the computation of the previous addition */
     }
 
     /* Add them */
 
     Tens = add_expressions( results_s, symbols );
-
+    //    std::cout << Tens << std::endl;
+    
     /* Send the result to the master */
 
     std::string expr_s = linearize_expression( Tens );
@@ -187,28 +204,33 @@ gi::ex add_expressions_parall( std::vector<std::string> expressions, gi::lst sym
 
     if( 0 == rank ) {
         for( peer = 0 ; peer < size ; peer++ ){
-            m_disp[peer] = totallen;
+            m_disp[peer] = totallen + 1;
             totallen += m_len[peer];
         }
+        m_disp[0] = 0;
             
         total_c = (char*) malloc( ( totallen + size ) * sizeof( char ) );
     }
-    
+
+    //    sleep( rank );
     expr_c = const_cast<char*>( expr_s.c_str() );
-    
-    std::cout << expr_c[ len-5 ]  << expr_c[ len-4 ]  << expr_c[ len-3 ]  << expr_c[ len-2 ]  << expr_c[ len-1 ] << std::endl;
+    //  std::cout << rank << " | " << expr_c << std::endl;
+
+    //std::cout << expr_s << std::endl;
+    //    std::cout << expr_c[ len-5 ]  << expr_c[ len-4 ]  << expr_c[ len-3 ]  << expr_c[ len-2 ]  << expr_c[ len-1 ] << std::endl;
+    //    std::cout << expr_c[ 0 ]  << expr_c[ 1 ]  << expr_c[ 2 ]  << expr_c[ 3 ]  << expr_c[ 4 ] << std::endl;
 
     MPI_Gatherv( expr_c, len, MPI_CHAR, total_c, m_len, m_disp, MPI_CHAR, 0, comm );
 
     if( 0 == rank ){ /* replace the \n's by + */
         for( peer = 1 ; peer < size ; peer++ ){
-            total_c[ m_disp[peer] ] = '+' ;
+            total_c[ m_disp[peer] - 1 ] = '+' ;
         }
-        std::cout << total_c[ totallen-5 ]  << total_c[ totallen-4 ]  << total_c[ totallen-3 ]  << total_c[ totallen-2 ]  << total_c[ totallen-1 ] << std::endl;
+        //  std::cout << total_c[ totallen-5 ]  << total_c[ totallen-4 ]  << total_c[ totallen-3 ]  << total_c[ totallen-2 ]  << total_c[ totallen-1 ] << std::endl;
         expr_c[ totallen + size - 1 ] = '\n' ;
-    //    std::cout << total_c << std::endl;
+        //x        std::cout <<"Total: " << total_c << std::endl;
 
-        Tens = de_linearize_expression( std::string( total_c ), symbols );
+        //        Tens = de_linearize_expression( std::string( total_c ), symbols );
     }
     
     free( lengths );