diff --git a/lib/untis/fetch.dart b/lib/untis/fetch.dart
index f9e8a4e3d4948abb613a0416af92828aebd4201b..2552f61fc534f0b9d92de48cb0b1c1e052bc08c3 100644
--- a/lib/untis/fetch.dart
+++ b/lib/untis/fetch.dart
@@ -11,7 +11,7 @@ import 'element_type.dart';
 import 'lecture.dart';
 
 typedef RequestOptions = (String path, String method, Json params);
-typedef JsonWithCookies = (Json json, List<Cookie> cookies);
+typedef RequestResult = (Json json, List<Cookie> cookies, FetchStats stats);
 
 class UntisFetch {
   static const String apiBase = '/WebUntis/api/public';
@@ -64,10 +64,10 @@ class UntisFetch {
     return response;
   }
 
-  Future<JsonWithCookies> _requestJson(RequestOptions options) async {
+  Future<RequestResult> _requestJson(RequestOptions options) async {
     final (_, String method, _) = options;
 
-    final before = DateTime.now();
+    final onStart = DateTime.now();
     final response = await _request(method, _makeUri(options));
 
     final cookies = response.cookies;
@@ -79,30 +79,19 @@ class UntisFetch {
       }
     }
 
-    final afterDownloadStart = DateTime.now();
-    final responseTime = afterDownloadStart.difference(before);
+    final onDownloadStart = DateTime.now();
 
     final responseString = await utf8.decodeStream(response);
-
-    final afterDownloadEnd = DateTime.now();
-    final downloadTime = afterDownloadEnd.difference(afterDownloadStart);
+    final onDownloadEnd = DateTime.now();
 
     final bodyJson = jsonDecode(responseString);
 
-    final afterDecode = DateTime.now();
-    final decodeTime = afterDecode.difference(afterDownloadEnd);
+    final onDecodeEnd = DateTime.now();
 
-    final timeStats = {
-      'Ping': responseTime,
-      'Download': downloadTime,
-      'JSON': decodeTime,
-    };
+    final stats =
+        FetchStats(onStart, onDownloadStart, onDownloadEnd, onDecodeEnd);
 
-    print(timeStats.entries
-        .map((e) => '${e.key}: ${e.value.inMilliseconds}ms')
-        .join(', '));
-
-    return (bodyJson as Json, resultCookies);
+    return (bodyJson as Json, resultCookies, stats);
   }
 
   Future<Json> requestOptions(RequestOptions options) async {
@@ -112,9 +101,10 @@ class UntisFetch {
     final methodPadded = method.padRight(8);
     print('$methodPadded $uri');
 
-    final (result, cookies) = await compute(_requestJson, options);
+    final (result, cookies, stats) = await compute(_requestJson, options);
     _sessionCookies.addAll(cookies);
 
+    print('$stats');
     return result;
   }
 
@@ -127,3 +117,34 @@ class UntisFetch {
     return await requestOptions(options);
   }
 }
+
+class FetchStats {
+  final DateTime onStart;
+  final DateTime onDownloadStart;
+  final DateTime onDownloadEnd;
+  final DateTime onDecodeEnd;
+
+  FetchStats(
+    this.onStart,
+    this.onDownloadStart,
+    this.onDownloadEnd,
+    this.onDecodeEnd,
+  );
+
+  @override
+  String toString() {
+    final responseTime = onDownloadStart.difference(onStart);
+    final downloadTime = onDownloadEnd.difference(onDownloadStart);
+    final decodeTime = onDecodeEnd.difference(onDownloadEnd);
+
+    final timeStats = {
+      'Ping': responseTime,
+      'Download': downloadTime,
+      'JSON': decodeTime,
+    };
+
+    return timeStats.entries
+        .map((e) => '${e.key}: ${e.value.inMilliseconds}ms')
+        .join(', ');
+  }
+}