diff --git a/matrix/api.py b/matrix/api.py
index dcb4fa6..021816d 100644
--- a/matrix/api.py
+++ b/matrix/api.py
@@ -450,6 +450,34 @@ class MatrixBacklogMessage(MatrixGenericMessage):
         )
 
 
+class MatrixJoinMessage(MatrixGenericMessage):
+    def __init__(self, client, room_id):
+        self.room_id = room_id
+
+        data = {"room_id": self.room_id}
+
+        MatrixGenericMessage.__init__(
+            self,
+            MessageType.JOIN,
+            client.room_join,
+            data
+        )
+
+
+class MatrixPartMessage(MatrixGenericMessage):
+    def __init__(self, client, room_id):
+        self.room_id = room_id
+
+        data = {"room_id": self.room_id}
+
+        MatrixGenericMessage.__init__(
+            self,
+            MessageType.PART,
+            client.room_leave,
+            data
+        )
+
+
 class MatrixUser:
     def __init__(self, name, display_name):
         self.name = name                  # type: str
diff --git a/matrix/commands.py b/matrix/commands.py
index d1be2a3..f388435 100644
--- a/matrix/commands.py
+++ b/matrix/commands.py
@@ -29,7 +29,9 @@ from matrix.api import (
     MessageType,
     MatrixTopicMessage,
     MatrixRedactMessage,
-    MatrixBacklogMessage
+    MatrixBacklogMessage,
+    MatrixJoinMessage,
+    MatrixPartMessage
 )
 from matrix.utils import key_from_value, tags_from_line_data
 from matrix.plugin_options import DebugType
@@ -190,10 +192,8 @@ def matrix_command_join_cb(data, buffer, command):
             return
 
         _, room_id = split_args
-        message = MatrixMessage(
-            server,
-            OPTIONS,
-            MessageType.JOIN,
+        message = MatrixJoinMessage(
+            server.client,
             room_id=room_id
         )
         server.send_or_queue(message)
@@ -231,10 +231,8 @@ def matrix_command_part_cb(data, buffer, command):
             rooms = rooms.split(" ")
 
         for room_id in rooms:
-            message = MatrixMessage(
-                server,
-                OPTIONS,
-                MessageType.PART,
+            message = MatrixPartMessage(
+                server.client,
                 room_id=room_id
             )
             server.send_or_queue(message)