diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt
index 1afae8c1727341e3cc52c7d5bcc1a4040110155c..ad5a43e8b73161b0322d65bb13fe2bb668449955 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt
@@ -24,6 +24,7 @@ import org.matrix.android.sdk.api.auth.login.LoginWizard
 import org.matrix.android.sdk.api.auth.registration.RegistrationWizard
 import org.matrix.android.sdk.api.auth.wellknown.WellknownResult
 import org.matrix.android.sdk.api.session.Session
+import org.matrix.android.sdk.internal.auth.login.RefreshedTokenInfo
 
 /**
  * This interface defines methods to authenticate or to create an account to a matrix server.
@@ -165,4 +166,9 @@ interface AuthenticationService {
      * Added for switch user
      */
     suspend fun removeSession(sessionId: String)
+
+    /**
+     * Added for Circles
+     */
+    suspend fun refreshToken(sessionId: String): RefreshedTokenInfo
 }
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt
index aa5774e5798ed26a3d18e25248771dad2152b001..d3b3b923fe84f9c59978edf05cf8d36abece1013 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt
@@ -42,6 +42,8 @@ import org.matrix.android.sdk.internal.auth.db.PendingSessionData
 import org.matrix.android.sdk.internal.auth.login.DefaultLoginWizard
 import org.matrix.android.sdk.internal.auth.login.DirectLoginTask
 import org.matrix.android.sdk.internal.auth.login.QrLoginTokenTask
+import org.matrix.android.sdk.internal.auth.login.RefreshTokenParams
+import org.matrix.android.sdk.internal.auth.login.RefreshedTokenInfo
 import org.matrix.android.sdk.internal.auth.registration.DefaultRegistrationWizard
 import org.matrix.android.sdk.internal.auth.version.Versions
 import org.matrix.android.sdk.internal.auth.version.doesServerSupportLogoutDevices
@@ -501,4 +503,29 @@ internal class DefaultAuthenticationService @Inject constructor(
     override suspend fun removeSession(sessionId: String) {
         sessionManager.removeSession(sessionId)
     }
+
+    //Added for Circles
+    override suspend fun refreshToken(sessionId: String): RefreshedTokenInfo {
+        val sessionParams = sessionParamsStore.get(sessionId) ?: throw IllegalArgumentException(
+                "Session params for session $sessionId not found"
+        )
+        val authAPI = buildAuthAPI(sessionParams.homeServerConnectionConfig)
+
+        val sessionCredentials = sessionParamsStore.get(sessionId)?.credentials ?: throw IllegalArgumentException(
+                "Credentials for session $sessionId not found"
+        )
+        val sessionRefreshToken = sessionCredentials.refreshToken ?: throw IllegalArgumentException(
+                "Refresh token for session $sessionId not found"
+        )
+        val refreshTokenInfo = executeRequest(null) {
+            authAPI.refreshToken(RefreshTokenParams(sessionRefreshToken))
+        }
+        val newCredentials = sessionCredentials.copy(
+                accessToken = refreshTokenInfo.accessToken,
+                refreshToken = refreshTokenInfo.refreshToken,
+                expiresInMs = refreshTokenInfo.expiresInMs
+        )
+        sessionParamsStore.updateCredentials(newCredentials)
+        return refreshTokenInfo
+    }
 }