diff --git a/apps/CodegenHeatEquationWithMaterial.cpp b/apps/CodegenHeatEquationWithMaterial.cpp
index 9cff394dbfe985d7f1c93d79c8f155267ff38fed..eddfa2e4e4a9fc7194f03df086c788c0a8ce81b3 100644
--- a/apps/CodegenHeatEquationWithMaterial.cpp
+++ b/apps/CodegenHeatEquationWithMaterial.cpp
@@ -22,7 +22,7 @@
 #include "timeloop/SweepTimeloop.h"
 
 #include "gen/HeatEquationKernelWithMaterial.hpp"
-#include "interpolate_binary_search_cpp.h"
+// #include "interpolate_binary_search_cpp.h"
 
 namespace walberla
 {
@@ -168,8 +168,8 @@ int main(int argc, char** argv)
 
 void test_performance() {
     // Configuration parameters
-    constexpr int warmupSteps = 2;
-    constexpr int outerIterations = 5;
+    constexpr int warmupSteps = 5;
+    constexpr int outerIterations = 10;
     constexpr int numCells = 64*64*64;
 
     // Setup test data
@@ -192,13 +192,13 @@ void test_performance() {
     std::cout << "Performing warmup steps..." << std::endl;
     for(int i = 0; i < warmupSteps; ++i) {
         for(const double& E : random_energies) {
+            // volatile double result = interpolate_double_lookup(E, test);
             volatile double result = test.interpolateDL(E);
         }
     }
     for(int i = 0; i < warmupSteps; ++i) {
         for(const double& E : random_energies) {
-            volatile double result = interpolate_binary_search_cpp(
-                    SS316L::T_eq, E, SS316L::E_neq);
+            volatile double result = test.interpolateBS(E);
         }
     }
 
@@ -217,26 +217,25 @@ void test_performance() {
                 volatile double result = test.interpolateDL(E);
             }
             const auto end1 = std::chrono::high_resolution_clock::now();
-            const auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(
+            const auto duration1 = std::chrono::duration_cast<std::chrono::nanoseconds>(
                 end1 - start1).count();
             timings_double_lookup.push_back(static_cast<double>(duration1));
 
-            std::cout << "Double Lookup - Iteration time: " << duration1 << " μs" << std::endl;
+            std::cout << "Double Lookup - Iteration time: " << duration1 << " ns" << std::endl;
         }
 
         // Binary Search timing
         {
             const auto start2 = std::chrono::high_resolution_clock::now();
             for(const double& E : random_energies) {
-                volatile double result = interpolate_binary_search_cpp(
-                    SS316L::T_eq, E, SS316L::E_neq);
+                volatile double result = test.interpolateBS(E);
             }
             const auto end2 = std::chrono::high_resolution_clock::now();
-            const auto duration2 = std::chrono::duration_cast<std::chrono::microseconds>(
+            const auto duration2 = std::chrono::duration_cast<std::chrono::nanoseconds>(
                 end2 - start2).count();
             timings_binary.push_back(static_cast<double>(duration2));
 
-            std::cout << "Binary Search - Iteration time: " << duration2 << " μs" << std::endl;
+            std::cout << "Binary Search - Iteration time: " << duration2 << " ns" << std::endl;
         }
     }
 
@@ -256,12 +255,12 @@ void test_performance() {
     std::cout << "\nPerformance Results (" << numCells << " cells, "
               << outerIterations << " iterations):" << std::endl;
     std::cout << "Binary Search:" << std::endl;
-    std::cout << "  Mean time: " << binary_mean << " ± " << binary_stdev << " μs" << std::endl;
-    std::cout << "  Per cell: " << binary_mean/numCells << " μs" << std::endl;
+    std::cout << "  Mean time: " << binary_mean << " ± " << binary_stdev << " ns" << std::endl;
+    std::cout << "  Per cell: " << binary_mean/numCells << " ns" << std::endl;
 
     std::cout << "Double Lookup:" << std::endl;
-    std::cout << "  Mean time: " << lookup_mean << " ± " << lookup_stdev << " μs" << std::endl;
-    std::cout << "  Per cell: " << lookup_mean/numCells << " μs" << std::endl;
+    std::cout << "  Mean time: " << lookup_mean << " ± " << lookup_stdev << " ns" << std::endl;
+    std::cout << "  Per cell: " << lookup_mean/numCells << " ns" << std::endl;
 }
 
 
diff --git a/apps/HeatEquationKernelWithMaterial.py b/apps/HeatEquationKernelWithMaterial.py
index 146242d2cd15db4d86603c752e86ac9ce32d5ceb..17a9bf263387a5c193aa58980ba58ba692ea2b3e 100644
--- a/apps/HeatEquationKernelWithMaterial.py
+++ b/apps/HeatEquationKernelWithMaterial.py
@@ -9,7 +9,7 @@ from pystencilssfg import SourceFileGenerator
 from sfg_walberla import Sweep
 from pymatlib.data.alloys.SS316L import SS316L
 from pymatlib.core.assignment_converter import assignment_converter
-from pymatlib.core.interpolators import DoubleLookupArrayContainer
+from pymatlib.core.interpolators import InterpolationArrayContainer
 from pymatlib.core.yaml_parser import create_alloy_from_yaml
 
 with SourceFileGenerator() as sfg:
@@ -40,7 +40,7 @@ with SourceFileGenerator() as sfg:
     # mat1 = create_alloy_from_yaml(str(yaml_path_1), u.center())
 
     # arr_container = DoubleLookupArrayContainer("SS316L", mat.temperature_array, mat.energy_density_array)
-    arr_container = DoubleLookupArrayContainer.from_material("SS316L", mat)
+    arr_container = InterpolationArrayContainer.from_material("SS316L", mat)
     sfg.generate(arr_container)
     # arr_container = DoubleLookupArrayContainer.from_material("SS316L_1", mat1)
     # sfg.generate(arr_container)