diff --git a/libempathy/empathy-contact.c b/libempathy/empathy-contact.c
index ec5d83a..d102216 100644
--- a/libempathy/empathy-contact.c
+++ b/libempathy/empathy-contact.c
@@ -1737,7 +1737,8 @@ empathy_contact_dup_from_tp_contact (TpContact *tp_contact)
 }
 
 static int
-presence_sort_func (EmpathyContact *a, EmpathyContact *b)
+presence_cmp_func (EmpathyContact *a,
+    EmpathyContact *b)
 {
   FolksPresence *presence_a, *presence_b;
 
@@ -1750,29 +1751,108 @@ presence_sort_func (EmpathyContact *a, EmpathyContact *b)
       folks_presence_get_presence_type (presence_b));
 }
 
-/* Sort by presence as with presence_sort_func(), but if the two contacts have
+static gint
+voip_cmp_func (EmpathyContact *a,
+    EmpathyContact *b)
+{
+  gboolean has_audio_a, has_audio_b;
+  gboolean has_video_a, has_video_b;
+
+  has_audio_a = empathy_contact_can_voip_audio (a);
+  has_audio_b = empathy_contact_can_voip_audio (b);
+  has_video_a = empathy_contact_can_voip_video (a);
+  has_video_b = empathy_contact_can_voip_video (b);
+
+  /* First check video */
+  if (has_video_a == has_video_b)
+    {
+      /* Use audio to to break tie */
+      if (has_audio_a == has_audio_b)
+        return 0;
+      else if (has_audio_a)
+        return -1;
+      else
+        return 1;
+    }
+  else if (has_video_a)
+    return -1;
+  else
+    return 1;
+}
+
+static gint
+ft_cmp_func (EmpathyContact *a,
+    EmpathyContact *b)
+{
+  gboolean can_send_files_a, can_send_files_b;
+
+  can_send_files_a = empathy_contact_can_send_files (a);
+  can_send_files_b = empathy_contact_can_send_files (b);
+
+  if (can_send_files_a == can_send_files_b)
+    return 0;
+  else if (can_send_files_a)
+    return -1;
+  else
+    return 1;
+}
+
+static gint
+rfb_stream_tube_cmp_func (EmpathyContact *a,
+    EmpathyContact *b)
+{
+  gboolean rfb_a, rfb_b;
+
+  rfb_a = empathy_contact_can_use_rfb_stream_tube (a);
+  rfb_b = empathy_contact_can_use_rfb_stream_tube (b);
+
+  if (rfb_a == rfb_b)
+    return 0;
+  else if (rfb_a)
+    return -1;
+  else
+    return 1;
+}
+
+/* Sort by presence as with presence_cmp_func(), but if the two contacts have
  * the same presence, prefer the one which can do both audio *and* video calls,
  * over the one which can only do one of the two. */
 static int
 voip_sort_func (EmpathyContact *a, EmpathyContact *b)
 {
-  gboolean has_audio_video_a, has_audio_video_b;
-  gint presence_sort = presence_sort_func (a, b);
+  gint presence_sort = presence_cmp_func (a, b);
 
   if (presence_sort != 0)
     return presence_sort;
 
-  has_audio_video_a = empathy_contact_can_voip_audio (a) &&
-      empathy_contact_can_voip_video (a);
-  has_audio_video_b = empathy_contact_can_voip_audio (b) &&
-      empathy_contact_can_voip_video (b);
+  return voip_cmp_func (a, b);
+}
 
-  if (has_audio_video_a && !has_audio_video_b)
-    return -1;
-  else if (!has_audio_video_a && has_audio_video_b)
-    return 1;
-  else
-    return 0;
+/* Sort by presence as with presence_cmp_func() and then break ties using the
+ * most "capabable" individual. So users will be able to pick more actions on
+ * the contact in the "Contact" menu of the chat window. */
+static gint
+chat_sort_func (EmpathyContact *a,
+    EmpathyContact *b)
+{
+  gint result;
+
+  result = presence_cmp_func (a, b);
+  if (result != 0)
+    return result;
+
+  /* Prefer individual supporting file transfer */
+  result = ft_cmp_func (a, b);
+  if (result != 0)
+    return result;
+
+  /* Check audio/video capabilities */
+  result = voip_cmp_func (a, b);
+  if (result != 0)
+    return result;
+
+  /* Check 'Share my destop' feature */
+  return rfb_stream_tube_cmp_func (a, b);
 }
 
 static GCompareFunc
@@ -1784,11 +1864,12 @@ get_sort_func_for_action (EmpathyActionType action_type)
       case EMPATHY_ACTION_VIDEO_CALL:
         return (GCompareFunc) voip_sort_func;
       case EMPATHY_ACTION_CHAT:
+        return (GCompareFunc) chat_sort_func;
       case EMPATHY_ACTION_VIEW_LOGS:
       case EMPATHY_ACTION_SEND_FILE:
       case EMPATHY_ACTION_SHARE_MY_DESKTOP:
       default:
-        return (GCompareFunc) presence_sort_func;
+        return (GCompareFunc) presence_cmp_func;
     }
 }
 
