diff --git a/daemon/gvfsbackenddav.c b/daemon/gvfsbackenddav.c
index b54f870..ea910ba 100644
--- a/daemon/gvfsbackenddav.c
+++ b/daemon/gvfsbackenddav.c
@@ -56,6 +56,7 @@
 #include "gvfsjobqueryfsinfo.h"
 #include "gvfsjobqueryattributes.h"
 #include "gvfsjobenumerate.h"
+#include "gvfsjobunmount.h"
 #include "gvfsdaemonprotocol.h"
 
 #include "soup-input-stream.h"
@@ -2630,13 +2631,49 @@ do_set_display_name (GVfsBackend           *backend,
   soup_uri_free (source);
 }
 
+static void
+unmount_cb (GVfsBackend  *backend,
+            GAsyncResult *res,
+            gpointer      user_data)
+{
+  GVfsJobUnmount *job = G_VFS_JOB_UNMOUNT (user_data);
+  gboolean should_unmount;
+
+  should_unmount = g_vfs_backend_unmount_with_operation_finish (backend,
+                                                                res);
+
+  if (should_unmount)
+    g_vfs_job_succeeded (G_VFS_JOB (job));
+  else
+    g_vfs_job_failed_literal (G_VFS_JOB (job),
+                              G_IO_ERROR, G_IO_ERROR_BUSY,
+                              _("Filesystem is busy"));
+}
+
 static gboolean
-try_unmount (GVfsBackend    *backend,
-             GVfsJobUnmount *job,
-             GMountUnmountFlags flags,
-             GMountSource *mount_source)
+try_unmount (GVfsBackend        *backend,
+             GVfsJobUnmount     *job,
+             GMountUnmountFlags  flags,
+             GMountSource       *mount_source)
 {
-  _exit (0);
+
+  if (! g_vfs_backend_has_blocking_processes (backend) ||
+      flags & G_MOUNT_UNMOUNT_FORCE)
+    {
+      g_vfs_job_succeeded (G_VFS_JOB (job));
+    }
+  else if (g_mount_source_is_dummy (mount_source))
+    {
+      g_vfs_job_failed_literal (G_VFS_JOB (job),
+                                G_IO_ERROR, G_IO_ERROR_BUSY,
+                                _("Filesystem is busy"));
+    }
+  else
+    g_vfs_backend_unmount_with_operation (backend,
+                                          mount_source,
+                                          (GAsyncReadyCallback) unmount_cb,
+                                          job);
+  return TRUE;
 }
 
 /* ************************************************************************* */

