diff --git a/libpurple/protocols/facebook/api.h b/libpurple/protocols/facebook/api.h
--- a/libpurple/protocols/facebook/api.h
+++ b/libpurple/protocols/facebook/api.h
@@ -764,16 +764,14 @@ fb_api_typing(FbApi *api, FbId uid, gboo
 /**
  * fb_api_event_dup:
  * @event: The #FbApiEvent or #NULL.
- * @deep: #TRUE to duplicate allocated data, otherwise #FALSE.
  *
- * Duplicates an #FbApiEvent. If @event is #NULL, a new zero filled
- * #FbApiEvent is returned. The returned #FbApiEvent should be freed
- * with #fb_api_event_free() when no longer needed.
+ * Duplicates an #FbApiEvent. The returned #FbApiEvent should be freed with
+ * #fb_api_event_free() when no longer needed.
  *
  * Returns: The new #FbApiEvent.
  */
 FbApiEvent *
-fb_api_event_dup(const FbApiEvent *event, gboolean deep);
+fb_api_event_dup(const FbApiEvent *event);
 
 /**
  * fb_api_event_reset:
@@ -797,16 +795,14 @@ fb_api_event_free(FbApiEvent *event);
 /**
  * fb_api_message_dup:
  * @msg: The #FbApiMessage or #NULL.
- * @deep: #TRUE to duplicate allocated data, otherwise #FALSE.
  *
- * Duplicates an #FbApiMessage. If @msg is #NULL, a new zero filled
- * #FbApiMessage is returned. The returned #FbApiMessage should be
- * freed with #fb_api_message_free() when no longer needed.
+ * Duplicates an #FbApiMessage. The returned #FbApiMessage should be freed with
+ * #fb_api_message_free() when no longer needed.
  *
  * Returns: The new #FbApiMessage.
  */
 FbApiMessage *
-fb_api_message_dup(const FbApiMessage *msg, gboolean deep);
+fb_api_message_dup(const FbApiMessage *msg);
 
 /**
  * fb_api_message_reset:
@@ -831,9 +827,8 @@ fb_api_message_free(FbApiMessage *msg);
  * fb_api_presence_dup:
  * @presence: The #FbApiPresence or %NULL.
  *
- * Duplicates an #FbApiPresence. If @presence is %NULL, a new zero filled
- * #FbApiPresence is returned. The returned #FbApiPresence should be freed with
- * #fb_api_presence_free() when no longer needed.
+ * Duplicates an #FbApiPresence. The returned #FbApiPresence should be freed
+ * with #fb_api_presence_free() when no longer needed.
  *
  * Returns: The new #FbApiPresence.
  */
@@ -861,16 +856,14 @@ fb_api_presence_free(FbApiPresence *pres
 /**
  * fb_api_thread_dup:
  * @thrd: The #FbApiThread or #NULL.
- * @deep: #TRUE to duplicate allocated data, otherwise #FALSE.
  *
- * Duplicates an #FbApiThread. If @thrd is #NULL, a new zero filled
- * #FbApiThread is returned. The returned #FbApiThread should be freed
- * with #fb_api_thread_free() when no longer needed.
+ * Duplicates an #FbApiThread. The returned #FbApiThread should be freed with
+ * #fb_api_thread_free() when no longer needed.
  *
  * Returns: The new #FbApiThread.
  */
 FbApiThread *
-fb_api_thread_dup(const FbApiThread *thrd, gboolean deep);
+fb_api_thread_dup(const FbApiThread *thrd);
 
 /**
  * fb_api_thread_reset:
@@ -895,9 +888,8 @@ fb_api_thread_free(FbApiThread *thrd);
  * fb_api_typing_dup:
  * @typg: The #FbApiTyping or #NULL.
  *
- * Duplicates an #FbApiTyping. If @typg is #NULL, a new zero filled
- * #FbApiTyping is returned. The returned #FbApiTyping should be freed
- * with #fb_api_typing_free() when no longer needed.
+ * Duplicates an #FbApiTyping. The returned #FbApiTyping should be freed with
+ * #fb_api_typing_free() when no longer needed.
  *
  * Returns: The new #FbApiTyping.
  */
@@ -925,16 +917,14 @@ fb_api_typing_free(FbApiTyping *typg);
 /**
  * fb_api_user_dup:
  * @user: The #FbApiUser or #NULL.
- * @deep: #TRUE to duplicate allocated data, otherwise #FALSE.
  *
- * Duplicates an #FbApiUser. If @user is #NULL, a new zero filled
- * #FbApiUser is returned. The returned #FbApiUser should be freed with
+ * Duplicates an #FbApiUser. The returned #FbApiUser should be freed with
  * #fb_api_user_free() when no longer needed.
  *
  * Returns: The new #FbApiUser.
  */
 FbApiUser *
-fb_api_user_dup(const FbApiUser *user, gboolean deep);
+fb_api_user_dup(const FbApiUser *user);
 
 /**
  * fb_api_user_reset:
# HG changeset patch
# Node ID 4bfea5383ebc
# Parent  3be3657fab2f
diff --git a/libpurple/protocols/facebook/api.c b/libpurple/protocols/facebook/api.c
--- a/libpurple/protocols/facebook/api.c
+++ b/libpurple/protocols/facebook/api.c
@@ -1145,9 +1145,10 @@ fb_api_event_parse(FbApi *api, FbApiEven
 		str = strrchr(str, ':');
 
 		if (str != NULL) {
-			devent = fb_api_event_dup(event, FALSE);
+			devent = g_new(FbApiEvent, 1);
 			devent->type = FB_API_EVENT_TYPE_THREAD_TOPIC;
 			devent->uid = FB_ID_FROM_STR(str + 1);
+			devent->tid = event->tid;
 			devent->text = fb_json_values_next_str_dup(values, NULL);
 			events = g_slist_prepend(events, devent);
 		}
@@ -1165,9 +1166,10 @@ fb_api_event_parse(FbApi *api, FbApiEven
 			str = strrchr(str, ':');
 
 			if (str != NULL) {
-				devent = fb_api_event_dup(event, FALSE);
+				devent = g_new0(FbApiEvent, 1);
 				devent->type = evtypes[i].type;
 				devent->uid = FB_ID_FROM_STR(str + 1);
+				devent->tid = event->tid;
 				events = g_slist_prepend(events, devent);
 			}
 		}
@@ -1384,7 +1386,7 @@ fb_api_message_parse_attach(FbApi *api, 
 
 		if (str == NULL) {
 			id = fb_json_values_next_int(values, 0);
-			dmsg = fb_api_message_dup(msg, FALSE);
+			dmsg = g_memdup2(msg, sizeof(*msg));
 			fb_api_attach(api, id, mid, dmsg);
 			continue;
 		}
@@ -1399,7 +1401,7 @@ fb_api_message_parse_attach(FbApi *api, 
 		xma = fb_api_xma_parse(api, body, xode, &err);
 
 		if (xma != NULL) {
-			dmsg = fb_api_message_dup(msg, FALSE);
+			dmsg = g_memdup2(msg, sizeof(*msg));
 			dmsg->text = xma;
 			msgs = g_slist_prepend(msgs, dmsg);
 		}
@@ -1627,7 +1629,7 @@ fb_api_cb_publish_ms_new_message(FbApi *
 		body = fb_json_values_next_str(values, NULL);
 
 		if (body != NULL) {
-			dmsg = fb_api_message_dup(&msg, FALSE);
+			dmsg = g_memdup2(&msg, sizeof(msg));
 			dmsg->text = g_strdup(body);
 			msgs = g_slist_prepend(msgs, dmsg);
 		}
@@ -1635,7 +1637,7 @@ fb_api_cb_publish_ms_new_message(FbApi *
 		id = fb_json_values_next_int(values, 0);
 
 		if (id != 0) {
-			dmsg = fb_api_message_dup(&msg, FALSE);
+			dmsg = g_memdup2(&msg, sizeof(msg));
 			fb_api_sticker(api, id, dmsg);
 		}
 
@@ -1706,7 +1708,7 @@ fb_api_cb_publish_ms_event(FbApi *api, J
 
 	fb_json_values_update(values, &err);
 
-	event = fb_api_event_dup(NULL, FALSE);
+	event = g_new0(FbApiEvent, 1);
 	event->type = type;
 	event->tid = fb_json_values_next_int(values, 0);
 	event->uid = fb_json_values_next_int(values, 0);
@@ -1720,15 +1722,16 @@ fb_api_cb_publish_ms_event(FbApi *api, J
 	} else if (type == FB_API_EVENT_TYPE_THREAD_USER_ADDED) {
 
 		while (fb_json_values_update(values_inner, &err)) {
-			FbApiEvent *devent = fb_api_event_dup(event, FALSE);
-
+			FbApiEvent *devent = g_new0(FbApiEvent, 1);
+
+			devent->type = event->type;
 			devent->uid = fb_json_values_next_int(values_inner, 0);
+			devent->tid = event->tid;
 			devent->text = fb_json_values_next_str_dup(values_inner, NULL);
 
 			events = g_slist_prepend(events, devent);
 		}
-		fb_api_event_free(event);
-		event = NULL;
+		g_clear_pointer(&event, fb_api_event_free);
 		g_object_unref(values_inner);
 	}
 
@@ -1785,7 +1788,7 @@ fb_api_cb_publish_pt(FbThrift *thft, GSL
 		FB_API_TCHK(id == 2);
 		FB_API_TCHK(fb_thrift_read_i32(thft, &i32));
 
-		api_presence = fb_api_presence_dup(NULL);
+		api_presence = g_new0(FbApiPresence, 1);
 		api_presence->uid = i64;
 		api_presence->active = i32 != 0;
 		*presences = g_slist_prepend(*presences, api_presence);
@@ -2267,7 +2270,7 @@ fb_api_cb_contacts_nodes(FbApi *api, Jso
 			continue;
 		}
 
-		user = fb_api_user_dup(NULL, FALSE);
+		user = g_new0(FbApiUser, 1);
 		user->uid = uid;
 		user->name = fb_json_values_next_str_dup(values, NULL);
 		user->icon = fb_json_values_next_str_dup(values, NULL);
@@ -2534,7 +2537,7 @@ fb_api_message(FbApi *api, FbId id, gboo
 	g_return_if_fail(text != NULL);
 	priv = api->priv;
 
-	msg = fb_api_message_dup(NULL, FALSE);
+	msg = g_new0(FbApiMessage, 1);
 	msg->text = g_strdup(text);
 
 	if (thread) {
@@ -2629,7 +2632,7 @@ fb_api_cb_unread_parse_attach(FbApi *api
 	while (fb_json_values_update(values, &err)) {
 		str = fb_json_values_next_str(values, NULL);
 		id = FB_ID_FROM_STR(str);
-		dmsg = fb_api_message_dup(msg, FALSE);
+		dmsg = g_memdup2(msg, sizeof(*msg));
 		fb_api_attach(api, id, mid, dmsg);
 	}
 
@@ -2715,7 +2718,7 @@ fb_api_cb_unread_msgs(G_GNUC_UNUSED Soup
 		msg.tstamp = g_ascii_strtoll(str, NULL, 10);
 
 		if (body != NULL) {
-			dmsg = fb_api_message_dup(&msg, FALSE);
+			dmsg = g_memdup2(&msg, sizeof(msg));
 			dmsg->text = g_strdup(body);
 			msgs = g_slist_prepend(msgs, dmsg);
 		}
@@ -2723,7 +2726,7 @@ fb_api_cb_unread_msgs(G_GNUC_UNUSED Soup
 		str = fb_json_values_next_str(values, NULL);
 
 		if (str != NULL) {
-			dmsg = fb_api_message_dup(&msg, FALSE);
+			dmsg = g_memdup2(&msg, sizeof(msg));
 			id = FB_ID_FROM_STR(str);
 			fb_api_sticker(api, id, dmsg);
 		}
@@ -2735,7 +2738,7 @@ fb_api_cb_unread_msgs(G_GNUC_UNUSED Soup
 			xma = fb_api_xma_parse(api, body, xode, &err);
 
 			if (xma != NULL) {
-				dmsg = fb_api_message_dup(&msg, FALSE);
+				dmsg = g_memdup2(&msg, sizeof(msg));
 				dmsg->text = xma;
 				msgs = g_slist_prepend(msgs, dmsg);
 			}
@@ -2959,7 +2962,7 @@ fb_api_thread_parse(FbApi *api, FbApiThr
 		num_users++;
 
 		if (uid != priv->uid) {
-			user = fb_api_user_dup(NULL, FALSE);
+			user = g_new0(FbApiUser, 1);
 			user->uid = uid;
 			user->name = fb_json_values_next_str_dup(values, NULL);
 			thrd->users = g_slist_prepend(thrd->users, user);
@@ -3209,7 +3212,7 @@ fb_api_cb_threads(G_GNUC_UNUSED SoupSess
 		fb_api_thread_reset(&thrd, FALSE);
 
 		if (fb_api_thread_parse(api, &thrd, l->data, &err)) {
-			dthrd = fb_api_thread_dup(&thrd, FALSE);
+			dthrd = g_memdup2(&thrd, sizeof(thrd));
 			thrds = g_slist_prepend(thrds, dthrd);
 		} else {
 			fb_api_thread_reset(&thrd, TRUE);
@@ -3261,19 +3264,16 @@ fb_api_typing(FbApi *api, FbId uid, gboo
 }
 
 FbApiEvent *
-fb_api_event_dup(const FbApiEvent *event, gboolean deep)
+fb_api_event_dup(const FbApiEvent *event)
 {
 	FbApiEvent *ret;
 
 	if (event == NULL) {
-		return g_new0(FbApiEvent, 1);
+		return NULL;
 	}
 
 	ret = g_memdup2(event, sizeof *event);
-
-	if (deep) {
-		ret->text = g_strdup(event->text);
-	}
+	ret->text = g_strdup(event->text);
 
 	return ret;
 }
@@ -3300,19 +3300,16 @@ fb_api_event_free(FbApiEvent *event)
 }
 
 FbApiMessage *
-fb_api_message_dup(const FbApiMessage *msg, gboolean deep)
+fb_api_message_dup(const FbApiMessage *msg)
 {
 	FbApiMessage *ret;
 
 	if (msg == NULL) {
-		return g_new0(FbApiMessage, 1);
+		return NULL;
 	}
 
 	ret = g_memdup2(msg, sizeof *msg);
-
-	if (deep) {
-		ret->text = g_strdup(msg->text);
-	}
+	ret->text = g_strdup(msg->text);
 
 	return ret;
 }
@@ -3341,10 +3338,6 @@ fb_api_message_free(FbApiMessage *msg)
 FbApiPresence *
 fb_api_presence_dup(const FbApiPresence *presence)
 {
-	if (presence == NULL) {
-		return g_new0(FbApiPresence, 1);
-	}
-
 	return g_memdup2(presence, sizeof *presence);
 }
 
@@ -3364,29 +3357,17 @@ fb_api_presence_free(FbApiPresence *pres
 }
 
 FbApiThread *
-fb_api_thread_dup(const FbApiThread *thrd, gboolean deep)
+fb_api_thread_dup(const FbApiThread *thrd)
 {
 	FbApiThread *ret;
-	FbApiUser *user;
-	GSList *l;
 
 	if (thrd == NULL) {
-		return g_new0(FbApiThread, 1);
+		return NULL;
 	}
 
 	ret = g_memdup2(thrd, sizeof *thrd);
-
-	if (deep) {
-		ret->users = NULL;
-
-		for (l = thrd->users; l != NULL; l = l->next) {
-			user = fb_api_user_dup(l->data, TRUE);
-			ret->users = g_slist_prepend(ret->users, user);
-		}
-
-		ret->topic = g_strdup(thrd->topic);
-		ret->users = g_slist_reverse(ret->users);
-	}
+	ret->topic = g_strdup(thrd->topic);
+	ret->users = g_slist_copy_deep(thrd->users, (GCopyFunc)fb_api_user_dup, NULL);
 
 	return ret;
 }
@@ -3417,10 +3398,6 @@ fb_api_thread_free(FbApiThread *thrd)
 FbApiTyping *
 fb_api_typing_dup(const FbApiTyping *typg)
 {
-	if (typg == NULL) {
-		return g_new0(FbApiTyping, 1);
-	}
-
 	return g_memdup2(typg, sizeof *typg);
 }
 
@@ -3440,21 +3417,18 @@ fb_api_typing_free(FbApiTyping *typg)
 }
 
 FbApiUser *
-fb_api_user_dup(const FbApiUser *user, gboolean deep)
+fb_api_user_dup(const FbApiUser *user)
 {
 	FbApiUser *ret;
 
 	if (user == NULL) {
-		return g_new0(FbApiUser, 1);
+		return NULL;
 	}
 
 	ret = g_memdup2(user, sizeof *user);
-
-	if (deep) {
-		ret->name = g_strdup(user->name);
-		ret->icon = g_strdup(user->icon);
-		ret->csum = g_strdup(user->csum);
-	}
+	ret->name = g_strdup(user->name);
+	ret->icon = g_strdup(user->icon);
+	ret->csum = g_strdup(user->csum);
 
 	return ret;
 }
diff --git a/libpurple/protocols/facebook/facebook.c b/libpurple/protocols/facebook/facebook.c
--- a/libpurple/protocols/facebook/facebook.c
+++ b/libpurple/protocols/facebook/facebook.c
@@ -425,7 +425,7 @@ fb_cb_api_events(FbApi *api, GSList *eve
 		case FB_API_EVENT_TYPE_THREAD_USER_ADDED:
 			if (purple_blist_find_buddy(acct, uid) == NULL) {
 				if (event->text) {
-					FbApiUser *user = fb_api_user_dup(NULL, FALSE);
+					FbApiUser *user = g_new0(FbApiUser, 1);
 					user->uid = event->uid;
 					user->name = g_strdup(event->text);
 
@@ -531,7 +531,7 @@ fb_cb_api_messages(FbApi *api, GSList *m
 		FB_ID_TO_STR(msg->uid, uid);
 
 		if (purple_blist_find_buddy(acct, uid) == NULL) {
-			msg = fb_api_message_dup(msg, TRUE);
+			msg = fb_api_message_dup(msg);
 			fb_data_add_message(fata, msg);
 			fb_api_contact(api, msg->uid);
 			continue;
@@ -548,7 +548,7 @@ fb_cb_api_messages(FbApi *api, GSList *m
 
 		if (msg->flags & FB_API_MESSAGE_FLAG_IMAGE) {
 			if (!(msg->flags & FB_API_MESSAGE_FLAG_DONE)) {
-				msg = fb_api_message_dup(msg, TRUE);
+				msg = fb_api_message_dup(msg);
 				fb_data_image_add(fata, msg->text, fb_cb_image,
 				                  msg, (GDestroyNotify)
 				                       fb_api_message_free);
