diff --git a/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt
index 6964f2aa995f7f759baebdf3f9d5f54cc1d8a7e3..600337f35dca5d5dd388ad8b572c641f6e78b928 100644
--- a/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt
@@ -27,21 +27,16 @@ import org.futo.circles.core.extensions.showSuccess
 import org.futo.circles.core.extensions.withConfirmation
 import org.futo.circles.core.feature.share.ShareProvider
 import org.futo.circles.core.model.CircleRoomTypeArg
-import org.futo.circles.core.model.CreatePollContent
 import org.futo.circles.core.model.Post
 import org.futo.circles.core.model.PostContent
 import org.futo.circles.databinding.DialogFragmentTimelineBinding
 import org.futo.circles.feature.timeline.list.PostOptionsListener
 import org.futo.circles.feature.timeline.list.TimelineAdapter
-import org.futo.circles.feature.timeline.poll.CreatePollListener
-import org.futo.circles.feature.timeline.post.create.CreatePostListener
 import org.futo.circles.feature.timeline.post.emoji.EmojiPickerListener
 import org.futo.circles.feature.timeline.post.menu.PostMenuListener
-import org.futo.circles.model.CreatePostContent
 import org.futo.circles.model.EndPoll
 import org.futo.circles.model.IgnoreSender
 import org.futo.circles.model.RemovePost
-import org.futo.circles.model.TextPostContent
 import org.futo.circles.view.CreatePostViewListener
 import org.matrix.android.sdk.api.extensions.tryOrNull
 import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent
@@ -50,8 +45,7 @@ import org.matrix.android.sdk.api.session.room.powerlevels.Role
 @ExperimentalBadgeUtils
 @AndroidEntryPoint
 class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimelineBinding::inflate),
-    PostOptionsListener, PostMenuListener,
-    CreatePostListener, CreatePollListener, EmojiPickerListener {
+    PostOptionsListener, PostMenuListener, EmojiPickerListener {
 
     private val args: TimelineDialogFragmentArgs by navArgs()
     private val viewModel by viewModels<TimelineViewModel>()
@@ -268,26 +262,6 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli
         withConfirmation(EndPoll()) { viewModel.endPoll(roomId, eventId) }
     }
 
-    override fun onSendPost(
-        roomId: String,
-        postContent: CreatePostContent,
-        threadEventId: String?
-    ) {
-        viewModel.sendPost(roomId, postContent, threadEventId)
-    }
-
-    override fun onEditPost(roomId: String, postContent: CreatePostContent, eventId: String) {
-        viewModel.editPost(eventId, roomId, postContent)
-    }
-
-    override fun onCreatePoll(roomId: String, pollContent: CreatePollContent) {
-        viewModel.createPoll(roomId, pollContent)
-    }
-
-    override fun onEditPoll(roomId: String, eventId: String, pollContent: CreatePollContent) {
-        viewModel.editPoll(roomId, eventId, pollContent)
-    }
-
     override fun onEmojiSelected(roomId: String?, eventId: String?, emoji: String) {
         roomId ?: return
         eventId ?: return
diff --git a/app/src/main/java/org/futo/circles/feature/timeline/TimelineViewModel.kt b/app/src/main/java/org/futo/circles/feature/timeline/TimelineViewModel.kt
index 85c76ec8c1f7ebe9286428cb3906b463ddbabe87..5daeb58953725c16aafca677b1f143089501b8cf 100644
--- a/app/src/main/java/org/futo/circles/feature/timeline/TimelineViewModel.kt
+++ b/app/src/main/java/org/futo/circles/feature/timeline/TimelineViewModel.kt
@@ -40,7 +40,6 @@ class TimelineViewModel @Inject constructor(
     timelineDataSourceFactory: BaseTimelineDataSource.Factory,
     accessLevelDataSource: AccessLevelDataSource,
     knockRequestsDataSource: KnockRequestsDataSource,
-    private val sendMessageDataSource: SendMessageDataSource,
     private val postOptionsDataSource: PostOptionsDataSource,
     private val userOptionsDataSource: UserOptionsDataSource,
     private val readMessageDataSource: ReadMessageDataSource,
@@ -91,44 +90,6 @@ class TimelineViewModel @Inject constructor(
         }
     }
 
-    fun sendPost(roomId: String, postContent: CreatePostContent, threadEventId: String?) {
-        launchBg {
-            when (postContent) {
-                is MediaPostContent -> sendMessageDataSource.sendMedia(
-                    roomId,
-                    postContent.uri,
-                    postContent.caption,
-                    threadEventId,
-                    postContent.mediaType
-                )
-
-                is TextPostContent -> sendMessageDataSource.sendTextMessage(
-                    roomId, postContent.text, threadEventId
-                )
-            }
-        }
-    }
-
-    fun editPost(eventId: String, roomId: String, postContent: CreatePostContent) {
-        when (postContent) {
-            is MediaPostContent -> postContent.caption?.let {
-                sendMessageDataSource.editMediaCaption(eventId, roomId, postContent.caption)
-            }
-
-            is TextPostContent -> sendMessageDataSource.editTextMessage(
-                eventId, roomId, postContent.text
-            )
-        }
-    }
-
-    fun createPoll(roomId: String, pollContent: CreatePollContent) {
-        sendMessageDataSource.createPoll(roomId, pollContent)
-    }
-
-    fun editPoll(roomId: String, eventId: String, pollContent: CreatePollContent) {
-        sendMessageDataSource.editPoll(roomId, eventId, pollContent)
-    }
-
     fun sendReaction(roomId: String, eventId: String, emoji: String) {
         postOptionsDataSource.sendReaction(roomId, eventId, emoji)
     }
diff --git a/app/src/main/java/org/futo/circles/feature/timeline/poll/CreatePollDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/timeline/poll/CreatePollDialogFragment.kt
index 653128e2e0993ea4f0d72457bb40c7dc424e4e4a..32b118446ebea7db639849a7b02c84c5a24042ef 100644
--- a/app/src/main/java/org/futo/circles/feature/timeline/poll/CreatePollDialogFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/timeline/poll/CreatePollDialogFragment.kt
@@ -1,6 +1,5 @@
 package org.futo.circles.feature.timeline.poll
 
-import android.content.Context
 import android.os.Bundle
 import android.view.View
 import androidx.core.widget.doAfterTextChanged
@@ -8,10 +7,10 @@ import androidx.fragment.app.viewModels
 import androidx.navigation.fragment.navArgs
 import dagger.hilt.android.AndroidEntryPoint
 import org.futo.circles.R
+import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
 import org.futo.circles.core.extensions.getText
 import org.futo.circles.core.extensions.observeData
 import org.futo.circles.core.extensions.onBackPressed
-import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
 import org.futo.circles.core.model.CreatePollContent
 import org.futo.circles.databinding.DialogFragmentCreatePollBinding
 import org.matrix.android.sdk.api.session.room.model.message.PollType
@@ -28,14 +27,6 @@ class CreatePollDialogFragment :
 
     private val viewModel by viewModels<CreatePollViewModel>()
 
-    private var createPollListener: CreatePollListener? = null
-
-    override fun onAttach(context: Context) {
-        super.onAttach(context)
-        createPollListener =
-            parentFragmentManager.fragments.firstOrNull { it is CreatePollListener } as? CreatePollListener
-    }
-
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
         setupViews()
@@ -86,9 +77,7 @@ class CreatePollDialogFragment :
             binding.tilQuestion.getText(),
             binding.lvPostOptions.getOptionsList()
         )
-        args.eventId?.let {
-            createPollListener?.onEditPoll(args.roomId, it, pollContent)
-        } ?: createPollListener?.onCreatePoll(args.roomId, pollContent)
+        viewModel.onSendPoll(pollContent)
     }
 
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/feature/timeline/poll/CreatePollListener.kt b/app/src/main/java/org/futo/circles/feature/timeline/poll/CreatePollListener.kt
deleted file mode 100644
index 0d781e52be31d82f638c707f2ebace806227b9d2..0000000000000000000000000000000000000000
--- a/app/src/main/java/org/futo/circles/feature/timeline/poll/CreatePollListener.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.futo.circles.feature.timeline.poll
-
-import org.futo.circles.core.model.CreatePollContent
-
-interface CreatePollListener {
-    fun onCreatePoll(roomId: String, pollContent: CreatePollContent)
-    fun onEditPoll(roomId: String, eventId: String, pollContent: CreatePollContent)
-}
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/feature/timeline/poll/CreatePollViewModel.kt b/app/src/main/java/org/futo/circles/feature/timeline/poll/CreatePollViewModel.kt
index a48e10440656d30ca49bccc3ee54dbba9e16cd43..8934b4e4f5be1edde29b3bcae3accfdad1e1d861 100644
--- a/app/src/main/java/org/futo/circles/feature/timeline/poll/CreatePollViewModel.kt
+++ b/app/src/main/java/org/futo/circles/feature/timeline/poll/CreatePollViewModel.kt
@@ -5,7 +5,9 @@ import androidx.lifecycle.SavedStateHandle
 import androidx.lifecycle.ViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
 import org.futo.circles.core.extensions.getOrThrow
+import org.futo.circles.core.feature.timeline.post.SendMessageDataSource
 import org.futo.circles.core.mapping.toPollContent
+import org.futo.circles.core.model.CreatePollContent
 import org.futo.circles.core.model.PollContent
 import org.futo.circles.core.provider.MatrixSessionProvider
 import org.matrix.android.sdk.api.session.getRoom
@@ -13,7 +15,10 @@ import org.matrix.android.sdk.api.session.room.getTimelineEvent
 import javax.inject.Inject
 
 @HiltViewModel
-class CreatePollViewModel @Inject constructor(savedStateHandle: SavedStateHandle) : ViewModel() {
+class CreatePollViewModel @Inject constructor(
+    savedStateHandle: SavedStateHandle,
+    private val sendMessageDataSource: SendMessageDataSource
+) : ViewModel() {
 
     private val roomId: String = savedStateHandle.getOrThrow("roomId")
     private val eventId: String? = savedStateHandle["eventId"]
@@ -23,6 +28,12 @@ class CreatePollViewModel @Inject constructor(savedStateHandle: SavedStateHandle
         setEditPostInfo()
     }
 
+    fun onSendPoll(pollContent: CreatePollContent) {
+        eventId?.let {
+            sendMessageDataSource.editPoll(roomId, it, pollContent)
+        } ?: sendMessageDataSource.createPoll(roomId, pollContent)
+    }
+
     private fun setEditPostInfo() {
         eventId ?: return
         val session = MatrixSessionProvider.currentSession
diff --git a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt
index 61da25b5a8bb5915db5679c72b3b064a0c2ea4c5..a5900a07195e0f8bd8ebabf0e868d111219eee96 100644
--- a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt
@@ -39,13 +39,6 @@ class CreatePostDialogFragment : BottomSheetDialogFragment(), PreviewPostListene
     private val viewModel by viewModels<CreatePostViewModel>()
 
     private val mediaPickerHelper = MediaPickerHelper(this, isVideoAvailable = true)
-    private var createPostListener: CreatePostListener? = null
-
-    override fun onAttach(context: Context) {
-        super.onAttach(context)
-        createPostListener =
-            parentFragmentManager.fragments.lastOrNull { it is CreatePostListener } as? CreatePostListener
-    }
 
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
@@ -117,17 +110,6 @@ class CreatePostDialogFragment : BottomSheetDialogFragment(), PreviewPostListene
         binding?.vPostPreview?.setMedia(uri, type)
     }
 
-    private fun sendPost(content: CreatePostContent) {
-        if (args.isEdit) onEditPost(content)
-        else createPostListener?.onSendPost(
-            args.roomId, content, args.eventId
-        )
-    }
-
-    private fun onEditPost(content: CreatePostContent) {
-        val eventId = args.eventId ?: return
-        createPostListener?.onEditPost(args.roomId, content, eventId)
-    }
 
     override fun onUploadMediaClicked() {
         mediaPickerHelper.showMediaPickerDialog(
@@ -150,7 +132,7 @@ class CreatePostDialogFragment : BottomSheetDialogFragment(), PreviewPostListene
 
     override fun onSendClicked(content: CreatePostContent) {
         if (showNoInternetConnection()) return
-        sendPost(content)
+        viewModel.onSendAction(content)
         dismiss()
     }
 
diff --git a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostListener.kt b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostListener.kt
deleted file mode 100644
index 23b6c3ffbbf7a36cedd487441870eb2c9f20cb3d..0000000000000000000000000000000000000000
--- a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostListener.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.futo.circles.feature.timeline.post.create
-
-import org.futo.circles.model.CreatePostContent
-
-interface CreatePostListener {
-    fun onSendPost(roomId: String, postContent: CreatePostContent, threadEventId: String?)
-    fun onEditPost(roomId: String, postContent: CreatePostContent, eventId: String)
-}
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostViewModel.kt b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostViewModel.kt
index 7a426d93671f43ff925872f53965ad95bf7f62be..7b3565bee49544efc68a345da7741ed43af524c7 100644
--- a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostViewModel.kt
+++ b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostViewModel.kt
@@ -5,14 +5,20 @@ import androidx.lifecycle.SavedStateHandle
 import androidx.lifecycle.ViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
 import org.futo.circles.core.extensions.getOrThrow
-import org.futo.circles.core.model.PostContent
+import org.futo.circles.core.extensions.launchBg
 import org.futo.circles.core.feature.timeline.post.PostContentDataSource
+import org.futo.circles.core.feature.timeline.post.SendMessageDataSource
+import org.futo.circles.core.model.PostContent
+import org.futo.circles.model.CreatePostContent
+import org.futo.circles.model.MediaPostContent
+import org.futo.circles.model.TextPostContent
 import javax.inject.Inject
 
 @HiltViewModel
 class CreatePostViewModel @Inject constructor(
     savedStateHandle: SavedStateHandle,
-    private val postContentDataSource: PostContentDataSource
+    private val postContentDataSource: PostContentDataSource,
+    private val sendMessageDataSource: SendMessageDataSource
 ) : ViewModel() {
 
     private val roomId: String = savedStateHandle.getOrThrow("roomId")
@@ -25,9 +31,45 @@ class CreatePostViewModel @Inject constructor(
         if (isEdit) setEditPostInfo()
     }
 
+    fun onSendAction(content: CreatePostContent) {
+        if (isEdit) eventId?.let { editPost(it, roomId, content) }
+        else sendPost(roomId, content, eventId)
+    }
+
+
     private fun setEditPostInfo() {
         eventId ?: return
         val content = postContentDataSource.getPostContent(roomId, eventId) ?: return
         postToEditContentLiveData.value = content
     }
+
+    private fun sendPost(roomId: String, postContent: CreatePostContent, threadEventId: String?) {
+        launchBg {
+            when (postContent) {
+                is MediaPostContent -> sendMessageDataSource.sendMedia(
+                    roomId,
+                    postContent.uri,
+                    postContent.caption,
+                    threadEventId,
+                    postContent.mediaType
+                )
+
+                is TextPostContent -> sendMessageDataSource.sendTextMessage(
+                    roomId, postContent.text, threadEventId
+                )
+            }
+        }
+    }
+
+    private fun editPost(eventId: String, roomId: String, postContent: CreatePostContent) {
+        when (postContent) {
+            is MediaPostContent -> postContent.caption?.let {
+                sendMessageDataSource.editMediaCaption(eventId, roomId, postContent.caption)
+            }
+
+            is TextPostContent -> sendMessageDataSource.editTextMessage(
+                eventId, roomId, postContent.text
+            )
+        }
+    }
 }
\ No newline at end of file