From 7432972b3c13cae0542fc1d47ca4cddff176c331 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com>
Date: Tue, 14 Feb 2023 18:06:18 +0100
Subject: [PATCH] Implement local HTTP Api usage

---
 .idea/libraries/Dart_Packages.xml             | 304 +++++++++++++++++-
 .idea/libraries/Flutter_Plugins.xml           |   8 +-
 lib/api/apiError.dart                         |   5 +
 lib/api/apiRequest.dart                       |  39 +++
 lib/api/talk/requestLoginTest.dart            |   6 +
 lib/api/webuntis/apiParams.dart               |   3 +
 lib/api/webuntis/apiResponse.dart             |   6 +
 .../queries/authenticate/authenticate.dart    |  55 ++++
 .../authenticate/authenticateParams.dart      |  16 +
 .../authenticate/authenticateParams.g.dart    |  19 ++
 .../authenticate/authenticateResponse.dart    |  18 ++
 .../authenticate/authenticateResponse.g.dart  |  25 ++
 .../webuntis/queries/getRooms/getRooms.dart   |  17 +
 .../queries/getRooms/getRoomsResponse.dart    |  29 ++
 .../queries/getRooms/getRoomsResponse.g.dart  |  40 +++
 .../queries/getTimetable/getTimetable.dart    |  22 ++
 .../getTimetable/getTimetableParams.dart      |  91 ++++++
 .../getTimetable/getTimetableParams.g.dart    | 114 +++++++
 .../getTimetable/getTimetableResponse.dart    |  85 +++++
 .../getTimetable/getTimetableResponse.g.dart  | 103 ++++++
 lib/api/webuntis/webuntisApi.dart             |  54 ++++
 lib/api/webuntis/webuntisError.dart           |  10 +
 lib/app.dart                                  |   3 +-
 lib/screen/login/login.dart                   | 107 +++---
 lib/screen/pages/timetable/testTimetable.dart | 145 +++++++++
 lib/widget/offlineError.dart                  |  32 ++
 pubspec.yaml                                  |   3 +
 27 files changed, 1300 insertions(+), 59 deletions(-)
 create mode 100644 lib/api/apiError.dart
 create mode 100644 lib/api/apiRequest.dart
 create mode 100644 lib/api/talk/requestLoginTest.dart
 create mode 100644 lib/api/webuntis/apiParams.dart
 create mode 100644 lib/api/webuntis/apiResponse.dart
 create mode 100644 lib/api/webuntis/queries/authenticate/authenticate.dart
 create mode 100644 lib/api/webuntis/queries/authenticate/authenticateParams.dart
 create mode 100644 lib/api/webuntis/queries/authenticate/authenticateParams.g.dart
 create mode 100644 lib/api/webuntis/queries/authenticate/authenticateResponse.dart
 create mode 100644 lib/api/webuntis/queries/authenticate/authenticateResponse.g.dart
 create mode 100644 lib/api/webuntis/queries/getRooms/getRooms.dart
 create mode 100644 lib/api/webuntis/queries/getRooms/getRoomsResponse.dart
 create mode 100644 lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart
 create mode 100644 lib/api/webuntis/queries/getTimetable/getTimetable.dart
 create mode 100644 lib/api/webuntis/queries/getTimetable/getTimetableParams.dart
 create mode 100644 lib/api/webuntis/queries/getTimetable/getTimetableParams.g.dart
 create mode 100644 lib/api/webuntis/queries/getTimetable/getTimetableResponse.dart
 create mode 100644 lib/api/webuntis/queries/getTimetable/getTimetableResponse.g.dart
 create mode 100644 lib/api/webuntis/webuntisApi.dart
 create mode 100644 lib/api/webuntis/webuntisError.dart
 create mode 100644 lib/screen/pages/timetable/testTimetable.dart
 create mode 100644 lib/widget/offlineError.dart

diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml
index b38194d..97f306b 100644
--- a/.idea/libraries/Dart_Packages.xml
+++ b/.idea/libraries/Dart_Packages.xml
@@ -2,6 +2,20 @@
   <library name="Dart Packages" type="DartPackagesLibraryType">
     <properties>
       <option name="packageNameToDirsMap">
+        <entry key="_fe_analyzer_shared">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-50.0.0/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="analyzer">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-5.2.0/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="another_flushbar">
           <value>
             <list>
@@ -26,7 +40,7 @@
         <entry key="args">
           <value>
             <list>
-              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.3.2/lib" />
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.4.0/lib" />
             </list>
           </value>
         </entry>
@@ -51,6 +65,62 @@
             </list>
           </value>
         </entry>
+        <entry key="build">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.3.1/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="build_config">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.1.1/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="build_daemon">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.1.0/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="build_resolvers">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.1.0/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="build_runner">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.3.3/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="build_runner_core">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.2.7/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="built_collection">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.1/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="built_value">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.4.3/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="characters">
           <value>
             <list>
@@ -58,6 +128,13 @@
             </list>
           </value>
         </entry>
+        <entry key="checked_yaml">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.2/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="clock">
           <value>
             <list>
@@ -65,6 +142,13 @@
             </list>
           </value>
         </entry>
+        <entry key="code_builder">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.4.0/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="collection">
           <value>
             <list>
@@ -100,6 +184,13 @@
             </list>
           </value>
         </entry>
+        <entry key="dart_style">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.2.4/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="dio">
           <value>
             <list>
@@ -128,6 +219,13 @@
             </list>
           </value>
         </entry>
+        <entry key="fixnum">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.1/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="flutter">
           <value>
             <list>
@@ -173,7 +271,28 @@
         <entry key="font_awesome_flutter">
           <value>
             <list>
-              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/font_awesome_flutter-10.3.0/lib" />
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/font_awesome_flutter-10.4.0/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="frontend_server_client">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-3.2.0/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="glob">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.1.1/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="graphs">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.2.0/lib" />
             </list>
           </value>
         </entry>
@@ -191,6 +310,13 @@
             </list>
           </value>
         </entry>
+        <entry key="http_multi_server">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.2.1/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="http_parser">
           <value>
             <list>
@@ -201,7 +327,7 @@
         <entry key="image">
           <value>
             <list>
-              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/image-4.0.12/lib" />
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/image-4.0.15/lib" />
             </list>
           </value>
         </entry>
@@ -212,6 +338,13 @@
             </list>
           </value>
         </entry>
+        <entry key="io">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.4/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="jiffy">
           <value>
             <list>
@@ -226,6 +359,20 @@
             </list>
           </value>
         </entry>
+        <entry key="json_annotation">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.8.0/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="json_serializable">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-6.6.1/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="lints">
           <value>
             <list>
@@ -233,6 +380,13 @@
             </list>
           </value>
         </entry>
+        <entry key="logging">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.1.1/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="matcher">
           <value>
             <list>
@@ -254,6 +408,13 @@
             </list>
           </value>
         </entry>
+        <entry key="mime">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.4/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="nested">
           <value>
             <list>
@@ -261,6 +422,13 @@
             </list>
           </value>
         </entry>
+        <entry key="package_config">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.1.0/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="path">
           <value>
             <list>
@@ -271,7 +439,7 @@
         <entry key="path_provider_linux">
           <value>
             <list>
-              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.7/lib" />
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.8/lib" />
             </list>
           </value>
         </entry>
@@ -317,6 +485,13 @@
             </list>
           </value>
         </entry>
+        <entry key="pool">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.1/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="process">
           <value>
             <list>
@@ -331,6 +506,20 @@
             </list>
           </value>
         </entry>
+        <entry key="pub_semver">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.1.3/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="pubspec_parse">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.2.1/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="quiver">
           <value>
             <list>
@@ -355,7 +544,7 @@
         <entry key="shared_preferences_foundation">
           <value>
             <list>
-              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.2/lib" />
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.3/lib" />
             </list>
           </value>
         </entry>
@@ -387,6 +576,20 @@
             </list>
           </value>
         </entry>
+        <entry key="shelf">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.4.0/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="shelf_web_socket">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.3/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="sign_in_button">
           <value>
             <list>
@@ -401,6 +604,20 @@
             </list>
           </value>
         </entry>
+        <entry key="source_gen">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.2.7/lib" />
+            </list>
+          </value>
+        </entry>
+        <entry key="source_helper">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.3.3/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="source_span">
           <value>
             <list>
@@ -422,6 +639,13 @@
             </list>
           </value>
         </entry>
+        <entry key="stream_transform">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.1.0/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="string_scanner">
           <value>
             <list>
@@ -450,6 +674,13 @@
             </list>
           </value>
         </entry>
+        <entry key="timing">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.1/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="typed_data">
           <value>
             <list>
@@ -467,7 +698,7 @@
         <entry key="url_launcher">
           <value>
             <list>
-              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.1.8/lib" />
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.1.9/lib" />
             </list>
           </value>
         </entry>
@@ -481,7 +712,7 @@
         <entry key="url_launcher_ios">
           <value>
             <list>
-              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.0.18/lib" />
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.1.0/lib" />
             </list>
           </value>
         </entry>
@@ -527,6 +758,13 @@
             </list>
           </value>
         </entry>
+        <entry key="watcher">
+          <value>
+            <list>
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.2/lib" />
+            </list>
+          </value>
+        </entry>
         <entry key="web_socket_channel">
           <value>
             <list>
@@ -551,7 +789,7 @@
         <entry key="xdg_directories">
           <value>
             <list>
-              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0+3/lib" />
+              <option value="/opt/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-1.0.0/lib" />
             </list>
           </value>
         </entry>
@@ -572,81 +810,115 @@
       </option>
     </properties>
     <CLASSES>
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-50.0.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-5.2.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/another_flushbar-1.12.29/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/another_transformer_page_view-2.0.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.3.6/lib" />
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.3.2/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.4.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.9.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/bubble-1.2.1/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.3.1/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.1.1/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.1.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.1.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.3.3/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.2.7/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.1/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.4.3/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.1/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.2/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.1/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.4.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.16.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.1.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.2/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/csslib-0.17.2/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.5/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.2.4/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.6/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.3.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-2.0.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.4/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-2.0.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_login-4.1.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_native_splash-2.2.17/lib" />
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/font_awesome_flutter-10.3.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/font_awesome_flutter-10.4.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-3.2.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.1.1/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.2.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/html-0.15.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.5/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.2.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.2/lib" />
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/image-4.0.12/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/image-4.0.15/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.4/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/jiffy-5.0.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.4/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.8.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-6.6.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/lints-2.0.1/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.1.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.12/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.5/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.8.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.4/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.1.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.2/lib" />
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.7/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.8/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.5/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-5.1.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.1.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.1.3/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/pointycastle-3.6.2/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.4/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.5/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.1.3/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.2.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/quiver-3.2.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.17/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_android-2.0.15/lib" />
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.2/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.3/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-2.1.3/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_platform_interface-2.1.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.4/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.1.3/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.4.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.3/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/sign_in_button-3.1.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.2.7/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.3.3/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.9.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.1.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.12/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/timetable_view-0.3.0/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/universal_io-2.0.4/lib" />
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.1.8/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.1.9/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_android-6.0.23/lib" />
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.0.18/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.1.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-3.0.2/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-3.0.2/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.1.1/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.14/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-3.0.3/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.2/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.2/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.3.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/webdav_client-1.1.8/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/win32-3.1.3/lib" />
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0+3/lib" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-1.0.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/xml-6.1.0/lib" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.1/lib" />
       <root url="file:///opt/flutter/bin/cache/pkg/sky_engine/lib" />
diff --git a/.idea/libraries/Flutter_Plugins.xml b/.idea/libraries/Flutter_Plugins.xml
index 68699cc..3e1b5a3 100644
--- a/.idea/libraries/Flutter_Plugins.xml
+++ b/.idea/libraries/Flutter_Plugins.xml
@@ -1,7 +1,6 @@
 <component name="libraryTable">
   <library name="Flutter Plugins" type="FlutterPluginsLibraryType">
     <CLASSES>
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.7" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-2.0.4" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.1.3" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-2.1.3" />
@@ -11,12 +10,13 @@
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.14" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-3.0.3" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-2.0.17" />
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.0.18" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-3.0.2" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-3.0.2" />
       <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_android-6.0.23" />
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.2" />
-      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.1.8" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_foundation-2.1.3" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.8" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.1.9" />
+      <root url="file:///opt/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.1.0" />
     </CLASSES>
     <JAVADOC />
     <SOURCES />
diff --git a/lib/api/apiError.dart b/lib/api/apiError.dart
new file mode 100644
index 0000000..91cf533
--- /dev/null
+++ b/lib/api/apiError.dart
@@ -0,0 +1,5 @@
+class ApiError {
+  String message;
+
+  ApiError(this.message);
+}
\ No newline at end of file
diff --git a/lib/api/apiRequest.dart b/lib/api/apiRequest.dart
new file mode 100644
index 0000000..c17ad0b
--- /dev/null
+++ b/lib/api/apiRequest.dart
@@ -0,0 +1,39 @@
+import 'dart:developer';
+
+import 'package:http/http.dart' as http;
+import 'package:marianum_mobile/api/apiError.dart';
+
+class ApiRequest {
+  Uri endpoint;
+
+  ApiRequest(this.endpoint);
+
+  Future<http.Response> get(Map<String, String>? headers) async {
+    return await http.get(endpoint, headers: headers);
+  }
+
+  Future<http.Response> post(String data, Map<String, String>? headers) async {
+    log("Fetching: ${data}");
+    try {
+      http.Response response = await http
+          .post(endpoint, body: data, headers: headers)
+          .timeout(
+          const Duration(seconds: 10),
+          onTimeout: () {
+            log("timeout!");
+            throw ApiError("Network timeout");
+          }
+      );
+
+      if(response.statusCode != 200) {
+        log("Got ${response.statusCode}");
+        throw ApiError("Service response invalid, got status ${response.statusCode}");
+      }
+      return response;
+
+    } on Exception catch(e) {
+      throw ApiError("Http: ${e.toString()}");
+    }
+
+  }
+}
\ No newline at end of file
diff --git a/lib/api/talk/requestLoginTest.dart b/lib/api/talk/requestLoginTest.dart
new file mode 100644
index 0000000..724e63c
--- /dev/null
+++ b/lib/api/talk/requestLoginTest.dart
@@ -0,0 +1,6 @@
+import 'package:marianum_mobile/api/apiRequest.dart';
+
+class RequestLoginTest extends ApiRequest {
+  RequestLoginTest(super.endpoint);
+
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/apiParams.dart b/lib/api/webuntis/apiParams.dart
new file mode 100644
index 0000000..d59ae83
--- /dev/null
+++ b/lib/api/webuntis/apiParams.dart
@@ -0,0 +1,3 @@
+class ApiParams {
+
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/apiResponse.dart b/lib/api/webuntis/apiResponse.dart
new file mode 100644
index 0000000..7f670c5
--- /dev/null
+++ b/lib/api/webuntis/apiResponse.dart
@@ -0,0 +1,6 @@
+import 'package:http/http.dart' as http;
+import 'package:json_annotation/json_annotation.dart';
+abstract class ApiResponse {
+  @JsonKey(includeFromJson: false, includeToJson: false)
+  late http.Response rawResponse;
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/queries/authenticate/authenticate.dart b/lib/api/webuntis/queries/authenticate/authenticate.dart
new file mode 100644
index 0000000..f6f8349
--- /dev/null
+++ b/lib/api/webuntis/queries/authenticate/authenticate.dart
@@ -0,0 +1,55 @@
+import 'dart:async';
+import 'dart:convert';
+import 'dart:developer';
+
+import 'package:marianum_mobile/api/webuntis/webuntisApi.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+
+import 'authenticateParams.dart';
+import 'authenticateResponse.dart';
+
+class Authenticate extends WebuntisApi {
+  AuthenticateParams param;
+
+  Authenticate(this.param) : super("authenticate", param, authenticatedResponse: false);
+
+  @override
+  Future<AuthenticateResponse> run() async {
+    awaitingResponse = true;
+    String rawAnswer = await query(this);
+    AuthenticateResponse response = finalize(AuthenticateResponse.fromJson(jsonDecode(rawAnswer)['result']));
+    _lastResponse = response;
+    awaitedResponse.complete();
+    return response;
+  }
+
+  static bool awaitingResponse = false;
+  static Completer awaitedResponse = Completer();
+  static AuthenticateResponse? _lastResponse;
+
+  static Future<void> createSession() async {
+    SharedPreferences preferences = await SharedPreferences.getInstance();
+
+    _lastResponse = await Authenticate(
+        AuthenticateParams(
+          user: preferences.getString("username")!,
+          password: preferences.getString("password")!,
+        )
+    ).run();
+  }
+
+  static Future<AuthenticateResponse> getSession() async {
+    if(awaitingResponse) {
+      log("Other query in progress... waiting");
+      await awaitedResponse.future;
+    }
+
+    if(_lastResponse == null) {
+      log("Not authenticated... requesting");
+      awaitingResponse = true;
+      await createSession();
+    }
+    return _lastResponse!;
+
+  }
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/queries/authenticate/authenticateParams.dart b/lib/api/webuntis/queries/authenticate/authenticateParams.dart
new file mode 100644
index 0000000..30ce8e7
--- /dev/null
+++ b/lib/api/webuntis/queries/authenticate/authenticateParams.dart
@@ -0,0 +1,16 @@
+import 'package:json_annotation/json_annotation.dart';
+import 'package:marianum_mobile/api/webuntis/apiParams.dart';
+
+part 'authenticateParams.g.dart';
+
+@JsonSerializable()
+class AuthenticateParams extends ApiParams {
+
+  String user;
+  String password;
+
+  AuthenticateParams({required this.user, required this.password});
+  factory AuthenticateParams.fromJson(Map<String, dynamic> json) => _$AuthenticateParamsFromJson(json);
+
+  Map<String, dynamic> toJson() => _$AuthenticateParamsToJson(this);
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/queries/authenticate/authenticateParams.g.dart b/lib/api/webuntis/queries/authenticate/authenticateParams.g.dart
new file mode 100644
index 0000000..49db5df
--- /dev/null
+++ b/lib/api/webuntis/queries/authenticate/authenticateParams.g.dart
@@ -0,0 +1,19 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'authenticateParams.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+AuthenticateParams _$AuthenticateParamsFromJson(Map<String, dynamic> json) =>
+    AuthenticateParams(
+      user: json['user'] as String,
+      password: json['password'] as String,
+    );
+
+Map<String, dynamic> _$AuthenticateParamsToJson(AuthenticateParams instance) =>
+    <String, dynamic>{
+      'user': instance.user,
+      'password': instance.password,
+    };
diff --git a/lib/api/webuntis/queries/authenticate/authenticateResponse.dart b/lib/api/webuntis/queries/authenticate/authenticateResponse.dart
new file mode 100644
index 0000000..2ff4e0f
--- /dev/null
+++ b/lib/api/webuntis/queries/authenticate/authenticateResponse.dart
@@ -0,0 +1,18 @@
+import 'package:json_annotation/json_annotation.dart';
+import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
+
+part 'authenticateResponse.g.dart';
+
+@JsonSerializable()
+class AuthenticateResponse extends ApiResponse {
+
+  String sessionId;
+  int personType;
+  int personId;
+  int klasseId;
+
+  AuthenticateResponse(this.sessionId, this.personType, this.personId, this.klasseId);
+
+  factory AuthenticateResponse.fromJson(Map<String, dynamic> json) => _$AuthenticateResponseFromJson(json);
+  Map<String, dynamic> toJson() => _$AuthenticateResponseToJson(this);
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/queries/authenticate/authenticateResponse.g.dart b/lib/api/webuntis/queries/authenticate/authenticateResponse.g.dart
new file mode 100644
index 0000000..3e53ed4
--- /dev/null
+++ b/lib/api/webuntis/queries/authenticate/authenticateResponse.g.dart
@@ -0,0 +1,25 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'authenticateResponse.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+AuthenticateResponse _$AuthenticateResponseFromJson(
+        Map<String, dynamic> json) =>
+    AuthenticateResponse(
+      json['sessionId'] as String,
+      json['personType'] as int,
+      json['personId'] as int,
+      json['klasseId'] as int,
+    );
+
+Map<String, dynamic> _$AuthenticateResponseToJson(
+        AuthenticateResponse instance) =>
+    <String, dynamic>{
+      'sessionId': instance.sessionId,
+      'personType': instance.personType,
+      'personId': instance.personId,
+      'klasseId': instance.klasseId,
+    };
diff --git a/lib/api/webuntis/queries/getRooms/getRooms.dart b/lib/api/webuntis/queries/getRooms/getRooms.dart
new file mode 100644
index 0000000..58b303c
--- /dev/null
+++ b/lib/api/webuntis/queries/getRooms/getRooms.dart
@@ -0,0 +1,17 @@
+import 'dart:convert';
+
+import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
+import 'package:marianum_mobile/api/webuntis/webuntisApi.dart';
+
+import 'getRoomsResponse.dart';
+
+class GetRooms extends WebuntisApi {
+  GetRooms() : super("getRooms", null);
+
+  @override
+  Future<GetRoomsResponse> run() async {
+    String rawAnswer = await query(this);
+    return finalize(GetRoomsResponse.fromJson(jsonDecode(rawAnswer)));
+  }
+
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/queries/getRooms/getRoomsResponse.dart b/lib/api/webuntis/queries/getRooms/getRoomsResponse.dart
new file mode 100644
index 0000000..37d8689
--- /dev/null
+++ b/lib/api/webuntis/queries/getRooms/getRoomsResponse.dart
@@ -0,0 +1,29 @@
+import 'package:json_annotation/json_annotation.dart';
+import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
+
+part 'getRoomsResponse.g.dart';
+
+@JsonSerializable()
+class GetRoomsResponse extends ApiResponse {
+  Set<GetRoomsResponseObject> result;
+
+  GetRoomsResponse(this.result);
+
+  factory GetRoomsResponse.fromJson(Map<String, dynamic> json) => _$GetRoomsResponseFromJson(json);
+  Map<String, dynamic> toJson() => _$GetRoomsResponseToJson(this);
+}
+
+@JsonSerializable(explicitToJson: true)
+class GetRoomsResponseObject {
+  int id;
+  String name;
+  String longName;
+  bool active;
+  String building;
+
+
+  GetRoomsResponseObject(this.id, this.name, this.longName, this.active, this.building);
+
+  factory GetRoomsResponseObject.fromJson(Map<String, dynamic> json) => _$GetRoomsResponseObjectFromJson(json);
+  Map<String, dynamic> toJson() => _$GetRoomsResponseObjectToJson(this);
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart b/lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart
new file mode 100644
index 0000000..f2c2825
--- /dev/null
+++ b/lib/api/webuntis/queries/getRooms/getRoomsResponse.g.dart
@@ -0,0 +1,40 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'getRoomsResponse.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+GetRoomsResponse _$GetRoomsResponseFromJson(Map<String, dynamic> json) =>
+    GetRoomsResponse(
+      (json['result'] as List<dynamic>)
+          .map(
+              (e) => GetRoomsResponseObject.fromJson(e as Map<String, dynamic>))
+          .toSet(),
+    );
+
+Map<String, dynamic> _$GetRoomsResponseToJson(GetRoomsResponse instance) =>
+    <String, dynamic>{
+      'result': instance.result.toList(),
+    };
+
+GetRoomsResponseObject _$GetRoomsResponseObjectFromJson(
+        Map<String, dynamic> json) =>
+    GetRoomsResponseObject(
+      json['id'] as int,
+      json['name'] as String,
+      json['longName'] as String,
+      json['active'] as bool,
+      json['building'] as String,
+    );
+
+Map<String, dynamic> _$GetRoomsResponseObjectToJson(
+        GetRoomsResponseObject instance) =>
+    <String, dynamic>{
+      'id': instance.id,
+      'name': instance.name,
+      'longName': instance.longName,
+      'active': instance.active,
+      'building': instance.building,
+    };
diff --git a/lib/api/webuntis/queries/getTimetable/getTimetable.dart b/lib/api/webuntis/queries/getTimetable/getTimetable.dart
new file mode 100644
index 0000000..e1e1885
--- /dev/null
+++ b/lib/api/webuntis/queries/getTimetable/getTimetable.dart
@@ -0,0 +1,22 @@
+import 'dart:convert';
+import 'dart:developer';
+
+import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
+import 'package:marianum_mobile/api/webuntis/webuntisApi.dart';
+
+import 'getTimetableParams.dart';
+import 'getTimetableResponse.dart';
+
+class GetTimetable extends WebuntisApi {
+  GetTimetableParams params;
+
+  GetTimetable(this.params) : super("getTimetable", params);
+
+  @override
+  Future<GetTimetableResponse> run() async {
+    String rawAnswer = await query(this);
+    log(rawAnswer);
+    return finalize(GetTimetableResponse.fromJson(jsonDecode(rawAnswer)));
+  }
+
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/queries/getTimetable/getTimetableParams.dart b/lib/api/webuntis/queries/getTimetable/getTimetableParams.dart
new file mode 100644
index 0000000..3a5ea76
--- /dev/null
+++ b/lib/api/webuntis/queries/getTimetable/getTimetableParams.dart
@@ -0,0 +1,91 @@
+import 'package:json_annotation/json_annotation.dart';
+import 'package:marianum_mobile/api/webuntis/apiParams.dart';
+
+part 'getTimetableParams.g.dart';
+
+@JsonSerializable(explicitToJson: true)
+class GetTimetableParams extends ApiParams {
+  GetTimetableParamsOptions options;
+
+  GetTimetableParams({required this.options});
+
+  factory GetTimetableParams.fromJson(Map<String, dynamic> json) => _$GetTimetableParamsFromJson(json);
+  Map<String, dynamic> toJson() => _$GetTimetableParamsToJson(this);
+}
+
+
+@JsonSerializable(explicitToJson: true)
+class GetTimetableParamsOptions {
+  GetTimetableParamsOptionsElement element;
+  @JsonKey(includeIfNull: false)
+  int? startDate;
+  @JsonKey(includeIfNull: false)
+  int? endDate;
+  @JsonKey(includeIfNull: false)
+  bool? onlyBaseTimetable;
+  @JsonKey(includeIfNull: false)
+  bool? showBooking;
+  @JsonKey(includeIfNull: false)
+  bool? showInfo;
+  @JsonKey(includeIfNull: false)
+  bool? showSubstText;
+  @JsonKey(includeIfNull: false)
+  bool? showLsText;
+  @JsonKey(includeIfNull: false)
+  bool? showLsNumber;
+  @JsonKey(includeIfNull: false)
+  bool? showStudentgroup;
+  @JsonKey(includeIfNull: false)
+  GetTimetableParamsOptionsFields? klasseFields;
+  @JsonKey(includeIfNull: false)
+  GetTimetableParamsOptionsFields? roomFields;
+  @JsonKey(includeIfNull: false)
+  GetTimetableParamsOptionsFields? subjectFields;
+  @JsonKey(includeIfNull: false)
+  GetTimetableParamsOptionsFields? teacherFields;
+
+  GetTimetableParamsOptions({
+    required this.element,
+    this.startDate,
+    this.endDate,
+    this.onlyBaseTimetable,
+    this.showBooking,
+    this.showInfo,
+    this.showSubstText,
+    this.showLsText,
+    this.showLsNumber,
+    this.showStudentgroup,
+    this.klasseFields,
+    this.roomFields,
+    this.subjectFields,
+    this.teacherFields
+  });
+
+  factory GetTimetableParamsOptions.fromJson(Map<String, dynamic> json) => _$GetTimetableParamsOptionsFromJson(json);
+  Map<String, dynamic> toJson() => _$GetTimetableParamsOptionsToJson(this);
+}
+
+enum GetTimetableParamsOptionsFields {
+  @JsonValue("id") id,
+  @JsonValue("name") name,
+  @JsonValue("longname") longname,
+  @JsonValue("externalkey") externalkey,
+}
+
+@JsonSerializable()
+class GetTimetableParamsOptionsElement {
+  int id;
+  int type;
+  @JsonKey(includeIfNull: false)
+  GetTimetableParamsOptionsElementKeyType? keyType;
+
+  GetTimetableParamsOptionsElement({required this.id, required this.type, this.keyType});
+  factory GetTimetableParamsOptionsElement.fromJson(Map<String, dynamic> json) => _$GetTimetableParamsOptionsElementFromJson(json);
+  Map<String, dynamic> toJson() => _$GetTimetableParamsOptionsElementToJson(this);
+}
+
+enum GetTimetableParamsOptionsElementKeyType {
+  @JsonValue("id") id,
+  @JsonValue("name") name,
+  @JsonValue("externalkey") externalkey
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/queries/getTimetable/getTimetableParams.g.dart b/lib/api/webuntis/queries/getTimetable/getTimetableParams.g.dart
new file mode 100644
index 0000000..803512c
--- /dev/null
+++ b/lib/api/webuntis/queries/getTimetable/getTimetableParams.g.dart
@@ -0,0 +1,114 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'getTimetableParams.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+GetTimetableParams _$GetTimetableParamsFromJson(Map<String, dynamic> json) =>
+    GetTimetableParams(
+      options: GetTimetableParamsOptions.fromJson(
+          json['options'] as Map<String, dynamic>),
+    );
+
+Map<String, dynamic> _$GetTimetableParamsToJson(GetTimetableParams instance) =>
+    <String, dynamic>{
+      'options': instance.options.toJson(),
+    };
+
+GetTimetableParamsOptions _$GetTimetableParamsOptionsFromJson(
+        Map<String, dynamic> json) =>
+    GetTimetableParamsOptions(
+      element: GetTimetableParamsOptionsElement.fromJson(
+          json['element'] as Map<String, dynamic>),
+      startDate: json['startDate'] as int?,
+      endDate: json['endDate'] as int?,
+      onlyBaseTimetable: json['onlyBaseTimetable'] as bool?,
+      showBooking: json['showBooking'] as bool?,
+      showInfo: json['showInfo'] as bool?,
+      showSubstText: json['showSubstText'] as bool?,
+      showLsText: json['showLsText'] as bool?,
+      showLsNumber: json['showLsNumber'] as bool?,
+      showStudentgroup: json['showStudentgroup'] as bool?,
+      klasseFields: $enumDecodeNullable(
+          _$GetTimetableParamsOptionsFieldsEnumMap, json['klasseFields']),
+      roomFields: $enumDecodeNullable(
+          _$GetTimetableParamsOptionsFieldsEnumMap, json['roomFields']),
+      subjectFields: $enumDecodeNullable(
+          _$GetTimetableParamsOptionsFieldsEnumMap, json['subjectFields']),
+      teacherFields: $enumDecodeNullable(
+          _$GetTimetableParamsOptionsFieldsEnumMap, json['teacherFields']),
+    );
+
+Map<String, dynamic> _$GetTimetableParamsOptionsToJson(
+    GetTimetableParamsOptions instance) {
+  final val = <String, dynamic>{
+    'element': instance.element.toJson(),
+  };
+
+  void writeNotNull(String key, dynamic value) {
+    if (value != null) {
+      val[key] = value;
+    }
+  }
+
+  writeNotNull('startDate', instance.startDate);
+  writeNotNull('endDate', instance.endDate);
+  writeNotNull('onlyBaseTimetable', instance.onlyBaseTimetable);
+  writeNotNull('showBooking', instance.showBooking);
+  writeNotNull('showInfo', instance.showInfo);
+  writeNotNull('showSubstText', instance.showSubstText);
+  writeNotNull('showLsText', instance.showLsText);
+  writeNotNull('showLsNumber', instance.showLsNumber);
+  writeNotNull('showStudentgroup', instance.showStudentgroup);
+  writeNotNull('klasseFields',
+      _$GetTimetableParamsOptionsFieldsEnumMap[instance.klasseFields]);
+  writeNotNull('roomFields',
+      _$GetTimetableParamsOptionsFieldsEnumMap[instance.roomFields]);
+  writeNotNull('subjectFields',
+      _$GetTimetableParamsOptionsFieldsEnumMap[instance.subjectFields]);
+  writeNotNull('teacherFields',
+      _$GetTimetableParamsOptionsFieldsEnumMap[instance.teacherFields]);
+  return val;
+}
+
+const _$GetTimetableParamsOptionsFieldsEnumMap = {
+  GetTimetableParamsOptionsFields.id: 'id',
+  GetTimetableParamsOptionsFields.name: 'name',
+  GetTimetableParamsOptionsFields.longname: 'longname',
+  GetTimetableParamsOptionsFields.externalkey: 'externalkey',
+};
+
+GetTimetableParamsOptionsElement _$GetTimetableParamsOptionsElementFromJson(
+        Map<String, dynamic> json) =>
+    GetTimetableParamsOptionsElement(
+      id: json['id'] as int,
+      type: json['type'] as int,
+      keyType: $enumDecodeNullable(
+          _$GetTimetableParamsOptionsElementKeyTypeEnumMap, json['keyType']),
+    );
+
+Map<String, dynamic> _$GetTimetableParamsOptionsElementToJson(
+    GetTimetableParamsOptionsElement instance) {
+  final val = <String, dynamic>{
+    'id': instance.id,
+    'type': instance.type,
+  };
+
+  void writeNotNull(String key, dynamic value) {
+    if (value != null) {
+      val[key] = value;
+    }
+  }
+
+  writeNotNull('keyType',
+      _$GetTimetableParamsOptionsElementKeyTypeEnumMap[instance.keyType]);
+  return val;
+}
+
+const _$GetTimetableParamsOptionsElementKeyTypeEnumMap = {
+  GetTimetableParamsOptionsElementKeyType.id: 'id',
+  GetTimetableParamsOptionsElementKeyType.name: 'name',
+  GetTimetableParamsOptionsElementKeyType.externalkey: 'externalkey',
+};
diff --git a/lib/api/webuntis/queries/getTimetable/getTimetableResponse.dart b/lib/api/webuntis/queries/getTimetable/getTimetableResponse.dart
new file mode 100644
index 0000000..547af3c
--- /dev/null
+++ b/lib/api/webuntis/queries/getTimetable/getTimetableResponse.dart
@@ -0,0 +1,85 @@
+import 'package:json_annotation/json_annotation.dart';
+import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
+
+part 'getTimetableResponse.g.dart';
+
+@JsonSerializable(explicitToJson: true)
+class GetTimetableResponse extends ApiResponse {
+  Set<GetTimetableResponseObject> result;
+
+  GetTimetableResponse(this.result);
+
+  factory GetTimetableResponse.fromJson(Map<String, dynamic> json) => _$GetTimetableResponseFromJson(json);
+  Map<String, dynamic> toJson() => _$GetTimetableResponseToJson(this);
+
+}
+
+@JsonSerializable(explicitToJson: true)
+class GetTimetableResponseObject {
+  int id;
+  int date;
+  int startTime;
+  int endTime;
+  String? lstype;
+  String? code;
+  String? info;
+  String? substText;
+  String? lstext;
+  int? lsnumber;
+  String? statflags;
+  String? activityType;
+  String? sg;
+  String? bkRemark;
+  String? bkText;
+  List<dynamic> kl;
+  List<dynamic> te;
+  List<dynamic> su;
+  List<dynamic> ro;
+
+  GetTimetableResponseObject({
+    required this.id,
+    required this.date,
+    required this.startTime,
+    required this.endTime,
+    this.lstype,
+    this.code,
+    this.info,
+    this.substText,
+    this.lstext,
+    this.lsnumber,
+    this.statflags,
+    this.activityType,
+    this.sg,
+    this.bkRemark,
+    required this.kl,
+    required this.te,
+    required this.su,
+    required this.ro
+  });
+
+  factory GetTimetableResponseObject.fromJson(Map<String, dynamic> json) => _$GetTimetableResponseObjectFromJson(json);
+  Map<String, dynamic> toJson() => _$GetTimetableResponseObjectToJson(this);
+}
+
+@JsonSerializable(explicitToJson: true)
+class GetTimetableResponseObjectFields {
+  List<GetTimetableResponseObjectFieldsObject>? te;
+
+  GetTimetableResponseObjectFields(this.te);
+
+  factory GetTimetableResponseObjectFields.fromJson(Map<String, dynamic> json) => _$GetTimetableResponseObjectFieldsFromJson(json);
+  Map<String, dynamic> toJson() => _$GetTimetableResponseObjectFieldsToJson(this);
+}
+
+@JsonSerializable()
+class GetTimetableResponseObjectFieldsObject {
+  int? id;
+  String? name;
+  String? longname;
+  String? externalkey;
+
+  GetTimetableResponseObjectFieldsObject({this.id, this.name, this.longname, this.externalkey});
+
+  factory GetTimetableResponseObjectFieldsObject.fromJson(Map<String, dynamic> json) => _$GetTimetableResponseObjectFieldsObjectFromJson(json);
+  Map<String, dynamic> toJson() => _$GetTimetableResponseObjectFieldsObjectToJson(this);
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/queries/getTimetable/getTimetableResponse.g.dart b/lib/api/webuntis/queries/getTimetable/getTimetableResponse.g.dart
new file mode 100644
index 0000000..6df085e
--- /dev/null
+++ b/lib/api/webuntis/queries/getTimetable/getTimetableResponse.g.dart
@@ -0,0 +1,103 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'getTimetableResponse.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+GetTimetableResponse _$GetTimetableResponseFromJson(
+        Map<String, dynamic> json) =>
+    GetTimetableResponse(
+      (json['result'] as List<dynamic>)
+          .map((e) =>
+              GetTimetableResponseObject.fromJson(e as Map<String, dynamic>))
+          .toSet(),
+    );
+
+Map<String, dynamic> _$GetTimetableResponseToJson(
+        GetTimetableResponse instance) =>
+    <String, dynamic>{
+      'result': instance.result.map((e) => e.toJson()).toList(),
+    };
+
+GetTimetableResponseObject _$GetTimetableResponseObjectFromJson(
+        Map<String, dynamic> json) =>
+    GetTimetableResponseObject(
+      id: json['id'] as int,
+      date: json['date'] as int,
+      startTime: json['startTime'] as int,
+      endTime: json['endTime'] as int,
+      lstype: json['lstype'] as String?,
+      code: json['code'] as String?,
+      info: json['info'] as String?,
+      substText: json['substText'] as String?,
+      lstext: json['lstext'] as String?,
+      lsnumber: json['lsnumber'] as int?,
+      statflags: json['statflags'] as String?,
+      activityType: json['activityType'] as String?,
+      sg: json['sg'] as String?,
+      bkRemark: json['bkRemark'] as String?,
+      kl: json['kl'] as List<dynamic>,
+      te: json['te'] as List<dynamic>,
+      su: json['su'] as List<dynamic>,
+      ro: json['ro'] as List<dynamic>,
+    )..bkText = json['bkText'] as String?;
+
+Map<String, dynamic> _$GetTimetableResponseObjectToJson(
+        GetTimetableResponseObject instance) =>
+    <String, dynamic>{
+      'id': instance.id,
+      'date': instance.date,
+      'startTime': instance.startTime,
+      'endTime': instance.endTime,
+      'lstype': instance.lstype,
+      'code': instance.code,
+      'info': instance.info,
+      'substText': instance.substText,
+      'lstext': instance.lstext,
+      'lsnumber': instance.lsnumber,
+      'statflags': instance.statflags,
+      'activityType': instance.activityType,
+      'sg': instance.sg,
+      'bkRemark': instance.bkRemark,
+      'bkText': instance.bkText,
+      'kl': instance.kl,
+      'te': instance.te,
+      'su': instance.su,
+      'ro': instance.ro,
+    };
+
+GetTimetableResponseObjectFields _$GetTimetableResponseObjectFieldsFromJson(
+        Map<String, dynamic> json) =>
+    GetTimetableResponseObjectFields(
+      (json['te'] as List<dynamic>?)
+          ?.map((e) => GetTimetableResponseObjectFieldsObject.fromJson(
+              e as Map<String, dynamic>))
+          .toList(),
+    );
+
+Map<String, dynamic> _$GetTimetableResponseObjectFieldsToJson(
+        GetTimetableResponseObjectFields instance) =>
+    <String, dynamic>{
+      'te': instance.te?.map((e) => e.toJson()).toList(),
+    };
+
+GetTimetableResponseObjectFieldsObject
+    _$GetTimetableResponseObjectFieldsObjectFromJson(
+            Map<String, dynamic> json) =>
+        GetTimetableResponseObjectFieldsObject(
+          id: json['id'] as int?,
+          name: json['name'] as String?,
+          longname: json['longname'] as String?,
+          externalkey: json['externalkey'] as String?,
+        );
+
+Map<String, dynamic> _$GetTimetableResponseObjectFieldsObjectToJson(
+        GetTimetableResponseObjectFieldsObject instance) =>
+    <String, dynamic>{
+      'id': instance.id,
+      'name': instance.name,
+      'longname': instance.longname,
+      'externalkey': instance.externalkey,
+    };
diff --git a/lib/api/webuntis/webuntisApi.dart b/lib/api/webuntis/webuntisApi.dart
new file mode 100644
index 0000000..5efae62
--- /dev/null
+++ b/lib/api/webuntis/webuntisApi.dart
@@ -0,0 +1,54 @@
+import 'dart:convert';
+import 'dart:developer';
+import 'package:marianum_mobile/api/apiRequest.dart';
+import 'package:http/http.dart' as http;
+import 'package:marianum_mobile/api/webuntis/webuntisError.dart';
+import 'package:marianum_mobile/api/webuntis/apiResponse.dart';
+
+import 'apiParams.dart';
+import 'queries/authenticate/authenticate.dart';
+
+abstract class WebuntisApi extends ApiRequest {
+  String method;
+  ApiParams? genericParam;
+  http.Response? response;
+
+  bool authenticatedResponse;
+
+  WebuntisApi(this.method, this.genericParam, {this.authenticatedResponse = true}) : super(Uri.parse("https://peleus.webuntis.com/WebUntis/jsonrpc.do?school=marianum-fulda"));
+
+
+  Future<String> query(WebuntisApi untis) async {
+    String query = '{"id":"ID","method":"$method","params":${untis._body()},"jsonrpc":"2.0"}';
+    log(query);
+
+    String sessionId = "0";
+    if(authenticatedResponse) {
+      sessionId = (await Authenticate.getSession()).sessionId;
+    }
+    http.Response data = await post(query, {"Cookie": "JSESSIONID=$sessionId"});
+    response = data;
+
+    dynamic jsonData = jsonDecode(data.body);
+    if(jsonData['error'] != null) {
+      if(jsonData['error']['code'] == -8520) {
+        await Authenticate.createSession();
+        this.query(untis);
+      } else {
+        throw WebuntisError(jsonData['error']['message'], jsonData['error']['code']);
+      }
+    }
+    return data.body;
+  }
+
+  dynamic finalize(dynamic response) {
+    response.rawResponse = this.response!;
+    return response;
+  }
+
+  Future<ApiResponse> run();
+
+  String _body() {
+    return genericParam == null ? "{}" : jsonEncode(genericParam);
+  }
+}
\ No newline at end of file
diff --git a/lib/api/webuntis/webuntisError.dart b/lib/api/webuntis/webuntisError.dart
new file mode 100644
index 0000000..edd1843
--- /dev/null
+++ b/lib/api/webuntis/webuntisError.dart
@@ -0,0 +1,10 @@
+class WebuntisError {
+  String message;
+  int code;
+
+  WebuntisError(this.message, this.code);
+
+  String toString() {
+    return "WebUntis ($code): $message";
+  }
+}
\ No newline at end of file
diff --git a/lib/app.dart b/lib/app.dart
index 943152c..9066fa0 100644
--- a/lib/app.dart
+++ b/lib/app.dart
@@ -1,6 +1,7 @@
 
 import 'package:flutter/material.dart';
 import 'package:marianum_mobile/data/incommingPackets/talkNotificationsPacket.dart';
+import 'package:marianum_mobile/screen/pages/timetable/testTimetable.dart';
 import 'package:provider/provider.dart';
 import 'package:shared_preferences/shared_preferences.dart';
 
@@ -42,7 +43,7 @@ class _AppState extends State<App> {
           PageView(
             controller: pageController,
             children: const [
-              Timetable(),
+              TestTimeTable(),
               Talk(),
               Files(),
               Overhang(),
diff --git a/lib/screen/login/login.dart b/lib/screen/login/login.dart
index 11f8052..c333634 100644
--- a/lib/screen/login/login.dart
+++ b/lib/screen/login/login.dart
@@ -1,12 +1,19 @@
+
 import 'dart:io';
+import 'dart:developer';
 
 import 'package:flutter/material.dart';
 import 'package:flutter_login/flutter_login.dart';
+import 'package:marianum_mobile/api/apiError.dart';
+import 'package:marianum_mobile/api/webuntis/webuntisError.dart';
 import 'package:provider/provider.dart';
 import 'package:shared_preferences/shared_preferences.dart';
 
+import '../../api/webuntis/queries/authenticate/authenticateParams.dart';
+import '../../api/webuntis/queries/authenticate/authenticate.dart';
 import '../../data/accountModel.dart';
 
+
 class Login extends StatefulWidget {
   const Login({Key? key}) : super(key: key);
 
@@ -15,32 +22,75 @@ class Login extends StatefulWidget {
 }
 
 class _LoginState extends State<Login> {
-  Duration get loginTime => const Duration(milliseconds: 2250);
+  bool displayDisclaimerText = true;
 
-  final Future<SharedPreferences> _storage = SharedPreferences.getInstance();
-
-  String? checkInput(value){
-    return (value ?? "").length < 5 ? "Eingabe zu kurz" : null;
+  String? _checkInput(value){
+    return (value ?? "").length == 0 ? "Eingabe erforderlich" : null;
   }
 
+  Future<String?> _login(LoginData data) async {
+    SharedPreferences preferences = await SharedPreferences.getInstance();
+    preferences.setBool("loggedIn", false);
+
+    try {
+      await Authenticate(
+        AuthenticateParams(
+          user: data.name,
+          password: data.password,
+        )
+      ).run().then((value) => {
+        log(value.sessionId)
+      });
+    } on WebuntisError catch(e) {
+      return e.toString();
+    } on ApiError catch(e) {
+      return e.toString();
+    }
+
+    setState(() {
+      displayDisclaimerText = false;
+    });
+
+    preferences.setBool("loggedIn", true);
+    preferences.setString("username", data.name);
+    preferences.setString("password", data.password);
+
+    return null;
+  }
+
+  Future<String> _resetPassword(String name) {
+    return Future.delayed(Duration.zero).then((_) {
+      return "Diese Funktion steht nicht zur Verfügung!";
+    });
+  }
 
   @override
   Widget build(BuildContext context) {
     return FlutterLogin(
       logo: Image.file(File("assets/logo/icon.png")).image,
 
-      userValidator: checkInput,
-      passwordValidator: checkInput,
+      userValidator: _checkInput,
+      passwordValidator: _checkInput,
+      onSubmitAnimationCompleted: () => Provider.of<AccountModel>(context, listen: false).login(),
 
-      onLogin: _authUser,
+      savedEmail: "test",
+
+      onLogin: _login,
       onSignup: null,
-      onRecoverPassword: _recoverPassword,
+
+      onRecoverPassword: _resetPassword,
+      hideForgotPasswordButton: true,
 
       theme: LoginTheme(
         primaryColor: Theme.of(context).primaryColor,
+        accentColor: Colors.white,
+        errorColor: Theme.of(context).primaryColor,
+        footerBottomPadding: 10,
+        textFieldStyle: const TextStyle(
+          fontWeight: FontWeight.w500
+        ),
         cardTheme: const CardTheme(
           elevation: 10,
-          shape: InputBorder.none,
         ),
       ),
 
@@ -52,42 +102,23 @@ class _LoginState extends State<Login> {
 
       disableCustomPageTransformer: true,
 
-      headerWidget: const Padding(
-        padding: EdgeInsets.only(bottom: 10),
+      headerWidget: Padding(
+        padding: const EdgeInsets.only(bottom: 30),
         child: Center(
-          child: Text(
-            "Dies ist ein Inoffizieller Nextclient & Webuntis Client und wird nicht vom Marianum selbst betrieben.\nBitte bedenke, dass deine persönlichen Anmelde & Infodaten durch dritte, nicht vom Marianum betriebene, Systeme geleitet werden!",
+          child: Visibility(
+            visible: displayDisclaimerText,
+            child: const Text(
+            "Dies ist ein Inoffizieller Nextclient & Webuntis Client und wird nicht vom Marianum selbst betrieben.\nKeinerlei Gewähr für Vollständigkeit, Richtigkeit und Aktualität!",
             textAlign: TextAlign.center,
+            ),
           ),
         ),
       ),
 
-      footer: "Marianum Fulda - Die persönliche Schule!",
-      title: "Marianum",
+      footer: "Marianum Fulda - Die persönliche Schule",
+      title: "Marianum Fulda",
 
-      hideForgotPasswordButton: true,
       userType: LoginUserType.name,
-
     );
   }
-
-  Future<String?> _authUser(LoginData data) async {
-    final SharedPreferences preferences = await _storage;
-    preferences.setBool("loggedIn", true);
-    preferences.setString("username", data.name);
-    preferences.setString("password", data.password);
-
-    debugPrint('Name: ${data.name}, Password: ${data.password}');
-    return Future.delayed(loginTime).then((_) {
-      Provider.of<AccountModel>(context, listen: false).login();
-      return null;
-    });
-  }
-
-  Future<String> _recoverPassword(String name) {
-    return Future.delayed(loginTime).then((_) {
-      return "Diese Funktion steht nicht zur Verfügung!";
-    });
-  }
-
 }
diff --git a/lib/screen/pages/timetable/testTimetable.dart b/lib/screen/pages/timetable/testTimetable.dart
new file mode 100644
index 0000000..35f7b8d
--- /dev/null
+++ b/lib/screen/pages/timetable/testTimetable.dart
@@ -0,0 +1,145 @@
+import 'dart:developer';
+
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:jiffy/jiffy.dart';
+import 'package:marianum_mobile/api/webuntis/queries/getRooms/getRooms.dart';
+import 'package:marianum_mobile/data/incommingPackets/timetablePacket.dart';
+import 'package:marianum_mobile/widget/loadingSpinner.dart';
+import 'package:marianum_mobile/widget/offlineError.dart';
+import 'package:timetable_view/timetable_view.dart';
+
+import '../../../api/webuntis/queries/getTimetable/getTimetableParams.dart';
+import '../../../api/webuntis/queries/getTimetable/getTimetableResponse.dart';
+import '../../../api/webuntis/queries/getTimetable/getTimetable.dart';
+
+class TestTimeTable extends StatefulWidget {
+	const TestTimeTable({Key? key}) : super(key: key);
+
+	@override
+	State<TestTimeTable> createState() => _TestTimeTableState();
+}
+
+class _TestTimeTableState extends State<TestTimeTable> {
+
+	late Future<GetTimetableResponse> data;
+
+	@override
+	void initState() {
+		data = GetTimetable(
+				GetTimetableParams(
+						options: GetTimetableParamsOptions(
+								element: GetTimetableParamsOptionsElement(
+									id: 92,
+									type: 5,
+									keyType: GetTimetableParamsOptionsElementKeyType.id,
+								),
+								startDate: 20230206,
+								endDate: 20230212,
+						)
+				)
+		).run();
+
+
+		GetRooms().run().then((value) => {
+			log(value.rawResponse.body)
+		});
+
+		super.initState();
+	}
+
+	@override
+	Widget build(BuildContext context) {
+		return FutureBuilder(
+			builder: (BuildContext context, AsyncSnapshot<GetTimetableResponse> snapshot) {
+				if(snapshot.hasData) {
+					return Center(
+						child: TimetableView(
+							laneEventsList: _buildLaneEvents(snapshot.data!),
+							onEventTap: (TableEvent event) {},
+							timetableStyle: CustomTableStyle(context),
+							onEmptySlotTap: (int laneIndex, TableEventTime start, TableEventTime end) => {},
+						),
+					);
+				} else if(snapshot.hasError) {
+					return const OfflineBanner(text: "Der Stundenplan konnte nicht geladen werden!");
+				} else {
+					return const Center(
+						child: CircularProgressIndicator(),
+					);
+				}
+			},
+			future: data,
+		);
+	}
+
+	List<LaneEvents> _buildLaneEvents(GetTimetableResponse data) {
+		List<LaneEvents> laneEvents = List<LaneEvents>.empty(growable: true);
+		Jiffy.locale("de");
+
+		List<int> dayList = data.result.map((e) => e.date).toSet().toList();
+		dayList.sort((a, b) => a-b);
+		dayList.forEach((day) {
+			//Every Day
+
+			laneEvents.add(
+				LaneEvents(
+					lane: Lane(
+						laneIndex: day,
+						name: "${Jiffy(day.toString()).format("dd.MM.yy")}\n${Jiffy(day.toString()).format("EEEE")}",
+						textStyle: TextStyle(
+							color: Theme.of(context).primaryColor,
+							fontWeight: FontWeight.bold,
+							fontSize: 14
+						)
+					),
+					events: List<TableEvent>.generate(
+						data.result.where((element) => element.date == day).length,
+						(index) {
+							GetTimetableResponseObject tableEvent = data.result.where((element) => element.date == day).elementAt(index);
+							return TableEvent(
+								title: "${tableEvent.substText}",
+								eventId: tableEvent.id,
+								laneIndex: day,
+								startTime: parseTime(tableEvent.startTime),
+								endTime: parseTime(tableEvent.endTime),
+								padding: const EdgeInsets.all(5),
+								backgroundColor: Theme.of(context).primaryColor,
+								location: "\n${tableEvent.statflags}",
+							);
+						}
+					)
+				)
+			);
+
+		});
+
+		return laneEvents;
+	}
+
+	TableEventTime parseTime(int input) {
+		String time = input.toString().length < 4 ? "0$input" : input.toString();
+		return TableEventTime(hour: int.parse(time.substring(0, 2)), minute: int.parse(time.substring(2, 4)));
+	}
+}
+
+class CustomTableStyle extends TimetableStyle {
+	dynamic context;
+	CustomTableStyle(this.context);
+
+	@override
+	int get startHour => 07;
+	@override
+	int get endHour => 17;
+	@override
+	double get laneWidth => 100;
+	@override
+	Color get cornerColor => Theme.of(context).primaryColor;
+	@override
+	Color get timeItemTextColor => Theme.of(context).primaryColor;
+	@override
+	double get timeItemHeight => 60;
+	@override
+	double get timeItemWidth => 40;
+
+}
\ No newline at end of file
diff --git a/lib/widget/offlineError.dart b/lib/widget/offlineError.dart
new file mode 100644
index 0000000..c723007
--- /dev/null
+++ b/lib/widget/offlineError.dart
@@ -0,0 +1,32 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+
+class OfflineBanner extends StatelessWidget {
+  final IconData icon;
+  final String text;
+  const OfflineBanner({Key? key, this.icon = Icons.report_gmailerrorred, this.text = "Es ist ein Fehler aufgetreten!"}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Center(
+      child: Container(
+        margin: const EdgeInsets.only(top: 100, left: 20, right: 20),
+        child: Column(
+          children: [
+            Container(
+              margin: const EdgeInsets.all(30),
+              child: Icon(icon, color: Colors.grey, size: 60),
+            ),
+            Text(text,
+              style: const TextStyle(
+                fontSize: 20,
+                color: Colors.grey,
+              ),
+              textAlign: TextAlign.center,
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index a0e0e84..64a8842 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -46,10 +46,13 @@ dependencies:
   web_socket_channel: ^2.2.0
   jiffy: ^5.0.0
   timetable_view: ^0.3.0
+  json_annotation: ^4.8.0
 
 dev_dependencies:
   flutter_test:
     sdk: flutter
+  json_serializable: ^6.6.1
+  build_runner: ^2.3.3
 
   # The "flutter_lints" package below contains a set of recommended lints to
   # encourage good coding practices. The lint set provided by the package is