diff --git a/auth/src/main/java/org/futo/circles/auth/feature/token/RefreshTokenWorker.kt b/auth/src/main/java/org/futo/circles/auth/feature/token/RefreshTokenWorker.kt
new file mode 100644
index 0000000000000000000000000000000000000000..feb4a015526a95151ec30074002d853b2d93ffae
--- /dev/null
+++ b/auth/src/main/java/org/futo/circles/auth/feature/token/RefreshTokenWorker.kt
@@ -0,0 +1,38 @@
+package org.futo.circles.auth.feature.token
+
+import android.content.Context
+import androidx.hilt.work.HiltWorker
+import androidx.work.CoroutineWorker
+import androidx.work.WorkManager
+import androidx.work.WorkerParameters
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedInject
+import org.futo.circles.core.extensions.Response
+import javax.inject.Inject
+
+@HiltWorker
+class RefreshTokenWorker @AssistedInject constructor(
+    @Assisted val context: Context,
+    @Assisted val params: WorkerParameters
+) : CoroutineWorker(context, params) {
+
+    @Inject
+    lateinit var refreshTokenDataSource: RefreshTokenDataSource
+
+    override suspend fun doWork(): Result {
+        val sessionId = params.inputData.getString(SESSION_ID_PARAM_KEY) ?: run {
+            WorkManager.getInstance(context).cancelWorkById(this.id)
+            return Result.failure()
+        }
+        val result = refreshTokenDataSource.refreshToken(sessionId)
+        return if (result is Response.Success) Result.success()
+        else {
+            WorkManager.getInstance(context).cancelWorkById(this.id)
+            Result.failure()
+        }
+    }
+
+    companion object {
+        const val SESSION_ID_PARAM_KEY = "sessionId"
+    }
+}