Index: doc/user-guide/commands.xml
===================================================================
--- doc/user-guide/commands.xml	(revision b3d99e347e66e1559b86e7d3bf78ed8b087ec947)
+++ doc/user-guide/commands.xml	(revision b61c74c0e0941577b551cf54d8965893090ca282)
@@ -848,4 +848,5 @@
 				<varlistentry><term>follow &lt;screenname&gt;</term><listitem><para>Start following a person</para></listitem></varlistentry>
 				<varlistentry><term>unfollow &lt;screenname&gt;</term><listitem><para>Stop following a person</para></listitem></varlistentry>
+				<varlistentry><term>favourite &lt;screenname|#id&gt;</term><listitem><para>Favo<emphasis>u</emphasis>rite the given user's most recent tweet, or the given tweet ID.</para></listitem></varlistentry>
 				<varlistentry><term>post &lt;message&gt;</term><listitem><para>Post a tweet</para></listitem></varlistentry>
 			</variablelist>
Index: protocols/twitter/twitter.c
===================================================================
--- protocols/twitter/twitter.c	(revision b3d99e347e66e1559b86e7d3bf78ed8b087ec947)
+++ protocols/twitter/twitter.c	(revision b61c74c0e0941577b551cf54d8965893090ca282)
@@ -490,4 +490,27 @@
 }
 
+/** Convert the given bitlbee tweet ID, bitlbee username, or twitter tweet ID
+ *  into a twitter tweet ID.
+ *
+ *  Returns 0 if the user provides garbage.
+ */
+static guint64 twitter_message_id_from_command_arg(struct im_connection *ic, struct twitter_data *td, char *arg) {
+	struct twitter_user_data *tud;
+	bee_user_t *bu;
+	guint64 id = 0;
+	if (g_str_has_prefix(arg, "#") &&
+		sscanf(arg + 1, "%" G_GUINT64_FORMAT, &id) == 1) {
+		if (id < TWITTER_LOG_LENGTH && td->log)
+			id = td->log[id].id;
+	} else if ((bu = bee_user_by_handle(ic->bee, ic, arg)) &&
+		(tud = bu->data) && tud->last_id)
+		id = tud->last_id;
+	else if (sscanf(arg, "%" G_GUINT64_FORMAT, &id) == 1){
+		if (id < TWITTER_LOG_LENGTH && td->log)
+			id = td->log[id].id;
+	}
+	return id;
+}
+
 static void twitter_handle_command(struct im_connection *ic, char *message)
 {
@@ -517,4 +540,13 @@
 			twitter_msg(ic, "Could not undo last action");
 
+		g_free(cmds);
+		return;
+	} else if (g_strcasecmp(cmd[0], "favourite") == 0 && cmd[1]) {
+		guint64 id;
+		if ((id = twitter_message_id_from_command_arg(ic, td, cmd[1]))) {
+			twitter_favourite_tweet(ic, id);
+		} else {
+			twitter_msg(ic, "Please provide a message ID or username.");
+		}
 		g_free(cmds);
 		return;
@@ -546,19 +578,5 @@
 		return;
 	} else if (g_strcasecmp(cmd[0], "rt") == 0 && cmd[1]) {
-		struct twitter_user_data *tud;
-		bee_user_t *bu;
-		guint64 id;
-
-		if (g_str_has_prefix(cmd[1], "#") &&
-		    sscanf(cmd[1] + 1, "%" G_GUINT64_FORMAT, &id) == 1) {
-			if (id < TWITTER_LOG_LENGTH && td->log)
-				id = td->log[id].id;
-		} else if ((bu = bee_user_by_handle(ic->bee, ic, cmd[1])) &&
-		    (tud = bu->data) && tud->last_id)
-			id = tud->last_id;
-		else if (sscanf(cmd[1], "%" G_GUINT64_FORMAT, &id) == 1){
-			if (id < TWITTER_LOG_LENGTH && td->log)
-				id = td->log[id].id;
-		}
+		guint64 id = twitter_message_id_from_command_arg(ic, td, cmd[1]);
 
 		td->last_status_id = 0;
Index: protocols/twitter/twitter_lib.c
===================================================================
--- protocols/twitter/twitter_lib.c	(revision b3d99e347e66e1559b86e7d3bf78ed8b087ec947)
+++ protocols/twitter/twitter_lib.c	(revision b61c74c0e0941577b551cf54d8965893090ca282)
@@ -1083,2 +1083,14 @@
 	             ic, 1, args, 2);
 }
+
+/**
+ * Favourite a tweet.
+ */
+void twitter_favourite_tweet(struct im_connection *ic, guint64 id)
+{
+	char *url;
+	url = g_strdup_printf("%s%llu%s", TWITTER_FAVORITE_CREATE_URL,
+	                      (unsigned long long) id, ".xml");
+	twitter_http(ic, url, twitter_http_post, ic, 1, NULL, 0);
+	g_free(url);
+}
Index: protocols/twitter/twitter_lib.h
===================================================================
--- protocols/twitter/twitter_lib.h	(revision b3d99e347e66e1559b86e7d3bf78ed8b087ec947)
+++ protocols/twitter/twitter_lib.h	(revision b61c74c0e0941577b551cf54d8965893090ca282)
@@ -91,4 +91,5 @@
 void twitter_status_retweet(struct im_connection *ic, guint64 id);
 void twitter_report_spam(struct im_connection *ic, char *screen_name);
+void twitter_favourite_tweet(struct im_connection *ic, guint64 id);
 
 #endif //_TWITTER_LIB_H
