diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt
index 4420a5eda68e7e94a37a2ce7b38f7a9e4ca4294b..1fd925951ff0c5ddee10c012bb3dc2b72fd419d3 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt
@@ -24,9 +24,8 @@
 
 package de.chaosdorf.meteroid.sync
 
-import de.chaosdorf.meteroid.model.Server
+import de.chaosdorf.meteroid.model.AccountInfo
 import de.chaosdorf.meteroid.model.ServerRepository
-import de.chaosdorf.meteroid.model.User
 import de.chaosdorf.meteroid.model.UserRepository
 import de.chaosdorf.meteroid.storage.AccountPreferences
 import kotlinx.coroutines.flow.Flow
@@ -40,7 +39,7 @@ class AccountProvider @Inject constructor(
   serverRepository: ServerRepository,
   userRepository: UserRepository,
 ) {
-  val account: Flow<Pair<Server, User?>?> =
+  val account: Flow<AccountInfo?> =
     accountPreferences.state.flatMapLatest { preferences ->
       if (preferences.server == null) {
         flowOf(null)
@@ -49,10 +48,10 @@ class AccountProvider @Inject constructor(
           if (server == null) {
             flowOf(null)
           } else if (preferences.user == null) {
-            flowOf(Pair(server, null))
+            flowOf(AccountInfo(server, null))
           } else {
             userRepository.getFlow(server.serverId, preferences.user)
-              .mapLatest { user -> Pair(server, user) }
+              .mapLatest { user -> AccountInfo(server, user) }
           }
         }
       }
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListScreen.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListScreen.kt
index 46b2833374568b31f86fee4ff18f620c34a2577a..e0708c350d6b1158fa5404b9eea92a9aa111d82a 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListScreen.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListScreen.kt
@@ -38,6 +38,7 @@ import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
+import androidx.navigation.NavOptions
 import de.chaosdorf.meteroid.sync.SyncHandler
 import de.chaosdorf.meteroid.ui.navigation.HomeSections
 import de.chaosdorf.meteroid.ui.navigation.MeteroidBottomBar
@@ -46,7 +47,7 @@ import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar
 @Composable
 fun DrinkListScreen(
   viewModel: DrinkListViewModel,
-  onNavigate: (String) -> Unit = {}
+  onNavigate: (String, NavOptions) -> Unit
 ) {
   val account by viewModel.account.collectAsState()
   val drinks by viewModel.drinks.collectAsState()
@@ -56,7 +57,7 @@ fun DrinkListScreen(
     bottomBar = {
       MeteroidBottomBar(
         currentRoute = HomeSections.PURCHASE,
-        historyEnabled = account?.second?.audit == true,
+        historyEnabled = account?.user?.audit == true,
         navigateTo = onNavigate
       )
     }
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt
index 1a10f7dc1d592371aa20107ca4c40d40207a601f..bca3d100d6dd6521c646a588775cc897b6a134d0 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt
@@ -27,6 +27,7 @@ package de.chaosdorf.meteroid.ui.drinks
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import dagger.hilt.android.lifecycle.HiltViewModel
+import de.chaosdorf.meteroid.model.AccountInfo
 import de.chaosdorf.meteroid.model.Drink
 import de.chaosdorf.meteroid.model.DrinkRepository
 import de.chaosdorf.meteroid.model.Server
@@ -47,7 +48,7 @@ class DrinkListViewModel @Inject constructor(
   repository: DrinkRepository,
   syncHandler: DrinkSyncHandler
 ) : ViewModel() {
-  val account: StateFlow<Pair<Server, User?>?> = accountProvider.account
+  val account: StateFlow<AccountInfo?> = accountProvider.account
     .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
 
   val drinks: StateFlow<List<Drink>> = accountProvider.account
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListScreen.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListScreen.kt
index 9092436d6a46f478fcfcb032b1681c8dda884de6..14386cef5430a9d6a8393a024a497042d40828a0 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListScreen.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListScreen.kt
@@ -37,6 +37,7 @@ import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
+import androidx.navigation.NavOptions
 import de.chaosdorf.meteroid.ui.navigation.HomeSections
 import de.chaosdorf.meteroid.ui.navigation.MeteroidBottomBar
 import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar
@@ -44,7 +45,7 @@ import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar
 @Composable
 fun MoneyListScreen(
   viewModel: MoneyListViewModel,
-  onNavigate: (String) -> Unit = {}
+  onNavigate: (String, NavOptions) -> Unit
 ) {
   val account by viewModel.account.collectAsState()
 
@@ -53,7 +54,7 @@ fun MoneyListScreen(
     bottomBar = {
       MeteroidBottomBar(
         currentRoute = HomeSections.DEPOSIT,
-        historyEnabled = account?.second?.audit == true,
+        historyEnabled = account?.user?.audit == true,
         navigateTo = onNavigate
       )
     }
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt
index 138661767ee0c3a97d721eec86371e82041258f7..508ccec5a62e2b86e3f6e0b5799a5a690e755ce8 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt
@@ -29,8 +29,7 @@ import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import dagger.hilt.android.lifecycle.HiltViewModel
 import de.chaosdorf.meteroid.R
-import de.chaosdorf.meteroid.model.Server
-import de.chaosdorf.meteroid.model.User
+import de.chaosdorf.meteroid.model.AccountInfo
 import de.chaosdorf.meteroid.sync.AccountProvider
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
@@ -51,7 +50,7 @@ enum class MonetaryAmount(val amount: Double, @DrawableRes val image: Int) {
 class MoneyListViewModel @Inject constructor(
   accountProvider: AccountProvider
 ) : ViewModel() {
-  val account: StateFlow<Pair<Server, User?>?> = accountProvider.account
+  val account: StateFlow<AccountInfo?> = accountProvider.account
     .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
 
   val money: List<MonetaryAmount> = MonetaryAmount.entries
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyTile.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyTile.kt
index f584cb0ebd1db92969539ae4c885d9e59ab154d3..5ec0760bd633730e1cd07cba42ab38933b5e4d49 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyTile.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyTile.kt
@@ -56,8 +56,6 @@ fun MoneyTile(
         contentDescription = null,
         contentScale = ContentScale.Fit,
         modifier = Modifier
-          .clip(CircleShape)
-          .background(MaterialTheme.colorScheme.primaryContainer)
           .aspectRatio(1.0f)
           .padding(8.dp)
       )
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidBottomBar.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidBottomBar.kt
index ebe94f2df394db701947871f6d81811a7ef25373..18238c82faec1b9d23fe0113c896108a5b8f8155 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidBottomBar.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidBottomBar.kt
@@ -30,11 +30,12 @@ import androidx.compose.material3.NavigationBarItem
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
+import androidx.navigation.NavOptions
 
 @Composable
 fun <T : MeteroidNavSection> MeteroidBottomBar(
   currentRoute: T,
-  navigateTo: (String) -> Unit,
+  navigateTo: (String, NavOptions) -> Unit,
   historyEnabled: Boolean,
   modifier: Modifier = Modifier
 ) {
@@ -44,7 +45,14 @@ fun <T : MeteroidNavSection> MeteroidBottomBar(
         icon = { Icon(route.icon, contentDescription = route.title) },
         label = { Text(route.title) },
         selected = route == currentRoute,
-        onClick = { navigateTo(route.route) },
+        onClick = {
+          navigateTo(
+            route.route,
+            NavOptions.Builder()
+              .setPopUpTo(Routes.Home.Root, true)
+              .build()
+          )
+        },
         modifier = modifier,
         enabled = route != HomeSections.HISTORY || historyEnabled
       )
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidTopBar.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidTopBar.kt
index 9cca0a10c5ee128963f2529a6a45cae66fd27285..e796d4f902d46000b4572c7cded48531ec5452f3 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidTopBar.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidTopBar.kt
@@ -31,9 +31,12 @@ import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.shape.CircleShape
 import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.IconButton
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Text
 import androidx.compose.material3.TopAppBar
+import androidx.compose.material3.TopAppBarColors
+import androidx.compose.material3.TopAppBarDefaults
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clip
@@ -43,37 +46,40 @@ import androidx.compose.ui.layout.ContentScale
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
+import androidx.navigation.NavOptions
 import coil.compose.AsyncImage
+import de.chaosdorf.meteroid.model.AccountInfo
 import de.chaosdorf.meteroid.model.Server
 import de.chaosdorf.meteroid.model.User
 
 @Composable
 fun MeteroidTopBar(
-  account: Pair<Server, User?>?,
-  onNavigate: (String) -> Unit = {}
+  account: AccountInfo?,
+  onNavigate: (String, NavOptions) -> Unit
 ) {
   TopAppBar(
     title = {
       Text(
-        account?.second?.name
-          ?: account?.first?.name
+        account?.user?.name
+          ?: account?.server?.name
           ?: "Meteroid"
       )
     },
     navigationIcon = {
-      AsyncImage(
-        account?.second?.gravatarUrl(),
-        contentDescription = "User List",
-        contentScale = ContentScale.Crop,
-        modifier = Modifier
-          .size(48.dp)
-          .clip(CircleShape)
-          .border(1.dp, Color.White, CircleShape)
-          .background(MaterialTheme.colorScheme.primaryContainer)
-      )
+        AsyncImage(
+          account?.user?.gravatarUrl(),
+          contentDescription = "User List",
+          contentScale = ContentScale.Crop,
+          modifier = Modifier
+            .padding(start = 6.dp, end = 24.dp)
+            .size(40.dp)
+            .clip(CircleShape)
+            .border(1.dp, Color.White, CircleShape)
+            .background(MaterialTheme.colorScheme.primaryContainer)
+        )
     },
     actions = {
-      account?.second?.let { user ->
+      account?.user?.let { user ->
         val (foreground, background) =
           if (user.balance < 0)
             Pair(MaterialTheme.colorScheme.onError, MaterialTheme.colorScheme.error)
@@ -95,7 +101,17 @@ fun MeteroidTopBar(
       }
     },
     modifier = Modifier
-      .shadow(4.dp)
-      .clickable { onNavigate(Routes.Users.Root) }
+      .clickable {
+        onNavigate(
+          Routes.Users.Root,
+          NavOptions
+            .Builder()
+            .build()
+        )
+      },
+    colors = TopAppBarDefaults.topAppBarColors(
+      containerColor = MaterialTheme.colorScheme.primaryContainer,
+      titleContentColor = MaterialTheme.colorScheme.onPrimaryContainer
+    )
   )
 }
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/purchases/PurchaseInfo.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/purchases/PurchaseInfo.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b389efebf5249dae8238e488e42b24749469e09a
--- /dev/null
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/purchases/PurchaseInfo.kt
@@ -0,0 +1,33 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2013-2023 Chaosdorf e.V.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package de.chaosdorf.meteroid.ui.purchases
+
+import de.chaosdorf.meteroid.model.Drink
+import de.chaosdorf.meteroid.model.Purchase
+
+data class PurchaseInfo(
+    val purchase: Purchase,
+    val drink: Drink?
+)
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/purchases/PurchaseListScreen.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/purchases/PurchaseListScreen.kt
index 84d1f8b4e8953644635124db85d0bf6ae97598ba..ac31c251b4430f1931cebf1154a7eb811019f6bb 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/purchases/PurchaseListScreen.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/purchases/PurchaseListScreen.kt
@@ -35,6 +35,7 @@ import androidx.compose.runtime.Composable
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
+import androidx.navigation.NavOptions
 import de.chaosdorf.meteroid.sync.SyncHandler
 import de.chaosdorf.meteroid.ui.navigation.HomeSections
 import de.chaosdorf.meteroid.ui.navigation.MeteroidBottomBar
@@ -43,7 +44,7 @@ import de.chaosdorf.meteroid.ui.navigation.MeteroidTopBar
 @Composable
 fun PurchaseListScreen(
   viewModel: PurchaseViewModel,
-  onNavigate: (route: String) -> Unit = {}
+  onNavigate: (String, NavOptions) -> Unit
 ) {
   val account by viewModel.account.collectAsState()
   val purchases by viewModel.purchases.collectAsState()
@@ -54,7 +55,7 @@ fun PurchaseListScreen(
     bottomBar = {
       MeteroidBottomBar(
         currentRoute = HomeSections.HISTORY,
-        historyEnabled = account?.second?.audit == true,
+        historyEnabled = account?.user?.audit == true,
         navigateTo = onNavigate
       )
     }
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/purchases/PurchaseViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/purchases/PurchaseViewModel.kt
index 86a6af815d79682e971f83644f8f183cd1f250a1..b31def9bf795ae8b62529c0c4680f752af141976 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/purchases/PurchaseViewModel.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/purchases/PurchaseViewModel.kt
@@ -27,12 +27,9 @@ package de.chaosdorf.meteroid.ui.purchases
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import dagger.hilt.android.lifecycle.HiltViewModel
-import de.chaosdorf.meteroid.model.Drink
+import de.chaosdorf.meteroid.model.AccountInfo
 import de.chaosdorf.meteroid.model.DrinkRepository
-import de.chaosdorf.meteroid.model.Purchase
 import de.chaosdorf.meteroid.model.PurchaseRepository
-import de.chaosdorf.meteroid.model.Server
-import de.chaosdorf.meteroid.model.User
 import de.chaosdorf.meteroid.sync.AccountProvider
 import de.chaosdorf.meteroid.sync.PurchaseSyncHandler
 import de.chaosdorf.meteroid.sync.SyncHandler
@@ -53,47 +50,51 @@ class PurchaseViewModel @Inject constructor(
   drinkRepository: DrinkRepository,
   syncHandler: PurchaseSyncHandler
 ) : ViewModel() {
-  val account: StateFlow<Pair<Server, User?>?> = accountProvider.account
+  val account: StateFlow<AccountInfo?> = accountProvider.account
     .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
 
-  val purchases: StateFlow<List<Pair<Purchase, Drink?>>> = accountProvider.account
+  val purchases: StateFlow<List<PurchaseInfo>> = accountProvider.account
     .flatMapLatest { account ->
-      account?.let { (server, user) ->
-        user?.let { user ->
+      account?.let { (server, maybeUser) ->
+        maybeUser?.let { user ->
           combine(
             repository.getAllFlow(server.serverId, user.userId),
             drinkRepository.getAllFlow(server.serverId)
           ) { purchases, drinks ->
             purchases.map { purchase ->
-              Pair(purchase, drinks.firstOrNull { drink -> drink.drinkId == purchase.drinkId })
+              PurchaseInfo(
+                purchase,
+                drinks.firstOrNull { drink -> drink.drinkId == purchase.drinkId }
+              )
             }
           }
         }
       } ?: flowOf(emptyList())
     }.mapLatest { list ->
       list.mergeAdjecentDeposits()
-        .filter { it.second != null || it.first.difference != 0.0 }
+        .filter { it.drink != null || it.purchase.difference != 0.0 }
     }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
 
   val syncState: StateFlow<SyncHandler.State> = syncHandler.state
 }
 
-fun List<Pair<Purchase, Drink?>>.mergeAdjecentDeposits(): List<Pair<Purchase, Drink?>> {
-  val result = mutableListOf<Pair<Purchase, Drink?>>()
+fun List<PurchaseInfo>.mergeAdjecentDeposits(): List<PurchaseInfo> {
+  val result = mutableListOf<PurchaseInfo>()
   for (entry in this) {
     val previous = result.lastOrNull()
     if (previous != null
-      && previous.first.difference > 0
-      && entry.first.difference > 0
-      && previous.second == null
-      && entry.second == null
-      && entry.first.createdAt.minus(previous.first.createdAt) < 5.minutes
+      && previous.purchase.difference > 0
+      && entry.purchase.difference > 0
+      && previous.drink == null
+      && entry.drink == null
+      && entry.purchase.createdAt.minus(previous.purchase.createdAt) < 5.minutes
     ) {
       result.removeLast()
       result.add(
-        Pair(
-          entry.first.copy(difference = entry.first.difference + previous.first.difference),
-          null
+        entry.copy(
+          purchase = entry.purchase.copy(
+            difference = entry.purchase.difference + previous.purchase.difference
+          )
         )
       )
     } else {
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListScreen.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListScreen.kt
index 25eb6f7ff0da2e3e034543c465074bd653f972fe..02b12293813fd0cb1ca876516ce480d8f47e6ab8 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListScreen.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListScreen.kt
@@ -68,13 +68,13 @@ fun UserListScreen(
       TopAppBar(
         title = {
           Text(
-            server?.first?.name
+            server?.server?.name
               ?: "Meteroid"
           )
         },
         navigationIcon = {
           AsyncImage(
-            server?.first?.logoUrl,
+            server?.server?.logoUrl,
             contentDescription = "User List",
             contentScale = ContentScale.Crop,
             modifier = Modifier
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListViewModel.kt
index 7e74e6bb4c2625f722938f8bb974696b5749017f..bc36b148b7208947c54043e425431fdb9d9443fe 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListViewModel.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListViewModel.kt
@@ -27,6 +27,7 @@ package de.chaosdorf.meteroid.ui.users
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import dagger.hilt.android.lifecycle.HiltViewModel
+import de.chaosdorf.meteroid.model.AccountInfo
 import de.chaosdorf.meteroid.model.Server
 import de.chaosdorf.meteroid.model.User
 import de.chaosdorf.meteroid.model.UserRepository
@@ -46,7 +47,7 @@ class UserListViewModel @Inject constructor(
   repository: UserRepository,
   syncHandler: UserSyncHandler
 ) : ViewModel() {
-  val account: StateFlow<Pair<Server, User?>?> = accountProvider.account
+  val account: StateFlow<AccountInfo?> = accountProvider.account
     .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
 
   val users: StateFlow<List<User>> = accountProvider.account
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 0e5d0c5d8b42f548935dd864d8295394a0983cb0..7d17d98c36153e3781bde380b0437745f8e56180 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,22 +1,22 @@
 [versions]
-androidGradlePlugin = "8.1.2"
+androidGradlePlugin = "8.1.3"
 androidx-activity = "1.8.0"
 androidx-appcompat = "1.6.1"
 androidx-compose-bom = "2023.10.01"
-androidx-compose-compiler = "1.5.3"
+androidx-compose-compiler = "1.5.4"
 androidx-compose-material = "1.5.0-alpha04"
 androidx-compose-material3 = "1.2.0-alpha10"
 androidx-compose-runtimetracing = "1.0.0-alpha04"
 androidx-compose-tooling = "1.6.0-alpha08"
 androidx-datastore = "1.0.0"
-androidx-hilt = "1.0.0"
+androidx-hilt = "1.1.0"
 androidx-navigation = "2.7.5"
 androidx-room = "2.6.0"
 coil = "2.4.0"
 dagger-hilt = "2.48.1"
 desugar-jdk = "2.0.4"
-kotlin = "1.9.10"
-kotlin-ksp = "1.9.10-1.0.13"
+kotlin = "1.9.20"
+kotlin-ksp = "1.9.20-1.0.14"
 kotlinxCoroutines = "1.7.1"
 kotlinxDatetime = "0.4.0"
 kotlinxSerializationJson = "1.5.1"
diff --git a/persistence/src/main/kotlin/de/chaosdorf/meteroid/model/AccountInfo.kt b/persistence/src/main/kotlin/de/chaosdorf/meteroid/model/AccountInfo.kt
new file mode 100644
index 0000000000000000000000000000000000000000..581d020209ce703f670e6c144ec0d425c104c0fe
--- /dev/null
+++ b/persistence/src/main/kotlin/de/chaosdorf/meteroid/model/AccountInfo.kt
@@ -0,0 +1,30 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2013-2023 Chaosdorf e.V.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package de.chaosdorf.meteroid.model
+
+data class AccountInfo(
+  val server: Server,
+  val user: User?
+)