diff --git a/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeDialogFragment.kt
index 0fa90df4f4e2fd433c553768822f4abe07fd1311..e35f2c3b807dc7b47a57d0da7bf96da565e06ebe 100644
--- a/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeDialogFragment.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeDialogFragment.kt
@@ -6,13 +6,17 @@ import android.view.View
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.viewModels
 import androidx.navigation.fragment.findNavController
+import androidx.navigation.fragment.navArgs
 import dagger.hilt.android.AndroidEntryPoint
 import org.futo.circles.core.R
 import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
 import org.futo.circles.core.base.fragment.HasLoadingState
 import org.futo.circles.core.databinding.DialogFragmentInviteToFollowMeBinding
 import org.futo.circles.core.extensions.navigateSafe
+import org.futo.circles.core.extensions.observeResponse
+import org.futo.circles.core.extensions.onBackPressed
 import org.futo.circles.core.extensions.setIsVisible
+import org.futo.circles.core.extensions.showSuccess
 import org.futo.circles.core.feature.room.select.SelectRoomsFragment
 import org.futo.circles.core.feature.room.select.interfaces.RoomsListener
 import org.futo.circles.core.feature.room.select.interfaces.SelectRoomsListener
@@ -26,6 +30,7 @@ class InviteToFollowMeDialogFragment :
     ), HasLoadingState, SelectRoomsListener, RoomsListener {
 
     override val fragment: Fragment = this
+    private val args: InviteToFollowMeDialogFragmentArgs by navArgs()
     private val viewModel by viewModels<InviteToFollowMeViewModel>()
 
     private val selectRoomsFragment by lazy { SelectRoomsFragment.create(CircleRoomTypeArg.Circle) }
@@ -45,8 +50,10 @@ class InviteToFollowMeDialogFragment :
 
     private fun setupViews() {
         with(binding) {
+            tvTitle.text =
+                getString(R.string.select_circles_to_which_you_want_to_invite_format, args.userId)
             btnInvite.setOnClickListener {
-                viewModel.invite(selectRoomsFragment.getSelectedRooms())
+                viewModel.invite(args.userId, selectRoomsFragment.getSelectedRooms())
                 startLoading(btnInvite)
             }
             fbAddRoom.setOnClickListener { navigateToCreateCircle() }
@@ -55,7 +62,12 @@ class InviteToFollowMeDialogFragment :
     }
 
     private fun setupObservers() {
-
+        viewModel.inviteResultLiveData.observeResponse(this,
+            success = {
+                showSuccess(getString(R.string.invitation_sent))
+                onBackPressed()
+            }
+        )
     }
 
     private fun navigateToCreateCircle() {
diff --git a/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeViewModel.kt b/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeViewModel.kt
index 6daeedfb1f5291cf01ad8a3355d3baedb56afb20..068076b6c17101a7f110ae91eace3e98f50b3755 100644
--- a/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeViewModel.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeViewModel.kt
@@ -2,15 +2,37 @@ package org.futo.circles.core.feature.invite_to_follow
 
 import androidx.lifecycle.ViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
+import org.futo.circles.core.base.SingleEventLiveData
+import org.futo.circles.core.extensions.Response
+import org.futo.circles.core.extensions.launchBg
+import org.futo.circles.core.feature.room.invite.ManageInviteRequestsDataSource
 import org.futo.circles.core.model.SelectableRoomListItem
+import org.futo.circles.core.utils.getTimelineRoomFor
 import javax.inject.Inject
 
 @HiltViewModel
 class InviteToFollowMeViewModel @Inject constructor(
-
+    private val manageInviteRequestsDataSource: ManageInviteRequestsDataSource
 ) : ViewModel() {
-    fun invite(selectedRooms: List<SelectableRoomListItem>) {
 
-    }
+    val inviteResultLiveData = SingleEventLiveData<Response<Any>>()
 
+    fun invite(userId: String, selectedRooms: List<SelectableRoomListItem>) {
+        val timelinesIds = selectedRooms.mapNotNull { getTimelineRoomFor(it.id)?.roomId }
+        launchBg {
+            timelinesIds.forEach { timelineId ->
+                try {
+                    manageInviteRequestsDataSource.inviteUser(timelineId, userId)
+                } catch (t: Throwable) {
+                    inviteResultLiveData.postValue(
+                        Response.Error(
+                            t.message ?: "Failed to invite $userId to $timelineId"
+                        )
+                    )
+                    return@launchBg
+                }
+                inviteResultLiveData.postValue(Response.Success(Unit))
+            }
+        }
+    }
 }
\ No newline at end of file