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 c445d74af5d3245e4f930df4652e7273e2a48997..000fe2d76e1b111bf76556a31a8fa8f874bcbec0 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt
@@ -31,7 +31,6 @@ import de.chaosdorf.meteroid.model.PinnedUserRepository
 import de.chaosdorf.meteroid.model.ServerId
 import de.chaosdorf.meteroid.model.ServerRepository
 import de.chaosdorf.meteroid.model.UserRepository
-import kotlinx.coroutines.flow.combine
 import javax.inject.Inject
 
 class AccountProvider @Inject constructor(
@@ -39,12 +38,12 @@ class AccountProvider @Inject constructor(
   private val userRepository: UserRepository,
   private val pinnedUserRepository: PinnedUserRepository,
 ) {
-  fun accountFlow(serverId: ServerId, userId: UserId) = combine(
-    serverRepository.getFlow(serverId),
-    userRepository.getFlow(serverId, userId),
-    pinnedUserRepository.isPinnedFlow(serverId, userId)
-  ) { server, user, pinned ->
-    if (server == null || user == null) null
+  suspend fun account(serverId: ServerId, userId: UserId): AccountInfo? {
+    val server = serverRepository.get(serverId)
+    val user = userRepository.get(serverId, userId)
+    val pinned = pinnedUserRepository.isPinned(serverId, userId)
+
+    return if (server == null || user == null) null
     else AccountInfo(server, user, pinned)
   }
 
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt
index 1a3cbf3c80f3150f9d7182a9ca4496c0a504867d..6f8563e8b12c8340dc6a3be6f7bf19aa165df0e6 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt
@@ -79,6 +79,10 @@ class SyncManager @Inject constructor(
   suspend fun purchase(account: AccountInfo, drink: Drink) {
     val api = factory.newInstance(account.server.url)
     try {
+      Log.i(
+        "SyncManager",
+        "Syncing purchase of ${drink.drinkId}/${drink.drinkId} for ${account.user.name}/${account.user.userId}"
+      )
       api.purchase(account.user.userId, drink.drinkId)
       sync(account.server, account.user, incremental = true)
     } catch (e: Exception) {
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 470a91e7c9173ad630f12bbd52ea7bd1ecf673d8..59f2d5328a027b50372397e19e50a6ee3cd795eb 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
@@ -31,7 +31,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel
 import de.chaosdorf.mete.model.UserId
 import de.chaosdorf.meteroid.model.Drink
 import de.chaosdorf.meteroid.model.DrinkRepository
-import de.chaosdorf.meteroid.model.Server
 import de.chaosdorf.meteroid.model.ServerId
 import de.chaosdorf.meteroid.sync.AccountProvider
 import de.chaosdorf.meteroid.sync.SyncManager
@@ -46,16 +45,13 @@ import javax.inject.Inject
 @HiltViewModel
 class DrinkListViewModel @Inject constructor(
   private val savedStateHandle: SavedStateHandle,
-  accountProvider: AccountProvider,
+  private val accountProvider: AccountProvider,
   private val syncManager: SyncManager,
   drinkRepository: DrinkRepository,
 ) : ViewModel() {
   private val serverId = ServerId(checkNotNull(savedStateHandle["server"]))
   private val userId = UserId(checkNotNull(savedStateHandle["user"]))
 
-  val account = accountProvider.accountFlow(serverId, userId)
-    .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
-
   val filters: StateFlow<Set<Filter>> =
     savedStateHandle.getStateFlow("filters", setOf(Filter.Active))
 
@@ -76,8 +72,8 @@ class DrinkListViewModel @Inject constructor(
   }
 
   fun purchase(item: Drink, onBack: () -> Unit) {
-    account.value?.let { account ->
-      viewModelScope.launch {
+    viewModelScope.launch {
+      accountProvider.account(serverId, userId)?.let { account ->
         syncManager.purchase(account, item)
         if (!account.pinned) {
           onBack()
@@ -87,17 +83,13 @@ class DrinkListViewModel @Inject constructor(
   }
 
   fun sync() {
-    account.value?.let { account ->
-      viewModelScope.launch {
+    viewModelScope.launch {
+      accountProvider.account(serverId, userId)?.let { account ->
         syncManager.sync(account.server, account.user, incremental = true)
       }
     }
   }
 
-  suspend fun checkOffline(server: Server?): Boolean =
-    if (server == null) true
-    else syncManager.checkOffline(server)
-
   enum class Filter {
     CaffeineFree,
     Active;
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 cd405b270814e68e4cfdf65039584e485b691b3b..105d5dba05df8f6f5dbe4b0b3da21a5e8481fd86 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
@@ -31,12 +31,9 @@ import androidx.lifecycle.viewModelScope
 import dagger.hilt.android.lifecycle.HiltViewModel
 import de.chaosdorf.mete.model.UserId
 import de.chaosdorf.meteroid.R
-import de.chaosdorf.meteroid.model.Server
 import de.chaosdorf.meteroid.model.ServerId
 import de.chaosdorf.meteroid.sync.AccountProvider
 import de.chaosdorf.meteroid.sync.SyncManager
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.launch
 import java.math.BigDecimal
 import javax.inject.Inject
@@ -60,14 +57,11 @@ class MoneyListViewModel @Inject constructor(
   private val serverId = ServerId(checkNotNull(savedStateHandle["server"]))
   private val userId = UserId(checkNotNull(savedStateHandle["user"]))
 
-  val account = accountProvider.accountFlow(serverId, userId)
-    .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
-
   val money: List<MonetaryAmount> = MonetaryAmount.entries
 
   fun deposit(item: MonetaryAmount, onBack: () -> Unit) {
-    account.value?.let { account ->
-      viewModelScope.launch {
+    viewModelScope.launch {
+      accountProvider.account(serverId, userId)?.let { account ->
         syncManager.deposit(account, item.amount)
         if (!account.pinned) {
           onBack()
@@ -75,14 +69,4 @@ class MoneyListViewModel @Inject constructor(
       }
     }
   }
-
-  fun togglePin() {
-    viewModelScope.launch {
-      accountProvider.togglePin(serverId, userId)
-    }
-  }
-
-  suspend fun checkOffline(server: Server?): Boolean =
-    if (server == null) true
-    else syncManager.checkOffline(server)
 }
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt
index d3efc7826b6ffb465fb89029d9d5484e9a692698..493608633005e53b33f297aeac661d5a46a696ca 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt
@@ -30,7 +30,6 @@ import androidx.lifecycle.viewModelScope
 import dagger.hilt.android.lifecycle.HiltViewModel
 import de.chaosdorf.mete.model.UserId
 import de.chaosdorf.meteroid.model.DrinkRepository
-import de.chaosdorf.meteroid.model.Server
 import de.chaosdorf.meteroid.model.ServerId
 import de.chaosdorf.meteroid.model.TransactionRepository
 import de.chaosdorf.meteroid.sync.AccountProvider
@@ -48,7 +47,7 @@ import kotlin.time.Duration.Companion.minutes
 @HiltViewModel
 class TransactionViewModel @Inject constructor(
   savedStateHandle: SavedStateHandle,
-  accountProvider: AccountProvider,
+  private val accountProvider: AccountProvider,
   private val syncManager: SyncManager,
   repository: TransactionRepository,
   drinkRepository: DrinkRepository
@@ -56,9 +55,6 @@ class TransactionViewModel @Inject constructor(
   private val serverId = ServerId(checkNotNull(savedStateHandle["server"]))
   private val userId = UserId(checkNotNull(savedStateHandle["user"]))
 
-  val account = accountProvider.accountFlow(serverId, userId)
-    .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
-
   val transactions: StateFlow<List<TransactionInfo>> = combine(
     repository.getAllFlow(serverId, userId), drinkRepository.getAllFlow(serverId)
   ) { transactions, drinks ->
@@ -73,15 +69,12 @@ class TransactionViewModel @Inject constructor(
   }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
 
   fun sync() {
-    account.value?.let { (server, user) ->
-      viewModelScope.launch {
-        syncManager.sync(server, user, incremental = true)
+    viewModelScope.launch {
+      accountProvider.account(serverId, userId)?.let { account ->
+        syncManager.sync(account.server, account.user, incremental = true)
       }
     }
   }
-
-  suspend fun checkOffline(server: Server?): Boolean = if (server == null) true
-  else syncManager.checkOffline(server)
 }
 
 fun List<TransactionInfo>.mergeAdjecentDeposits(): List<TransactionInfo> {
diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt
index 712b16c4fd368efdc3b3183a57a76cf9f94c6ab8..a3fceec55d9ea40e15dd6c7ec9435e1d5c13589b 100644
--- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt
+++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt
@@ -32,12 +32,9 @@ import de.chaosdorf.mete.model.DrinkId
 import de.chaosdorf.mete.model.UserId
 import de.chaosdorf.meteroid.model.Drink
 import de.chaosdorf.meteroid.model.DrinkRepository
-import de.chaosdorf.meteroid.model.Server
 import de.chaosdorf.meteroid.model.ServerId
 import de.chaosdorf.meteroid.model.Transaction
 import de.chaosdorf.meteroid.model.TransactionRepository
-import de.chaosdorf.meteroid.sync.AccountProvider
-import de.chaosdorf.meteroid.sync.SyncManager
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.combine
@@ -53,17 +50,12 @@ import javax.inject.Inject
 @HiltViewModel
 class WrappedViewModel @Inject constructor(
   savedStateHandle: SavedStateHandle,
-  accountProvider: AccountProvider,
-  private val syncManager: SyncManager,
   repository: TransactionRepository,
   drinkRepository: DrinkRepository,
 ) : ViewModel() {
   private val serverId = ServerId(checkNotNull(savedStateHandle["server"]))
   private val userId = UserId(checkNotNull(savedStateHandle["user"]))
 
-  val account = accountProvider.accountFlow(serverId, userId)
-    .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
-
   private fun List<Transaction>.filterAudits(year: Int): List<Transaction> {
     val yearBegin = LocalDateTime(year, Month.JANUARY, 1, 0, 0, 0)
       .toInstant(TimeZone.UTC)
@@ -88,8 +80,4 @@ class WrappedViewModel @Inject constructor(
     val content = transactions.filterAudits(now.year)
     factories.mapNotNull { it.create(content, drinkMap) }
   }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
-
-  suspend fun checkOffline(server: Server?): Boolean =
-    if (server == null) true
-    else syncManager.checkOffline(server)
 }