diff --git a/web/src/App.svelte b/web/src/App.svelte
index acd207b..b12e231 100644
--- a/web/src/App.svelte
+++ b/web/src/App.svelte
@@ -3,15 +3,21 @@
   import IDTable from "./lib/IDTable.svelte";
   import LastId from "./lib/LastID.svelte";
   import AddIDModal from "./lib/AddIDModal.svelte";
+  import ExportModal from "./lib/ExportModal.svelte";
+  import { generateCSVFile } from "./lib/exporting";
+  import { fetchMapping, type IDMap } from "./lib/IDMapping";
+  import { downloadBlob } from "./lib/downloadBlob";
 
   let lastID: string = $state("");
+  let mapping: IDMap | null = $state(null);
 
   let addModal: AddIDModal;
-  let idTable: IDTable;
+  let exportModal: ExportModal;
+
+  onMount(async () => {
+    mapping = await fetchMapping();
 
-  onMount(() => {
     let sse = new EventSource("/api/idevent");
-
     sse.onmessage = (e) => {
       lastID = e.data;
     };
@@ -25,13 +31,14 @@
     
Anwesenheit
   
 
-   {
+      exportModal.open();
+    }}
   >
-    Download CSV
-  
+    Export CSV
+  
 
   
     
   
   
-    {
-      addModal.open(id,firstName,lastName);
-    }}/>
+    {#if mapping}
+       {
+          addModal.open(id, firstName, lastName);
+        }}
+      />
+    {/if}
   
 
    {
-      idTable.reloadData();
+    onSubmitted={async () => {
+      mapping = await fetchMapping();
+    }}
+  />
+
+   {
+      if (!mapping) {
+        return;
+      }
+      let csvFile = await generateCSVFile(from, to, mapping);
+
+      downloadBlob("export.csv",csvFile,"text/csv");
     }}
   />
 
diff --git a/web/src/lib/IDTable.svelte b/web/src/lib/IDTable.svelte
index 1b282a9..2d80ecb 100644
--- a/web/src/lib/IDTable.svelte
+++ b/web/src/lib/IDTable.svelte
@@ -1,16 +1,13 @@
 
 
-{#if data == null}
-  Loading...
-{:else}
-  
-    
-      
-        
-          |  {
-              handleSortClick("id");
-            }}
-          >
-            ID
-            {indicator("id")}
-           | 
-           {
-              handleSortClick("last");
-            }}
-          >
-            Nachname
-            {indicator("last")}
-           | 
-           {
-              handleSortClick("first");
-            }}
-            >Vorname
+
+   
+    
+      
+        |  {
+            handleSortClick("id");
+          }}
+        >
+          ID
+          {indicator("id")}
+         | 
+         {
+            handleSortClick("last");
+          }}
+        >
+          Nachname
+          {indicator("last")}
+         | 
+         {
+            handleSortClick("first");
+          }}
+          >Vorname
 
-            {indicator("first")}
-           | 
-            | 
+          {indicator("first")}
+        
+          | 
+       
+    
+    
+      {#each rowsSorted as row}
+        
+          | {row.id} | 
+          {row.last} | 
+          {row.first} | 
+           | 
          
-      
-      
-        {#each rowsSorted as row}
-          
-            | {row.id} | 
-            {row.last} | 
-            {row.first} | 
-             | 
-           
-        {/each}
-      
-     
-    
-{/if}
+      {/each}
+    
+   | 
+