diff --git a/src/DCPSE/DCPSE_op/DCPSE_Solver.hpp b/src/DCPSE/DCPSE_op/DCPSE_Solver.hpp
index 52330de9df95db3c521639e0dd181a20a249c24f..75d6572c3d85541a52ebff61fab18a3a680e3857 100644
--- a/src/DCPSE/DCPSE_op/DCPSE_Solver.hpp
+++ b/src/DCPSE/DCPSE_op/DCPSE_Solver.hpp
@@ -118,8 +118,8 @@ class DCPSE_scheme {
 
         } else if (opt == options_solver::LAGRANGE_MULTIPLIER) {
             if (v_cl.rank() == v_cl.size() - 1) {
-                b.resize(Sys_eqs::nvar * tot + 1, Sys_eqs::nvar * sz + 1);
-                x_ig.resize(Sys_eqs::nvar * tot + 1, Sys_eqs::nvar * sz + 1);
+                b.resize(Sys_eqs::nvar * (tot + 1), Sys_eqs::nvar * (sz + 1));
+                x_ig.resize(Sys_eqs::nvar * (tot + 1), Sys_eqs::nvar * (sz + 1));
             } else {
                 b.resize(Sys_eqs::nvar * tot + 1, Sys_eqs::nvar * sz);
                 x_ig.resize(Sys_eqs::nvar * tot + 1, Sys_eqs::nvar * sz);
@@ -245,8 +245,9 @@ class DCPSE_scheme {
         // Indicate all the non zero rows
         openfpm::vector<unsigned char> nz_rows;
 
+
         if (v_cl.rank() == v_cl.size()-1 && opt == options_solver::LAGRANGE_MULTIPLIER) {
-            nz_rows.resize(row_b+1);
+            nz_rows.resize(row_b+Sys_eqs::nvar);
             }
         else{
             nz_rows.resize(row_b);
@@ -266,7 +267,7 @@ class DCPSE_scheme {
         if (v_cl.getProcessingUnits() == 1) {
             openfpm::vector<unsigned> nz_cols;
             if (v_cl.rank() == v_cl.size()-1 && opt == options_solver::LAGRANGE_MULTIPLIER) {
-                nz_cols.resize(row_b+1);
+                nz_cols.resize(row_b+Sys_eqs::nvar);
             }
             else{
                 nz_cols.resize(row_b);
@@ -473,7 +474,7 @@ public:
                       " properties " << std::endl;
         };
 #endif
-        auto x = solver.with_constant_nullspace_solve(getA(opt), getB(opt));
+        auto x = solver.with_nullspace_solve(getA(opt), getB(opt));
 
         unsigned int comp = 0;
         copy_nested(x, comp, exps ...);
@@ -756,65 +757,57 @@ public:
                      p_map.size_local() * Sys_eqs::nvar,
                      p_map.size_local() * Sys_eqs::nvar);
         }
-        else if (opt == options_solver::LAGRANGE_MULTIPLIER) {
+        else if (opt == options_solver::LAGRANGE_MULTIPLIER){
             auto &v_cl = create_vcluster();
             openfpm::vector<triplet> &trpl = A.getMatrixTriplets();
 
             if (v_cl.rank() == v_cl.size() - 1) {
-                A.resize(tot * Sys_eqs::nvar + 1, tot * Sys_eqs::nvar + 1,
-                         p_map.size_local() * Sys_eqs::nvar + 1,
-                         p_map.size_local() * Sys_eqs::nvar + 1);
-
-                for (int i = 0; i < tot * Sys_eqs::nvar; i++) {
-                    triplet t1;
-
-                    t1.row() = tot * Sys_eqs::nvar;
-                    t1.col() = i;
-                    t1.value() = 1;
-
-                    trpl.add(t1);
-                }
-
+                A.resize(Sys_eqs::nvar * (tot + 1), Sys_eqs::nvar * (tot + 1),
+                         Sys_eqs::nvar * (p_map.size_local() + 1),
+                         Sys_eqs::nvar * (p_map.size_local() + 1));
+                for (int j = 0; j < Sys_eqs::nvar; j++) {
+                    for (int i = j*tot; i < (j+1)*tot; i++) {
+                        triplet t1;
+                        t1.row() = tot * Sys_eqs::nvar+j;
+                        t1.col() = i;
+                        t1.value() = 1;
+                        trpl.add(t1);
+                    }
                 for (int i = 0; i < p_map.size_local() * Sys_eqs::nvar; i++) {
-                    triplet t2;
-
-                    t2.row() = i + s_pnt * Sys_eqs::nvar;
-                    t2.col() = tot * Sys_eqs::nvar;
-                    t2.value() = 1;
-
-                    trpl.add(t2);
+                    if(tot*j<=i + s_pnt * Sys_eqs::nvar<tot*(j+1)){
+                        triplet t2;
+                        t2.row() = i + s_pnt * Sys_eqs::nvar;
+                        t2.col() = tot * Sys_eqs::nvar+j;
+                        t2.value() = 1;
+                        trpl.add(t2);
+                    }
                 }
-
                 triplet t3;
-
-                t3.col() = tot * Sys_eqs::nvar;
-                t3.row() = tot * Sys_eqs::nvar;
+                t3.col() = tot * Sys_eqs::nvar+j;
+                t3.row() = tot * Sys_eqs::nvar+j;
                 t3.value() = 0;
-
                 trpl.add(t3);
-
+                }
+            }
                 //row_b++;
                 //row++;
-            }
             else {
-                A.resize(tot * Sys_eqs::nvar + 1, tot * Sys_eqs::nvar + 1,
+                A.resize(Sys_eqs::nvar*(tot + 1), Sys_eqs::nvar*(tot + 1),
                          p_map.size_local() * Sys_eqs::nvar,
                          p_map.size_local() * Sys_eqs::nvar);
-
-                for (int i = 0; i < p_map.size_local() * Sys_eqs::nvar; i++) {
-                    triplet t2;
-
-                    t2.row() = i + s_pnt * Sys_eqs::nvar;
-                    t2.col() = tot * Sys_eqs::nvar;
-                    t2.value() = 1;
-
-                    trpl.add(t2);
+                for (int j = 0; j < Sys_eqs::nvar; j++) {
+                    for (int i = p_map.size_local() * j; i < p_map.size_local()*j+1; i++) {
+                        if(tot*j<=i + s_pnt * Sys_eqs::nvar<tot*(j+1)) {
+                            triplet t2;
+                            t2.row() = i + s_pnt * Sys_eqs::nvar;
+                            t2.col() = tot * Sys_eqs::nvar + j;
+                            t2.value() = 1;
+                            trpl.add(t2);
+                        }
+                    }
                 }
             }
-
-
         }
-
         else{
             auto &v_cl = create_vcluster();
             if (v_cl.rank() == v_cl.size() - 1) {
@@ -847,8 +840,8 @@ public:
         if (opt == options_solver::LAGRANGE_MULTIPLIER) {
             auto &v_cl = create_vcluster();
             if (v_cl.rank() == v_cl.size() - 1) {
-
-                b(tot * Sys_eqs::nvar) = 0;
+                for(int j=0;j<Sys_eqs::nvar;j++)
+                {b(tot * Sys_eqs::nvar+j) = 0;}
             }
         }
         return b;
@@ -866,8 +859,8 @@ public:
         if (opt == options_solver::LAGRANGE_MULTIPLIER) {
             auto &v_cl = create_vcluster();
             if (v_cl.rank() == v_cl.size() - 1) {
-
-                x_ig(tot * Sys_eqs::nvar) = 0;
+                for(int j=0;j<Sys_eqs::nvar;j++)
+                    {x_ig(tot * Sys_eqs::nvar+j) = 0;}
             }
         }
         return x_ig;