diff --git a/libpurple/purplemessage.h b/libpurple/purplemessage.h
--- a/libpurple/purplemessage.h
+++ b/libpurple/purplemessage.h
@@ -557,6 +557,31 @@
 void purple_message_set_notice(PurpleMessage *message, gboolean notice);
 
 /**
+ * purple_message_get_system:
+ * @message: The instance.
+ *
+ * Gets whether or not @message is a system message.
+ *
+ * Returns: %TRUE if @message is a system message, otherwise %FALSE.
+ *
+ * Since: 3.0
+ */
+PURPLE_AVAILABLE_IN_3_0
+gboolean purple_message_get_system(PurpleMessage *message);
+
+/**
+ * purple_message_set_system:
+ * @message: The instance.
+ * @system: %TRUE to mark @message as a system message.
+ *
+ * Sets whether or not @message is a system message.
+ *
+ * Since: 3.0
+ */
+PURPLE_AVAILABLE_IN_3_0
+void purple_message_set_system(PurpleMessage *message, gboolean system);
+
+/**
  * purple_message_get_timestamp:
  * @message: The message.
  *
# HG changeset patch
# Node ID d5ccac2bbc982e4676d9ce5d030509c814af1280
# Parent  1f1614e5468b68d07c26dd248030673dc6e55a22
diff --git a/libpurple/purplemessage.c b/libpurple/purplemessage.c
--- a/libpurple/purplemessage.c
+++ b/libpurple/purplemessage.c
@@ -36,9 +36,11 @@
 	char *author_alias;
 
 	char *contents;
-	gboolean action;
-	gboolean event;
-	gboolean notice;
+
+	guint action : 1;
+	guint event : 1;
+	guint notice : 1;
+	guint system : 1;
 
 	GDateTime *timestamp;
 	PurpleMessageFlags flags;
@@ -68,6 +70,7 @@
 	PROP_FLAGS,
 	PROP_ID,
 	PROP_NOTICE,
+	PROP_SYSTEM,
 	PROP_TIMESTAMP,
 	N_PROPERTIES,
 };
@@ -144,6 +147,9 @@
 	case PROP_NOTICE:
 		g_value_set_boolean(value, purple_message_get_notice(message));
 		break;
+	case PROP_SYSTEM:
+		g_value_set_boolean(value, purple_message_get_system(message));
+		break;
 	case PROP_TIMESTAMP:
 		g_value_set_boxed(value, purple_message_get_timestamp(message));
 		break;
@@ -204,6 +210,9 @@
 	case PROP_NOTICE:
 		purple_message_set_notice(message, g_value_get_boolean(value));
 		break;
+	case PROP_SYSTEM:
+		purple_message_set_system(message, g_value_get_boolean(value));
+		break;
 	case PROP_TIMESTAMP:
 		purple_message_set_timestamp(message, g_value_get_boxed(value));
 		break;
@@ -454,6 +463,20 @@
 		G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
 
 	/**
+	 * PurpleMessage:system:
+	 *
+	 * Whether or not this is a system message.
+	 *
+	 * System messages are used to represented error and warnings to the user.
+	 *
+	 * Since: 3.0
+	 */
+	properties[PROP_SYSTEM] = g_param_spec_boolean(
+		"system", NULL, NULL,
+		FALSE,
+		G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+	/**
 	 * PurpleMessage:timestamp:
 	 *
 	 * The timestamp of the message.
@@ -565,6 +588,7 @@
 		"contents", contents,
 		"timestamp", dt,
 		"flags", flags,
+		"system", TRUE,
 		NULL);
 
 	g_date_time_unref(dt);
@@ -842,6 +866,24 @@
 	}
 }
 
+gboolean
+purple_message_get_system(PurpleMessage *message) {
+	g_return_val_if_fail(PURPLE_IS_MESSAGE(message), FALSE);
+
+	return message->system;
+}
+
+void
+purple_message_set_system(PurpleMessage *message, gboolean system) {
+	g_return_if_fail(PURPLE_IS_MESSAGE(message));
+
+	if(message->system != system) {
+		message->system = system;
+
+		g_object_notify_by_pspec(G_OBJECT(message), properties[PROP_SYSTEM]);
+	}
+}
+
 GDateTime *
 purple_message_get_timestamp(PurpleMessage *message) {
 	g_return_val_if_fail(PURPLE_IS_MESSAGE(message), 0);
diff --git a/libpurple/tests/test_message.c b/libpurple/tests/test_message.c
--- a/libpurple/tests/test_message.c
+++ b/libpurple/tests/test_message.c
@@ -56,6 +56,7 @@
 	gboolean edited = FALSE;
 	gboolean event = FALSE;
 	gboolean notice = FALSE;
+	gboolean system = FALSE;
 
 	timestamp = g_date_time_new_from_unix_utc(911347200);
 	error = g_error_new(g_quark_from_static_string("test-message"), 0,
@@ -79,6 +80,7 @@
 		"flags", PURPLE_MESSAGE_SYSTEM,
 		"id", "id",
 		"notice", TRUE,
+		"system", TRUE,
 		"timestamp", timestamp,
 		NULL);
 
@@ -98,6 +100,7 @@
 		"flags", &flags,
 		"id", &id,
 		"notice", &notice,
+		"system", &system,
 		"timestamp", &timestamp1,
 		NULL);
 
@@ -136,6 +139,8 @@
 
 	g_assert_true(notice);
 
+	g_assert_true(system);
+
 	g_assert_true(g_date_time_equal(timestamp1, timestamp));
 	g_clear_pointer(&timestamp, g_date_time_unref);
 	g_clear_pointer(&timestamp1, g_date_time_unref);
