diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..97599ecee0a4e6bdc55f597a7f4f34a167f4f48b
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,5 @@
+repos:
+  - repo: https://github.com/psf/black
+    rev: 21.6b0
+    hooks:
+    - id: black
\ No newline at end of file
diff --git a/README.md b/README.md
index 8e6eafc69af1da3141a0e49008a81771e199e4ca..61cf12bb1a2cef8d0536e9bffdafc6108d729809 100644
--- a/README.md
+++ b/README.md
@@ -26,6 +26,9 @@ python3 -m pip install robofish-io
 We show a simple example below. More examples can be found in ```examples/```
 
 ```python
+import robofish.io
+import numpy as np
+
 # Create a new robofish io file
 f = robofish.io.File(world_size_cm=[100, 100], frequency_hz=25.0)
 f.attrs["experiment_setup"] = "This is a simple example with made up data."
@@ -58,8 +61,8 @@ print(
     f"Poses Shape:\t{f.entity_poses_rad.shape}.\t"
     + "Representing(entities, timesteps, pose dimensions (x, y, ori)"
 )
-print(f"The actions of one Fish, (timesteps, (speed, turn)):\n{fish.speed_turn}")
-print(f"Fish poses with calculated orientations:\n{fish.poses_calc_ori_rad}")
+print(f"The actions of one Fish, (timesteps, (speed, turn)):\n{fish.actions_speeds_turns}")
+print(f"Fish positions with orientations:\n{fish.poses_rad}")
 
 # Save the file
 f.save_as("example.hdf5")
diff --git a/ci/deploy.py b/ci/deploy.py
index 0437457696a996d508cb3b4235ba6feaeb49d52c..3bdb650e4291404626bc05efe229a3209ebcbe49 100755
--- a/ci/deploy.py
+++ b/ci/deploy.py
@@ -19,9 +19,9 @@ if __name__ == "__main__":
     env["TWINE_PASSWORD"] = env["CI_JOB_TOKEN"]
 
     if args.production:
-        target_project_id = env['ARTIFACTS_REPOSITORY_PROJECT_ID']
+        target_project_id = env["ARTIFACTS_REPOSITORY_PROJECT_ID"]
     else:
-        target_project_id = env['CI_PROJECT_ID']
+        target_project_id = env["CI_PROJECT_ID"]
 
     command = ["python3"]
     command += ["-m", "twine", "upload", "dist/*"]
diff --git a/docs/entity.md b/docs/entity.md
index 58b5f8606ae9992adf49efb74b8f3363ea5f9c1b..02a68a29150083e9ebf39d3608e79b21ec810864 100644
--- a/docs/entity.md
+++ b/docs/entity.md
@@ -63,26 +63,17 @@ As described in `robofish.io`, Files and Entities have useful properties.
 
 <small>
 
-| Entity function                                | Description                                                                                 |
-| ---------------------------------------------- | ------------------------------------------------------------------------------------------- |
-| `robofish.io.entity.Entity.positions`          | Positions as a `(timesteps, 2 (x, y))` arary.                                               |
-| `robofish.io.entity.Entity.orientations`       | Orientations as a `(timesteps, 2 (ori_x, ori_y))` arary.                                    |
-| `robofish.io.entity.Entity.orientations_rad`   | Orientations as a `(timesteps, 1 (ori_rad))` arary.                                         |
-| `robofish.io.entity.Entity.poses`              | Poses as a `(timesteps, 4 (x, y, x_ori, y_ori))` array.                                     |
-| `robofish.io.entity.Entity.poses_rad`          | Poses as a `(timesteps, 3(x, y, ori_rad))` array.                                           |
-| `robofish.io.entity.Entity.poses_calc_ori_rad` | Poses with calculated orientations as a<br>`(timesteps - 1, 3 (x, y, calc_ori_rad))` array. |
-| `robofish.io.entity.Entity.speed_turn`         | Speed and turn as a `(timesteps - 2, 2 (speed_cm/s, turn_rad/s))` array.                    |
+| Entity function                                  | Description                                                              |
+| ------------------------------------------------ | ------------------------------------------------------------------------ |
+| `robofish.io.entity.Entity.positions`            | Positions as a `(timesteps, 2 (x, y))` arary.                            |
+| `robofish.io.entity.Entity.orientations`         | Orientations as a `(timesteps, 2 (ori_x, ori_y))` arary.                 |
+| `robofish.io.entity.Entity.orientations_rad`     | Orientations as a `(timesteps, 1 (ori_rad))` arary.                      |
+| `robofish.io.entity.Entity.poses`                | Poses as a `(timesteps, 4 (x, y, x_ori, y_ori))` array.                  |
+| `robofish.io.entity.Entity.poses_rad`            | Poses as a `(timesteps, 3(x, y, ori_rad))` array.                        |
+| `robofish.io.entity.Entity.actions_speeds_turns` | Speed and turn as a `(timesteps - 1, 2 (speed_cm/s, turn_rad/s))` array. |
 
 </small>
 
-### Calculated orientations and speeds.
-
-![Calculated orientation, speeds and turns](data:image/png;base64,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)
-
-The image shows, how the orientations are calculated (`robofish.io.entity.Entity.poses_calc_ori_rad`), the orientations always show away from the last position. In this way, the first position does not have an orientation and the shape of the resulting array is `(timesteps - 1, 3 (x, y, calc_ori_rad))`.
-
-The meaning of the `robofish.io.entity.Entity.speed_turn` can also be explained with the image. The turn is the angle, the agent has to turn, to orientate towards the next position. The speed is the calculated, using the distance between two positions. The resulting turn and speed is converted to `[rad/s]` and `[cm/s]`. The first and last position don't have any action which results in an array shape of `(timesteps - 2, 2 (speed, turn))`.
-
 ---
 
-⚠️ Try this out by extending the example of the main doc, so that a new teleporting fish with random positions [-50, 50] is generated. How does that change the output and speed histogram `robofish-io-evaluate speed example.hdf5`? Try writing some attributes.
+⚠️ Try this out by extending the example of the main doc, so that a new teleporting fish with random positions [-50, 50] and orientations (0, 2 * pi) is generated. How does that change the output and speed histogram `robofish-io-evaluate speed example.hdf5`? Try writing some attributes.
diff --git a/docs/index.md b/docs/index.md
index df674a31b092d893994a20961bf90ebcebbaf5ea..b4a967dfa2166ef96ce5a3e8625598599c9bcd68 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -29,43 +29,36 @@ This documentation is structured with increasing complexity.
 First we'll execute the example from the readme. More examples can be found in ```examples/```.
 
 ```python
+import robofish.io
+import numpy as np
+
 # Create a new robofish io file
+
 f = robofish.io.File(world_size_cm=[100, 100], frequency_hz=25.0)
-f.attrs["experiment_setup"] = "This is a simple example with made up data."
-
-# Create a new robot entity with 10 timesteps.
-# Positions and orientations are passed separately in this example.
-# Since the orientations have two columns, unit vectors are assumed
-# (orientation_x, orientation_y)
-f.create_entity(
-    category="robot",
-    name="robot",
-    positions=np.zeros((10, 2)),
-    orientations=np.ones((10, 2)) * [0, 1],
-)
+f.attrs['experiment_setup'] = \
+    'This is a simple example with made up data.'
 
 # Create a new fish entity with 10 timesteps.
-# In this case, we pass positions and orientations together (x, y, rad).
-# Since it is a 3 column array, orientations in radiants are assumed.
+
 poses = np.zeros((10, 3))
 poses[:, 0] = np.arange(-5, 5)
 poses[:, 1] = np.arange(-5, 5)
 poses[:, 2] = np.arange(0, 2 * np.pi, step=2 * np.pi / 10)
-fish = f.create_entity("fish", poses=poses)
-fish.attrs["species"] = "My rotating spaghetti fish"
-fish.attrs["fish_standard_length_cm"] = 10
+
+fish = f.create_entity('fish', poses=poses)
+fish.attrs['species'] = 'My rotating spaghetti fish'
 
 # Some possibilities to access the data
-print(f"The file:\n{f}")
-print(
-    f"Poses Shape:\t{f.entity_poses_rad.shape}.\t"
-    + "Representing(entities, timesteps, pose dimensions (x, y, ori)"
-)
-print(f"The actions of one Fish, (timesteps, (speed, turn)):\n{fish.speed_turn}")
-print(f"Fish poses with calculated orientations:\n{fish.poses_calc_ori_rad}")
+
+print ('The file:', f)
+print ('Poses Shape (entities, timesteps, (x, y, ori):')
+print (f.entity_poses_rad.shape)
+print ('The actions (timesteps, (speed, turn)):')
+print (fish.actions_speeds_turns)
 
 # Save the file
-f.save_as("example.hdf5")
+
+f.save_as('example.hdf5')
 ```
 
 ⚠️ Please try out the example on your computer and read the output.
@@ -94,6 +87,11 @@ robofish-trackviewer example.hdf5
 ```
 View a video of the track in an interactive window.
 
+```bash
+robofish-io-render example.hdf5
+```
+A dynamic animation of the track with moving camera. (Beta)
+
 Further details about the commandline tools can be found in `robofish.io.app`.
 
 ## Accessing real data
@@ -126,15 +124,14 @@ In the same scheme the following properties are available:
 
 <small>
 
-| File/ Entity function       | Description                                                                                             |
-| --------------------------- | ------------------------------------------------------------------------------------------------------- |
-| *entity_*positions          | Positions as a `(*entities*, timesteps, 2 (x, y))` arary.                                               |
-| *entity_*orientations       | Orientations as a `(*entities*, timesteps, 2 (ori_x, ori_y))` arary.                                    |
-| *entity_*orientations_rad   | Orientations as a `(*entities*, timesteps, 1 (ori_rad))` arary.                                         |
-| *entity_*poses              | Poses as a `(*entities*, timesteps, 4 (x, y, x_ori, y_ori))` array.                                     |
-| *entity_*poses_rad          | Poses as a `(*entities*, timesteps, 3(x, y, ori_rad))` array.                                           |
-| *entity_*poses_calc_ori_rad | Poses with calculated orientations as a<br>`(*entities*, timesteps - 1, 3 (x, y, calc_ori_rad))` array. |
-| *entity_*speed_turn         | Speed and turn as a `(*entities*, timesteps - 2, 2 (speed_cm/s, turn_rad/s))` array.                    |
+| File/ Entity function         | Description                                                                          |
+| ----------------------------- | ------------------------------------------------------------------------------------ |
+| *entity_*positions            | Positions as a `(*entities*, timesteps, 2 (x, y))` arary.                            |
+| *entity_*orientations         | Orientations as a `(*entities*, timesteps, 2 (ori_x, ori_y))` arary.                 |
+| *entity_*orientations_rad     | Orientations as a `(*entities*, timesteps, 1 (ori_rad))` arary.                      |
+| *entity_*poses                | Poses as a `(*entities*, timesteps, 4 (x, y, x_ori, y_ori))` array.                  |
+| *entity_*poses_rad            | Poses as a `(*entities*, timesteps, 3(x, y, ori_rad))` array.                        |
+| *entity_*actions_speeds_turns | Speed and turn as a `(*entities*, timesteps - 1, 2 (speed_cm/s, turn_rad/s))` array. |
 
 </small>
 
diff --git a/examples/example_basic.ipynb b/examples/example_basic.ipynb
index eba81c56c7c497751bffce4c944b4ae3212dac15..7fa65910b9078944cef3d566248c6978558e99cb 100644
--- a/examples/example_basic.ipynb
+++ b/examples/example_basic.ipynb
@@ -14,12 +14,6 @@
     "    # Create a new io file object with a 100x100cm world\n",
     "    f = robofish.io.File(world_size_cm=[100, 100], frequency_hz=25.0)\n",
     "\n",
-    "    # create a simple obstacle, fixed in place, fixed outline\n",
-    "    obstacle_outline = [[[-10, -10], [-10, 0], [0, 0], [0, -10]]]\n",
-    "    obstacle_name = f.create_entity(\n",
-    "        \"obstacle\", positions=[[50, 50]], orientations=[[0]], outlines=obstacle_outline\n",
-    "    )\n",
-    "\n",
     "    # create a robofish with 1000 timesteps. If we would not give a name, the name would be generated to be robot_1.\n",
     "    robofish_timesteps = 1000\n",
     "    robofish_poses = np.tile([50, 50, 1, 0], (robofish_timesteps, 1))\n",
diff --git a/examples/example_basic.py b/examples/example_basic.py
index 34e092296f6edde6301a13623c15f77a46ddb70a..951d934b83910461a0da325366c1e3b0e922b1c5 100755
--- a/examples/example_basic.py
+++ b/examples/example_basic.py
@@ -6,12 +6,6 @@ def create_example_file(path):
     # Create a new io file object with a 100x100cm world
     f = robofish.io.File(world_size_cm=[100, 100], frequency_hz=25.0)
 
-    # create a simple obstacle, fixed in place, fixed outline
-    obstacle_outline = [[[-10, -10], [-10, 0], [0, 0], [0, -10]]]
-    obstacle_name = f.create_entity(
-        "obstacle", positions=[[50, 50]], orientations=[[0]], outlines=obstacle_outline
-    )
-
     # create a robofish with 1000 timesteps. If we would not give a name, the name would be generated to be robot_1.
     robofish_timesteps = 1000
     robofish_poses = np.tile([50, 50, 1, 0], (robofish_timesteps, 1))
diff --git a/examples/example_readme.py b/examples/example_readme.py
index 6798f9dd2e6916cc8b9354f8f68898247f858f37..b349444800ac26e344602cea4615a583570513ff 100644
--- a/examples/example_readme.py
+++ b/examples/example_readme.py
@@ -35,8 +35,10 @@ def create_example_file(path):
         f"Poses Shape:\t{f.entity_poses_rad.shape}.\t"
         + "Representing(entities, timesteps, pose dimensions (x, y, ori)"
     )
-    print(f"The actions of one Fish, (timesteps, (speed, turn)):\n{fish.speed_turn}")
-    print(f"Fish poses with calculated orientations:\n{fish.poses_calc_ori_rad}")
+    print(
+        f"The actions of one Fish, (timesteps, (speed, turn)):\n{fish.actions_speeds_turns}"
+    )
+    print(f"Fish positions with orientations:\n{fish.poses_rad}")
 
     # Save the file
     f.save_as(path)
diff --git a/gen_docs.sh b/gen_docs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..81aebfcafd1500e56c625521a73149838fb4f6d0
--- /dev/null
+++ b/gen_docs.sh
@@ -0,0 +1,5 @@
+
+cd "${0%/*}"
+
+pdoc3 --html fish_models --force
+cp -r docs/img/ html/fish_models/
diff --git a/pyproject.toml b/pyproject.toml
index 139acbc7f3d8ee316285ade2c7c1ef2d9efe4eed..a762f8d2475cb105f012e121bc2369b9ee3141be 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -5,3 +5,10 @@ requires = ["setuptools", "wheel"]  # PEP 508 specifications.
 [flake8]
 max-line-length = 88
 extend-ignore = "E203"
+
+[tool.black]
+line-length = 88
+include =''
+
+[tool.pytest.ini_options]
+filterwarnings = ["error"]
\ No newline at end of file
diff --git a/setup.py b/setup.py
index a4166e4dfb4c89f0169b8e7c0a8c5f91fece069b..d8daa5754e7ba90c216e889537a98394361197e4 100644
--- a/setup.py
+++ b/setup.py
@@ -9,7 +9,8 @@ entry_points = {
     "console_scripts": [
         "robofish-io-validate=robofish.io.app:validate",
         "robofish-io-print=robofish.io.app:print_file",
-        # TODO: This should be called robofish-evaluate which is not possible because of the package name (guess) ask moritzs
+        "robofish-io-render=robofish.io.app:render",
+        # TODO: This should be called robofish-evaluate which is not possible because of the package name (guess) ask moritz
         "robofish-io-evaluate=robofish.evaluate.app:evaluate",
     ]
 }
@@ -55,6 +56,7 @@ setup(
         "pandas",
         "deprecation",
         "tqdm",
+        "pre-commit",
     ],
     classifiers=[
         "Development Status :: 3 - Alpha",
diff --git a/src/robofish/evaluate/evaluate.py b/src/robofish/evaluate/evaluate.py
index c15e6c0c7616d5bef3ccc0d6c45ac19ba2c82da2..48f889b4e05e92787569e271c54f22f01d068dce 100644
--- a/src/robofish/evaluate/evaluate.py
+++ b/src/robofish/evaluate/evaluate.py
@@ -76,19 +76,18 @@ def evaluate_speed(
     for k, files in enumerate(files_per_path):
         path_speeds = []
         for p, file in files.items():
-            poses = file.select_entity_poses(
-                None if predicate is None else predicate[k]
-            )
-            for e_poses in poses:
-                e_speeds = np.linalg.norm(np.diff(e_poses[:, :2], axis=0), axis=1)
-                e_speeds *= file.frequency
-                path_speeds.extend(e_speeds)
+            for e_speeds_turns in file.entity_actions_speeds_turns:
+                path_speeds = np.concatenate([path_speeds, e_speeds_turns[:, 0]])
         speeds.append(path_speeds)
 
     if labels is None:
         labels = paths
+    speeds = np.array(speeds)
 
-    plt.hist(speeds, bins=20, label=labels, density=True, range=[0, 25])
+    left_quantile = np.min(np.quantile(speeds, 0.001, axis=1))
+    right_quantile = np.max(np.quantile(speeds, 0.999, axis=1))
+
+    plt.hist(list(speeds), bins=20, label=labels, range=[left_quantile, right_quantile])
     plt.title("Agent speeds")
     plt.xlabel("Speed [cm/s]")
     plt.ylabel("Frequency")
@@ -121,35 +120,31 @@ def evaluate_turn(
     """
     files_per_path = [robofish.io.read_multiple_files(p) for p in paths]
     turns = []
+    frequency = None
+
     for k, files in enumerate(files_per_path):
+
         path_turns = []
         for p, file in files.items():
-            # TODO: Use new io functions (entity_poses_calc_ori_rad)
-            poses = file.select_entity_poses(
-                None if predicate is None else predicate[k]
-            )
-
-            # Todo check if all frequencies are the same
+            assert frequency is None or frequency == file.frequency
             frequency = file.frequency
 
-            for e_poses in poses:
-                # convert ori_x, ori_y to radians
-                ori_rad = np.arctan2(e_poses[:, 3], e_poses[:, 2])
-                # calculate difference, also make it take the "shorter"
-                # turn (so that is in range of -pi, pi)
-                e_turns = ori_rad[1:] - ori_rad[:-1]
-                e_turns = np.where(e_turns < -np.pi, e_turns + 2 * np.pi, e_turns)
-                e_turns = np.where(e_turns > np.pi, e_turns - 2 * np.pi, e_turns)
-                # e_turns *= file.frequency
-                e_turns *= 180 / np.pi
-                path_turns.extend(e_turns)
+            for e_speeds_turns in file.entity_actions_speeds_turns:
+                path_turns.extend(e_speeds_turns[:, 1])
         turns.append(path_turns)
 
     if labels is None:
         labels = paths
 
-    # TODO: Quantil range
-    plt.hist(turns, bins=41, label=labels, density=True, range=[-30, 30])
+    left_quantile = np.min(np.quantile(np.array(turns), 0.001, axis=1))
+    right_quantile = np.max(np.quantile(np.array(turns), 0.999, axis=1))
+    plt.hist(
+        turns,
+        bins=41,
+        label=labels,
+        density=True,
+        range=[left_quantile, right_quantile],
+    )
     plt.title("Agent turns")
     plt.xlabel("Change in orientation [Degree / timestep at %dhz]" % frequency)
     plt.ylabel("Frequency")
diff --git a/src/robofish/io/app.py b/src/robofish/io/app.py
index 9e7fa858da781e990634b222ae01bb2cb3214e02..db9f41a9bf64fec7fe1ffc20d4c69b0fcc410bdb 100644
--- a/src/robofish/io/app.py
+++ b/src/robofish/io/app.py
@@ -100,3 +100,56 @@ def validate(args=None):
             error_code = 1
         print(f"{filled_file}:{validity}\t{validity_message}")
     return error_code
+
+
+def render(args=None):
+    parser = argparse.ArgumentParser(
+        description="This function shows the file as animation."
+    )
+    parser.add_argument(
+        "path",
+        type=str,
+        help="The path to one file.",
+    )
+
+    parser.add_argument(
+        "-vp",
+        "--video_path",
+        default=None,
+        type=str,
+        help="Path to save the video to (mp4). If a path is given, the animation won't be played.",
+    )
+
+    default_options = {
+        "linewidth": 2,
+        "speedup": 4,
+        "trail": 100,
+        "entity_scale": 0.2,
+        "fixed_view": False,
+        "view_size": 60,
+        "slow_view": 0.8,
+    }
+
+    for key, value in default_options.items():
+        if isinstance(value, bool):
+            parser.add_argument(
+                f"--{key}",
+                default=value,
+                action="store_true" if value is False else "store_false",
+                help=f"Optional setter for video option {key}.\tDefault: {value}",
+            )
+        else:
+            parser.add_argument(
+                f"--{key}",
+                default=value,
+                type=type(value),
+                help=f"Optional video option {key} with type {type(value)}.\tDefault: {value}",
+            )
+
+    if args is None:
+        args = parser.parse_args()
+
+    print(args)
+
+    f = robofish.io.File(path=args.path)
+    f.render(**vars(args))
diff --git a/src/robofish/io/entity.py b/src/robofish/io/entity.py
index b3b7b219e52379b0d2f0355828538bb3c2d51202..83f8c592ac65d10abb4004a32c75ed1af9417084 100644
--- a/src/robofish/io/entity.py
+++ b/src/robofish/io/entity.py
@@ -10,6 +10,7 @@ import numpy as np
 from typing import Iterable, Union
 import datetime
 import logging
+import deprecation
 
 
 class Entity(h5py.Group):
@@ -111,7 +112,6 @@ class Entity(h5py.Group):
             )
         else:
             if poses is not None:
-
                 assert poses.shape[1] in [3, 4]
                 positions = poses[:, :2]
                 orientations = poses[:, 2:]
@@ -150,6 +150,36 @@ class Entity(h5py.Group):
         return ori_rad[:, np.newaxis]
 
     @property
+    @deprecation.deprecated(
+        deprecated_in="1.2",
+        removed_in="1.2.4",
+        details="We found that our calculation of 'poses_calc_ori_rad' is flawed and replaced it "
+        "Use the original poses ('poses_rad') with tracked orientations instead. "
+        "If you see this message and you don't know what to do, update all packages, "
+        "merge to the master branch of fish_models if nothing helps, contact Andi.\n"
+        "Don't ignore this warning, it's a serious issue.",
+    )
+    def poses_calc_ori(self):
+        poses_cor = self.poses_calc_ori_rad
+        return np.concatenate(
+            [
+                poses_cor[:, :2],
+                np.cos(poses_cor[:, 2, np.newaxis]),
+                np.sin(poses_cor[:, 2, np.newaxis]),
+            ],
+            axis=1,
+        )
+
+    @property
+    @deprecation.deprecated(
+        deprecated_in="1.2",
+        removed_in="1.2.4",
+        details="We found that our calculation of 'poses_calc_ori' is flawed and replaced it "
+        "Use the original poses ('poses') with tracked orientations instead. "
+        "If you see this message and you don't know what to do, update all packages, "
+        "merge to the master branch of fish_models if nothing helps, contact Andi.\n"
+        "Don't ignore this warning, it's a serious issue.",
+    )
     def poses_calc_ori_rad(self):
         # Diff between positions [t - 1, 2]
         diff = np.diff(self.positions, axis=0)
@@ -175,13 +205,23 @@ class Entity(h5py.Group):
         return np.concatenate([self.positions, self.orientations_rad], axis=1)
 
     @property
+    @deprecation.deprecated(
+        deprecated_in="1.2",
+        removed_in="1.2.4",
+        details="We found that our calculation of 'speed_turn' is flawed and replaced it "
+        "with 'actions_speeds_turns'. The difference in calculation is, that the tracked "
+        "orientation is used now which gives the fish the ability to swim backwards. "
+        "If you see this message and you don't know what to do, update all packages, "
+        "merge to the master branch of fish_models if nothing helps, contact Andi.\n"
+        "Don't ignore this warning, it's a serious issue.",
+    )
     def speed_turn(self):
         """Get the speed, turn and from the positions.
 
         The vectors pointing from each position to the next are computed.
         The output of the function describe these vectors.
         Returns:
-            An array with shape (number_of_positions -1, 3).
+            An array with shape (number_of_positions -1, 3). It is one timestep shorter than the number_of_positions, since the last pose has no following timestep.
             The first column is the length of the vectors.
             The second column is the turning angle, required to get from one vector to the next.
             We assume, that the entity is oriented "correctly" in the first pose. So the first turn angle is 0.
@@ -196,3 +236,29 @@ class Entity(h5py.Group):
         speed = np.linalg.norm(diff[:, :2], axis=1)
         turn = utils.limit_angle_range(diff[:, 2], _range=(-np.pi, np.pi))
         return np.stack([speed, turn], axis=-1)
+
+    @property
+    def actions_speeds_turns(self):
+        """Calculate the speed, turn and from the recorded positions and orientations.
+
+        The turn is calculated by the change of orientation.
+        The speed is calculated by the distance between the points, projected on the new orientation vector.
+        The sideway change of position cannot be represented with this method.
+
+        Returns:
+            An array with shape (number_of_positions -1, 3).
+            The first column is the speed (distance projected on new orientation).
+            The second column is the turning angle.
+
+        """
+
+        ori = self.orientations
+        ori_rad = self.orientations_rad
+        pos = self.positions
+        turn = utils.limit_angle_range(np.diff(ori_rad, axis=0)[:, 0])
+        pos_diff = np.diff(pos, axis=0)
+        speed = np.array(
+            [np.dot(pos_diff[i], ori[i + 1]) for i in range(pos_diff.shape[0])]
+        )
+
+        return np.stack([speed, turn], axis=-1)
diff --git a/src/robofish/io/file.py b/src/robofish/io/file.py
index 5a197e366692a6c2fc877313f14acc3bd9c8c517..04f5ef58f9c21e1485b695011584fd7b6912b782 100644
--- a/src/robofish/io/file.py
+++ b/src/robofish/io/file.py
@@ -22,7 +22,7 @@ import h5py
 import numpy as np
 
 import logging
-from typing import Iterable, Union
+from typing import Iterable, Union, Tuple, List
 from pathlib import Path
 import shutil
 import datetime
@@ -31,6 +31,11 @@ import uuid
 import deprecation
 import types
 
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+from matplotlib import animation
+from matplotlib import patches
+
 # Remember: Update docstring when updating these two global variables
 default_format_version = np.array([1, 0], dtype=np.int32)
 
@@ -52,9 +57,9 @@ class File(h5py.File):
         path: Union[str, Path] = None,
         mode: str = "r",
         *,  # PEP 3102
-        world_size_cm: [int, int] = None,
+        world_size_cm: List[int] = None,
         strict_validate: bool = False,
-        format_version: [int, int] = default_format_version,
+        format_version: List[int] = default_format_version,
         format_url: str = default_format_url,
         sampling_name: str = None,
         frequency_hz: int = None,
@@ -80,7 +85,6 @@ class File(h5py.File):
         world_size_cm : [int, int] , optional
             side lengths [x, y] of the world in cm.
             rectangular world shape is assumed.
-            TODO: Cuboid world is also possible in track format
         strict_validate : bool, default=False
             if the file should be strictly validated against the track
             format specification, when loaded from a path.
@@ -419,15 +423,50 @@ class File(h5py.File):
         return self.select_entity_property(None, entity_property=Entity.poses_rad)
 
     @property
+    @deprecation.deprecated(
+        deprecated_in="1.2",
+        removed_in="1.2.4",
+        details="We found that our calculation of 'poses_calc_ori' is flawed."
+        "Please replace it with 'poses' and use the tracked orientation."
+        "If you see this message and you don't know what to do, update all packages and if nothing helps, contact Andi.\n"
+        "Don't ignore this warning, it's a serious issue.",
+    )
+    def entity_poses_calc_ori(self):
+        return self.select_entity_property(None, entity_property=Entity.poses_calc_ori)
+
+    @property
+    @deprecation.deprecated(
+        deprecated_in="1.2",
+        removed_in="1.2.4",
+        details="We found that our calculation of 'poses_calc_ori_rad' is flawed."
+        "Please replace it with 'poses_rad' and use the tracked orientation."
+        "If you see this message and you don't know what to do, update all packages and if nothing helps, contact Andi.\n"
+        "Don't ignore this warning, it's a serious issue.",
+    )
     def entity_poses_calc_ori_rad(self):
         return self.select_entity_property(
             None, entity_property=Entity.poses_calc_ori_rad
         )
 
     @property
+    @deprecation.deprecated(
+        deprecated_in="1.2",
+        removed_in="1.2.4",
+        details="We found that our calculation of 'speed_turn' is flawed and replaced it "
+        "with 'actions_speeds_turns'. The difference in calculation is, that the tracked "
+        "orientation is used now which gives the fish the ability to swim backwards. "
+        "If you see this message and you don't know what to do, update all packages and if nothing helps, contact Andi.\n"
+        "Don't ignore this warning, it's a serious issue.",
+    )
     def entity_speeds_turns(self):
         return self.select_entity_property(None, entity_property=Entity.speed_turn)
 
+    @property
+    def entity_actions_speeds_turns(self):
+        return self.select_entity_property(
+            None, entity_property=Entity.actions_speeds_turns
+        )
+
     def select_entity_poses(self, *args, ori_rad=False, **kwargs):
         entity_property = Entity.poses_rad if ori_rad else Entity.poses
         return self.select_entity_property(
@@ -474,42 +513,7 @@ class File(h5py.File):
             property_array[i][: properties[i].shape[0]] = properties[i]
         return property_array
 
-    @deprecation.deprecated(
-        deprecated_in="1.1.2",
-        removed_in="1.2",
-        details="get_poses() is deprecated and was replaced with the attribute 'poses' or the function select_poses(), when ",
-    )
-    def get_poses(self, *, category=None, names=None):
-
-        if category is not None:
-            predicate = lambda e: e.category == category
-            if names is not None:
-                predicate = lambda e: e.category == category and e.name in names
-        elif names is not None:
-            predicate = lambda e: e.name in names
-        else:
-            predicate = None
-        return self.select_entity_poses(predicate)
-
-    def entity_turn_speed(self, predicate=None):
-        """Get an array of turns and speeds of the entities."""
-
-        entities = self.entities
-        if predicate is not None:
-            entities = [e for e in entities if predicate(e)]
-
-        assert self.common_sampling(entities) is not None
-
-        # Initialize poses output array
-        max_timesteps = max([0] + [e.positions.shape[0] for e in entities])
-        turn_speed = np.empty((len(entities), max_timesteps, 3))
-        turn_speed[:] = np.nan
-
-        for i, entity in enumerate(entities):
-            poses = entity.poses_rad if rad else entity.poses
-            poses_output[i][: poses.shape[0]] = poses
-
-    def validate(self, strict_validate: bool = True) -> (bool, str):
+    def validate(self, strict_validate: bool = True) -> Tuple[bool, str]:
         """Validate the file to the specification.
 
         The function compares a given file to the robofish track format specification:
@@ -583,3 +587,159 @@ class File(h5py.File):
 
     def __str__(self):
         return self.to_string()
+
+    def render(self, video_path=None, **kwargs):
+        """Render a video of the file.
+
+        As there are render functions in gym_guppy and robofish.trackviewer, this function is a temporary addition.
+        The goal should be to bring together the rendering tools."""
+
+        def shape_vertices(scale=1) -> np.ndarray:
+            base_shape = np.array(
+                [
+                    (+3.0, +0.0),
+                    (+2.5, +1.0),
+                    (+1.5, +1.5),
+                    (-2.5, +1.0),
+                    (-4.5, +0.0),
+                    (-2.5, -1.0),
+                    (+1.5, -1.5),
+                    (+2.5, -1.0),
+                ]
+            )
+            return base_shape * scale
+
+        default_options = {
+            "linewidth": 2,
+            "speedup": 1,
+            "trail": 100,
+            "entity_scale": 0.2,
+            "fixed_view": False,
+            "view_size": 50,
+            "margin": 15,
+            "slow_view": 0.8,
+        }
+
+        options = {
+            key: kwargs[key] if key in kwargs else default_options[key]
+            for key in default_options.keys()
+        }
+
+        fig, ax = plt.subplots(figsize=(10, 10))
+        ax.set_facecolor("gray")
+
+        n_entities = len(self.entities)
+        lines = [
+            plt.plot([], [], lw=options["linewidth"], zorder=0)[0]
+            for _ in range(n_entities)
+        ]
+        entity_polygons = [
+            patches.Polygon(shape_vertices(options["entity_scale"]), facecolor="k")
+            for _ in range(n_entities)
+        ]
+
+        border_vertices = np.array(
+            [
+                np.array([-1, -1, 1, 1, -1]) * self.world_size[0] / 2,
+                np.array([-1, 1, 1, -1, -1]) * self.world_size[1] / 2,
+            ]
+        )
+
+        spacing = 10
+        x = np.arange(
+            -0.5 * self.world_size[0] + spacing, 0.5 * self.world_size[0], spacing
+        )
+        y = np.arange(
+            -0.5 * self.world_size[1] + spacing, 0.5 * self.world_size[1], spacing
+        )
+        xv, yv = np.meshgrid(x, y)
+
+        grid_points = plt.scatter(xv, yv, c="gray", s=1.5)
+
+        # border = plt.plot(border_vertices[0], border_vertices[1], "k")
+        border = patches.Polygon(border_vertices.T, facecolor="w", zorder=-1)
+
+        start_pose = self.entity_poses_rad[:, 0]
+
+        self.middle_of_swarm = np.mean(start_pose, axis=0)
+        min_view = np.max((np.max(start_pose, axis=0) - np.min(start_pose, axis=0))[:2])
+        self.view_size = np.max([options["view_size"], min_view + options["margin"]])
+
+        def init():
+            ax.set_xlim(-0.5 * self.world_size[0], 0.5 * self.world_size[0])
+            ax.set_ylim(-0.5 * self.world_size[1], 0.5 * self.world_size[1])
+            ax.set_xticks([])
+            ax.set_xticks([], minor=True)
+            ax.set_yticks([])
+            ax.set_yticks([], minor=True)
+
+            for e_poly in entity_polygons:
+                ax.add_patch(e_poly)
+            ax.add_patch(border)
+            return lines + entity_polygons + [border, grid_points]
+
+        def update(frame):
+            entity_poses = self.entity_poses_rad
+
+            file_frame = (int)(frame * options["speedup"]) % entity_poses.shape[1]
+            this_pose = entity_poses[:, file_frame]
+
+            if not options["fixed_view"]:
+                self.middle_of_swarm = options["slow_view"] * self.middle_of_swarm + (
+                    1 - options["slow_view"]
+                ) * np.mean(this_pose, axis=0)
+
+                # Find the maximal distance between the entities in x or y direction
+                self.min_view = np.max(
+                    (np.max(this_pose, axis=0) - np.min(this_pose, axis=0))[:2]
+                )
+                new_view_size = np.max(
+                    [options["view_size"], min_view + options["margin"]]
+                )
+                self.view_size = (
+                    options["slow_view"] * self.view_size
+                    + (1 - options["slow_view"]) * new_view_size
+                )
+
+                ax.set_xlim(
+                    self.middle_of_swarm[0] - self.view_size / 2,
+                    self.middle_of_swarm[0] + self.view_size / 2,
+                )
+                ax.set_ylim(
+                    self.middle_of_swarm[1] - self.view_size / 2,
+                    self.middle_of_swarm[1] + self.view_size / 2,
+                )
+
+            for i_entity in range(n_entities):
+
+                poses_trail = entity_poses[
+                    i_entity, max(0, file_frame - options["trail"]) : file_frame
+                ]
+
+                lines[i_entity].set_data(poses_trail[:, 0], poses_trail[:, 1])
+
+                current_pose = entity_poses[i_entity, file_frame]
+                t = mpl.transforms.Affine2D().translate(
+                    current_pose[0], current_pose[1]
+                )
+                r = mpl.transforms.Affine2D().rotate(current_pose[2])
+                tra = r + t + ax.transData
+                entity_polygons[i_entity].set_transform(tra)
+            return lines + entity_polygons + [border, grid_points]
+
+        ani = animation.FuncAnimation(
+            fig,
+            update,
+            frames=self.entity_positions.shape[1],
+            init_func=init,
+            blit=True,
+            interval=1.0 / self.frequency,
+            save_count=500,
+        )
+
+        if video_path is not None:
+            print(f"saving video to {video_path}")
+            writervideo = animation.FFMpegWriter(fps=25)
+            ani.save(video_path, writer=writervideo)
+        else:
+            plt.show()
diff --git a/src/robofish/io/io.py b/src/robofish/io/io.py
index 4c12aded73ffab9675370b160dac54b832164331..763779b205827fa238aed17ac30fbcf2febeb46c 100644
--- a/src/robofish/io/io.py
+++ b/src/robofish/io/io.py
@@ -136,4 +136,4 @@ def read_property_from_multiple_files(
             with robofish.io.File(path=path, strict_validate=strict_validate) as f:
                 p = f.select_entity_property(predicate, entity_property)
                 poses_array.append(p)
-    return poses_array
\ No newline at end of file
+    return poses_array
diff --git a/src/robofish/io/utils.py b/src/robofish/io/utils.py
index 3be2c62eee39b1fe0e14dbbff4723f569033b0d1..1992dc36b4a57f47b568e0cf62054eda32338b0b 100644
--- a/src/robofish/io/utils.py
+++ b/src/robofish/io/utils.py
@@ -35,4 +35,4 @@ def limit_angle_range(angle: Union[float, Iterable], _range=(-np.pi, np.pi)):
     if isinstance(angle, Iterable):
         return np.array([limit_one(v) for v in angle])
     else:
-        return limit_one(angle)
\ No newline at end of file
+        return limit_one(angle)
diff --git a/tests/robofish/evaluate/test_app_evaluate.py b/tests/robofish/evaluate/test_app_evaluate.py
index d95fa70893f8866920844c0a5564ed9693c8a9f6..43b3e5ad65a19b1cec7aa684a3c0ee608ecb7e89 100644
--- a/tests/robofish/evaluate/test_app_evaluate.py
+++ b/tests/robofish/evaluate/test_app_evaluate.py
@@ -3,6 +3,9 @@ from robofish.io import utils
 import pytest
 import logging
 from pathlib import Path
+import numpy as np
+
+np.seterr(all="raise")
 
 logging.getLogger().setLevel(logging.INFO)
 
diff --git a/tests/robofish/io/test_entity.py b/tests/robofish/io/test_entity.py
index 72dc5f7efe8a0ed1296a66f39473e575230dd123..0101aca08fc3a7742098fbeb7e04ab029f33a17e 100644
--- a/tests/robofish/io/test_entity.py
+++ b/tests/robofish/io/test_entity.py
@@ -31,28 +31,39 @@ def test_entity_object():
         )
 
 
-def test_entity_turn_speed():
+def test_entity_turns_speeds():
+    """This test was created, when the turns and speeds where calculated from positions only.
+    There were issues with the calculation of speeds and turns. The corresponding functions were set to be deprecated.
+    This test was adapted to have plausible orientations which are used when the speeds and turns are calculated.
+    The reconstructed track is not identical to the original track. The reson for this is unknown.
+    TODO: Find the reason, why the reconstructed track differs
+    """
+
     f = robofish.io.File(world_size_cm=[100, 100], frequency_hz=25)
     circle_rad = np.linspace(0, 2 * np.pi, num=100)
     circle_size = 40
-    positions = np.stack(
-        [np.cos(circle_rad) * circle_size, np.sin(circle_rad) * circle_size], axis=-1
+    poses_rad = np.stack(
+        [
+            np.cos(circle_rad) * circle_size,
+            np.sin(circle_rad) * circle_size,
+            circle_rad + np.pi / 2,
+        ],
+        axis=-1,
     )
-    e = f.create_entity("fish", positions=positions)
-    speed_turn = e.speed_turn
-    assert speed_turn.shape == (98, 2)
 
-    # Turns and speeds shoud be all the same afterwards, since the fish swims with constant velocity and angular velocity.
-    assert (np.std(speed_turn, axis=0) < 0.0001).all()
+    e = f.create_entity("fish", poses=poses_rad)
+    speeds_turns = e.actions_speeds_turns
+    assert speeds_turns.shape == (99, 2)
 
-    # Cut off the first position as it cannot be simulated
-    positions = positions[1:]
+    # Turns and speeds shoud be all the same afterwards, since the fish swims with constant velocity and angular velocity.
+    print(np.std(speeds_turns, axis=0))
+    assert (np.std(speeds_turns, axis=0) < 0.0001).all()
 
     # Use turn_speed to generate positions
-    gen_positions = np.zeros((positions.shape[0], 3))
-    gen_positions[0] = e.poses_calc_ori_rad[0]
+    gen_positions = np.zeros((poses_rad.shape[0], 3))
+    gen_positions[0] = e.poses_rad[0]
 
-    for i, (speed, turn) in enumerate(speed_turn):
+    for i, (speed, turn) in enumerate(speeds_turns):
         new_angle = gen_positions[i, 2] + turn
         gen_positions[i + 1] = [
             gen_positions[i, 0] + np.cos(new_angle) * speed,
@@ -60,6 +71,12 @@ def test_entity_turn_speed():
             new_angle,
         ]
 
+    # import matplotlib.pyplot as plt
+
+    # plt.plot(poses_rad[:, 0], poses_rad[:, 1], label="real")
+    # plt.plot(gen_positions[:, 0], gen_positions[:, 1], label="gen")
+    # plt.legend()
+    # plt.show()
     # The resulting positions should almost be equal to the the given positions
-    print(gen_positions[:, :2] - positions)
-    assert np.isclose(positions, gen_positions[:, :2], atol=1.0e-5).all()
+    print(gen_positions - poses_rad)
+    assert np.isclose(poses_rad, gen_positions, atol=2.6).all()
diff --git a/tests/robofish/io/test_file.py b/tests/robofish/io/test_file.py
index c7b6f1a13fdc683b51144317cb5fd04fdd759053..0002e394ba56c50fed02dce3c74542ad924482bf 100644
--- a/tests/robofish/io/test_file.py
+++ b/tests/robofish/io/test_file.py
@@ -139,21 +139,13 @@ def test_multiple_entities():
     return sf
 
 
-def test_speeds_turns_angles():
+def test_actions_speeds_turns_angles():
     with robofish.io.File(world_size_cm=[100, 100], frequency_hz=25) as f:
         poses = np.zeros((10, 100, 3))
         f.create_multiple_entities("fish", poses=poses)
 
         # Stationary fish has no speed or turn
-        assert (f.entity_speeds_turns == 0).all()
-
-
-def test_deprecated_get_poses():
-    f = test_multiple_entities()
-    with pytest.warns(DeprecationWarning):
-        assert f.get_poses().shape[0] == 10
-        assert f.get_poses(category="fish").shape[0] == 7
-        assert f.get_poses(names="fish_1").shape[0] == 1
+        assert (f.entity_actions_speeds_turns == 0).all()
 
 
 def test_entity_poses_rad(caplog):
@@ -180,8 +172,8 @@ def test_entity_positions_no_orientation():
         assert (f.entity_poses[:, :] == np.array([1, 1, 0, 1])).all()
         assert np.isclose(f.entity_orientations_rad, np.pi / 2).all()
 
-        # Calculate the orientation
-        assert f.entity_poses_calc_ori_rad.shape == (1, 99, 3)
+        # The entity is not moving so there should be no actions at all.
+        assert np.isclose(f.entity_actions_speeds_turns, 0).all()
 
 
 def test_load_validate():