diff --git a/experiments/california_housing.jl b/experiments/california_housing.jl
index 9f15341efaab6612a200414a2397fdfc4593d1e8..fa965f21c0621e510f4c082ebd149f756c36552c 100644
--- a/experiments/california_housing.jl
+++ b/experiments/california_housing.jl
@@ -20,6 +20,9 @@ params = (
     opt=Flux.Optimise.Descent(0.05)
 )
 
+# Best grid search params:
+append_best_params!(params, dataname)
+
 if !GRID_SEARCH
     run_experiment(
         counterfactual_data, test_data;
diff --git a/experiments/circles.jl b/experiments/circles.jl
index ca50439846d0b66437e7f172e2700e9529013a06..048bc931b5b64044b10894e4bacee5a18becd450 100644
--- a/experiments/circles.jl
+++ b/experiments/circles.jl
@@ -21,6 +21,9 @@ params = (
     sampling_steps=30,
 )
 
+# Best grid search params:
+append_best_params!(params, dataname)
+
 if !GRID_SEARCH
     run_experiment(
         counterfactual_data, test_data;
diff --git a/experiments/german_credit.jl b/experiments/german_credit.jl
index 0170846673a5fa97ddce3a7fdbdd300d9c154777..1d714825c6255e46b35085506a5acb6c23b9c513 100644
--- a/experiments/german_credit.jl
+++ b/experiments/german_credit.jl
@@ -20,6 +20,9 @@ params = (
     opt=Flux.Optimise.Descent(0.05)
 )
 
+# Best grid search params:
+append_best_params!(params, dataname)
+
 if !GRID_SEARCH
     run_experiment(
         counterfactual_data, test_data;
diff --git a/experiments/gmsc.jl b/experiments/gmsc.jl
index 0c6d262590f40a03dcca03ffb919f4243609e616..670ef2b16672ba9af669e1d0745d666cc029da94 100644
--- a/experiments/gmsc.jl
+++ b/experiments/gmsc.jl
@@ -21,6 +21,9 @@ params = (
     opt = Flux.Optimise.Descent(0.05)
 )
 
+# Best grid search params:
+append_best_params!(params, dataname)
+
 if !GRID_SEARCH
     run_experiment(
         counterfactual_data, test_data;
diff --git a/experiments/grid_search.jl b/experiments/grid_search.jl
index 4f3c01ea4f20c0e77c118459a791406d212d8ae9..e5c5231a34feffb5adffb8c2598d214f031620bc 100644
--- a/experiments/grid_search.jl
+++ b/experiments/grid_search.jl
@@ -52,10 +52,22 @@ function grid_search(
     end
 end
 
+const ALL_ECCCO_NAMES = [
+    "ECCCo",
+    "ECCCo (no CP)",
+    "ECCCo (no EBM)",
+    "ECCCo-Δ",
+    "ECCCo-Δ (no CP)",
+    "ECCCo-Δ (no EBM)",
+]
+
 const ECCCO_NAMES = [
     "ECCCo",
     "ECCCo (no CP)",
     "ECCCo (no EBM)",
+]
+
+const ECCCo_Δ_NAMES = [
     "ECCCo-Δ",
     "ECCCo-Δ (no CP)",
     "ECCCo-Δ (no EBM)",
@@ -66,7 +78,7 @@ const ECCCO_NAMES = [
 
 Returns the best outcome from grid search results. The best outcome is defined as the one with the lowest average rank across all datasets and variables for the specified generator and measure.
 """
-function best_outcome(outcomes::Dict; generator=ECCCO_NAMES, measure=["distance_from_energy", "distance_from_targets"], model::Union{Nothing,AbstractArray}=nothing)
+function best_outcome(outcomes::Dict; generator=ALL_ECCCO_NAMES, measure=["distance_from_energy_l2", "distance_from_targets_l2"], model::Union{Nothing,AbstractArray}=nothing)
     ranks = []
     for (params, outcome) in outcomes
         _ranks = generator_rank(outcome; generator=generator, measure=measure, model=model) |>
@@ -82,16 +94,16 @@ function best_outcome(outcomes::Dict; generator=ECCCO_NAMES, measure=["distance_
     return best_outcome
 end
 
-best_eccco(outcomes) = best_outcome(outcomes; generator=["ECCCo"], measure=["distance_from_energy", "distance_from_targets"])
+best_eccco(outcomes) = best_outcome(outcomes; generator=ECCCO_NAMES)
 
-best_eccco_Δ(outcomes) = best_outcome(outcomes; generator=["ECCCo-Δ"], measure=["distance_from_energy", "distance_from_targets"])
+best_eccco_Δ(outcomes) = best_outcome(outcomes; generator=ECCCo_Δ_NAMES)
 
 """
     best_absolute_outcome(outcomes; generator=ECCCO_NAMES, measure="distance_from_energy")
 
 Return the best outcome from grid search results. The best outcome is defined as the one with the lowest average value across all datasets and variables for the specified generator and measure.
 """
-function best_absolute_outcome(outcomes::Dict; generator=ECCCO_NAMES, measure::String="distance_from_energy", model::Union{Nothing,AbstractArray}=nothing)
+function best_absolute_outcome(outcomes::Dict; generator=ECCCO_NAMES, measure::String="distance_from_energy_l2", model::Union{Nothing,AbstractArray}=nothing)
     avg_values = []
     for (params, outcome) in outcomes
         # Compute:
@@ -113,6 +125,21 @@ function best_absolute_outcome(outcomes::Dict; generator=ECCCO_NAMES, measure::S
     )
 end
 
-best_absolute_outcome_eccco(outcomes) = best_absolute_outcome(outcomes; generator=["ECCCo"], measure="distance_from_energy")
+best_absolute_outcome_eccco(outcomes) = best_absolute_outcome(outcomes; generator=ECCCO_NAMES)
 
-best_absolute_outcome_eccco_Δ(outcomes) = best_absolute_outcome(outcomes; generator=["ECCCo-Δ"], measure="distance_from_energy")
\ No newline at end of file
+best_absolute_outcome_eccco_Δ(outcomes) = best_absolute_outcome(outcomes; generator=ECCCo_Δ_NAMES)
+
+"""
+    append_best_params!(params::NamedTuple, dataname::String)
+
+Appends the best parameters from grid search results to the specified parameters.
+"""
+function append_best_params!(params::NamedTuple, dataname::String)
+    if !isfile(joinpath(DEFAULT_OUTPUT_PATH, "grid_search", "$(replace(lowercase(dataname), " " => "_")).jls"))
+        @warn "No grid search results found. Using default parameters."
+    else
+        grid_search_results = Serialization.deserialize(joinpath(DEFAULT_OUTPUT_PATH, "grid_search", "$(replace(lowercase(dataname), " " => "_")).jls"))
+        best_params = best_eccco_Δ(grid_search_results).params
+        params = (; params..., best_params...)
+    end
+end
\ No newline at end of file
diff --git a/experiments/jobscripts/generators/innovation/california_housing.sh b/experiments/jobscripts/generators/innovation/california_housing.sh
new file mode 100644
index 0000000000000000000000000000000000000000..4160927bd1096d32175534e1f1ff57542d81aaa5
--- /dev/null
+++ b/experiments/jobscripts/generators/innovation/california_housing.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+#SBATCH --job-name="California Housing (ECCCo)"
+#SBATCH --time=3:00:00
+#SBATCH --ntasks=48
+#SBATCH --cpus-per-task=1
+#SBATCH --partition=compute
+#SBATCH --mem-per-cpu=4GB
+#SBATCH --account=innovation
+#SBATCH --mail-type=END     # Set mail type to 'END' to receive a mail when the job finishes. 
+
+module load 2023r1 openmpi
+
+srun julia --project=experiments experiments/run_experiments.jl -- data=california_housing output_path=results mpi > experiments/california_housing.log
diff --git a/experiments/jobscripts/generators/innovation/synthetic.sh b/experiments/jobscripts/generators/innovation/synthetic.sh
new file mode 100644
index 0000000000000000000000000000000000000000..1d5d39149d465b4b1d66720a3187acc1aaa1bd26
--- /dev/null
+++ b/experiments/jobscripts/generators/innovation/synthetic.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+#SBATCH --job-name="Synthetic (ECCCo)"
+#SBATCH --time=10:00:00
+#SBATCH --ntasks=48
+#SBATCH --cpus-per-task=1
+#SBATCH --partition=compute
+#SBATCH --mem-per-cpu=4GB
+#SBATCH --account=innovation
+#SBATCH --mail-type=END     # Set mail type to 'END' to receive a mail when the job finishes. 
+
+module load 2023r1 openmpi
+
+srun julia --project=experiments experiments/run_experiments.jl -- data=linearly_separable,moons,circles output_path=results mpi > experiments/synthetic.log
diff --git a/experiments/jobscripts/generators/innovation/tabular.sh b/experiments/jobscripts/generators/innovation/tabular.sh
new file mode 100644
index 0000000000000000000000000000000000000000..032b327fafbb4f299c9015f9d96e07919a827256
--- /dev/null
+++ b/experiments/jobscripts/generators/innovation/tabular.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+#SBATCH --job-name="Tabular (ECCCo)"
+#SBATCH --time=12:00:00
+#SBATCH --ntasks=48
+#SBATCH --cpus-per-task=1
+#SBATCH --partition=compute
+#SBATCH --mem-per-cpu=4GB
+#SBATCH --account=innovation
+#SBATCH --mail-type=END     # Set mail type to 'END' to receive a mail when the job finishes. 
+
+module load 2023r1 openmpi
+
+srun julia --project=experiments experiments/run_experiments.jl -- data=gmsc,german_credit output_path=results mpi > experiments/tabular.log
diff --git a/experiments/linearly_separable.jl b/experiments/linearly_separable.jl
index cfb02a7807b4982dfdd14869dfae0fca22a93971..31a17b03459373e486a3b079c388def3b1d0c0c1 100644
--- a/experiments/linearly_separable.jl
+++ b/experiments/linearly_separable.jl
@@ -22,6 +22,9 @@ params = (
     epochs=100,
 )
 
+# Best grid search params:
+append_best_params!(params, dataname)
+
 if !GRID_SEARCH 
     run_experiment(
         counterfactual_data, test_data; 
diff --git a/experiments/mnist.jl b/experiments/mnist.jl
index 5f6e8a25be1665ec95cb8d05805cb3d0b7453675..c7c9a322eedfbd70e78bbeacb551ca2dce205755 100644
--- a/experiments/mnist.jl
+++ b/experiments/mnist.jl
@@ -45,7 +45,7 @@ params = (
     Λ=[0.1, 0.25, 0.25],
     Λ_Δ=[0.1, 0.1, 1.0],
     opt=Flux.Optimise.Descent(0.1),
-    reg_strength = 0.0,
+    reg_strength = 0.01,
     ce_measures=ce_measures,
 )
 
diff --git a/experiments/moons.jl b/experiments/moons.jl
index 6d7d285107a50de334495df5934536c97e367a24..3fcdd2b5abdfc7f0cf65a5fee417488c8a862a8e 100644
--- a/experiments/moons.jl
+++ b/experiments/moons.jl
@@ -21,6 +21,9 @@ params = (
     sampling_steps=30,
 )
 
+# Best grid search params:
+append_best_params!(params, dataname)
+
 if !GRID_SEARCH
     run_experiment(
         counterfactual_data, test_data;