diff --git a/app/src/main/java/org/futo/circles/feature/timeline/post/menu/PostMenuViewModel.kt b/app/src/main/java/org/futo/circles/feature/timeline/post/menu/PostMenuViewModel.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f35e18bbfe4b99dd11c6601399ef78099cd8577a
--- /dev/null
+++ b/app/src/main/java/org/futo/circles/feature/timeline/post/menu/PostMenuViewModel.kt
@@ -0,0 +1,53 @@
+package org.futo.circles.feature.timeline.post.menu
+
+import androidx.lifecycle.SavedStateHandle
+import androidx.lifecycle.ViewModel
+import dagger.hilt.android.lifecycle.HiltViewModel
+import org.futo.circles.core.extensions.getCurrentUserPowerLevel
+import org.futo.circles.core.extensions.getOrThrow
+import org.futo.circles.core.model.PollContent
+import org.futo.circles.core.model.PollState
+import org.futo.circles.core.model.PostContentType
+import org.futo.circles.core.model.canEdit
+import org.futo.circles.core.timeline.post.PostContentDataSource
+import org.matrix.android.sdk.api.session.room.powerlevels.Role
+import javax.inject.Inject
+
+
+@HiltViewModel
+class PostMenuViewModel @Inject constructor(
+    savedStateHandle: SavedStateHandle,
+    private val postContentDataSource: PostContentDataSource
+) : ViewModel() {
+
+    val roomId: String = savedStateHandle.getOrThrow("roomId")
+    val eventId: String = savedStateHandle.getOrThrow("eventId")
+
+    private val userPowerLevel = getCurrentUserPowerLevel(roomId)
+
+    fun getPostContent() = postContentDataSource.getPostContent(roomId, eventId)
+
+    fun getSenderId() = postContentDataSource.getPost(roomId, eventId)?.postInfo?.sender?.userId
+
+    fun canDeletePost() =
+        (areUserAbleToPost() && isMyPost()) || userPowerLevel >= Role.Moderator.value
+
+    fun canEditPost() = areUserAbleToPost() && isMyPost()
+            && getPostContent()?.type == PostContentType.TEXT_CONTENT
+
+    fun canEndPoll() = isPoll() && getPollState() != PollState.Ended && canDeletePost()
+
+    fun canEditPoll() =
+        isPoll() && isMyPost() && areUserAbleToPost() && getPollState()?.canEdit() == true
+
+    fun isMediaPost(): Boolean = getPostContent()?.isMedia() == true
+
+    fun isMyPost(): Boolean = postContentDataSource.getPost(roomId, eventId)?.isMyPost() == true
+
+    private fun areUserAbleToPost() = userPowerLevel >= Role.Default.value
+
+    private fun isPoll(): Boolean = getPostContent()?.isPoll() == true
+
+    private fun getPollState() = (getPostContent() as? PollContent)?.state
+
+}