diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
index 1f0c394355fe60bba38875674a9e2e4f6b07b775..26d0b2c431c6355e2d2ceb01b486ab3978ef2c57 100644
--- a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
+++ b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
@@ -388,6 +388,9 @@ std::unique_ptr<EigenLinearSolverBase> createIterativeSolver(
         case EigenOption::PreconType::DIAGONAL:
             return createIterativeSolver<
                 Solver, Eigen::DiagonalPreconditioner<double>>();
+        case EigenOption::PreconType::LeastSquareDIAGONAL:
+            return createIterativeSolver<
+                Solver, Eigen::LeastSquareDiagonalPreconditioner<double>>();
         case EigenOption::PreconType::ILUT:
             // TODO for this preconditioner further options can be passed.
             // see
@@ -429,6 +432,11 @@ std::unique_ptr<EigenLinearSolverBase> createIterativeSolver(
         {
             return createIterativeSolver<EigenCGSolver>(precon_type);
         }
+        case EigenOption::SolverType::LeastSquareCG:
+        {
+            return createIterativeSolver<Eigen::LeastSquaresConjugateGradient>(
+                precon_type);
+        }
         case EigenOption::SolverType::GMRES:
         {
 #ifdef USE_EIGEN_UNSUPPORTED
@@ -493,6 +501,7 @@ EigenLinearSolver::EigenLinearSolver(std::string const& /*solver_name*/,
         case EigenOption::SolverType::BiCGSTAB:
         case EigenOption::SolverType::BiCGSTABL:
         case EigenOption::SolverType::CG:
+        case EigenOption::SolverType::LeastSquareCG:
         case EigenOption::SolverType::GMRES:
         case EigenOption::SolverType::IDRS:
         case EigenOption::SolverType::IDRSTABL:
diff --git a/MathLib/LinAlg/Eigen/EigenOption.cpp b/MathLib/LinAlg/Eigen/EigenOption.cpp
index b9df0ff226ace71eb98ea7d1eb4a5b82b7092eaa..07b11082bffb88ec04189ebedbc4577f79d287c1 100644
--- a/MathLib/LinAlg/Eigen/EigenOption.cpp
+++ b/MathLib/LinAlg/Eigen/EigenOption.cpp
@@ -38,6 +38,10 @@ EigenOption::SolverType EigenOption::getSolverType(
     {
         return SolverType::CG;
     }
+    if (solver_name == "LeastSquareCG")
+    {
+        return SolverType::LeastSquareCG;
+    }
     if (solver_name == "BiCGSTAB")
     {
         return SolverType::BiCGSTAB;
@@ -81,6 +85,10 @@ EigenOption::PreconType EigenOption::getPreconType(
     {
         return PreconType::DIAGONAL;
     }
+    if (precon_name == "LeastSquareDIAGONAL")
+    {
+        return PreconType::LeastSquareDIAGONAL;
+    }
     if (precon_name == "ILUT")
     {
         return PreconType::ILUT;
@@ -95,6 +103,8 @@ std::string EigenOption::getSolverName(SolverType const solver_type)
     {
         case SolverType::CG:
             return "CG";
+        case SolverType::LeastSquareCG:
+            return "LeastSquareCG";
         case SolverType::BiCGSTAB:
             return "BiCGSTAB";
         case SolverType::BiCGSTABL:
@@ -121,6 +131,8 @@ std::string EigenOption::getPreconName(PreconType const precon_type)
             return "NONE";
         case PreconType::DIAGONAL:
             return "DIAGONAL";
+        case PreconType::LeastSquareDIAGONAL:
+            return "LeastSquareDIAGONAL";
         case PreconType::ILUT:
             return "ILUT";
     }
diff --git a/MathLib/LinAlg/Eigen/EigenOption.h b/MathLib/LinAlg/Eigen/EigenOption.h
index 54815c948b92818850031565d9b59dc20e1c1741..217d69eae31e94ca97a8514c7eb2efb17c2428cf 100644
--- a/MathLib/LinAlg/Eigen/EigenOption.h
+++ b/MathLib/LinAlg/Eigen/EigenOption.h
@@ -21,6 +21,7 @@ struct EigenOption final
     enum class SolverType : short
     {
         CG,
+        LeastSquareCG,
         BiCGSTAB,
         BiCGSTABL,
         IDRS,
@@ -35,6 +36,7 @@ struct EigenOption final
     {
         NONE,
         DIAGONAL,
+        LeastSquareDIAGONAL,
         ILUT
     };