diff --git a/NumLib/TimeStepping/Algorithms/CreateEvolutionaryPIDcontroller.cpp b/NumLib/TimeStepping/Algorithms/CreateEvolutionaryPIDcontroller.cpp
index 848690bb255abdbd765a364b8a288224b525e57e..37fdd0aeb8351b8787e8b93d6d212c140098bb4d 100644
--- a/NumLib/TimeStepping/Algorithms/CreateEvolutionaryPIDcontroller.cpp
+++ b/NumLib/TimeStepping/Algorithms/CreateEvolutionaryPIDcontroller.cpp
@@ -45,12 +45,9 @@ std::unique_ptr<TimeStepAlgorithm> createEvolutionaryPIDcontroller(
     auto fixed_output_times =
         //! \ogs_file_param{prj__time_loop__processes__process__time_stepping__EvolutionaryPIDcontroller__fixed_output_times}
         config.getConfigParameter<std::vector<double>>("fixed_output_times",
-                                                       std::vector<double>{});
-    if (!fixed_output_times.empty())
-    {
-        // Remove possible duplicated elements and sort in descending order.
-        BaseLib::makeVectorUnique(fixed_output_times, std::greater<>());
-    }
+                                                       {});
+    // Remove possible duplicated elements and sort.
+    BaseLib::makeVectorUnique(fixed_output_times);
 
     //! \ogs_file_param{prj__time_loop__processes__process__time_stepping__EvolutionaryPIDcontroller__tol}
     auto const tol = config.getConfigParameter<double>("tol");
diff --git a/NumLib/TimeStepping/Algorithms/CreateIterationNumberBasedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/CreateIterationNumberBasedTimeStepping.cpp
index 742097186663bb782bece72c29c5e2a14656f725..8a7b8ebaa1afbf74bbbc09e95a83eb7213f120b6 100644
--- a/NumLib/TimeStepping/Algorithms/CreateIterationNumberBasedTimeStepping.cpp
+++ b/NumLib/TimeStepping/Algorithms/CreateIterationNumberBasedTimeStepping.cpp
@@ -46,12 +46,9 @@ std::unique_ptr<TimeStepAlgorithm> createIterationNumberBasedTimeStepping(
     auto fixed_output_times =
         //! \ogs_file_param{prj__time_loop__processes__process__time_stepping__IterationNumberBasedTimeStepping__fixed_output_times}
         config.getConfigParameter<std::vector<double>>("fixed_output_times",
-                                                       std::vector<double>{});
-    if (!fixed_output_times.empty())
-    {
-        // Remove possible duplicated elements and sort in descending order.
-        BaseLib::makeVectorUnique(fixed_output_times, std::greater<>());
-    }
+                                                       {});
+    // Remove possible duplicated elements and sort.
+    BaseLib::makeVectorUnique(fixed_output_times);
 
     return std::make_unique<IterationNumberBasedTimeStepping>(
         t_initial, t_end, minimum_dt, maximum_dt, initial_dt,
diff --git a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
index b0d0c3de1a6a2d162413a8100a29633a19238994..385a0ed9d9d1e2abd2ba1831c0297e6c4a279fde 100644
--- a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
+++ b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
@@ -36,8 +36,12 @@ EvolutionaryPIDcontroller::EvolutionaryPIDcontroller(
       _e_n_minus2(0.),
       _is_accepted(true)
 {
-    // Remove possible duplicated elements. Result will be sorted.
-    BaseLib::makeVectorUnique(_fixed_output_times);
+    if (!std::is_sorted(cbegin(_fixed_output_times), cend(_fixed_output_times)))
+    {
+        OGS_FATAL(
+            "Vector of fixed time steps passed to the "
+            "EvolutionaryPIDcontroller constructor must be sorted");
+    }
 }
 
 bool EvolutionaryPIDcontroller::next(double const solution_error,
diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
index a204a053b02c3621d184a1adb338d8d7c1e66a7b..a69d866af6d769fff0636258dbbd196142e17397 100644
--- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
+++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp
@@ -53,8 +53,12 @@ IterationNumberBasedTimeStepping::IterationNumberBasedTimeStepping(
         OGS_FATAL("Vector of iteration numbers must be sorted.");
     }
 
-    // Remove possible duplicated elements. Result will be sorted.
-    BaseLib::makeVectorUnique(_fixed_output_times);
+    if (!std::is_sorted(cbegin(_fixed_output_times), cend(_fixed_output_times)))
+    {
+        OGS_FATAL(
+            "Vector of fixed time steps passed to the "
+            "IterationNumberBasedTimeStepping constructor must be sorted");
+    }
 }
 
 bool IterationNumberBasedTimeStepping::next(double const /*solution_error*/,
diff --git a/ProcessLib/Output/CreateOutput.cpp b/ProcessLib/Output/CreateOutput.cpp
index 0e1ac5bac287dd78644df570baa861584dca1830..27bdb5fba71b9ae70841c5ec8dfeae98f3a78f13 100644
--- a/ProcessLib/Output/CreateOutput.cpp
+++ b/ProcessLib/Output/CreateOutput.cpp
@@ -55,8 +55,6 @@ std::unique_ptr<Output> createOutput(
     // Construction of output times
     std::vector<Output::PairRepeatEachSteps> repeats_each_steps;
 
-    std::vector<double> fixed_output_times;
-
     //! \ogs_file_param{prj__time_loop__output__timesteps}
     if (auto const timesteps = config.getConfigSubtreeOptional("timesteps"))
     {
@@ -133,16 +131,12 @@ std::unique_ptr<Output> createOutput(
         }
     }
 
-    auto fixed_output_times_ptr =
+    std::vector<double> fixed_output_times =
         //! \ogs_file_param{prj__time_loop__output__fixed_output_times}
-        config.getConfigParameterOptional<std::vector<double>>(
-            "fixed_output_times");
-    if (fixed_output_times_ptr)
-    {
-        fixed_output_times = std::move(*fixed_output_times_ptr);
-        // Remove possible duplicated elements and sort in descending order.
-        BaseLib::makeVectorUnique(fixed_output_times, std::greater<>());
-    }
+        config.getConfigParameter<std::vector<double>>("fixed_output_times",
+                                                       {});
+    // Remove possible duplicated elements and sort.
+    BaseLib::makeVectorUnique(fixed_output_times);
 
     bool const output_iteration_results =
         //! \ogs_file_param{prj__time_loop__output__output_iteration_results}
diff --git a/ProcessLib/Output/Output.cpp b/ProcessLib/Output/Output.cpp
index 5526d622a966cdbabdc97a4aac32859966ac49fe..f45fcdf93a81df3080f8c1cccc843b0e1f760572 100644
--- a/ProcessLib/Output/Output.cpp
+++ b/ProcessLib/Output/Output.cpp
@@ -78,22 +78,20 @@ bool Output::shallDoOutput(int timestep, double const t)
         }
     }
 
-    bool make_output = timestep % each_steps == 0;
-
-    if (_fixed_output_times.empty())
+    if (timestep % each_steps == 0)
     {
-        return make_output;
+        return true;
     }
 
-    const double specific_time = _fixed_output_times.back();
-    const double zero_threshold = std::numeric_limits<double>::min();
-    if (std::fabs(specific_time - t) < zero_threshold)
+    auto const fixed_output_time = std::lower_bound(
+        cbegin(_fixed_output_times), cend(_fixed_output_times), t);
+    if (fixed_output_time == cend(_fixed_output_times))
     {
-        _fixed_output_times.pop_back();
-        make_output = true;
+        return false;
     }
 
-    return make_output;
+    return std::fabs(*fixed_output_time - t) <
+           std::numeric_limits<double>::min();
 }
 
 Output::Output(std::string output_directory, std::string output_file_prefix,
@@ -117,6 +115,12 @@ Output::Output(std::string output_directory, std::string output_file_prefix,
       _mesh_names_for_output(mesh_names_for_output),
       _meshes(meshes)
 {
+    if (!std::is_sorted(cbegin(_fixed_output_times), cend(_fixed_output_times)))
+    {
+        OGS_FATAL(
+            "Vector of fixed output time steps passed to the Output "
+            "constructor must be sorted");
+    }
 }
 
 void Output::addProcess(ProcessLib::Process const& process,
diff --git a/ProcessLib/Output/Output.h b/ProcessLib/Output/Output.h
index 07ae325e3e3066113da3ecb8612c3a75e194eb08..4a14a38a9b595e853dde05b5df4def21cd0d2aff 100644
--- a/ProcessLib/Output/Output.h
+++ b/ProcessLib/Output/Output.h
@@ -104,7 +104,7 @@ private:
     std::vector<PairRepeatEachSteps> _repeats_each_steps;
 
     //! Given times that steps have to reach.
-    std::vector<double> _fixed_output_times;
+    std::vector<double> const _fixed_output_times;
 
     std::multimap<Process const*, MeshLib::IO::PVDFile> _process_to_pvd_file;