diff --git a/changelog.d/3802.bugfix b/changelog.d/3802.bugfix
new file mode 100644
index 0000000000..59c3f8526c
--- /dev/null
+++ b/changelog.d/3802.bugfix
@@ -0,0 +1 @@
+Stop VMs playing in the timeline if a new VM recording is started
\ No newline at end of file
diff --git a/changelog.d/3817.feature b/changelog.d/3817.feature
new file mode 100644
index 0000000000..f9854db647
--- /dev/null
+++ b/changelog.d/3817.feature
@@ -0,0 +1 @@
+Voice Message - Enable by default, remove from labs
\ No newline at end of file
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt
index e50d6c8df3..057b4f2703 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt
@@ -971,7 +971,7 @@ class RoomDetailFragment @Inject constructor(
         autoCompleter.exitSpecialMode()
         views.composerLayout.collapse()
 
-        views.voiceMessageRecorderView.isVisible = text.isBlank() && vectorPreferences.labsUseVoiceMessage()
+        views.voiceMessageRecorderView.isVisible = text.isBlank()
 
         updateComposerText(text)
         views.composerLayout.views.sendButton.contentDescription = getString(R.string.send)
@@ -1301,7 +1301,7 @@ class RoomDetailFragment @Inject constructor(
             }
 
             override fun onTextBlankStateChanged(isBlank: Boolean) {
-                if (!views.composerLayout.views.sendButton.isVisible && vectorPreferences.labsUseVoiceMessage()) {
+                if (!views.composerLayout.views.sendButton.isVisible) {
                     // Animate alpha to prevent overlapping with the animation of the send button
                     views.voiceMessageRecorderView.alpha = 0f
                     views.voiceMessageRecorderView.isVisible = true
@@ -1374,10 +1374,10 @@ class RoomDetailFragment @Inject constructor(
                 if (state.canSendMessage) {
                     if (!views.voiceMessageRecorderView.isActive()) {
                         views.composerLayout.isVisible = true
-                        views.voiceMessageRecorderView.isVisible = vectorPreferences.labsUseVoiceMessage() && views.composerLayout.text?.isBlank().orFalse()
+                        views.voiceMessageRecorderView.isVisible = views.composerLayout.text?.isBlank().orFalse()
                         views.composerLayout.setRoomEncrypted(summary.isEncrypted)
                         views.notificationAreaView.render(NotificationAreaView.State.Hidden)
-                        views.composerLayout.alwaysShowSendButton = !vectorPreferences.labsUseVoiceMessage()
+                        views.composerLayout.alwaysShowSendButton = false
                     }
                 } else {
                     views.composerLayout.isVisible = false
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
index 1196a845e3..446d4161e3 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
@@ -68,7 +68,8 @@ class VoiceMessagePlaybackTracker @Inject constructor() {
                 .forEach { key ->
                     val state = states[key]
                     if (state is Listener.State.Playing) {
-                        setState(key, Listener.State.Paused(state.playbackTime))
+                        // Paused(state.playbackTime) state should also be considered later.
+                        setState(key, Listener.State.Idle)
                     }
                 }
     }
diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt
index fbc9f5836e..e3949983fc 100755
--- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt
@@ -154,8 +154,6 @@ class VectorPreferences @Inject constructor(private val context: Context) {
         const val SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE = "SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE"
         const val SETTINGS_LABS_SPACES_HOME_AS_ORPHAN = "SETTINGS_LABS_SPACES_HOME_AS_ORPHAN"
 
-        const val SETTINGS_LABS_VOICE_MESSAGE = "SETTINGS_LABS_VOICE_MESSAGE"
-
         private const val SETTINGS_DEVELOPER_MODE_PREFERENCE_KEY = "SETTINGS_DEVELOPER_MODE_PREFERENCE_KEY"
         private const val SETTINGS_LABS_SHOW_HIDDEN_EVENTS_PREFERENCE_KEY = "SETTINGS_LABS_SHOW_HIDDEN_EVENTS_PREFERENCE_KEY"
         private const val SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY = "SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY"
@@ -989,8 +987,4 @@ class VectorPreferences @Inject constructor(private val context: Context) {
             putInt(TAKE_PHOTO_VIDEO_MODE, mode)
         }
     }
-
-    fun labsUseVoiceMessage(): Boolean {
-        return defaultPrefs.getBoolean(SETTINGS_LABS_VOICE_MESSAGE, false)
-    }
 }
diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml
index 50227590be..1e0f736db2 100644
--- a/vector/src/main/res/xml/vector_settings_labs.xml
+++ b/vector/src/main/res/xml/vector_settings_labs.xml
@@ -57,9 +57,4 @@
         android:key="SETTINGS_LABS_SPACES_HOME_AS_ORPHAN"
         android:title="@string/labs_space_show_orphan_in_home"/>
 
-    <im.vector.app.core.preference.VectorSwitchPreference
-        android:defaultValue="false"
-        android:key="SETTINGS_LABS_VOICE_MESSAGE"
-        android:title="@string/labs_use_voice_message"/>
-
 </androidx.preference.PreferenceScreen>
\ No newline at end of file