diff --git a/ChangeLog b/ChangeLog
index 29cee4f927c1c7c62473b7e7cc500fbe380d7ab3..975a67aacd26c55c88e2769138d63b7d4bd98716 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2005-07-15	Benedikt Meurer <benny@xfce.org>
+
+	* docs/papers/HackingOnThunar.odt: Improve the "Hacking on Thunar"
+	  guide.
+	* thunar-vfs/thunar-vfs-volume.{c,h}: Change the icon lookup mechanism
+	  to return an icon name instead of a GtkIconInfo object. Also allow
+	  the ThunarVfsVolume implementation to specify a custom icon by
+	  overriding the lookup_icon_name() method. Add a new method
+	  get_free_space() which can be used to determine the amount of free
+	  space on a given volume.
+	* thunar-vfs/thunar-vfs-volume-bsd.c: Catch up with the changes to
+	  ThunarVfsVolume.
+	* thunar/thunar-favourites-model.c: Cache icons for the favourites and
+	  reload them whenever the file/volume changes. Adopt the new icon
+	  lookup mechanism for ThunarVfsVolume.
+
 2005-07-14	Benedikt Meurer <benny@xfce.org>
 
 	* thunar/thunar-standard-view.c(thunar_standard_view_init): Add frame
diff --git a/docs/papers/HackingOnThunar.odt b/docs/papers/HackingOnThunar.odt
index c2ff310f16ba07fdb5b5d9b5b8006dab147686f3..eba6e23b04a76b5f3b5763e260474d8d52c98025 100644
Binary files a/docs/papers/HackingOnThunar.odt and b/docs/papers/HackingOnThunar.odt differ
diff --git a/thunar-vfs/thunar-vfs-volume-bsd.c b/thunar-vfs/thunar-vfs-volume-bsd.c
index d30aa339c61fe863b8f3779cb54e2c9ac5391ff1..2dabf8860303efdcc2588532d9a8fa9557df9ecb 100644
--- a/thunar-vfs/thunar-vfs-volume-bsd.c
+++ b/thunar-vfs/thunar-vfs-volume-bsd.c
@@ -48,14 +48,16 @@
 
 
 
-static void                thunar_vfs_volume_bsd_class_init         (ThunarVfsVolumeBSDClass *klass);
-static void                thunar_vfs_volume_bsd_volume_init        (ThunarVfsVolumeIface    *iface);
-static void                thunar_vfs_volume_bsd_init               (ThunarVfsVolumeBSD      *volume_bsd);
-static void                thunar_vfs_volume_bsd_finalize           (GObject                 *object);
+static void                  thunar_vfs_volume_bsd_class_init       (ThunarVfsVolumeBSDClass *klass);
+static void                  thunar_vfs_volume_bsd_volume_init      (ThunarVfsVolumeIface    *iface);
+static void                  thunar_vfs_volume_bsd_init             (ThunarVfsVolumeBSD      *volume_bsd);
+static void                  thunar_vfs_volume_bsd_finalize         (GObject                 *object);
 static ThunarVfsVolumeKind   thunar_vfs_volume_bsd_get_kind         (ThunarVfsVolume         *volume);
 static const gchar          *thunar_vfs_volume_bsd_get_name         (ThunarVfsVolume         *volume);
 static ThunarVfsVolumeStatus thunar_vfs_volume_bsd_get_status       (ThunarVfsVolume         *volume);
 static ThunarVfsURI         *thunar_vfs_volume_bsd_get_mount_point  (ThunarVfsVolume         *volume);
+static gboolean              thunar_vfs_volume_bsd_get_free_space   (ThunarVfsVolume         *volume,
+                                                                     ThunarVfsFileSize       *free_space_return);
 static gboolean              thunar_vfs_volume_bsd_update           (gpointer                 user_data);
 static ThunarVfsVolumeBSD   *thunar_vfs_volume_bsd_new              (const gchar             *device_path,
                                                                      const gchar             *mount_path);
@@ -113,6 +115,7 @@ thunar_vfs_volume_bsd_volume_init (ThunarVfsVolumeIface *iface)
   iface->get_name = thunar_vfs_volume_bsd_get_name;
   iface->get_status = thunar_vfs_volume_bsd_get_status;
   iface->get_mount_point = thunar_vfs_volume_bsd_get_mount_point;
+  iface->get_free_space = thunar_vfs_volume_bsd_get_free_space;
 }
 
 
@@ -148,7 +151,6 @@ thunar_vfs_volume_bsd_finalize (GObject *object)
 static ThunarVfsVolumeKind
 thunar_vfs_volume_bsd_get_kind (ThunarVfsVolume *volume)
 {
-  g_return_val_if_fail (THUNAR_VFS_IS_VOLUME_BSD (volume), THUNAR_VFS_VOLUME_KIND_UNKNOWN);
   return THUNAR_VFS_VOLUME_BSD (volume)->kind;
 }
 
@@ -159,12 +161,7 @@ thunar_vfs_volume_bsd_get_name (ThunarVfsVolume *volume)
 {
   ThunarVfsVolumeBSD *volume_bsd = THUNAR_VFS_VOLUME_BSD (volume);
 
-  g_return_val_if_fail (THUNAR_VFS_IS_VOLUME_BSD (volume_bsd), NULL);
-
-  if (volume_bsd->label != NULL)
-    return volume_bsd->label;
-  else
-    return volume_bsd->device_name;
+  return (volume_bsd->label != NULL) ? volume_bsd->label : volume_bsd->device_name;
 }
 
 
@@ -172,7 +169,6 @@ thunar_vfs_volume_bsd_get_name (ThunarVfsVolume *volume)
 static ThunarVfsVolumeStatus
 thunar_vfs_volume_bsd_get_status (ThunarVfsVolume *volume)
 {
-  g_return_val_if_fail (THUNAR_VFS_IS_VOLUME_BSD (volume), FALSE);
   return THUNAR_VFS_VOLUME_BSD (volume)->status;
 }
 
@@ -181,12 +177,22 @@ thunar_vfs_volume_bsd_get_status (ThunarVfsVolume *volume)
 static ThunarVfsURI*
 thunar_vfs_volume_bsd_get_mount_point (ThunarVfsVolume *volume)
 {
-  g_return_val_if_fail (THUNAR_VFS_IS_VOLUME_BSD (volume), NULL);
   return THUNAR_VFS_VOLUME_BSD (volume)->mount_point;
 }
 
 
 
+static gboolean
+thunar_vfs_volume_bsd_get_free_space (ThunarVfsVolume   *volume,
+                                      ThunarVfsFileSize *free_space_return)
+{
+  ThunarVfsVolumeBSD *volume_bsd = THUNAR_VFS_VOLUME_BSD (volume);
+  *free_space_return = volume_bsd->info.f_blocks * volume_bsd->info.f_bsize;
+  return TRUE;
+}
+
+
+
 static gboolean
 thunar_vfs_volume_bsd_update (gpointer user_data)
 {
@@ -283,6 +289,8 @@ thunar_vfs_volume_bsd_new (const gchar *device_path,
     volume_bsd->kind = THUNAR_VFS_VOLUME_KIND_CDROM;
   else if (p[0] == 'f' && p[1] == 'd' && g_ascii_isdigit (p[2]))
     volume_bsd->kind = THUNAR_VFS_VOLUME_KIND_FLOPPY;
+  else if (p[0] == 'a' && p[1] == 'd' && g_ascii_isdigit (p[2]))
+    volume_bsd->kind = THUNAR_VFS_VOLUME_KIND_HARDDISK;
   else
     volume_bsd->kind = THUNAR_VFS_VOLUME_KIND_UNKNOWN;
 
diff --git a/thunar-vfs/thunar-vfs-volume.c b/thunar-vfs/thunar-vfs-volume.c
index d8f3cbbc951bb128ced232110a6b4d12cd94cddd..fd16325bf5f0c8581ed362a2078a038c1977230c 100644
--- a/thunar-vfs/thunar-vfs-volume.c
+++ b/thunar-vfs/thunar-vfs-volume.c
@@ -252,53 +252,100 @@ thunar_vfs_volume_is_removable (ThunarVfsVolume *volume)
 
 
 /**
- * thunar_vfs_volume_lookup_icon:
+ * thunar_vfs_volume_get_free_space:
+ * @volume            : a #ThunarVfsVolume instance.
+ * @free_space_return : location to store the free space to.
+ *
+ * Tries to determine the number of available bytes on the specified
+ * @volume and places the result to the memory pointed to by
+ * @free_space_return. The returned amount of bytes represents the
+ * space available to the current user, which may be different from
+ * the total free amount.
+ *
+ * If @volume is unable to determine the free space, %FALSE will be
+ * returned and @free_space_return won't be set.
+ *
+ * Return value: %TRUE if the free amount was determined successfully,
+ *               else %FALSE.
+ **/
+gboolean
+thunar_vfs_volume_get_free_space (ThunarVfsVolume   *volume,
+                                  ThunarVfsFileSize *free_space_return)
+{
+  g_return_val_if_fail (THUNAR_VFS_IS_VOLUME (volume), FALSE);
+  g_return_val_if_fail (free_space_return != NULL, FALSE);
+  return THUNAR_VFS_VOLUME_GET_IFACE (volume)->get_free_space (volume, free_space_return);
+}
+
+
+
+/**
+ * thunar_vfs_volume_lookup_icon_name:
  * @volume     : a #ThunarVfsVolume instance.
  * @icon_theme : a #GtkIconTheme instance.
- * @size       : the size of the icon in pixels.
- * @flags      : the icon theme lookup flags.
  *
- * Tries to find a suitable icon for @volume in the given @icon_theme. If
- * no suitable icon can be found, %NULL will be returned instead.
+ * Tries to find a suitable icon for @volume in the given @icon_theme and
+ * returns its name. If no suitable icon is found in @icon_theme, then
+ * a fallback icon name will be returned. This way you can always count
+ * on this method to return a valid string.
  *
- * Call #gtk_icon_info_free() on the returned icon info object when you
- * are done with it.
- *
- * Return value: a #GtkIconInfo or %NULL.
+ * Return value: the icon name.
  **/
-GtkIconInfo*
-thunar_vfs_volume_lookup_icon (ThunarVfsVolume   *volume,
-                               GtkIconTheme      *icon_theme,
-                               gint               size,
-                               GtkIconLookupFlags flags)
+const gchar*
+thunar_vfs_volume_lookup_icon_name (ThunarVfsVolume *volume,
+                                    GtkIconTheme    *icon_theme)
 {
-  ThunarVfsVolumeKind kind;
-  GtkIconInfo        *icon_info;
+  ThunarVfsVolumeIface *iface;
+  ThunarVfsVolumeKind   kind;
+  const gchar          *icon_name;
 
   g_return_val_if_fail (THUNAR_VFS_IS_VOLUME (volume), NULL);
   g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
-  g_return_val_if_fail (size > 0, NULL);
+
+  /* allow the implementing class to provide a custom icon */
+  iface = THUNAR_VFS_VOLUME_GET_IFACE (volume);
+  if (iface->lookup_icon_name != NULL)
+    {
+      icon_name = (*iface->lookup_icon_name) (volume, icon_theme);
+      if (G_LIKELY (icon_name != NULL))
+        return icon_name;
+    }
 
   kind = thunar_vfs_volume_get_kind (volume);
   switch (kind)
     {
+    case THUNAR_VFS_VOLUME_KIND_DVD:
+      if (gtk_icon_theme_has_icon (icon_theme, "gnome-dev-dvd"))
+        return "gnome-dev-dvd";
+      /* FALL-THROUGH */
+
     case THUNAR_VFS_VOLUME_KIND_CDROM:
-      icon_info = gtk_icon_theme_lookup_icon (icon_theme, "gnome-dev-cdrom", size, flags);
-      if (icon_info != NULL)
-        return icon_info;
+      if (gtk_icon_theme_has_icon (icon_theme, "gnome-dev-cdrom"))
+        return "gnome-dev-cdrom";
       break;
 
     case THUNAR_VFS_VOLUME_KIND_FLOPPY:
-      icon_info = gtk_icon_theme_lookup_icon (icon_theme, "gnome-dev-floppy", size, flags);
-      if (icon_info != NULL)
-        return icon_info;
+      if (gtk_icon_theme_has_icon (icon_theme, "gnome-dev-floppy"))
+        return "gnome-dev-floppy";
+      break;
+
+    case THUNAR_VFS_VOLUME_KIND_HARDDISK:
+      if (gtk_icon_theme_has_icon (icon_theme, "gnome-dev-harddisk"))
+        return "gnome-dev-harddisk";
+      break;
+
+    case THUNAR_VFS_VOLUME_KIND_USBSTICK:
+      if (gtk_icon_theme_has_icon (icon_theme, "gnome-dev-removable-usb"))
+        return "gnome-dev-removable-usb";
+      else if (gtk_icon_theme_has_icon (icon_theme, "gnome-dev-harddisk-usb"))
+        return "gnome-dev-harddisk-usb";
       break;
 
     default:
       break;
     }
 
-  return gtk_icon_theme_lookup_icon (icon_theme, "gnome-fs-blockdev", size, flags);
+  return "gnome-fs-blockdev";
 }
 
 
diff --git a/thunar-vfs/thunar-vfs-volume.h b/thunar-vfs/thunar-vfs-volume.h
index 1481b1d7b1742b59b2d5c55e7e516af10e7f784e..09ac7d92618c4772f6ac4fb7188473a06dcdd580 100644
--- a/thunar-vfs/thunar-vfs-volume.h
+++ b/thunar-vfs/thunar-vfs-volume.h
@@ -23,7 +23,7 @@
 
 #include <gtk/gtk.h>
 
-#include <thunar-vfs/thunar-vfs-uri.h>
+#include <thunar-vfs/thunar-vfs-info.h>
 
 G_BEGIN_DECLS;
 
@@ -48,8 +48,10 @@ typedef enum
 {
   THUNAR_VFS_VOLUME_KIND_UNKNOWN,
   THUNAR_VFS_VOLUME_KIND_CDROM,
+  THUNAR_VFS_VOLUME_KIND_DVD,
   THUNAR_VFS_VOLUME_KIND_FLOPPY,
   THUNAR_VFS_VOLUME_KIND_HARDDISK,
+  THUNAR_VFS_VOLUME_KIND_USBSTICK,
 } ThunarVfsVolumeKind;
 
 /**
@@ -70,10 +72,14 @@ struct _ThunarVfsVolumeIface
   GTypeInterface __parent__;
 
   /* methods */
-  ThunarVfsVolumeKind   (*get_kind)         (ThunarVfsVolume *volume);
-  const gchar          *(*get_name)         (ThunarVfsVolume *volume);
-  ThunarVfsVolumeStatus (*get_status)       (ThunarVfsVolume *volume);
-  ThunarVfsURI         *(*get_mount_point)  (ThunarVfsVolume *volume);
+  ThunarVfsVolumeKind   (*get_kind)         (ThunarVfsVolume   *volume);
+  const gchar          *(*get_name)         (ThunarVfsVolume   *volume);
+  ThunarVfsVolumeStatus (*get_status)       (ThunarVfsVolume   *volume);
+  ThunarVfsURI         *(*get_mount_point)  (ThunarVfsVolume   *volume);
+  gboolean              (*get_free_space)   (ThunarVfsVolume   *volume,
+                                             ThunarVfsFileSize *free_space_return);
+  const gchar          *(*lookup_icon_name) (ThunarVfsVolume   *volume,
+                                             GtkIconTheme      *icon_theme);
 
   /* signals */
   void (*changed) (ThunarVfsVolume *volume);
@@ -90,10 +96,11 @@ gboolean              thunar_vfs_volume_is_mounted        (ThunarVfsVolume   *vo
 gboolean              thunar_vfs_volume_is_present        (ThunarVfsVolume   *volume);
 gboolean              thunar_vfs_volume_is_removable      (ThunarVfsVolume   *volume);
 
-GtkIconInfo          *thunar_vfs_volume_lookup_icon       (ThunarVfsVolume   *volume,
-                                                           GtkIconTheme      *icon_theme,
-                                                           gint               size,
-                                                           GtkIconLookupFlags flags);
+gboolean              thunar_vfs_volume_get_free_space    (ThunarVfsVolume   *volume,
+                                                           ThunarVfsFileSize *free_space_return);
+
+const gchar          *thunar_vfs_volume_lookup_icon_name  (ThunarVfsVolume   *volume,
+                                                           GtkIconTheme      *icon_theme);
 
 void                  thunar_vfs_volume_changed           (ThunarVfsVolume   *volume);
 
diff --git a/thunar/thunar-favourites-model.c b/thunar/thunar-favourites-model.c
index 90f9e02c8bbb0b65aaf1b7675156b8e1035962a5..840482f8e85ea5b0ff39db816b9e6c82ef14bd54 100644
--- a/thunar/thunar-favourites-model.c
+++ b/thunar/thunar-favourites-model.c
@@ -34,6 +34,7 @@
 
 #include <thunar/thunar-favourites-model.h>
 #include <thunar/thunar-file.h>
+#include <thunar/thunar-icon-factory.h>
 
 
 
@@ -118,6 +119,7 @@ struct _ThunarFavouritesModel
   gint                    n_favourites;
   GList                  *hidden_volumes;
   ThunarFavourite        *favourites;
+  ThunarIconFactory      *icon_factory;
   ThunarVfsVolumeManager *volume_manager;
 };
 
@@ -130,6 +132,9 @@ struct _ThunarFavourite
 
   ThunarFavourite    *next;
   ThunarFavourite    *prev;
+
+  /* cached icon */
+  GdkPixbuf          *icon;
 };
 
 
@@ -172,6 +177,7 @@ thunar_favourites_model_init (ThunarFavouritesModel *model)
   model->stamp = g_random_int ();
   model->n_favourites = 0;
   model->favourites = NULL;
+  model->icon_factory = thunar_icon_factory_get_for_icon_theme (gtk_icon_theme_get_default ());
   model->volume_manager = thunar_vfs_volume_manager_get_default ();
 
   /* will be used to append the favourites to the list */
@@ -186,6 +192,7 @@ thunar_favourites_model_init (ThunarFavouritesModel *model)
       favourite->type = THUNAR_FAVOURITE_SYSTEM_DEFINED;
       favourite->file = file;
       favourite->volume = NULL;
+      favourite->icon = NULL;
 
       /* append the favourite to the list */
       thunar_favourites_model_add_favourite (model, favourite, path);
@@ -202,6 +209,7 @@ thunar_favourites_model_init (ThunarFavouritesModel *model)
       favourite->type = THUNAR_FAVOURITE_SYSTEM_DEFINED;
       favourite->file = file;
       favourite->volume = NULL;
+      favourite->icon = NULL;
 
       /* append the favourite to the list */
       thunar_favourites_model_add_favourite (model, favourite, path);
@@ -218,6 +226,7 @@ thunar_favourites_model_init (ThunarFavouritesModel *model)
       favourite->type = THUNAR_FAVOURITE_SYSTEM_DEFINED;
       favourite->file = file;
       favourite->volume = NULL;
+      favourite->icon = NULL;
 
       /* append the favourite to the list */
       thunar_favourites_model_add_favourite (model, favourite, path);
@@ -249,6 +258,7 @@ thunar_favourites_model_init (ThunarFavouritesModel *model)
                   favourite->type = THUNAR_FAVOURITE_REMOVABLE_MEDIA;
                   favourite->file = file;
                   favourite->volume = volume;
+                  favourite->icon = NULL;
 
                   /* link the favourite to the list */
                   thunar_favourites_model_add_favourite (model, favourite, path);
@@ -302,6 +312,7 @@ thunar_favourites_model_init (ThunarFavouritesModel *model)
           favourite->type = THUNAR_FAVOURITE_USER_DEFINED;
           favourite->file = file;
           favourite->volume = NULL;
+          favourite->icon = NULL;
 
           /* append the favourite to the list */
           thunar_favourites_model_add_favourite (model, favourite, path);
@@ -382,6 +393,9 @@ thunar_favourites_model_finalize (GObject *object)
           g_object_unref (G_OBJECT (current->volume));
         }
 
+      if (G_LIKELY (current->icon != NULL))
+        g_object_unref (G_OBJECT (current->icon));
+
       g_free (current);
     }
 
@@ -390,6 +404,9 @@ thunar_favourites_model_finalize (GObject *object)
     g_object_unref (G_OBJECT (lp->data));
   g_list_free (model->hidden_volumes);
 
+  /* unlink from the icon factory */
+  g_object_unref (G_OBJECT (model->icon_factory));
+
   /* unlink from the volume manager */
   g_object_unref (G_OBJECT (model->volume_manager));
 
@@ -495,13 +512,13 @@ thunar_favourites_model_get_value (GtkTreeModel *tree_model,
                                    gint          column,
                                    GValue       *value)
 {
-  ThunarFavourite *favourite;
-  GtkIconTheme    *icon_theme;
-  GtkIconInfo     *icon_info;
-  GdkPixbuf       *icon;
+  ThunarFavouritesModel *model = THUNAR_FAVOURITES_MODEL (tree_model);
+  ThunarFavourite       *favourite;
+  GtkIconTheme          *icon_theme;
+  const gchar           *icon_name;
 
-  g_return_if_fail (THUNAR_IS_FAVOURITES_MODEL (tree_model));
-  g_return_if_fail (iter->stamp == THUNAR_FAVOURITES_MODEL (tree_model)->stamp);
+  g_return_if_fail (THUNAR_IS_FAVOURITES_MODEL (model));
+  g_return_if_fail (iter->stamp == model->stamp);
 
   favourite = iter->user_data;
 
@@ -519,24 +536,20 @@ thunar_favourites_model_get_value (GtkTreeModel *tree_model,
 
     case THUNAR_FAVOURITES_MODEL_COLUMN_ICON:
       g_value_init (value, GDK_TYPE_PIXBUF);
-      if (G_UNLIKELY (favourite->volume != NULL))
+      if (G_UNLIKELY (favourite->icon == NULL))
         {
-          icon_theme = gtk_icon_theme_get_default ();
-          icon_info = thunar_vfs_volume_lookup_icon (favourite->volume, icon_theme, 32, 0);
-          if (G_LIKELY (icon_info != NULL))
+          if (G_UNLIKELY (favourite->volume != NULL))
             {
-              icon = gtk_icon_info_load_icon (icon_info, NULL);
-              if (G_LIKELY (icon != NULL))
-                g_value_take_object (value, icon);
-              gtk_icon_info_free (icon_info);
+              icon_theme = thunar_icon_factory_get_icon_theme (model->icon_factory);
+              icon_name = thunar_vfs_volume_lookup_icon_name (favourite->volume, icon_theme);
+              favourite->icon = thunar_icon_factory_load_icon (model->icon_factory, icon_name, 32, NULL, TRUE);
+            }
+          else if (G_LIKELY (favourite->file != NULL))
+            {
+              favourite->icon = thunar_file_load_icon (favourite->file, 32);
             }
         }
-      else if (G_LIKELY (favourite->file != NULL))
-        {
-          icon = thunar_file_load_icon (favourite->file, 32);
-          if (G_LIKELY (icon != NULL))
-            g_value_take_object (value, icon);
-        }
+      g_value_set_object (value, favourite->icon);
       break;
 
     case THUNAR_FAVOURITES_MODEL_COLUMN_SEPARATOR:
@@ -856,6 +869,13 @@ thunar_favourites_model_file_changed (ThunarFile            *file,
   for (favourite = model->favourites, n = 0; favourite != NULL; favourite = favourite->next, ++n)
     if (favourite->file == file)
       {
+        /* drop the cached icon */
+        if (G_LIKELY (favourite->icon != NULL))
+          {
+            g_object_unref (G_OBJECT (favourite->icon));
+            favourite->icon = NULL;
+          }
+
         iter.stamp = model->stamp;
         iter.user_data = favourite;
 
@@ -909,6 +929,10 @@ thunar_favourites_model_file_destroy (ThunarFile            *file,
   /* drop the watch from the file */
   thunar_file_unwatch (favourite->file);
 
+  /* drop the cached icon */
+  if (G_LIKELY (favourite->icon != NULL))
+    g_object_unref (G_OBJECT (favourite->icon));
+
   /* disconnect us from the favourite's file */
   g_signal_handlers_disconnect_matched (G_OBJECT (favourite->file),
                                         G_SIGNAL_MATCH_DATA, 0,
@@ -972,6 +996,7 @@ thunar_favourites_model_volume_changed (ThunarVfsVolume       *volume,
               favourite->type = THUNAR_FAVOURITE_REMOVABLE_MEDIA;
               favourite->file = file;
               favourite->volume = volume;
+              favourite->icon = NULL;
 
               /* the volume is present now, so we have to display it */
               path = gtk_tree_path_new_from_indices (index, -1);
@@ -1008,6 +1033,13 @@ thunar_favourites_model_volume_changed (ThunarVfsVolume       *volume,
         }
       else
         {
+          /* drop the cached icon */
+          if (G_LIKELY (favourite->icon != NULL))
+            {
+              g_object_unref (G_OBJECT (favourite->icon));
+              favourite->icon = NULL;
+            }
+
           /* tell the view that the volume has changed in some way */
           iter.stamp = model->stamp;
           iter.user_data = favourite;
@@ -1225,6 +1257,7 @@ thunar_favourites_model_move (ThunarFavouritesModel *model,
   ThunarVfsVolume    *volume;
   GtkTreePath        *path;
   ThunarFile         *file;
+  GdkPixbuf          *icon;
   gint               *order;
   gint                index_src;
   gint                index_dst;
@@ -1256,18 +1289,21 @@ thunar_favourites_model_move (ThunarFavouritesModel *model,
     {
       type = favourite->type;
       file = favourite->file;
+      icon = favourite->icon;
       volume = favourite->volume;
 
       for (; index < index_dst; favourite = favourite->next, ++index)
         {
           favourite->type = favourite->next->type;
           favourite->file = favourite->next->file;
+          favourite->icon = favourite->next->icon;
           favourite->volume = favourite->next->volume;
           order[index] = index + 1;
         }
 
       favourite->type = type;
       favourite->file = file;
+      favourite->icon = icon;
       favourite->volume = volume;
       order[index++] = index_src;
     }
@@ -1280,12 +1316,14 @@ thunar_favourites_model_move (ThunarFavouritesModel *model,
 
       type = favourite->type;
       file = favourite->file;
+      icon = favourite->icon;
       volume = favourite->volume;
 
       for (; index > index_dst; favourite = favourite->prev, --index)
         {
           favourite->type = favourite->prev->type;
           favourite->file = favourite->prev->file;
+          favourite->icon = favourite->prev->icon;
           favourite->volume = favourite->prev->volume;
           order[index] = index - 1;
         }
@@ -1294,6 +1332,7 @@ thunar_favourites_model_move (ThunarFavouritesModel *model,
 
       favourite->type = type;
       favourite->file = file;
+      favourite->icon = icon;
       favourite->volume = volume;
       order[index] = index_src;
       index = index_src + 1;