diff --git a/migrations/007_cleanup_timesheets.php b/migrations/007_cleanup_timesheets.php
new file mode 100644
index 0000000000000000000000000000000000000000..01d6f74903d7a2842a05326b00914d53d39eb855
--- /dev/null
+++ b/migrations/007_cleanup_timesheets.php
@@ -0,0 +1,39 @@
+<?php
+
+class CleanupTimesheets extends Migration
+{
+    public function description()
+    {
+        return 'remove orphaned entries from stundenzettel_timesheets';
+    }
+
+    public function up()
+    {
+        $db = DBManager::get();
+
+        $sql = 'ALTER TABLE stundenzettel_contracts ADD KEY inst_id (inst_id)';
+        $db->exec($sql);
+
+        $sql = 'ALTER TABLE stundenzettel_timesheets ADD KEY contract_id (contract_id)';
+        $db->exec($sql);
+
+        $sql = 'DELETE FROM stundenzettel_timesheets
+                WHERE contract_id NOT IN (SELECT id FROM stundenzettel_contracts)';
+        $db->exec($sql);
+
+        $sql = 'DELETE FROM stundenzettel_records
+                WHERE timesheet_id NOT IN (SELECT id FROM stundenzettel_timesheets)';
+        $db->exec($sql);
+    }
+
+    public function down()
+    {
+        $db = DBManager::get();
+
+        $sql = 'ALTER TABLE stundenzettel_contracts DROP KEY inst_id';
+        $db->exec($sql);
+
+        $sql = 'ALTER TABLE stundenzettel_timesheets DROP KEY contract_id';
+        $db->exec($sql);
+    }
+}
diff --git a/models/StundenzettelContract.class.php b/models/StundenzettelContract.class.php
index 72374888d8eabc417cc2da30bfb75d6c8fdd95d8..7900eea8ed2abbd5f19af16c8fecdcaf21e66ecf 100644
--- a/models/StundenzettelContract.class.php
+++ b/models/StundenzettelContract.class.php
@@ -36,6 +36,12 @@ class StundenzettelContract extends \SimpleORMap
             'foreign_key' => 'inst_id'
         ];
 
+        $config['has_many']['timesheets'] = [
+            'class_name'        => 'StundenzettelTimesheet',
+            'assoc_foreign_key' => 'contract_id',
+            'on_delete'         => 'delete'
+        ];
+
         $config['additional_fields']['default_workday_time']['get'] = function ($item) {
             $workday_hours = $item->contract_hours / 4.348 / 5;
             $hours = floor($workday_hours);
diff --git a/models/StundenzettelRecord.class.php b/models/StundenzettelRecord.class.php
index fa13dc8539858210594496efec572c9cb549334f..74a8553aa41ff4b2c2fe1d093142a3866f127345 100644
--- a/models/StundenzettelRecord.class.php
+++ b/models/StundenzettelRecord.class.php
@@ -26,7 +26,8 @@ class StundenzettelRecord extends \SimpleORMap
 
         $config['belongs_to']['timesheet'] = [
             'class_name'  => 'StundenzettelTimesheet',
-            'foreign_key' => 'timesheet_id',];
+            'foreign_key' => 'timesheet_id'
+        ];
 
         $config['registered_callbacks']['before_store'][] = 'before_store';
 
diff --git a/models/StundenzettelTimesheet.class.php b/models/StundenzettelTimesheet.class.php
index a988f3c9d36048f9aed2394bf1f0d27b022d4734..b452db31cd2c62eed4f28c863b3af6a1b5e7a92a 100644
--- a/models/StundenzettelTimesheet.class.php
+++ b/models/StundenzettelTimesheet.class.php
@@ -29,6 +29,12 @@ class StundenzettelTimesheet extends \SimpleORMap
             'foreign_key' => 'approver_id'
         ];
 
+        $config['has_many']['records'] = [
+            'class_name'        => 'StundenzettelRecord',
+            'assoc_foreign_key' => 'timesheet_id',
+            'on_delete'         => 'delete'
+        ];
+
         $config['additional_fields']['timesheet_balance']['get'] = function ($item) {
             if ($item->month_completed) {
                 return $item->sum - ($item->contract->contract_hours * 3600);