diff -ur empathy-2.32.0.1/libempathy-gtk/empathy-individual-view.c empathy-2.32.0.1.patched//libempathy-gtk/empathy-individual-view.c
--- empathy-2.32.0.1/libempathy-gtk/empathy-individual-view.c	2010-10-04 17:52:45.000000000 +0400
+++ empathy-2.32.0.1.patched//libempathy-gtk/empathy-individual-view.c	2010-10-26 18:59:07.000000000 +0400
@@ -93,6 +93,13 @@
 typedef struct
 {
   EmpathyIndividualView *view;
+  guint timeout_id;
+  gint distance;
+} AutoScrollData;
+
+typedef struct
+{
+  EmpathyIndividualView *view;
   FolksIndividual *individual;
   gboolean remove;
 } ShowActiveData;
@@ -549,6 +556,30 @@
   return FALSE;
 }
 
+
+#define AUTO_SCROLL_MARGIN_SIZE 20
+#define AUTO_SCROLL_PITCH       10
+
+static gboolean
+individual_view_auto_scroll_cb (AutoScrollData *data)
+{
+	GtkAdjustment         *adj;
+	gdouble                new_value;
+
+	adj = gtk_tree_view_get_vadjustment (GTK_TREE_VIEW (data->view));
+
+	if (data->distance < 0)
+		new_value = adj->value - AUTO_SCROLL_PITCH;
+	else
+		new_value = adj->value + AUTO_SCROLL_PITCH;
+
+	new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
+
+	gtk_adjustment_set_value (adj, new_value);
+
+	return TRUE;
+}
+
 static gboolean
 individual_view_drag_motion (GtkWidget *widget,
     GdkDragContext *context,
@@ -561,6 +592,7 @@
   GdkAtom target;
   GtkTreeIter iter;
   static DragMotionData *dm = NULL;
+  static AutoScrollData *as = NULL;
   GtkTreePath *path;
   gboolean is_row;
   gboolean is_different = FALSE;
@@ -570,6 +602,29 @@
   priv = GET_PRIV (EMPATHY_INDIVIDUAL_VIEW (widget));
   model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
 
+  if (as)
+    {
+      if (as->timeout_id)
+        g_source_remove (as->timeout_id);
+      g_free (as);
+      as = NULL;
+    }
+
+  if (y < AUTO_SCROLL_MARGIN_SIZE ||
+      y > (widget->allocation.height - AUTO_SCROLL_MARGIN_SIZE))
+    {
+      as = g_new0 (AutoScrollData, 1);
+
+      as->view = EMPATHY_INDIVIDUAL_VIEW (widget);
+      if (y < AUTO_SCROLL_MARGIN_SIZE)
+        as->distance = MIN (-y, -1);
+      else
+        as->distance = MAX (widget->allocation.height - y, 1);
+
+      as->timeout_id = g_timeout_add (10 * ABS (as->distance),
+          (GSourceFunc) individual_view_auto_scroll_cb, as);
+    }
+
   is_row = gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
       x, y, &path, NULL, NULL, NULL);
 
