Index: common/gmounttracker.c
===================================================================
--- common/gmounttracker.c	(Revision 1810)
+++ common/gmounttracker.c	(Arbeitskopie)
@@ -122,6 +122,7 @@ g_mount_info_dup (GMountInfo *info)
   copy->user_visible = info->user_visible;
   copy->prefered_filename_encoding = g_strdup (info->prefered_filename_encoding);
   copy->fuse_mountpoint = g_strdup (info->fuse_mountpoint);
+  copy->home_path = g_strdup (info->home_path);
   
   return copy;
 }
@@ -146,6 +147,7 @@ g_mount_info_unref (GMountInfo *info)
       g_mount_spec_unref (info->mount_spec);
       g_free (info->prefered_filename_encoding);
       g_free (info->fuse_mountpoint);
+      g_free (info->home_path);
       g_free (info);
     }
 }
@@ -189,6 +191,7 @@ g_mount_info_from_dbus (DBusMessageIter 
   char *dbus_id;
   char *obj_path;
   char *fuse_mountpoint;
+  char *home_path;
 
   if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_STRUCT)
     return NULL;
@@ -213,6 +216,11 @@ g_mount_info_from_dbus (DBusMessageIter 
     return NULL;
   }
 
+  if (!_g_dbus_message_iter_get_args (&struct_iter, NULL,
+				      DBUS_TYPE_STRING, &home_path,
+				      0))
+    home_path = g_strdup ("");
+
   info = g_new0 (GMountInfo, 1);
   info->ref_count = 1;
   info->display_name = g_strdup (display_name);
@@ -224,6 +232,7 @@ g_mount_info_from_dbus (DBusMessageIter 
   info->user_visible = user_visible;
   info->prefered_filename_encoding = g_strdup (prefered_filename_encoding);
   info->fuse_mountpoint = fuse_mountpoint;
+  info->home_path = home_path;
   
   return info;
 }
Index: common/gmounttracker.h
===================================================================
--- common/gmounttracker.h	(Revision 1810)
+++ common/gmounttracker.h	(Arbeitskopie)
@@ -48,6 +48,7 @@ typedef struct {
   gboolean user_visible;
   char *prefered_filename_encoding; /* NULL -> UTF8 */
   char *fuse_mountpoint;
+  char *home_path;
   GMountSpec *mount_spec;
 } GMountInfo;
 
Index: daemon/gvfsbackend.c
===================================================================
--- daemon/gvfsbackend.c	(Revision 1810)
+++ daemon/gvfsbackend.c	(Arbeitskopie)
@@ -70,6 +70,7 @@ struct _GVfsBackendPrivate
   char *stable_name;
   char *icon;
   char *prefered_filename_encoding;
+  char *home_path;
   gboolean user_visible;
   GMountSpec *mount_spec;
 };
@@ -144,6 +145,7 @@ g_vfs_backend_finalize (GObject *object)
   g_free (backend->priv->stable_name);
   g_free (backend->priv->icon);
   g_free (backend->priv->prefered_filename_encoding);
+  g_free (backend->priv->home_path);
   if (backend->priv->mount_spec)
     g_mount_spec_unref (backend->priv->mount_spec);
   
@@ -194,6 +196,7 @@ g_vfs_backend_init (GVfsBackend *backend
   backend->priv->prefered_filename_encoding = g_strdup ("");
   backend->priv->display_name = g_strdup ("");
   backend->priv->stable_name = g_strdup ("");
+  backend->priv->home_path = g_strdup ("");
   backend->priv->user_visible = TRUE;
 }
 
@@ -316,6 +319,14 @@ g_vfs_backend_set_prefered_filename_enco
 }
 
 void
+g_vfs_backend_set_home_path (GVfsBackend  *backend,
+			     const char *home_path)
+{
+  g_free (backend->priv->home_path);
+  backend->priv->home_path = g_strdup (home_path);
+}
+
+void
 g_vfs_backend_set_user_visible (GVfsBackend  *backend,
 				gboolean user_visible)
 {
@@ -551,6 +562,7 @@ g_vfs_backend_register_mount (GVfsBacken
   DBusMessage *message;
   DBusMessageIter iter;
   dbus_bool_t user_visible;
+  char *home_path;
   
   message = dbus_message_new_method_call (G_VFS_DBUS_DAEMON_NAME,
 					  G_VFS_DBUS_MOUNTTRACKER_PATH,
@@ -579,6 +591,15 @@ g_vfs_backend_register_mount (GVfsBacken
   dbus_message_iter_init_append (message, &iter);
   g_mount_spec_to_dbus (&iter, backend->priv->mount_spec);
 
+  home_path = g_strdup (backend->priv->home_path);
+  if (home_path == NULL)
+    home_path = g_strdup ("");
+
+  if (!dbus_message_append_args (message,
+				 DBUS_TYPE_STRING, &home_path,
+				 0))
+    _g_dbus_oom ();
+
   dbus_message_set_auto_start (message, TRUE);
 
   _g_dbus_connection_call_async (NULL, message, -1, 
Index: daemon/gvfsbackend.h
===================================================================
--- daemon/gvfsbackend.h	(Revision 1810)
+++ daemon/gvfsbackend.h	(Arbeitskopie)
@@ -383,6 +383,8 @@ void        g_vfs_backend_set_icon_name 
 							  const char         *icon);
 void        g_vfs_backend_set_prefered_filename_encoding (GVfsBackend        *backend,
 							  const char         *prefered_filename_encoding);
+void        g_vfs_backend_set_home_path                  (GVfsBackend        *backend,
+							  const char         *home_path);
 void        g_vfs_backend_set_user_visible               (GVfsBackend        *backend,
 							  gboolean            user_visible);
 void        g_vfs_backend_set_mount_spec                 (GVfsBackend        *backend,
Index: daemon/gvfsbackendsftp.c
===================================================================
--- daemon/gvfsbackendsftp.c	(Revision 1810)
+++ daemon/gvfsbackendsftp.c	(Arbeitskopie)
@@ -1383,6 +1383,40 @@ get_uid_sync (GVfsBackendSftp *backend)
   return TRUE;
 }
 
+static gboolean
+get_home_sync (GVfsBackendSftp *backend)
+{
+  GDataOutputStream *command;
+  GDataInputStream *reply;
+  char *home_path;
+  int type;
+  
+  command = new_command_stream (backend, SSH_FXP_REALPATH);
+  put_string (command, ".");
+  send_command_sync_and_unref_command (backend, command, NULL, NULL);
+
+  reply = read_reply_sync (backend, NULL, NULL);
+  if (reply == NULL)
+    return FALSE;
+  
+  type = g_data_input_stream_read_byte (reply, NULL, NULL);
+  /*id =*/ (void) g_data_input_stream_read_uint32 (reply, NULL, NULL);
+
+  /* On error, set home to NULL and ignore */
+  if (type == SSH_FXP_NAME)
+    {
+      /* count = */ (void) g_data_input_stream_read_uint32 (reply, NULL, NULL);
+
+      home_path = read_string (reply, NULL);
+      g_vfs_backend_set_home_path (G_VFS_BACKEND (backend), home_path);
+      g_free (home_path);
+    }
+
+  g_object_unref (reply);
+
+  return TRUE;
+}
+
 static void
 do_mount (GVfsBackend *backend,
           GVfsJobMount *job,
@@ -1497,9 +1531,12 @@ do_mount (GVfsBackend *backend,
       return;
     }
   
+  sftp_mount_spec = g_mount_spec_new ("sftp");
+
+  get_home_sync (op_backend);
+
   read_reply_async (op_backend);
 
-  sftp_mount_spec = g_mount_spec_new ("sftp");
   if (op_backend->user_specified)
     g_mount_spec_set (sftp_mount_spec, "user", op_backend->user);
   g_mount_spec_set (sftp_mount_spec, "host", op_backend->host);
Index: daemon/mount.c
===================================================================
--- daemon/mount.c	(Revision 1810)
+++ daemon/mount.c	(Arbeitskopie)
@@ -41,6 +41,7 @@ typedef struct {
   char *stable_name;
   char *icon;
   char *prefered_filename_encoding;
+  char *home_path;
   gboolean user_visible;
 
   /* Daemon object ref */
@@ -159,6 +160,7 @@ vfs_mount_free (VfsMount *mount)
   g_free (mount->stable_name);
   g_free (mount->icon);
   g_free (mount->prefered_filename_encoding);
+  g_free (mount->home_path);
   g_free (mount->dbus_id);
   g_free (mount->object_path);
   g_mount_spec_unref (mount->mount_spec);
@@ -235,8 +237,15 @@ vfs_mount_to_dbus (VfsMount *mount,
 
   g_mount_spec_to_dbus (&struct_iter, mount->mount_spec);
 
+  if (!dbus_message_iter_append_basic (&struct_iter,
+				       DBUS_TYPE_STRING,
+				       &mount->home_path))
+    _g_dbus_oom ();
+
   if (!dbus_message_iter_close_container (iter, &struct_iter))
     _g_dbus_oom ();
+
+  g_free (fuse_mountpoint);
 }
 
 static void
@@ -647,7 +656,7 @@ register_mount (DBusConnection *connecti
   VfsMount *mount;
   DBusMessage *reply;
   DBusError error;
-  const char *display_name, *stable_name, *icon, *obj_path, *id, *prefered_filename_encoding;
+  const char *display_name, *stable_name, *icon, *obj_path, *id, *prefered_filename_encoding, *home_path;
   dbus_bool_t user_visible;
   DBusMessageIter iter;
   GMountSpec *mount_spec;
@@ -690,7 +699,14 @@ register_mount (DBusConnection *connecti
 	  mount->dbus_id = g_strdup (id);
 	  mount->object_path = g_strdup (obj_path);
 	  mount->mount_spec = mount_spec;
-	  
+
+	  if (_g_dbus_message_iter_get_args (&iter, NULL,
+					     DBUS_TYPE_STRING, &home_path,
+					     0))
+	       mount->home_path = g_strdup (home_path);
+	  else
+	       mount->home_path = g_strdup ("");
+
 	  mounts = g_list_prepend (mounts, mount);
 
 	  signal_mounted_unmounted (mount, TRUE);
@@ -853,6 +869,7 @@ list_mounts (DBusConnection *connection,
 					   DBUS_TYPE_BOOLEAN_AS_STRING
 					   DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING
  					   G_MOUNT_SPEC_TYPE_AS_STRING
+					   DBUS_TYPE_STRING_AS_STRING
 					 DBUS_STRUCT_END_CHAR_AS_STRING,
 					 &array_iter))
     _g_dbus_oom ();
Index: client/gdaemonmount.c
===================================================================
--- client/gdaemonmount.c	(Revision 1810)
+++ client/gdaemonmount.c	(Arbeitskopie)
@@ -115,6 +115,22 @@ g_daemon_mount_get_root (GMount *mount)
   return g_daemon_file_new (daemon_mount->mount_info->mount_spec, "/");
 }
 
+static GFile *
+g_daemon_mount_get_home (GMount *mount)
+{
+  GMountSpec *mount_spec;
+  const char *home;
+  GDaemonMount *daemon_mount = G_DAEMON_MOUNT (mount);
+
+  home = daemon_mount->mount_info->home_path;
+  mount_spec = daemon_mount->mount_info->mount_spec;
+
+  if (home != NULL && home[0] == '/')
+    return g_daemon_file_new (mount_spec, home);
+
+  return NULL;
+}
+
 static GIcon *
 g_daemon_mount_get_icon (GMount *mount)
 {
@@ -361,6 +377,7 @@ static void
 g_daemon_mount_mount_iface_init (GMountIface *iface)
 {
   iface->get_root = g_daemon_mount_get_root;
+  iface->get_home = g_daemon_mount_get_home;
   iface->get_name = g_daemon_mount_get_name;
   iface->get_icon = g_daemon_mount_get_icon;
   iface->get_uuid = g_daemon_mount_get_uuid;
