diff --git a/overcooked_simulator/game_content/tutorial/tutorial.layout b/overcooked_simulator/game_content/layouts/tutorial.layout
similarity index 100%
rename from overcooked_simulator/game_content/tutorial/tutorial.layout
rename to overcooked_simulator/game_content/layouts/tutorial.layout
diff --git a/overcooked_simulator/game_content/study/level1/level1_config.yaml b/overcooked_simulator/game_content/study/level1/level1_config.yaml
index b1cab18a7b15997c588bf9ffb05baca55cd9e902..919d6aa3a86ba80219553114851d57c15e052ed8 100644
--- a/overcooked_simulator/game_content/study/level1/level1_config.yaml
+++ b/overcooked_simulator/game_content/study/level1/level1_config.yaml
@@ -1,19 +1,20 @@
 plates:
-  clean_plates: 1
-  dirty_plates: 2
+  clean_plates: 2
+  dirty_plates: 0
   plate_delay: [ 5, 10 ]
   # range of seconds until the dirty plate arrives.
 
 game:
-  time_limit_seconds: 20
+  time_limit_seconds: 2
 
 meals:
-  all: False
+  all: false
   # if all: false -> only orders for these meals are generated
   # TODO: what if this list is empty?
   list:
-    - OnionSoup
     - TomatoSoup
+    - OnionSoup
+    - Salad
 
 layout_chars:
   _: Free
@@ -75,30 +76,16 @@ orders:
         b: 20
     sample_on_serving: false
     # Sample the delay for the next order only after a meal was served.
-    score_calc_gen_func: !!python/name:overcooked_simulator.order.simple_score_calc_gen_func ''
-    score_calc_gen_kwargs:
-      # the kwargs for the score_calc_gen_func
-      other: 20
-      scores:
-        Burger: 15
-        OnionSoup: 10
-        Salad: 5
-        TomatoSoup: 10
-    expired_penalty_func: !!python/name:overcooked_simulator.order.simple_expired_penalty ''
-    expired_penalty_kwargs:
-      default: -5
-  serving_not_ordered_meals: !!python/name:overcooked_simulator.order.serving_not_ordered_meals_with_zero_score ''
-  # a func that calcs a store for not ordered but served meals. Input: meal
-  penalty_for_trash: !!python/name:overcooked_simulator.order.penalty_for_each_item ''
-  # a func that calcs the penalty for items that the player puts into the trashcan.
+  serving_not_ordered_meals: true
+  # can meals that are not ordered be served / dropped on the serving window
 
 player_config:
   radius: 0.4
-  player_speed_units_per_seconds: 8
+  player_speed_units_per_seconds: 6
   interaction_range: 1.6
   restricted_view: False
   view_angle: 70
-  view_range: 5.5  # in grid units, can be "null"
+  view_range: 4  # in grid units, can be "null"
 
 effect_manager:
   FireManager:
@@ -109,48 +96,84 @@ effect_manager:
 
 
 extra_setup_functions:
+  # # ---------------  Scoring  ---------------
+  orders:
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
+    kwargs:
+      hooks: [ completed_order ]
+      callback_class: !!python/name:overcooked_simulator.scores.ScoreViaHooks ''
+      callback_class_kwargs:
+        static_score: 20
+        score_on_specific_kwarg: meal_name
+        score_map:
+          Burger: 15
+          OnionSoup: 10
+          Salad: 5
+          TomatoSoup: 10
+  not_ordered_meals:
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
+    kwargs:
+      hooks: [ serve_not_ordered_meal ]
+      callback_class: !!python/name:overcooked_simulator.scores.ScoreViaHooks ''
+      callback_class_kwargs:
+        static_score: 2
+  trashcan_usages:
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
+    kwargs:
+      hooks: [ trashcan_usage ]
+      callback_class: !!python/name:overcooked_simulator.scores.ScoreViaHooks ''
+      callback_class_kwargs:
+        static_score: -5
+  expired_orders:
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
+    kwargs:
+      hooks: [ order_expired ]
+      callback_class: !!python/name:overcooked_simulator.scores.ScoreViaHooks ''
+      callback_class_kwargs:
+        static_score: -10
+  # # --------------- Recording ---------------
   #  json_states:
-  #    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+  #    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
   #    kwargs:
   #      hooks: [ json_state ]
-  #      log_class: !!python/name:overcooked_simulator.recording.LogRecorder ''
-  #      log_class_kwargs:
+  #      callback_class: !!python/name:overcooked_simulator.recording.FileRecorder ''
+  #      callback_class_kwargs:
   #        log_path: USER_LOG_DIR/ENV_NAME/json_states.jsonl
   actions:
-    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
     kwargs:
       hooks: [ pre_perform_action ]
-      log_class: !!python/name:overcooked_simulator.recording.LogRecorder ''
-      log_class_kwargs:
+      callback_class: !!python/name:overcooked_simulator.recording.FileRecorder ''
+      callback_class_kwargs:
         log_path: USER_LOG_DIR/ENV_NAME/LOG_RECORD_NAME.jsonl
   random_env_events:
-    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
     kwargs:
       hooks: [ order_duration_sample, plate_out_of_kitchen_time ]
-      log_class: !!python/name:overcooked_simulator.recording.LogRecorder ''
-      log_class_kwargs:
+      callback_class: !!python/name:overcooked_simulator.recording.FileRecorder ''
+      callback_class_kwargs:
         log_path: USER_LOG_DIR/ENV_NAME/LOG_RECORD_NAME.jsonl
         add_hook_ref: true
   env_configs:
-    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
     kwargs:
       hooks: [ env_initialized, item_info_config ]
-      log_class: !!python/name:overcooked_simulator.recording.LogRecorder ''
-      log_class_kwargs:
+      callback_class: !!python/name:overcooked_simulator.recording.FileRecorder ''
+      callback_class_kwargs:
         log_path: USER_LOG_DIR/ENV_NAME/LOG_RECORD_NAME.jsonl
         add_hook_ref: true
 #  info_msg:
-#    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+#    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
 #    kwargs:
 #      hooks: [ cutting_board_100 ]
 #      log_class: !!python/name:overcooked_simulator.info_msg.InfoMsgManager ''
 #      log_class_kwargs:
 #        msg: Glückwunsch du hast was geschnitten!
 #  fire_msg:
-#    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+#    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
 #    kwargs:
 #      hooks: [ new_fire ]
 #      log_class: !!python/name:overcooked_simulator.info_msg.InfoMsgManager ''
 #      log_class_kwargs:
 #        msg: Feuer, Feuer, Feuer
-#        level: Warning
\ No newline at end of file
+#        level: Warning
diff --git a/overcooked_simulator/game_content/study/level2/level2_config.yaml b/overcooked_simulator/game_content/study/level2/level2_config.yaml
index e9eb286d48e27c3f76ea2e8e2f19ee3996ca167d..83552e3cfe30eea394c1869ca159fd9ce2401163 100644
--- a/overcooked_simulator/game_content/study/level2/level2_config.yaml
+++ b/overcooked_simulator/game_content/study/level2/level2_config.yaml
@@ -1,20 +1,19 @@
 plates:
-  clean_plates: 1
-  dirty_plates: 2
+  clean_plates: 2
+  dirty_plates: 0
   plate_delay: [ 5, 10 ]
   # range of seconds until the dirty plate arrives.
 
 game:
-  time_limit_seconds: 5
+  time_limit_seconds: 300
 
 meals:
-  all: False
+  all: false
   # if all: false -> only orders for these meals are generated
   # TODO: what if this list is empty?
   list:
     - Salad
     - Burger
-    - TomatoSoup
 
 layout_chars:
   _: Free
@@ -76,30 +75,16 @@ orders:
         b: 20
     sample_on_serving: false
     # Sample the delay for the next order only after a meal was served.
-    score_calc_gen_func: !!python/name:overcooked_simulator.order.simple_score_calc_gen_func ''
-    score_calc_gen_kwargs:
-      # the kwargs for the score_calc_gen_func
-      other: 20
-      scores:
-        Burger: 15
-        OnionSoup: 10
-        Salad: 5
-        TomatoSoup: 10
-    expired_penalty_func: !!python/name:overcooked_simulator.order.simple_expired_penalty ''
-    expired_penalty_kwargs:
-      default: -5
-  serving_not_ordered_meals: !!python/name:overcooked_simulator.order.serving_not_ordered_meals_with_zero_score ''
-  # a func that calcs a store for not ordered but served meals. Input: meal
-  penalty_for_trash: !!python/name:overcooked_simulator.order.penalty_for_each_item ''
-  # a func that calcs the penalty for items that the player puts into the trashcan.
+  serving_not_ordered_meals: true
+  # can meals that are not ordered be served / dropped on the serving window
 
 player_config:
   radius: 0.4
-  player_speed_units_per_seconds: 8
+  player_speed_units_per_seconds: 6
   interaction_range: 1.6
   restricted_view: True
-  view_angle: 90
-  view_range: 3.5  # in grid units, can be "null"
+  view_angle: 100
+  view_range: 3.2  # in grid units, can be "null"
 
 effect_manager:
   FireManager:
@@ -110,48 +95,84 @@ effect_manager:
 
 
 extra_setup_functions:
+  # # ---------------  Scoring  ---------------
+  orders:
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
+    kwargs:
+      hooks: [ completed_order ]
+      callback_class: !!python/name:overcooked_simulator.scores.ScoreViaHooks ''
+      callback_class_kwargs:
+        static_score: 20
+        score_on_specific_kwarg: meal_name
+        score_map:
+          Burger: 15
+          OnionSoup: 10
+          Salad: 5
+          TomatoSoup: 10
+  not_ordered_meals:
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
+    kwargs:
+      hooks: [ serve_not_ordered_meal ]
+      callback_class: !!python/name:overcooked_simulator.scores.ScoreViaHooks ''
+      callback_class_kwargs:
+        static_score: 2
+  trashcan_usages:
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
+    kwargs:
+      hooks: [ trashcan_usage ]
+      callback_class: !!python/name:overcooked_simulator.scores.ScoreViaHooks ''
+      callback_class_kwargs:
+        static_score: -5
+  expired_orders:
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
+    kwargs:
+      hooks: [ order_expired ]
+      callback_class: !!python/name:overcooked_simulator.scores.ScoreViaHooks ''
+      callback_class_kwargs:
+        static_score: -10
+  # # --------------- Recording ---------------
   #  json_states:
-  #    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+  #    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
   #    kwargs:
   #      hooks: [ json_state ]
-  #      log_class: !!python/name:overcooked_simulator.recording.LogRecorder ''
-  #      log_class_kwargs:
+  #      callback_class: !!python/name:overcooked_simulator.recording.FileRecorder ''
+  #      callback_class_kwargs:
   #        log_path: USER_LOG_DIR/ENV_NAME/json_states.jsonl
   actions:
-    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
     kwargs:
       hooks: [ pre_perform_action ]
-      log_class: !!python/name:overcooked_simulator.recording.LogRecorder ''
-      log_class_kwargs:
+      callback_class: !!python/name:overcooked_simulator.recording.FileRecorder ''
+      callback_class_kwargs:
         log_path: USER_LOG_DIR/ENV_NAME/LOG_RECORD_NAME.jsonl
   random_env_events:
-    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
     kwargs:
       hooks: [ order_duration_sample, plate_out_of_kitchen_time ]
-      log_class: !!python/name:overcooked_simulator.recording.LogRecorder ''
-      log_class_kwargs:
+      callback_class: !!python/name:overcooked_simulator.recording.FileRecorder ''
+      callback_class_kwargs:
         log_path: USER_LOG_DIR/ENV_NAME/LOG_RECORD_NAME.jsonl
         add_hook_ref: true
   env_configs:
-    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
     kwargs:
       hooks: [ env_initialized, item_info_config ]
-      log_class: !!python/name:overcooked_simulator.recording.LogRecorder ''
-      log_class_kwargs:
+      callback_class: !!python/name:overcooked_simulator.recording.FileRecorder ''
+      callback_class_kwargs:
         log_path: USER_LOG_DIR/ENV_NAME/LOG_RECORD_NAME.jsonl
         add_hook_ref: true
 #  info_msg:
-#    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+#    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
 #    kwargs:
 #      hooks: [ cutting_board_100 ]
 #      log_class: !!python/name:overcooked_simulator.info_msg.InfoMsgManager ''
 #      log_class_kwargs:
 #        msg: Glückwunsch du hast was geschnitten!
 #  fire_msg:
-#    func: !!python/name:overcooked_simulator.recording.class_recording_with_hooks ''
+#    func: !!python/name:overcooked_simulator.hooks.hooks_via_callback_class ''
 #    kwargs:
 #      hooks: [ new_fire ]
 #      log_class: !!python/name:overcooked_simulator.info_msg.InfoMsgManager ''
 #      log_class_kwargs:
 #        msg: Feuer, Feuer, Feuer
-#        level: Warning
\ No newline at end of file
+#        level: Warning
diff --git a/overcooked_simulator/game_content/study/study_config.yaml b/overcooked_simulator/game_content/study/study_config.yaml
index 51e89ad042770901b589e7afefd5de8276a6ca28..e7ab75977245f3ab22fa3e7e814a425b92a5d463 100644
--- a/overcooked_simulator/game_content/study/study_config.yaml
+++ b/overcooked_simulator/game_content/study/study_config.yaml
@@ -8,6 +8,11 @@ levels:
     item_info_path: study/level1/level1_item_info.yaml
     name: "Level 1-1: Far Apart"
 
+#  - config_path: environment_config.yaml
+#    layout_path: basic.layout
+#    item_info_path: item_info.yaml
+#    name: "Basic"
+#
   - config_path: study/level2/level2_config.yaml
     layout_path: overcooked-1/1-4-bottleneck.layout
     item_info_path: study/level2/level2_item_info.yaml