diff --git a/ChemistryLib/PhreeqcIO.cpp b/ChemistryLib/PhreeqcIO.cpp
index 0d1c92b2e894fcac559d29b74d1c9da185d1cf62..fdda6e0de58082dbde9e551f1bdb96068b1d6ed1 100644
--- a/ChemistryLib/PhreeqcIO.cpp
+++ b/ChemistryLib/PhreeqcIO.cpp
@@ -20,6 +20,7 @@
 #include "BaseLib/Algorithm.h"
 #include "BaseLib/ConfigTreeUtil.h"
 #include "MathLib/LinAlg/Eigen/EigenVector.h"
+#include "MathLib/LinAlg/LinAlg.h"
 #include "MeshLib/Mesh.h"
 #include "PhreeqcIOData/AqueousSolution.h"
 #include "PhreeqcIOData/ChemicalSystem.h"
@@ -116,8 +117,7 @@ void PhreeqcIO::initialize()
 void PhreeqcIO::executeInitialCalculation(
     std::vector<GlobalVector> const& interpolated_process_solutions)
 {
-    setAqueousSolutionsOrUpdateProcessSolutions(
-        process_solutions, Status::SettingAqueousSolutions);
+    setAqueousSolution(interpolated_process_solutions);
 
     writeInputsToFile();
 
@@ -132,8 +132,7 @@ void PhreeqcIO::executeInitialCalculation(
 void PhreeqcIO::doWaterChemistryCalculation(
     std::vector<GlobalVector*>& process_solutions, double const dt)
 {
-    setAqueousSolutionsOrUpdateProcessSolutions(
-        process_solutions, Status::SettingAqueousSolutions);
+    setAqueousSolution(interpolated_process_solutions);
 
     setAqueousSolutionsPrevFromDumpFile();
 
@@ -147,66 +146,23 @@ void PhreeqcIO::doWaterChemistryCalculation(
         process_solutions, Status::UpdatingProcessSolutions);
 }
 
-void PhreeqcIO::setAqueousSolutionsOrUpdateProcessSolutions(
-    std::vector<GlobalVector*> const& process_solutions, Status const status)
+void PhreeqcIO::setAqueousSolution(
+    std::vector<GlobalVector> const& interpolated_process_solutions)
 {
-    std::size_t const num_chemical_systems = _mesh.getNumberOfBaseNodes();
-
-    auto const chemical_system_map =
-        *_mesh.getProperties().template getPropertyVector<std::size_t>(
-            "bulk_node_ids", MeshLib::MeshItemType::Node, 1);
-
-    // Loop over chemical systems
     auto& aqueous_solution = _chemical_system->aqueous_solution;
+
+    // components
     auto& components = aqueous_solution->components;
-    for (std::size_t local_id = 0; local_id < num_chemical_systems; ++local_id)
+    for (unsigned component_id = 0; component_id < components.size();
+         ++component_id)
     {
-        auto const global_id = chemical_system_map[local_id];
-        // Loop over transport process id map to retrieve component
-        // concentrations from process solutions or to update process solutions
-        // after chemical calculation by Phreeqc
-        for (unsigned component_id = 0; component_id < components.size();
-             ++component_id)
-        {
-            auto& component = components[component_id];
-            auto& transport_process_solution =
-                process_solutions[component_id + 1];
-            switch (status)
-            {
-                case Status::SettingAqueousSolutions:
-                    // Set component concentrations.
-                    component.amount->set(
-                        local_id, (*transport_process_solution)[global_id]);
-                    break;
-                case Status::UpdatingProcessSolutions:
-                    // Update solutions of component transport processes.
-                    transport_process_solution->set(
-                        global_id, (*component.amount)[local_id]);
-                    break;
-            }
-        }
-
-        switch (status)
-        {
-            case Status::SettingAqueousSolutions:
-            {
-                // Set pH value by hydrogen concentration.
-                aqueous_solution->pH->set(
-                    local_id,
-                    -std::log10((*process_solutions.back())[global_id]));
-                break;
-            }
-            case Status::UpdatingProcessSolutions:
-            {
-                // Update hydrogen concentration by pH value.
-                auto hydrogen_concentration =
-                    std::pow(10, -(*aqueous_solution->pH)[local_id]);
-                process_solutions.back()->set(global_id,
-                                              hydrogen_concentration);
-                break;
-            }
-        }
+        MathLib::LinAlg::copy(interpolated_process_solutions[component_id + 1],
+                              *components[component_id].amount);
     }
+
+    // pH
+    MathLib::LinAlg::copy(interpolated_process_solutions.back(),
+                          *aqueous_solution->pH);
 }
 
 void PhreeqcIO::setAqueousSolutionsPrevFromDumpFile()
diff --git a/ChemistryLib/PhreeqcIO.h b/ChemistryLib/PhreeqcIO.h
index f43f9848094e99d1700a021720968104bcbadc02..e2625497a858043546d4d97ece3e8cebc3ab434b 100644
--- a/ChemistryLib/PhreeqcIO.h
+++ b/ChemistryLib/PhreeqcIO.h
@@ -31,12 +31,6 @@ struct SurfaceSite;
 struct Dump;
 struct UserPunch;
 
-enum class Status
-{
-    SettingAqueousSolutions,
-    UpdatingProcessSolutions
-};
-
 class PhreeqcIO final : public ChemicalSolverInterface
 {
 public:
@@ -60,9 +54,8 @@ public:
         std::vector<GlobalVector*>& process_solutions,
         double const dt) override;
 
-    void setAqueousSolutionsOrUpdateProcessSolutions(
-        std::vector<GlobalVector*> const& process_solutions,
-        Status const status);
+    void setAqueousSolution(
+        std::vector<GlobalVector> const& interpolated_process_solutions);
 
     void writeInputsToFile(double const dt = 0);