diff --git a/cooperative_cuisine/__init__.py b/cooperative_cuisine/__init__.py
index 23cdcc74fc0069ae27ab291259b5337cbcf8bb7d..d1eb6431ff5e6b2d90ff01d0eebe769eb79164df 100644
--- a/cooperative_cuisine/__init__.py
+++ b/cooperative_cuisine/__init__.py
@@ -356,6 +356,7 @@ num_bots: 0
 # Structure of the Documentation
 The API documentation follows the file and content structure in the repo.
 On the left you can find the navigation panel that brings you to the implementation of
+- the **action**s the player can perform,
 - the **counter factory** converts the characters in the layout file to counter instances,
 - the **counters**, including the kitchen utility objects like dispenser, cooking counter (stove, deep fryer, oven),
   sink, etc.,
diff --git a/cooperative_cuisine/action.py b/cooperative_cuisine/action.py
new file mode 100644
index 0000000000000000000000000000000000000000..a080070b23a716556ca33841cf0226928c52334a
--- /dev/null
+++ b/cooperative_cuisine/action.py
@@ -0,0 +1,51 @@
+from __future__ import annotations
+
+import dataclasses
+from enum import Enum
+from typing import Literal
+
+from numpy import typing as npt
+
+
+class ActionType(Enum):
+    """The 3 different types of valid actions. They can be extended via the `Action.action_data` attribute."""
+
+    MOVEMENT = "movement"
+    """move the agent."""
+    PUT = "pickup"
+    """interaction type 1, e.g., for pickup or drop off."""
+    # TODO change value to put
+    INTERACT = "interact"
+    """interaction type 2, e.g., for progressing. Start and stop interaction via `keydown` and `keyup` actions."""
+
+
+class InterActionData(Enum):
+    """The data for the interaction action: `ActionType.MOVEMENT`."""
+
+    START = "keydown"
+    "start an interaction."
+    STOP = "keyup"
+    "stop an interaction without moving away."
+
+
+@dataclasses.dataclass
+class Action:
+    """Action class, specifies player, action type and action itself."""
+
+    player: str
+    """Id of the player."""
+    action_type: ActionType
+    """Type of the action to perform. Defines what action data is valid."""
+    action_data: npt.NDArray[float] | InterActionData | Literal["pickup"]
+    """Data for the action, e.g., movement vector or start and stop interaction."""
+    duration: float | int = 0
+    """Duration of the action (relevant for movement)"""
+
+    def __repr__(self):
+        return f"Action({self.player},{self.action_type.value},{self.action_data},{self.duration})"
+
+    def __post_init__(self):
+        if isinstance(self.action_type, str):
+            self.action_type = ActionType(self.action_type)
+        if isinstance(self.action_data, str) and self.action_data != "pickup":
+            self.action_data = InterActionData(self.action_data)
diff --git a/cooperative_cuisine/configs/agents/random_agent.py b/cooperative_cuisine/configs/agents/random_agent.py
index db05c7a9fca1f19bf7989eace7bf48edf325d3a3..f2208817bbdc55b0942c2c18a6bc8b65e235ec9f 100644
--- a/cooperative_cuisine/configs/agents/random_agent.py
+++ b/cooperative_cuisine/configs/agents/random_agent.py
@@ -10,11 +10,7 @@ from datetime import datetime, timedelta
 import numpy as np
 from websockets import connect
 
-from cooperative_cuisine.environment import (
-    ActionType,
-    Action,
-    InterActionData,
-)
+from cooperative_cuisine.action import ActionType, InterActionData, Action
 from cooperative_cuisine.utils import custom_asdict_factory
 
 TIME_TO_STOP_ACTION = 3.0
diff --git a/cooperative_cuisine/environment.py b/cooperative_cuisine/environment.py
index c0eb680405340f6fbf01d4bf9f55ee65613db7a5..958c1b91ce69b31d32ae476308613a47d1510909 100644
--- a/cooperative_cuisine/environment.py
+++ b/cooperative_cuisine/environment.py
@@ -1,13 +1,11 @@
 from __future__ import annotations
 
-import dataclasses
 import inspect
 import json
 import logging
 import sys
 from collections import defaultdict
 from datetime import timedelta, datetime
-from enum import Enum
 from pathlib import Path
 from random import Random
 from typing import Literal, TypedDict, Callable
@@ -16,6 +14,7 @@ import numpy as np
 import numpy.typing as npt
 import yaml
 
+from cooperative_cuisine.action import ActionType, InterActionData, Action
 from cooperative_cuisine.counter_factory import (
     CounterFactory,
 )
@@ -66,53 +65,6 @@ log = logging.getLogger(__name__)
 PREVENT_SQUEEZING_INTO_OTHER_PLAYERS = True
 
 
-class ActionType(Enum):
-    """The 3 different types of valid actions. They can be extended via the `Action.action_data` attribute."""
-
-    MOVEMENT = "movement"
-    """move the agent."""
-    PUT = "pickup"
-    """interaction type 1, e.g., for pickup or drop off. Maybe other words: transplace?"""
-    # TODO change value to put
-    INTERACT = "interact"
-    """interaction type 2, e.g., for progressing. Start and stop interaction via `keydown` and `keyup` actions."""
-
-
-class InterActionData(Enum):
-    """The data for the interaction action: `ActionType.MOVEMENT`."""
-
-    START = "keydown"
-    "start an interaction."
-    STOP = "keyup"
-    "stop an interaction without moving away."
-
-
-@dataclasses.dataclass
-class Action:
-    """Action class, specifies player, action type and action itself."""
-
-    player: str
-    """Id of the player."""
-    action_type: ActionType
-    """Type of the action to perform. Defines what action data is valid."""
-    action_data: npt.NDArray[float] | InterActionData | Literal["pickup"]
-    """Data for the action, e.g., movement vector or start and stop interaction."""
-    duration: float | int = 0
-    """Duration of the action (relevant for movement)"""
-
-    def __repr__(self):
-        return f"Action({self.player},{self.action_type.value},{self.action_data},{self.duration})"
-
-    def __post_init__(self):
-        if isinstance(self.action_type, str):
-            self.action_type = ActionType(self.action_type)
-        if isinstance(self.action_data, str) and self.action_data != "pickup":
-            self.action_data = InterActionData(self.action_data)
-
-
-# TODO Abstract base class for different environments
-
-
 class EnvironmentConfig(TypedDict):
     plates: PlateConfig
     game: dict[
@@ -266,23 +218,9 @@ class Environment:
             ),
         )
 
-        progress_counter_classes = list(
-            filter(
-                lambda cl: hasattr(cl, "progress"),
-                dict(
-                    inspect.getmembers(
-                        sys.modules["cooperative_cuisine.counters"], inspect.isclass
-                    )
-                ).values(),
-            )
-        )
-        self.progressing_counters = list(
-            filter(
-                lambda c: c.__class__ in progress_counter_classes,
-                self.counters,
-            )
-        )
+        self.progressing_counters = []
         """Counters that needs to be called in the step function via the `progress` method."""
+        self.overwrite_counters(self.counters)
 
         self.order_manager.create_init_orders(self.env_time)
         self.start_time = self.env_time
diff --git a/cooperative_cuisine/game_server.py b/cooperative_cuisine/game_server.py
index 56ae02dc7d7a5ff1c344c3eb54828cc1fa460d2c..f28761b0ed60baa77bcd68a8486003eec0e69670 100644
--- a/cooperative_cuisine/game_server.py
+++ b/cooperative_cuisine/game_server.py
@@ -29,7 +29,8 @@ from pydantic import BaseModel
 from starlette.websockets import WebSocketDisconnect
 from typing_extensions import TypedDict
 
-from cooperative_cuisine.environment import Action, Environment
+from cooperative_cuisine.action import Action
+from cooperative_cuisine.environment import Environment
 from cooperative_cuisine.server_results import (
     CreateEnvResult,
     PlayerInfo,
diff --git a/cooperative_cuisine/pygame_2d_vis/gui.py b/cooperative_cuisine/pygame_2d_vis/gui.py
index a4ce3b3238cc01ae48a792277a1b2c84b61f4f22..dad4497551673287c32103bc96974885a6a1db2e 100644
--- a/cooperative_cuisine/pygame_2d_vis/gui.py
+++ b/cooperative_cuisine/pygame_2d_vis/gui.py
@@ -20,11 +20,7 @@ from pygame import mixer
 from websockets.sync.client import connect
 
 from cooperative_cuisine import ROOT_DIR
-from cooperative_cuisine.environment import (
-    Action,
-    ActionType,
-    InterActionData,
-)
+from cooperative_cuisine.action import ActionType, InterActionData, Action
 from cooperative_cuisine.game_server import CreateEnvironmentConfig
 from cooperative_cuisine.pygame_2d_vis.drawing import Visualizer
 from cooperative_cuisine.pygame_2d_vis.game_colors import colors
diff --git a/cooperative_cuisine/pygame_2d_vis/video_replay.py b/cooperative_cuisine/pygame_2d_vis/video_replay.py
index 1c6c348a68e430c6488ecb794ee9536c973f49e1..acb08cbaefafc6ad20e855f28eb6f7d274318956 100644
--- a/cooperative_cuisine/pygame_2d_vis/video_replay.py
+++ b/cooperative_cuisine/pygame_2d_vis/video_replay.py
@@ -43,7 +43,8 @@ from PIL import Image
 from tqdm import tqdm
 
 from cooperative_cuisine import ROOT_DIR
-from cooperative_cuisine.environment import Environment, Action
+from cooperative_cuisine.action import Action
+from cooperative_cuisine.environment import Environment
 from cooperative_cuisine.pygame_2d_vis.drawing import Visualizer
 from cooperative_cuisine.recording import FileRecorder
 
diff --git a/cooperative_cuisine/reinforcement_learning/gym_env.py b/cooperative_cuisine/reinforcement_learning/gym_env.py
index d5f79214580709d2c409cf16db8f739a321679c8..6b138cd9c9a9c8b9f44ba327bfde3ec669b21c53 100644
--- a/cooperative_cuisine/reinforcement_learning/gym_env.py
+++ b/cooperative_cuisine/reinforcement_learning/gym_env.py
@@ -21,12 +21,10 @@ from stable_baselines3.common.vec_env import VecVideoRecorder
 from wandb.integration.sb3 import WandbCallback
 
 from cooperative_cuisine import ROOT_DIR
+from cooperative_cuisine.action import ActionType, InterActionData, Action
 from cooperative_cuisine.counters import Counter, CookingCounter, Dispenser
 from cooperative_cuisine.environment import (
     Environment,
-    Action,
-    ActionType,
-    InterActionData,
 )
 from cooperative_cuisine.game_items import CookingEquipment
 from cooperative_cuisine.pygame_2d_vis.drawing import Visualizer
diff --git a/tests/test_start.py b/tests/test_start.py
index 18e8de29bf924350b72452ee48281f0121c57893..d52e19db1151b900899f511bc1e17fc561ad7e14 100644
--- a/tests/test_start.py
+++ b/tests/test_start.py
@@ -4,12 +4,10 @@ import numpy as np
 import pytest
 
 from cooperative_cuisine import ROOT_DIR
+from cooperative_cuisine.action import ActionType, InterActionData, Action
 from cooperative_cuisine.counters import Counter, CuttingBoard
 from cooperative_cuisine.environment import (
-    Action,
     Environment,
-    ActionType,
-    InterActionData,
 )
 from cooperative_cuisine.game_items import Item, ItemInfo, ItemType
 from cooperative_cuisine.game_server import PlayerRequestType