diff --git a/client/src/adapters/comment.ts b/client/src/adapters/comment.ts
new file mode 100644
index 0000000000000000000000000000000000000000..47c65419ba5f87b0c0596f6cc475ab2548a2db31
--- /dev/null
+++ b/client/src/adapters/comment.ts
@@ -0,0 +1,10 @@
+
+export interface Comment {
+    id: string;
+    task: string;
+    user: string;
+    text: string;
+    created: Date;
+    edited: Date;
+}
+
diff --git a/client/src/adapters/project.ts b/client/src/adapters/project.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8d0bfb23d11d693a45f4b898547c76ec93da469e
--- /dev/null
+++ b/client/src/adapters/project.ts
@@ -0,0 +1,8 @@
+
+export interface Project {
+    id: string;
+    name: string;
+    status: 'open' | 'closed' | 'suspended';
+    teams: Array<string>;
+}
+
diff --git a/client/src/adapters/task.ts b/client/src/adapters/task.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6e6e21342f213445770997449e89cf5e7f1f48e8
--- /dev/null
+++ b/client/src/adapters/task.ts
@@ -0,0 +1,28 @@
+
+
+export interface TaskRequirement {
+    role: string;
+    time: number;
+}
+
+export interface TaskAssignment {
+    user: string;
+    time: number;
+    finished: boolean;
+}
+
+export interface Task {
+    id: string;
+    project: string;
+    name: string;
+    text: string;
+    icon: string;
+    priority: 'low' | 'medium' | 'high' | 'urgent';
+    status: 'open' | 'closed' | 'suspended';
+    dependentcies: Array<string>;
+    requirements: Array<TaskRequirement>;
+    assigned: Array<TaskAssignment>;
+    created: Date;
+    edited: Date;
+}
+
diff --git a/client/src/adapters/team.ts b/client/src/adapters/team.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e7e61bad00231fb558115383e18f055857d9be86
--- /dev/null
+++ b/client/src/adapters/team.ts
@@ -0,0 +1,7 @@
+
+export interface Team {
+    id: string;
+    name: string;
+    role?: string;
+}
+
diff --git a/client/src/adapters/user.ts b/client/src/adapters/user.ts
index 655b475eaed9c3493c7d661b9bcfe417abda9b1d..73455ff60f409740a94261bb1fdd03735c035799 100644
--- a/client/src/adapters/user.ts
+++ b/client/src/adapters/user.ts
@@ -1,6 +1,10 @@
 
 import { apiRoot } from 'config';
 
+import { getAuthHeader } from './auth';
+import { Task } from './task';
+import { Work } from './work';
+
 export async function exists(username: string) {
     try {
         const response = await fetch(`${apiRoot}/user/name/${username}`);
@@ -11,3 +15,88 @@ export async function exists(username: string) {
     }
 }
 
+export interface User {
+    id: string;
+    username: string;
+    realname?: string;
+    email?: string;
+}
+
+export async function getCurrentUser(): Promise<User> {
+    try {
+        const response = await fetch(`${apiRoot}/user/`, { headers: getAuthHeader() });
+        if (response.ok) {
+            return (await response.json()).user;
+        } else {
+            throw new Error("Failed to get user");
+        }
+    } catch (e) {
+        throw e;
+    }
+}
+
+export async function getTasks(): Promise<Array<Task>> {
+    try {
+        const response = await fetch(`${apiRoot}/user/tasks`, { headers: getAuthHeader() });
+        if (response.ok) {
+            return (await response.json()).tasks.map((task: any) => ({
+                ...task,
+                edited: new Date(task.edited),
+                created: new Date(task.created),
+            }));
+        } else {
+            throw new Error("Failed to get user tasks");
+        }
+    } catch (e) {
+        throw e;
+    }
+}
+
+export async function getWork(): Promise<Work> {
+    try {
+        const response = await fetch(`${apiRoot}/user/work`, { headers: getAuthHeader() });
+        if (response.ok) {
+            return (await response.json()).work;
+        } else {
+            throw new Error("Failed to get user work");
+        }
+    } catch (e) {
+        throw e;
+    }
+}
+
+export async function getUser(uuid: string): Promise<User> {
+    try {
+        const response = await fetch(`${apiRoot}/user/${uuid}`, { headers: getAuthHeader() });
+        if (response.ok) {
+            return (await response.json()).user;
+        } else {
+            throw new Error("Failed to get user");
+        }
+    } catch (e) {
+        throw e;
+    }
+}
+
+export async function updateUser(user: { realname?: string, email?: string }) {
+    try {
+        const response = await fetch(`${apiRoot}/user/`, {
+            method: 'PUT',
+            headers: {
+                ...getAuthHeader(),
+                'Content-Type': 'application/json',
+            },
+            body: JSON.stringify(user),
+        });
+        if (!response.ok) {
+            throw new Error("Failed to update user");
+        }
+    } catch (e) {
+        throw e;
+    }
+}
+
+export function getUserImageUri(uuid: string): string {
+    return `${apiRoot}/user/${uuid}/image`;
+}
+
diff --git a/client/src/adapters/work.ts b/client/src/adapters/work.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c5f6975733ba171992710993c6a5d385a64883fa
--- /dev/null
+++ b/client/src/adapters/work.ts
@@ -0,0 +1,9 @@
+
+export interface Work {
+    id: string;
+    task: string;
+    user: string;
+    started: Date;
+    finished: Date;
+}
+