diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt b/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt
index 26d1f112ddb927ffd51df994874a30ea1a458db6..63de4f5004cf883da95430e1524223f63acc5475 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt
@@ -1,11 +1,13 @@
 package theodolite
 import io.quarkus.runtime.annotations.QuarkusMain
+import theodolite.execution.TheodoliteExecutor
 
 
 @QuarkusMain
 object Main {
     @JvmStatic
     fun main(args: Array<String>) {
-        println("Starting Benchmarks")
+        val theodolite = TheodoliteExecutor();
+        theodolite.run()
     }
 }
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt
index e6ffc016552fbea01dbd124c1df1056ada681af3..591a2bc10960ddaf49bb4bbe10eea1b8258c7978 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt
@@ -1,8 +1,10 @@
 package theodolite.execution
 
+import theodolite.util.Benchmark
 import theodolite.util.LoadDimension
 import theodolite.util.Resource
+import theodolite.util.Results
 
-interface BenchmarkExecutor {
-    fun runExperiment(load: LoadDimension, res: Resource): Boolean;
+abstract class BenchmarkExecutor(val benchmark: Benchmark, val results: Results) {
+    abstract fun runExperiment(load: LoadDimension, res: Resource): Boolean;
 }
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b2323b83eb9a196d5f2617c7d7b6ee0f8716af23
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt
@@ -0,0 +1,18 @@
+package theodolite.execution
+
+import theodolite.util.Benchmark
+import theodolite.util.LoadDimension
+import theodolite.util.Resource
+import theodolite.util.Results
+
+class KafkaBenchmarkExecutor(benchmark: Benchmark, results: Results) : BenchmarkExecutor(benchmark, results) {
+    override fun runExperiment(load: LoadDimension, res: Resource): Boolean {
+        benchmark.start()
+        // wait
+        benchmark.stop();
+        // evaluate
+        val result = false // if success else false
+        this.results.setResult(Pair(load, res), result)
+        return result;
+    }
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt
index 65cb4220300a43f14bdac7637c5e79e34f691d46..d98ba3fb190732d03b9c74ac651ee0496c11ad58 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt
@@ -1,13 +1,20 @@
 package theodolite.execution
 
 import theodolite.execution.BenchmarkExecutor
+import theodolite.util.Benchmark
 import theodolite.util.LoadDimension
 import theodolite.util.Resource
+import theodolite.util.Results
 
-class TestBenchmarkExecutor(val mockResults: Array<Array<Boolean>>): BenchmarkExecutor {
+class TestBenchmarkExecutor(private val mockResults: Array<Array<Boolean>>, benchmark: Benchmark, results: Results):
+    BenchmarkExecutor(benchmark, results) {
 
     override fun runExperiment(load: LoadDimension, res: Resource): Boolean {
-        System.out.println("load :" + load.get().toString() + ", res: " + res.get().toString())
-        return this.mockResults[load.get()][res.get()]
+        val result = this.mockResults[load.get()][res.get()]
+
+        System.out.println("load :" + load.get().toString() + ", res: " + res.get().toString() + ", res: " + result)
+
+        this.results.setResult(Pair(load, res), result)
+        return result;
     }
 }
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt
new file mode 100644
index 0000000000000000000000000000000000000000..e2c56c70c2772c3ddda245f5f210a32049e3b855
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt
@@ -0,0 +1,34 @@
+package theodolite.execution
+
+import theodolite.strategies.restriction.LowerBoundRestriction
+import theodolite.strategies.searchstrategy.CompositeStrategy
+import theodolite.strategies.searchstrategy.LinearSearch
+import theodolite.util.*
+
+class TheodoliteExecutor() {
+    private fun loadConfig(): Config {
+        val benchmark: Benchmark = KafkaBenchmark()
+        val results: Results = Results()
+        val executor: BenchmarkExecutor = KafkaBenchmarkExecutor(benchmark, results)
+
+        val restrictionStrategy = LowerBoundRestriction(results)
+        val searchStrategy = LinearSearch(executor, results)
+
+        return Config(
+            loads = (0..6).map{ number -> LoadDimension(number) },
+            resources = (0..6).map{ number -> Resource(number) },
+            compositeStrategy = CompositeStrategy(executor, searchStrategy, restrictionStrategies = setOf(restrictionStrategy), results = results)
+        )
+    }
+
+    fun run() {
+        // read or get benchmark config
+        val config = this.loadConfig()
+
+        // execute benchmarks for each load
+        for(load in config.loads) {
+            config.compositeStrategy.findSuitableResources(load, config.resources)
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/LowerBoundRestriction.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/LowerBoundRestriction.kt
index 6f71a949e47739bc01916e042e2625e89a215785..fb3574e57053436019a9c74cdc4d82e71268bcf5 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/LowerBoundRestriction.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/LowerBoundRestriction.kt
@@ -3,14 +3,13 @@ package theodolite.strategies.restriction
 import theodolite.util.Results
 import theodolite.util.LoadDimension
 import theodolite.util.Resource
-import kotlin.math.max
 
 class LowerBoundRestriction(results: Results) : RestrictionStrategy(results) {
     override fun next(load: LoadDimension, resources: List<Resource>): List<Resource> {
             val maxLoad: LoadDimension? = this.results.getMaxBenchmarkedLoad(load)
-            var lowerBound: Resource? = this.results.getRequiredInstances(maxLoad)
+            var lowerBound: Resource? = this.results.getMinRequiredInstances(maxLoad)
             if(lowerBound == null) {
-                lowerBound = Resource(0) // TODO handle the null case
+                lowerBound = resources.get(0)
             }
             return resources.filter{x -> x.get() >= lowerBound.get()}
     }
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt
index 32cfe2191ee4e9d640fcc271ddcc596920296575..1ce43d7bb2c73faf2e0ca418f1e574082dd2d1ed 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt
@@ -26,10 +26,11 @@ class BinarySearch(benchmarkExecutor: BenchmarkExecutor, results: Results) : Sea
                 return lower + 1;
             }
         } else {
+            // (true, true), (false, true), (false, false) // (false, false, false, true, false, true, false, true)
             val mid = (upper + lower) / 2
             if (this.benchmarkExecutor.runExperiment(load, resources[mid])) {
                 if (mid == lower) {
-                    return search(load, resources, lower, lower );
+                    return lower
                 }
                 return search(load, resources, lower, mid - 1 );
             } else {
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt
index 7a100e5abb600ea976fe35b11076b55a6e58b25b..ed8750083881f72a091c0acd923ef7c46ff79db7 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt
@@ -6,13 +6,13 @@ import theodolite.util.LoadDimension
 import theodolite.util.Resource
 import theodolite.util.Results
 
-class CompositeStrategy(benchmarkExecutor: BenchmarkExecutor, val searchStrategy: SearchStrategy, val restrictionStrategies: List<RestrictionStrategy>, results: Results) : SearchStrategy(benchmarkExecutor, results) {
+class CompositeStrategy(benchmarkExecutor: BenchmarkExecutor, val searchStrategy: SearchStrategy, val restrictionStrategies: Set<RestrictionStrategy>, results: Results) : SearchStrategy(benchmarkExecutor, results) {
 
-    override fun findSuitableResources(load: LoadDimension,resources: List<Resource>): Resource? {
-        var restricted = resources
+    override fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource? {
+        var restrictedResources = resources.toList()
         for (strategy in this.restrictionStrategies) {
-            restricted = restricted.intersect(strategy.next(load, resources)).toList() // erstellt das eine liste oder verändert das die liste?
+            restrictedResources = restrictedResources.intersect(strategy.next(load, resources)).toList()
         }
-        return this.searchStrategy.findSuitableResources(load, restricted)
+        return this.searchStrategy.findSuitableResources(load, restrictedResources)
     }
 }
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt
index 6381f9e6280bcf0dff93c6a58004b2fa668adc4f..37fa4ca41678c285bb4fb6a86633dedecb78ba03 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt
@@ -9,12 +9,7 @@ class LinearSearch(benchmarkExecutor: BenchmarkExecutor, results: Results) : Sea
 
     override fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource? {
         for (res in resources) {
-            if (this.benchmarkExecutor.runExperiment(load, res)) {
-                this.results.setResult(Pair(load, res), true)
-                return res
-            } else {
-                this.results.setResult(Pair(load, res), false)
-            }
+            if (this.benchmarkExecutor.runExperiment(load, res)) return res
         }
         return null;
     }
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f757128a2bf1ca997fbe6f777f6bfb9de37cf776
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt
@@ -0,0 +1,9 @@
+package theodolite.util
+
+// todo: needs cluster and resource config
+interface Benchmark {
+
+    fun start();
+
+    fun stop();
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7dff743661d7d19b421de46874f2f70c5e76ec42
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt
@@ -0,0 +1,13 @@
+package theodolite.util
+
+import theodolite.strategies.restriction.RestrictionStrategy
+import theodolite.strategies.searchstrategy.CompositeStrategy
+import theodolite.strategies.searchstrategy.SearchStrategy
+
+data class Config(
+    val loads: List<LoadDimension>,
+    val resources: List<Resource>,
+    val compositeStrategy: CompositeStrategy
+) {
+
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt
new file mode 100644
index 0000000000000000000000000000000000000000..fdbb1cc932c33b076404db682d43763d88fc6398
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt
@@ -0,0 +1,13 @@
+package theodolite.util
+
+class KafkaBenchmark: Benchmark {
+
+    override fun start() {
+        TODO("Not yet implemented")
+    }
+
+    override fun stop() {
+        TODO("Not yet implemented")
+    }
+
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/Results.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/Results.kt
index 01e303ceb49637b9a094174c4d785c1defbac95d..a2e2cddb19d6485d5206489234f446bbf425d1d8 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/util/Results.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/Results.kt
@@ -16,8 +16,10 @@ class Results {
         return this.results.get(experiment)
     }
 
-    public fun getRequiredInstances(load: LoadDimension?): Resource? {
-        var requiredInstances: Resource? = null;
+    public fun getMinRequiredInstances(load: LoadDimension?): Resource? {
+        if (this.results.isEmpty()) return Resource(Int.MIN_VALUE)
+
+        var requiredInstances: Resource? = Resource(Int.MAX_VALUE)
         for(experiment in results) {
             if(experiment.key.first == load && experiment.value){
                 if(requiredInstances == null) {
@@ -31,13 +33,13 @@ class Results {
     }
 
     public fun getMaxBenchmarkedLoad(load: LoadDimension): LoadDimension? {
-        var maxBenchmarkedLoad: LoadDimension = LoadDimension(0)
+        var maxBenchmarkedLoad: LoadDimension? = null;
         for(experiment in results) {
             if (experiment.value) {
                 if(experiment.key.first.get() <= load.get()) {
-                    if (experiment.value && maxBenchmarkedLoad == null) {
+                    if (maxBenchmarkedLoad == null) {
                         maxBenchmarkedLoad = experiment.key.first
-                    } else if (experiment.value && maxBenchmarkedLoad.get() < experiment.key.first.get()) {
+                    } else if (maxBenchmarkedLoad.get() < experiment.key.first.get()) {
                         maxBenchmarkedLoad = experiment.key.first
                     }
                 }
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/TestBenchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/TestBenchmark.kt
new file mode 100644
index 0000000000000000000000000000000000000000..e95c2070f9954e2c1800750da121288236880d81
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/TestBenchmark.kt
@@ -0,0 +1,11 @@
+package theodolite.util
+
+class TestBenchmark: Benchmark {
+    override fun start() {
+        TODO("Not yet implemented")
+    }
+
+    override fun stop() {
+        TODO("Not yet implemented")
+    }
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt b/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt
index c9ab93992e73cbf9655ddb585c96308529ce3b9b..ce031ddb101008e518f8bace40c315dca3a60530 100644
--- a/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt
+++ b/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt
@@ -8,9 +8,7 @@ import theodolite.strategies.searchstrategy.BinarySearch
 import theodolite.strategies.restriction.LowerBoundRestriction
 import theodolite.strategies.searchstrategy.CompositeStrategy
 import theodolite.execution.TestBenchmarkExecutor
-import theodolite.util.LoadDimension
-import theodolite.util.Resource
-import theodolite.util.Results
+import theodolite.util.*
 
 @QuarkusTest
 class CompositeStrategyTest {
@@ -28,11 +26,12 @@ class CompositeStrategyTest {
         )
         val mockLoads: List<LoadDimension> =  (0..6).map{number -> LoadDimension(number)}
         val mockResources: List<Resource> =  (0..6).map{number -> Resource(number)}
-        val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults)
         val results: Results = Results();
+        val benchmark = TestBenchmark()
+        val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults, benchmark, results)
         val linearSearch: LinearSearch = LinearSearch(benchmarkExecutor, results);
         val lowerBoundRestriction: LowerBoundRestriction = LowerBoundRestriction(results);
-        val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, linearSearch, listOf(lowerBoundRestriction), results)
+        val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, linearSearch, setOf(lowerBoundRestriction), results)
 
         val actual: ArrayList<Resource?> = ArrayList<Resource?>()
         val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6).map{ x -> Resource(x)})
@@ -58,11 +57,12 @@ class CompositeStrategyTest {
         )
         val mockLoads: List<LoadDimension> =  (0..6).map{number -> LoadDimension(number)}
         val mockResources: List<Resource> =  (0..6).map{number -> Resource(number)}
-        val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults)
         val results: Results = Results();
+        val benchmark = TestBenchmark()
+        val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults, benchmark, results)
         val binarySearch: BinarySearch = BinarySearch(benchmarkExecutor, results);
         val lowerBoundRestriction: LowerBoundRestriction = LowerBoundRestriction(results);
-        val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, binarySearch, listOf(lowerBoundRestriction), results) // sets instead of lists
+        val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, binarySearch, setOf(lowerBoundRestriction), results) // sets instead of lists
 
         val actual: ArrayList<Resource?> = ArrayList<Resource?>()
         val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6).map{ x -> Resource(x)})