diff --git a/.example.env b/.example.env
index 90655e6a68fa68e9915bba3b2953cd844fb77253..5fe6bc88581d23bd4774d32595221a2cb1b95a81 100644
--- a/.example.env
+++ b/.example.env
@@ -16,3 +16,5 @@ MAIL_PORT=25
 MAIL_FROM=esag@example.com
 
 DOMAIN=example.com # The domain of the application
+
+BODY_SIZE_LIMIT=Infinity
diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts
index cab7d923b71906f2be952473c92bb57112b35184..e029c2306953400861aec59e3ea00bfdcd5f3987 100644
--- a/src/lib/server/auth.ts
+++ b/src/lib/server/auth.ts
@@ -90,20 +90,20 @@ export const { handle, signIn, signOut } = SvelteKitAuth({
 export const handleAuthorization: Handle = async ({event, resolve})=>{
 	if(event.url.pathname.startsWith("/admin/") || event.url.pathname === "/admin"){
 		const session = await event.locals.auth();
-		if(!session || session.user.type !== "admin") redirect(303, "/");
+		if(session?.user?.type !== "admin") redirect(303, "/");
 		if(REQUIRED_GROUP && !session.user.groups.includes(REQUIRED_GROUP)) error(403, `Missing required group ${REQUIRED_GROUP}`);
 		const user = await User.getById(session.user.userId);
 		if(!user) redirect(303, "/");
 		event.locals.user = user;
 	}else if(event.url.pathname.startsWith("/intern/tutor/") || event.url.pathname === "/intern/tutor"){
 		const session = await event.locals.auth();
-		if(!session || session.user.type !== "tutor") redirect(303, `/intern?redirect_url=${encodeURIComponent(event.url.href)}#tutor`);
+		if(session?.user?.type !== "tutor") redirect(303, `/intern?redirect_url=${encodeURIComponent(event.url.href)}#tutor`);
 		const tutor = await Tutor.getById(session.user.userId);
 		if(!tutor) redirect(303, "/intern");
 		event.locals.tutor = tutor;
 	}else if(event.url.pathname.startsWith("/intern/rallye/") || event.url.pathname === "/intern/rallye"){
 		const session = await event.locals.auth();
-		if(!session || session.user.type !== "rally") redirect(303, `/intern?redirect_url=${encodeURIComponent(event.url.href)}#rallye`);
+		if(session?.user?.type !== "rally") redirect(303, `/intern?redirect_url=${encodeURIComponent(event.url.href)}#rallye`);
 		const supervisor = await RallyStationSupervisor.getById(session.user.userId);
 		if(!supervisor) redirect(303, "/intern");
 		event.locals.supervisor = supervisor;
diff --git a/src/routes/(non-admin)/eswe/+page.svelte b/src/routes/(non-admin)/eswe/+page.svelte
index b4f4dcabf2b81a6d79fabdb65980706c3ca38139..7b5828ceb47f34599b833e5865b7f434a6e063ac 100644
--- a/src/routes/(non-admin)/eswe/+page.svelte
+++ b/src/routes/(non-admin)/eswe/+page.svelte
@@ -82,6 +82,8 @@
 <!--TODO-->
 <P>Tut uns leid, aber das Erstsemesterwochenende ist leider schon vorbei.</P>
 {/if}
+
+{#if images.length > 0}
 <Heading tag="h2" customSize="text-3xl font-bold" class="mb-3 mt-6">Eindrücke aus Vorjahren</Heading>
 
 <!-- TODO diesen Text anpassen, muss ja nicht immer Hohenfried sein -->
@@ -90,7 +92,7 @@
 <!-- images array is just a dummy, item is not an image property object but the index within the gallery -->
 <Gallery items={Array.from({length: images.length}, (_, i)=>i)} class="gap-4 grid-cols-2 md:grid-cols-3" let:item={index}>
 	<button onclick={()=>openModal(index)}>
-		<Image src={images[index]} class="h-auto max-w-full rounded-lg" loading="lazy" sizes="(min-width: 768px) 33vw, min(50vw, 363px)" autosize/>
+		<Image src={images[index]} class="h-auto max-w-full rounded-lg" loading="lazy" sizes="(min-width: 768px) 33vw, min(50vw, 363px)" autosize />
 	</button>
 </Gallery>
 <Modal bind:open={showModal} outsideclose dismissable={false} size="lg"> <!-- not dismissable bc missing z-index -->
@@ -104,6 +106,7 @@
 		</svelte:fragment>
 	</Carousel>
 </Modal>
+{/if}
 {:else}
 <P>{$LL.ESWE.OnlyAvailableInGerman()}</P>
 {/if}
diff --git a/src/routes/(non-admin)/rabatte/+page.svelte b/src/routes/(non-admin)/rabatte/+page.svelte
index 0d56365ef9a1e8829a04ed8027c2d7cc8a75f0fb..475533351d0d698de9c58f0fd8ef41cd4be7f187 100644
--- a/src/routes/(non-admin)/rabatte/+page.svelte
+++ b/src/routes/(non-admin)/rabatte/+page.svelte
@@ -220,7 +220,7 @@
 	}
 </style>
 
-<div class="map-container z-40 mx-auto max-w-6xl px-4" bind:this={mapContainer}>
+<div class="map-container z-40 mx-auto px-4 xs:px-8 sm:px-12 lg:px-14 max-w-5xl" bind:this={mapContainer}>
 	<LeafletMap bind:this={leafletMap} {locations} {scrollTo} holidays={data.holidays} />
 </div>
 <div class="list-container">
diff --git a/src/routes/admin/+layout.server.ts b/src/routes/admin/+layout.server.ts
index 53e0b8193cb77b7979a4310b3d4adfc2d14d24d8..f6e380e97ec7f093a607042bccf3cb3f0f428d34 100644
--- a/src/routes/admin/+layout.server.ts
+++ b/src/routes/admin/+layout.server.ts
@@ -1,8 +1,10 @@
 import { User } from "$lib/server/database/entities/User.entity";
+import { error } from "@sveltejs/kit";
 import type { LayoutServerLoad } from "./$types";
 
 export const load: LayoutServerLoad = async event=>{
-	const session = (await event.locals.auth())!;
+	const session = await event.locals.auth();
+	if(!session?.user) error(401, "Unauthorized");
 	const user = await User.getById(session.user.userId);
 	return {
 		user: {...session.user, permissions: user!.permissions.raw()}, // TODO add permissions
diff --git a/src/routes/admin/eswe/+page.svelte b/src/routes/admin/eswe/+page.svelte
index 1b4e98420fcc31ab68f844600aed6500b349b652..e938444d1da5c1476524351ab501a0052c89d08c 100644
--- a/src/routes/admin/eswe/+page.svelte
+++ b/src/routes/admin/eswe/+page.svelte
@@ -3,7 +3,7 @@
 	import { invalidateAll } from "$app/navigation";
 	import Image from "$lib/components/Image.svelte";
 	import { addMessage } from "$lib/messages.js";
-	import { Breadcrumb, BreadcrumbItem, Button, Input, Label, Table, TableBody, TableBodyCell, TableBodyRow, TableHead, TableHeadCell } from "flowbite-svelte";
+	import { Breadcrumb, BreadcrumbItem, Button, Fileupload, Input, Label, Table, TableBody, TableBodyCell, TableBodyRow, TableHead, TableHeadCell } from "flowbite-svelte";
 	
 	let { data } = $props();
 </script>
@@ -75,7 +75,7 @@
 		{/each}
 		<TableBodyRow>
 			<TableBodyCell class="max-w-min">
-				<Input type="file" name="image" form="new" class="w-30" accept={data.extensions.map(ext=>`.${ext}`).join(",")} />
+				<Fileupload name="image" form="new" class="w-30" accept={data.extensions.map(ext=>`.${ext}`).join(",")} />
 			</TableBodyCell>
 			<TableBodyCell>
 				<Label>
diff --git a/src/routes/admin/flyer/+page.svelte b/src/routes/admin/flyer/+page.svelte
index b21856e3916e0b50794a0e5a58f76bed52d084a2..7214e1eef387da977eb3f2ac395c7a507095c207 100644
--- a/src/routes/admin/flyer/+page.svelte
+++ b/src/routes/admin/flyer/+page.svelte
@@ -1,5 +1,5 @@
 <script lang="ts">
-	import { Breadcrumb, BreadcrumbItem, Button, Input, Li, List } from 'flowbite-svelte';
+	import { Breadcrumb, BreadcrumbItem, Button, Fileupload, Li, List } from 'flowbite-svelte';
 	import { enhance } from '$app/forms';
 	import Image from '$lib/components/Image.svelte';
 	import { addMessage } from '$lib/messages.js';
@@ -37,7 +37,7 @@
 			}
 		}}>
 			<div class="flex gap-3">
-				<Input type="file" name="file" accept=".pdf" />
+				<Fileupload name="file" accept=".pdf" />
 				<Button type="submit">Hochladen</Button>
 			</div>
 		</form>
diff --git a/src/routes/admin/schedule/+page.svelte b/src/routes/admin/schedule/+page.svelte
index ab9f572b5f54d13a1971ab9c1cbda614fdd76b55..42d229ee17df5c505ae224be2e9b2e6fc298dbf0 100644
--- a/src/routes/admin/schedule/+page.svelte
+++ b/src/routes/admin/schedule/+page.svelte
@@ -1,5 +1,5 @@
 <script lang="ts">
-	import { Accordion, AccordionItem, Breadcrumb, BreadcrumbItem, Button, Heading, Input, Label, Modal, P, Select, Table, TableBody, TableBodyCell, TableBodyRow, TableHead, TableHeadCell, Textarea } from "flowbite-svelte";
+	import { Accordion, AccordionItem, Breadcrumb, BreadcrumbItem, Button, Fileupload, Heading, Input, Label, Modal, P, Select, Table, TableBody, TableBodyCell, TableBodyRow, TableHead, TableHeadCell, Textarea } from "flowbite-svelte";
 	import type { Schedule } from "$lib/server/database/entities/Schedule.entity.js";
 	import { enhance } from "$app/forms";
 	import { Permission } from "$lib/perms";
@@ -47,7 +47,7 @@
 			}
 		}}>
 			<img src="/stundenplaene/branding.png" class="mb-2 max-h-28" bind:this={brandingImageElement} alt="Branding für Stundenpläne" />
-			<Input type="file" name="image" accept="image/png" on:change={e=>{
+			<Fileupload name="image" accept="image/png" on:change={e=>{
 				brandingImageElement!.src = URL.createObjectURL(e.target?.files[0]);
 			}} />
 			<Button type="submit">Speichern</Button>
diff --git a/src/routes/admin/schedule/fonts/+page.svelte b/src/routes/admin/schedule/fonts/+page.svelte
index 4f0abbbfaeee5b5151f25c7e562b3609aee4b08a..614fc20a867f0e51adbd012e650b78193693946c 100644
--- a/src/routes/admin/schedule/fonts/+page.svelte
+++ b/src/routes/admin/schedule/fonts/+page.svelte
@@ -2,7 +2,7 @@
 	import { enhance } from "$app/forms";
 	import { invalidateAll } from "$app/navigation";
 	import { addMessage } from "$lib/messages.js";
-	import { Breadcrumb, BreadcrumbItem, Button, Input, Label, Table, TableBody, TableBodyCell, TableBodyRow, TableHead, TableHeadCell } from "flowbite-svelte";
+	import { Breadcrumb, BreadcrumbItem, Button, Fileupload, Input, Label, Table, TableBody, TableBodyCell, TableBodyRow, TableHead, TableHeadCell } from "flowbite-svelte";
 
 	let { data } = $props();
 	
@@ -63,7 +63,7 @@
 			<TableBodyCell>
 				<Label>
 					Datei
-					<Input type="file" name="font" required form="new" accept={data.supportedExtensions.map(x=>`.${x}`).join(",")} on:change={e=>fontName=transformFontName(e.target.files[0].name)} />
+					<Fileupload name="font" required form="new" accept={data.supportedExtensions.map(x=>`.${x}`).join(",")} on:change={e=>fontName=transformFontName(e.target.files[0].name)} />
 				</Label>
 				<Label>
 					Name der Schriftart
diff --git a/src/routes/admin/user/+page.svelte b/src/routes/admin/user/+page.svelte
index e9e80429e7e992b53829ba69aeec673440ea2640..384a1a3086fad72ad9a50987d87a96aa3f1fc694 100644
--- a/src/routes/admin/user/+page.svelte
+++ b/src/routes/admin/user/+page.svelte
@@ -89,7 +89,7 @@
 			</TableBodyCell>
 			{/if}
 		</TableBodyRow>
-		{#each data.users as user}
+		{#each data.users as user (user.id)}
 		{@const isSelf = user.id === data.user.userId}
 		<TableBodyRow class={isSelf ? "bg-gray-200 dark:bg-gray-700" : ""}>
 			<TableBodyCell class="py-2 {isSelf ? "font-bold" : ""}">{user.username}</TableBodyCell>
diff --git a/static/es-info/kurz.pdf b/static/es-info/kurz.pdf
index e76fd45e5d15d9b963a02a075643208d74fa148d..1d5867b73daf0429fc654c8107d9a853610daacb 100644
Binary files a/static/es-info/kurz.pdf and b/static/es-info/kurz.pdf differ