diff --git a/gvfs-1.8.1.tar.bz2 b/gvfs-1.8.1.tar.bz2
deleted file mode 100644
index 8746c22..0000000
--- a/gvfs-1.8.1.tar.bz2
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7d305320d881d914d88286a72a311587ea33fbe5075101729cb5766f01832ff7
-size 1412227
diff --git a/gvfs-1.9.0.tar.bz2 b/gvfs-1.9.0.tar.bz2
new file mode 100644
index 0000000..044f583
--- /dev/null
+++ b/gvfs-1.9.0.tar.bz2
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:323406de7ba912942e7edbebec5e78c214b6d0af46834b48b7bc2dfb755a06dc
+size 1415866
diff --git a/gvfs-dav-recursive-directory-ops.patch b/gvfs-dav-recursive-directory-ops.patch
deleted file mode 100644
index 23b331f..0000000
--- a/gvfs-dav-recursive-directory-ops.patch
+++ /dev/null
@@ -1,2231 +0,0 @@
-commit 25cb6b442cc37b8e6056cc837233523d7572736b
-Author: Hans Petter Jansson <hpj@cl.no>
-Date:   Thu Jan 13 18:04:58 2011 +0100
-
-    Patch 8: gvfs-dav-recursive-directory-ops.patch
-
-Index: gvfs-1.7.3/daemon/Makefile.am
-===================================================================
---- gvfs-1.7.3.orig/daemon/Makefile.am
-+++ gvfs-1.7.3/daemon/Makefile.am
-@@ -438,6 +438,7 @@ gvfsd_gphoto2_LDADD = $(libraries) $(GPH
- endif
- 
- gvfsd_http_SOURCES = \
-+	gmempipe.c gmempipe.h \
- 	soup-input-stream.c soup-input-stream.h \
- 	gvfsbackendhttp.c gvfsbackendhttp.h \
- 	daemon-main.c daemon-main.h \
-@@ -481,6 +482,7 @@ gvfsd_nvvfs_LDADD = $(libraries)
- 
- 
- gvfsd_dav_SOURCES = \
-+	gmempipe.c gmempipe.h \
- 	soup-input-stream.c soup-input-stream.h \
- 	soup-output-stream.c soup-output-stream.h \
- 	gvfsbackendhttp.c gvfsbackendhttp.h \
-Index: gvfs-1.7.3/daemon/gmempipe.c
-===================================================================
---- /dev/null
-+++ gvfs-1.7.3/daemon/gmempipe.c
-@@ -0,0 +1,716 @@
-+/* GIO - GLib Input, Output and Streaming Library
-+ *
-+ * Copyright (C) Christian Kellner <gicmo@gnome.org>
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General
-+ * Public License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: Christian Kellner <gicmo@gnome.org>
-+ */
-+
-+#include "gmempipe.h"
-+
-+#include <string.h>
-+
-+
-+
-+G_DEFINE_TYPE (GMemPipe, g_mem_pipe, G_TYPE_OBJECT)
-+
-+/* TODO: Real P_() */
-+#define P_(_x) (_x)
-+
-+static void   g_mem_pipe_get_property     (GObject    *object,
-+                                           guint       prop_id,
-+                                           GValue     *value,
-+                                           GParamSpec *pspec);
-+
-+static void   g_mem_pipe_set_property     (GObject      *object,
-+                                           guint         prop_id,
-+                                           const GValue *value,
-+                                           GParamSpec   *pspec);
-+
-+typedef enum {
-+
-+  GPD_NONE  = 0x00,
-+  GPD_READ  = 0x01, /* reading from the pipe  */
-+  GPD_WRITE = 0x02  /* writing to the pipe */
-+
-+} GPipeDirection;
-+
-+enum
-+{
-+  PROP_0,
-+  PROP_BUFFER_SIZE
-+};
-+
-+struct _GMemPipePrivate
-+{
-+
-+  struct {
-+    gsize  size;
-+    gsize  dlen;
-+
-+    char   *data;
-+
-+  } buffer;
-+
-+  GMutex *lock;
-+  GCond  *cond;
-+
-+  GPipeDirection  closed;
-+  GInputStream   *input_stream;
-+  GOutputStream  *output_stream;
-+};
-+
-+/* streaming classes declarations */
-+typedef struct _GMemPipeInputStream GMemPipeInputStream;
-+typedef struct _GMemPipeOutputStream GMemPipeOutputStream;
-+
-+static GOutputStream *g_mem_pipe_output_stream_new (GMemPipe *mem_pipe);
-+static GInputStream  *g_mem_pipe_input_stream_new  (GMemPipe *mem_pipe);
-+
-+/* GMemPipe imlementation starts here*/
-+static void
-+g_mem_pipe_finalize (GObject *object)
-+{
-+  GMemPipe        *mem_pipe;
-+  GMemPipePrivate *priv;
-+
-+  mem_pipe = G_MEM_PIPE (object);
-+
-+  priv = mem_pipe->priv;
-+
-+  g_mutex_free (priv->lock);
-+  g_cond_free (priv->cond);
-+
-+  if (priv->buffer.size)
-+    g_free (priv->buffer.data);
-+
-+  /* FIXME: move those to dispose? */
-+  g_object_unref (priv->input_stream);
-+  g_object_unref (priv->output_stream);
-+
-+  if (G_OBJECT_CLASS (g_mem_pipe_parent_class)->finalize)
-+    (*G_OBJECT_CLASS (g_mem_pipe_parent_class)->finalize) (object);
-+}
-+
-+static void
-+g_mem_pipe_class_init (GMemPipeClass *klass)
-+{
-+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-+
-+  g_type_class_add_private (klass, sizeof (GMemPipePrivate));
-+
-+  gobject_class->finalize     = g_mem_pipe_finalize;
-+  gobject_class->set_property = g_mem_pipe_set_property;
-+  gobject_class->get_property = g_mem_pipe_get_property;
-+  
-+  g_object_class_install_property (gobject_class, PROP_BUFFER_SIZE,
-+                                   g_param_spec_uint ("buffer-size",
-+                                                      P_("Buffer size"),
-+                                                      P_("The size of the internal buffer"),
-+                                                      0,
-+                                                      G_MAXUINT,
-+                                                      0,
-+                                                      G_PARAM_CONSTRUCT_ONLY |
-+                                                      G_PARAM_READWRITE |
-+                                                      G_PARAM_STATIC_STRINGS));
-+  
-+}
-+
-+static void
-+g_mem_pipe_init (GMemPipe *mem_pipe)
-+{
-+  GMemPipePrivate *priv;
-+  mem_pipe->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE (mem_pipe,
-+						       G_TYPE_MEM_PIPE,
-+						       GMemPipePrivate);
-+
-+  priv->cond = g_cond_new ();
-+  priv->lock = g_mutex_new ();
-+  priv->input_stream  = g_mem_pipe_input_stream_new (mem_pipe);
-+  priv->output_stream = g_mem_pipe_output_stream_new (mem_pipe);
-+}
-+
-+static void
-+g_mem_pipe_get_property (GObject    *object,
-+                         guint       prop_id,
-+                         GValue     *value,
-+                         GParamSpec *pspec)
-+{
-+  GMemPipe *mem_pipe = G_MEM_PIPE (object);
-+
-+  switch (prop_id)
-+    {
-+      case PROP_BUFFER_SIZE:
-+	g_warn_if_fail (mem_pipe->priv->buffer.dlen == 0);
-+        g_value_set_uint (value, mem_pipe->priv->buffer.size);
-+        break;
-+    
-+      default:
-+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+  }
-+}
-+
-+static void
-+g_mem_pipe_set_property (GObject      *object,
-+                         guint         prop_id,
-+                         const GValue *value,
-+                         GParamSpec   *pspec)
-+{
-+  GMemPipe *mem_pipe = G_MEM_PIPE (object);
-+  
-+  switch (prop_id)
-+    {
-+      case PROP_BUFFER_SIZE:
-+        mem_pipe->priv->buffer.size = g_value_get_uint (value);
-+        mem_pipe->priv->buffer.data = g_realloc (mem_pipe->priv->buffer.data,
-+                                                 mem_pipe->priv->buffer.size);
-+        break;
-+      
-+      default:
-+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+    } 
-+}
-+
-+static void
-+signal_cancellation (GCancellable *cancellable,
-+                     gpointer user_data)
-+{
-+  GMemPipe        *mem_pipe;
-+  GMemPipePrivate *priv;
-+
-+  mem_pipe = G_MEM_PIPE (user_data);
-+  priv = mem_pipe->priv;
-+
-+  g_mutex_lock (priv->lock);
-+  g_cond_signal (priv->cond);
-+  g_mutex_unlock (priv->lock);
-+}
-+
-+static guint
-+_g_mem_pipe_cancellable_connect (GMemPipe     *mem_pipe,
-+                                 GCancellable *cancellable)
-+{
-+  guint handler_id;
-+
-+  if (cancellable == NULL)
-+    return 0;
-+
-+  handler_id = g_cancellable_connect (cancellable,
-+                                      G_CALLBACK (signal_cancellation),
-+                                      mem_pipe,
-+                                      NULL);
-+  
-+  return handler_id;
-+}
-+
-+/* half open means write-end closed and read-end still open;
-+ * NB there is no need to special case the inverse of it
-+ * since writing to a pipe where the read is already closed
-+ * makes no sense at all (this is a SIGPIPE in unix land)
-+ */
-+#define _g_mem_pipe_is_half_open(_pipe)  _pipe->priv->closed & GPD_WRITE && \
-+                                        ~_pipe->priv->closed & GPD_READ
-+static gboolean
-+_g_mem_pipe_check_is_open (GMemPipe       *mem_pipe,
-+                           GPipeDirection  direction,
-+                           GError         **error)
-+{
-+  gboolean res;
-+  GMemPipePrivate *priv = mem_pipe->priv;
-+
-+  res = priv->closed == 0;
-+
-+  if (res == FALSE && direction & GPD_READ)
-+    res = _g_mem_pipe_is_half_open (mem_pipe);
-+
-+  if (res == FALSE)
-+    g_set_error_literal (error, 
-+			 G_IO_ERROR,
-+			 G_IO_ERROR_CLOSED,
-+			 "Pipe closed");
-+  return res;
-+}
-+
-+/* LOCKED: Must be called with the LOCK held! 
-+ *
-+ * Checks if the pipe is ready for IO. Will wait
-+ * if not.
-+ * 
-+ * NB: Can only check for GPD_WIRTE *or* GPD_READ!
-+ *
-+ * Returns: The number of data one can read/write
-+ * to the pipe; -1 in case of an error and 0 iff
-+ * the pipe write end got closed and there is no
-+ * data left in the pipe to read from.
-+ */
-+static gssize
-+_g_mem_pipe_poll (GMemPipe        *mem_pipe,
-+                  GPipeDirection   direction,
-+                  GCancellable    *cancellable,
-+                  GError         **error)
-+{
-+  GMemPipePrivate *priv = mem_pipe->priv;
-+  gssize           res  = -1;
-+
-+  while (! g_cancellable_set_error_if_cancelled (cancellable, error))
-+    {      
-+      if (! _g_mem_pipe_check_is_open (mem_pipe, direction, error))
-+	break;
-+	
-+      /* First check if we have to wait at all */
-+      if (direction & GPD_WRITE)
-+	{
-+	  res = priv->buffer.size - priv->buffer.dlen;
-+	  g_assert (res >= 0);
-+	}
-+      else /* ergo: direction & GPD_READ */
-+	{
-+	  res = priv->buffer.dlen;
-+
-+	  /* if the pipe is half open we must 
-+             never wait even in the case that
-+             res == 0; so we directly return */
-+	  if (_g_mem_pipe_is_half_open (mem_pipe))
-+	    return res;
-+	}
-+      /* if we got some data (or error) there is no need to wait! */
-+      if (res != 0)
-+	break;
-+      
-+      g_cond_wait (priv->cond, priv->lock);
-+
-+      res = -1; /* reset */
-+    }
-+
-+  return res;
-+}
-+
-+gssize
-+g_mem_pipe_read (GMemPipe      *mem_pipe,
-+                 void          *buffer,
-+                 gsize          count,
-+                 GCancellable  *cancellable,
-+                 GError       **error)
-+{
-+  GMemPipePrivate *priv;
-+  gssize   n;
-+  gssize   nread;
-+  gboolean is_buffered;
-+  gulong   handler_id;
-+
-+  g_return_val_if_fail (G_IS_MEM_PIPE (mem_pipe), -1);
-+  priv = mem_pipe->priv;
-+  
-+  if (count == 0)
-+    return 0;
-+
-+  handler_id = _g_mem_pipe_cancellable_connect (mem_pipe, cancellable);
-+  g_mutex_lock (priv->lock);
-+  
-+  is_buffered = (priv->buffer.size != 0);
-+  if (is_buffered == FALSE)
-+    {
-+      priv->buffer.data = buffer;
-+      priv->buffer.size = count;
-+
-+      /* if the writer thread is waiting for
-+         a place to write to, signal him that
-+         now there is this very place */
-+      g_cond_signal (priv->cond);
-+    }
-+
-+  n = _g_mem_pipe_poll (mem_pipe, GPD_READ, cancellable, error);
-+
-+  if (n > 0)
-+    {
-+      nread = MIN (count, n);
-+    
-+      if (is_buffered)
-+        {
-+          memcpy (buffer, priv->buffer.data, nread);
-+          g_memmove (priv->buffer.data, priv->buffer.data + nread, nread);
-+          priv->buffer.dlen -= nread;
-+        
-+          /* There should be room now in the buffer,
-+             maybe get more data right now */
-+          g_cond_signal (priv->cond);
-+        }
-+      else
-+        priv->buffer.dlen = priv->buffer.size = 0;
-+    }
-+  else
-+    nread = n;
-+
-+  g_mutex_unlock (priv->lock);
-+  g_cancellable_disconnect (cancellable, handler_id);
-+  
-+  return nread;
-+}
-+
-+gssize
-+g_mem_pipe_write (GMemPipe      *mem_pipe,
-+                  const void    *buffer,
-+                  gsize          count,
-+                  GCancellable  *cancellable,
-+                  GError       **error)
-+{
-+  GMemPipePrivate *priv;
-+  gssize           n;
-+  gssize           nwritten;
-+  gulong           handler_id;
-+
-+  g_return_val_if_fail (G_IS_MEM_PIPE (mem_pipe), -1);
-+
-+  if (count == 0)
-+    return 0;
-+
-+  priv = mem_pipe->priv;
-+  handler_id = _g_mem_pipe_cancellable_connect (mem_pipe, cancellable);
-+  
-+  g_mutex_lock (priv->lock);
-+  
-+  n = _g_mem_pipe_poll (mem_pipe, GPD_WRITE, cancellable, error);
-+
-+  if (n > 0)
-+    {
-+      nwritten = MIN (count, n);
-+      memcpy (priv->buffer.data + priv->buffer.dlen, buffer, nwritten);
-+      priv->buffer.dlen += nwritten;
-+    
-+      /* data is now available, wake up any sleeping thread */
-+      g_cond_signal (priv->cond);
-+    }
-+  else
-+    nwritten = n;
-+
-+  g_mutex_unlock (priv->lock);
-+  g_cancellable_disconnect (cancellable, handler_id);
-+  
-+  return nwritten;
-+}
-+
-+gboolean
-+g_mem_pipe_write_all  (GMemPipe      *mem_pipe,
-+                       const void    *buffer,
-+                       gsize          count,
-+                       gsize         *bytes_written,
-+                       GCancellable  *cancellable,
-+                       GError       **error)
-+{
-+  gssize    n;
-+  gsize     nwritten;
-+  gboolean  res;
-+  
-+  g_return_val_if_fail (G_IS_MEM_PIPE (mem_pipe), FALSE);
-+  
-+  nwritten = 0;
-+  res = TRUE;
-+  
-+  do
-+    {
-+      n = g_mem_pipe_write (mem_pipe,
-+			    buffer + nwritten,
-+			    count - nwritten,
-+			    cancellable,
-+			    error);
-+      
-+      if (n < 0)
-+	break;
-+      
-+      nwritten += n;
-+      
-+    }
-+  while (nwritten != count);
-+  
-+  if (bytes_written != NULL)
-+    *bytes_written = nwritten;
-+  
-+  return nwritten == count;
-+}
-+
-+gboolean
-+g_mem_pipe_close_write (GMemPipe      *mem_pipe,
-+			GCancellable  *cancellable,
-+			GError       **error)
-+{
-+  GMemPipePrivate *priv;
-+
-+  g_return_val_if_fail (G_IS_MEM_PIPE (mem_pipe), FALSE);
-+
-+  priv = mem_pipe->priv;
-+  g_mutex_lock (priv->lock);
-+  priv->closed |= GPD_WRITE;
-+  g_cond_signal (priv->cond);
-+  g_mutex_unlock (priv->lock);
-+
-+  return TRUE;
-+}
-+
-+gboolean
-+g_mem_pipe_close_read (GMemPipe      *mem_pipe,
-+		       GCancellable  *cancellable,
-+                       GError       **error)
-+{
-+  GMemPipePrivate *priv;
-+
-+  g_return_val_if_fail (G_IS_MEM_PIPE (mem_pipe), FALSE);
-+
-+  priv = mem_pipe->priv;
-+
-+  g_mutex_lock (priv->lock);
-+  priv->closed |= GPD_READ;
-+  g_cond_signal (priv->cond);
-+  g_mutex_unlock (priv->lock);
-+
-+  return TRUE;
-+}
-+
-+GMemPipe *
-+g_mem_pipe_new ()
-+{
-+    GMemPipe *mem_pipe;
-+
-+    mem_pipe = g_object_new (G_TYPE_MEM_PIPE, NULL);
-+
-+    return mem_pipe;
-+}
-+
-+GMemPipe *
-+g_mem_pipe_buffered_new (gsize buffer_size)
-+{
-+  GMemPipe *mem_pipe;
-+  
-+  mem_pipe = g_object_new (G_TYPE_MEM_PIPE, 
-+			   "buffer-size", buffer_size,
-+			   NULL);
-+  return mem_pipe;
-+}
-+
-+GInputStream *
-+g_mem_pipe_get_input_stream (GMemPipe *mem_pipe)
-+{
-+  GMemPipePrivate *priv;
-+  
-+  g_return_val_if_fail (G_IS_MEM_PIPE (mem_pipe), FALSE);
-+  
-+  priv = mem_pipe->priv;
-+  return g_object_ref (priv->input_stream);
-+}
-+
-+GOutputStream *
-+g_mem_pipe_get_output_stream (GMemPipe *mem_pipe)
-+{
-+  GMemPipePrivate *priv;
-+  
-+  g_return_val_if_fail (G_IS_MEM_PIPE (mem_pipe), FALSE);
-+  
-+  priv = mem_pipe->priv;
-+  return g_object_ref (priv->output_stream);
-+}
-+
-+
-+/* *********************************************************************** */
-+/* streams */
-+
-+/* ********************************* */
-+/* input stream */
-+typedef GInputStreamClass GMemPipeInputStreamClass;
-+struct _GMemPipeInputStream
-+{
-+  GInputStream parent_instance;
-+  GMemPipe *mem_pipe;
-+};
-+
-+#define G_TYPE_MEM_PIPE_INPUT_STREAM  (g_mem_pipe_input_stream_get_type ())
-+#define G_MEM_PIPE_INPUT_STREAM(o)    (G_TYPE_CHECK_INSTANCE_CAST ((o), \
-+                                       G_TYPE_MEM_PIPE_INPUT_STREAM,    \
-+				       GMemPipeInputStream))
-+#define G_IS_MEM_PIPE_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
-+				       G_TYPE_MEM_PIPE_INPUT_STREAM))
-+
-+GType   g_mem_pipe_input_stream_get_type (void) G_GNUC_CONST;
-+
-+G_DEFINE_TYPE (GMemPipeInputStream,
-+	       g_mem_pipe_input_stream,
-+	       G_TYPE_INPUT_STREAM)
-+
-+static GInputStream *
-+g_mem_pipe_input_stream_new (GMemPipe *mem_pipe)
-+{
-+  GMemPipeInputStream *istream;
-+  istream = g_object_new (G_TYPE_MEM_PIPE_INPUT_STREAM, NULL);
-+
-+  istream->mem_pipe = g_object_ref (mem_pipe);
-+  return G_INPUT_STREAM (istream);
-+}
-+
-+static gssize
-+g_mem_pipe_input_stream_read (GInputStream  *stream,
-+			      void          *buffer,
-+			      gsize          length,
-+			      GCancellable  *cancellable,
-+			      GError       **error)
-+{
-+  GMemPipeInputStream *istream = (GMemPipeInputStream *) stream;
-+
-+  return g_mem_pipe_read (istream->mem_pipe,
-+			  buffer,
-+			  length,
-+			  cancellable,
-+			  error);
-+}
-+
-+static gboolean
-+g_mem_pipe_input_stream_close (GInputStream  *stream,
-+			       GCancellable  *cancellable,
-+			       GError       **error)
-+{
-+  GMemPipeInputStream *istream = (GMemPipeInputStream *) stream;
-+  
-+  return g_mem_pipe_close_read (istream->mem_pipe,
-+			       cancellable,
-+			       error);
-+}
-+
-+static void
-+g_mem_pipe_input_stream_init (GMemPipeInputStream *self)
-+{
-+  
-+}
-+
-+static void
-+g_mem_pipe_input_stream_dispose (GObject *object)
-+{
-+  GMemPipeInputStream *istream;
-+
-+  istream = G_MEM_PIPE_INPUT_STREAM (object);
-+
-+  if (istream->mem_pipe != NULL)
-+    {
-+      g_object_unref (istream->mem_pipe);
-+      istream->mem_pipe = NULL;
-+    }
-+
-+  G_OBJECT_CLASS (g_mem_pipe_input_stream_parent_class)->dispose (object);
-+}
-+
-+static void
-+g_mem_pipe_input_stream_class_init (GMemPipeInputStreamClass *klass)
-+{
-+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-+  GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass);
-+
-+  gobject_class->dispose  = g_mem_pipe_input_stream_dispose;
-+  stream_class->read_fn   = g_mem_pipe_input_stream_read;
-+  stream_class->close_fn  = g_mem_pipe_input_stream_close;
-+}
-+
-+
-+/* ********************************* */
-+/* output stream */
-+typedef GOutputStreamClass GMemPipeOutputStreamClass;
-+struct _GMemPipeOutputStream
-+{
-+  GOutputStream parent_instance;
-+  GMemPipe *mem_pipe;
-+};
-+
-+#define G_TYPE_MEM_PIPE_OUTPUT_STREAM  (g_mem_pipe_output_stream_get_type ())
-+#define G_MEM_PIPE_OUTPUT_STREAM(o)    (G_TYPE_CHECK_INSTANCE_CAST ((o), \
-+                                        G_TYPE_MEM_PIPE_OUTPUT_STREAM,   \
-+				        GMemPipeOutputStream))
-+#define G_IS_MEM_PIPE_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
-+				        G_TYPE_MEM_PIPE_OUTPUT_STREAM))
-+
-+GType   g_mem_pipe_output_stream_get_type (void) G_GNUC_CONST;
-+
-+G_DEFINE_TYPE (GMemPipeOutputStream,
-+	       g_mem_pipe_output_stream,
-+	       G_TYPE_OUTPUT_STREAM)
-+
-+static GOutputStream *
-+g_mem_pipe_output_stream_new (GMemPipe *mem_pipe)
-+{
-+  GMemPipeOutputStream *ostream;
-+  ostream = g_object_new (G_TYPE_MEM_PIPE_OUTPUT_STREAM, NULL);
-+
-+  ostream->mem_pipe = g_object_ref (mem_pipe);
-+  return G_OUTPUT_STREAM (ostream);
-+}
-+
-+static gssize
-+g_mem_pipe_output_stream_write (GOutputStream  *stream,
-+				const void     *buffer,
-+				gsize           count,
-+				GCancellable   *cancellable,
-+				GError        **error)
-+{
-+  GMemPipeOutputStream *ostream = (GMemPipeOutputStream *) stream;
-+
-+  return g_mem_pipe_write (ostream->mem_pipe,
-+			   buffer,
-+			   count,
-+			   cancellable,
-+			   error);
-+}
-+
-+static gboolean
-+g_mem_pipe_output_stream_close (GOutputStream  *stream,
-+				GCancellable   *cancellable,
-+				GError        **error)
-+{
-+  GMemPipeOutputStream *ostream = (GMemPipeOutputStream *) stream;
-+
-+  g_return_val_if_fail (G_IS_MEMORY_OUTPUT_STREAM (stream), FALSE);
-+
-+  return g_mem_pipe_close_write (ostream->mem_pipe,
-+				 cancellable,
-+				 error);
-+}
-+
-+static void
-+g_mem_pipe_output_stream_init (GMemPipeOutputStream *self)
-+{
-+  
-+}
-+
-+static void
-+g_mem_pipe_output_stream_dispose (GObject *object)
-+{
-+  GMemPipeOutputStream *ostream;
-+
-+  ostream = G_MEM_PIPE_OUTPUT_STREAM (object);
-+
-+  if (ostream->mem_pipe != NULL)
-+    {
-+      g_object_unref (ostream->mem_pipe);
-+      ostream->mem_pipe = NULL;
-+    }
-+
-+  G_OBJECT_CLASS (g_mem_pipe_output_stream_parent_class)->dispose (object);
-+}
-+
-+static void
-+g_mem_pipe_output_stream_class_init (GMemPipeOutputStreamClass *klass)
-+{
-+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-+  GOutputStreamClass *stream_class = G_OUTPUT_STREAM_CLASS (klass);
-+
-+  gobject_class->dispose = g_mem_pipe_output_stream_dispose;
-+  stream_class->write_fn = g_mem_pipe_output_stream_write;
-+  stream_class->close_fn = g_mem_pipe_output_stream_close;
-+}
-Index: gvfs-1.7.3/daemon/gmempipe.h
-===================================================================
---- /dev/null
-+++ gvfs-1.7.3/daemon/gmempipe.h
-@@ -0,0 +1,86 @@
-+/* GIO - GLib Input, Output and Streaming Library
-+ * 
-+ * Copyright (C) Christian Kellner <gicmo@gnome.org>
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General
-+ * Public License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: Christian Kellner <gicmo@gnome.org>
-+ */
-+
-+#ifndef __G_MEM_PIPE_H__
-+#define __G_MEM_PIPE_H__
-+
-+#include <glib-object.h>
-+#include <gio/gio.h>
-+
-+G_BEGIN_DECLS
-+
-+#define G_TYPE_MEM_PIPE         (g_mem_pipe_get_type ())
-+#define G_MEM_PIPE(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_MEM_PIPE, GMemPipe))
-+#define G_MEM_PIPE_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_MEM_PIPE, GMemPipeClass))
-+#define G_IS_MEM_PIPE(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_MEM_PIPE))
-+#define G_IS_MEM_PIPE_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), G_TPE_MEM_PIPE))
-+#define G_MEM_PIPE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_MEM_PIPE, GMemPipeClass))
-+
-+typedef struct _GMemPipe        GMemPipe;
-+typedef struct _GMemPipePrivate GMemPipePrivate;
-+typedef struct _GMemPipeClass   GMemPipeClass;
-+
-+struct _GMemPipe
-+{
-+  GObject parent_instance;
-+
-+  GMemPipePrivate *priv;
-+};
-+
-+struct _GMemPipeClass
-+{
-+  GObjectClass parent_class;
-+
-+};
-+
-+GType          g_mem_pipe_get_type          (void) G_GNUC_CONST;
-+GMemPipe *     g_mem_pipe_new               (void);
-+GMemPipe *     g_mem_pipe_buffered_new      (gsize          buffer_size);
-+gssize         g_mem_pipe_write             (GMemPipe      *mem_pipe,
-+					     const void    *buffer,
-+					     gsize          count,
-+					     GCancellable  *cancellable,
-+					     GError       **error);
-+gboolean       g_mem_pipe_write_all         (GMemPipe      *mem_pipe,
-+					     const void    *buffer,
-+					     gsize          count,
-+					     gsize         *bytes_written,
-+					     GCancellable  *cancellable,
-+					     GError       **error);
-+gssize         g_mem_pipe_read              (GMemPipe      *mem_pipe,
-+					     void          *buffer,
-+					     gsize          count,
-+					     GCancellable  *cancellable,
-+					     GError       **error);
-+gboolean       g_mem_pipe_close_write       (GMemPipe      *mem_pipe,
-+					     GCancellable  *cancellable,
-+					     GError       **error);
-+gboolean       g_mem_pipe_close_read        (GMemPipe      *mem_pipe,
-+					     GCancellable  *cancellable,
-+					     GError       **error);
-+GInputStream  *g_mem_pipe_get_input_stream  (GMemPipe      *mem_pipe);
-+GOutputStream *g_mem_pipe_get_output_stream (GMemPipe      *mem_pipe);
-+
-+
-+G_END_DECLS
-+
-+#endif /* __G_MEM_PIPE_H__ */
-Index: gvfs-1.7.3/daemon/gvfsbackenddav.c
-===================================================================
---- gvfs-1.7.3.orig/daemon/gvfsbackenddav.c
-+++ gvfs-1.7.3/daemon/gvfsbackenddav.c
-@@ -2311,6 +2311,47 @@ try_unmount (GVfsBackend    *backend,
-   _exit (0);
- }
- 
-+
-+/* *** overwrite http backend method *** */
-+static void
-+do_open_for_read (GVfsBackend        *backend,
-+		  GVfsJobOpenForRead *job,
-+		  const char         *filename)
-+{
-+  SoupURI     *uri;
-+  GFileType    file_type;
-+  gboolean     res;
-+  guint        num_children;
-+  GError      *error;
-+
-+  error = NULL;
-+
-+  uri = http_backend_uri_for_filename (backend, filename, FALSE);
-+  res = stat_location (backend, uri, &file_type, &num_children, &error);
-+  soup_uri_free (uri);
-+
-+  if (res == FALSE)
-+    {
-+      g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
-+      g_error_free (error);
-+      return;
-+    }
-+
-+  if (file_type == G_FILE_TYPE_DIRECTORY)
-+    {
-+      g_vfs_job_failed (G_VFS_JOB (job),
-+                        G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY,
-+                        _("Directory not empty"));
-+      return;
-+    }
-+
-+  /* the real work happens in the parent class */
-+  G_VFS_BACKEND_CLASS (g_vfs_backend_dav_parent_class)->open_for_read (backend,
-+								       job,
-+								       filename);
-+}
-+
-+
- /* ************************************************************************* */
- /*  */
- static void
-@@ -2324,6 +2365,8 @@ g_vfs_backend_dav_class_init (GVfsBacken
- 
-   backend_class = G_VFS_BACKEND_CLASS (klass); 
- 
-+  backend_class->open_for_read     = do_open_for_read;
-+
-   backend_class->try_mount         = NULL;
-   backend_class->mount             = do_mount;
-   backend_class->try_query_info    = NULL;
-Index: gvfs-1.7.3/daemon/gvfsbackendhttp.c
-===================================================================
---- gvfs-1.7.3.orig/daemon/gvfsbackendhttp.c
-+++ gvfs-1.7.3/daemon/gvfsbackendhttp.c
-@@ -239,7 +239,6 @@ http_error_code_from_status (guint statu
-   return G_IO_ERROR_FAILED;
- }
- 
--
- static void
- g_vfs_job_failed_from_http_status (GVfsJob *job, guint status_code, const char *message)
- {
-@@ -262,6 +261,16 @@ g_vfs_job_failed_from_http_status (GVfsJ
-   }
- }
- 
-+static void
-+g_vfs_job_failed_from_soup_error (GVfsJob *job, GError *error)
-+{
-+  if (error->domain == SOUP_HTTP_ERROR)
-+    g_vfs_job_failed_from_http_status (job, error->code, error->message);
-+  else
-+    g_vfs_job_failed_literal (job, error->domain, error->code, error->message);
-+}
-+
-+
- guint
- http_backend_send_message (GVfsBackend *backend,
-                            SoupMessage *msg)
-@@ -335,53 +344,17 @@ try_mount (GVfsBackend  *backend,
-   return TRUE;
- }
- 
--/* *** open_read () *** */
--static void
--open_for_read_ready (GObject      *source_object,
--                     GAsyncResult *result,
--                     gpointer      user_data)
--{
--  GInputStream *stream;
--  GVfsJob      *job;
--  gboolean      res;
--  gboolean      can_seek;
--  GError       *error;
--
--  stream = G_INPUT_STREAM (source_object); 
--  error  = NULL;
--  job    = G_VFS_JOB (user_data);
--
--  res = soup_input_stream_send_finish (stream,
--                                       result,
--                                       &error);
--  if (res == FALSE)
--    {
--      g_vfs_job_failed_literal (G_VFS_JOB (job),
--                                error->domain,
--                                error->code,
--                                error->message);
--
--      g_error_free (error);
--      g_object_unref (stream);
--      return;
--    }
--
--  can_seek = G_IS_SEEKABLE (stream) && g_seekable_can_seek (G_SEEKABLE (stream));
--
--  g_vfs_job_open_for_read_set_can_seek (G_VFS_JOB_OPEN_FOR_READ (job), can_seek);
--  g_vfs_job_open_for_read_set_handle (G_VFS_JOB_OPEN_FOR_READ (job), stream);
--  g_vfs_job_succeeded (job);
--}
--
--static gboolean 
--try_open_for_read (GVfsBackend        *backend,
--                   GVfsJobOpenForRead *job,
--                   const char         *filename)
-+static void 
-+do_open_for_read (GVfsBackend        *backend,
-+		  GVfsJobOpenForRead *job,
-+		  const char         *filename)
- {
-   GVfsBackendHttp *op_backend;
-   GInputStream    *stream;
-   SoupMessage     *msg;
-   SoupURI         *uri;
-+  GError          *error;
-+  gboolean         res;
- 
-   op_backend = G_VFS_BACKEND_HTTP (backend);
-   uri = http_backend_uri_for_filename (backend, filename, FALSE);
-@@ -390,125 +363,119 @@ try_open_for_read (GVfsBackend        *b
- 
-   soup_message_body_set_accumulate (msg->response_body, FALSE);
- 
--  stream = soup_input_stream_new (op_backend->session_async, msg);
-+  stream = soup_input_stream_new (op_backend->session, msg);
-   g_object_unref (msg);
- 
--  soup_input_stream_send_async (stream,
--                                G_PRIORITY_DEFAULT,
--                                G_VFS_JOB (job)->cancellable,
--                                open_for_read_ready,
--                                job);
--  return TRUE;
-+  error = NULL;
-+  res = soup_input_stream_send (stream,
-+				G_VFS_JOB (job)->cancellable,
-+				&error);
-+
-+  if (res == FALSE)
-+    {
-+      g_vfs_job_failed_from_soup_error (G_VFS_JOB (job), error);
-+      g_error_free (error);
-+      g_object_unref (stream);
-+    }
-+  else
-+    {
-+      gboolean can_seek;
-+      can_seek = G_IS_SEEKABLE (stream) && g_seekable_can_seek (G_SEEKABLE (stream));
-+      
-+      g_vfs_job_open_for_read_set_can_seek (G_VFS_JOB_OPEN_FOR_READ (job), can_seek);
-+      g_vfs_job_open_for_read_set_handle (G_VFS_JOB_OPEN_FOR_READ (job), stream);
-+
-+      g_vfs_job_succeeded (G_VFS_JOB (job));
-+    }
- }
- 
--/* *** read () *** */
- static void
--read_ready (GObject      *source_object,
--            GAsyncResult *result,
--            gpointer      user_data)
-+do_read (GVfsBackend *     backend,
-+         GVfsJobRead *     job,
-+         GVfsBackendHandle handle,
-+         char *            buffer,
-+         gsize             bytes_requested)
- {
-   GInputStream *stream;
--  GVfsJob      *job;
-   GError       *error;
--  gssize        nread;
-+  gssize        n_bytes;
- 
--  stream = G_INPUT_STREAM (source_object); 
--  error  = NULL;
--  job    = G_VFS_JOB (user_data);
--
--  nread = g_input_stream_read_finish (stream, result, &error);
--
--  if (nread < 0)
--   {
--     g_vfs_job_failed_literal (G_VFS_JOB (job),
--                               error->domain,
--                               error->code,
--                               error->message);
--
--     g_error_free (error);
--     return;
--   }
-+  stream = G_INPUT_STREAM (handle);
- 
--  g_vfs_job_read_set_size (G_VFS_JOB_READ (job), nread);
--  g_vfs_job_succeeded (job);
-+  error = NULL;
-+  n_bytes = g_input_stream_read (stream,
-+				 buffer,
-+				 bytes_requested,
-+				 G_VFS_JOB (job)->cancellable,
-+				 &error);
- 
-+  if (n_bytes >= 0)
-+    {
-+      g_vfs_job_read_set_size (job, n_bytes);
-+      g_vfs_job_succeeded (G_VFS_JOB (job));
-+    }
-+  else
-+    {
-+      g_vfs_job_failed_from_soup_error (G_VFS_JOB (job), error);
-+      g_error_free (error);
-+    }
- }
- 
--static gboolean
--try_read (GVfsBackend        *backend,
--          GVfsJobRead        *job,
--          GVfsBackendHandle   handle,
--          char               *buffer,
--          gsize               bytes_requested)
--{
--  GInputStream    *stream;
--
--  stream = G_INPUT_STREAM (handle);
- 
--  g_input_stream_read_async (stream,
--                             buffer,
--                             bytes_requested,
--                             G_PRIORITY_DEFAULT,
--                             G_VFS_JOB (job)->cancellable,
--                             read_ready,
--                             job);
--  return TRUE;
--}
--
--static gboolean
--try_seek_on_read (GVfsBackend *backend,
--                  GVfsJobSeekRead *job,
--                  GVfsBackendHandle handle,
--                  goffset    offset,
--                  GSeekType  type)
-+static void
-+do_seek_on_read (GVfsBackend *backend,
-+		 GVfsJobSeekRead *job,
-+		 GVfsBackendHandle handle,
-+		 goffset    offset,
-+		 GSeekType  type)
- {
--  GInputStream    *stream;
--  GError          *error = NULL;
-+  GInputStream *stream;
-+  GError       *error = NULL;
-+  gboolean      res;
- 
-   stream = G_INPUT_STREAM (handle);
- 
--  if (!g_seekable_seek (G_SEEKABLE (stream), offset, type,
--                        G_VFS_JOB (job)->cancellable, &error))
-+
-+  res = g_seekable_seek (G_SEEKABLE (stream),
-+			 offset,
-+			 type,
-+			 G_VFS_JOB (job)->cancellable,
-+			 &error);
-+  
-+  if (res == FALSE)
-     {
--      g_vfs_job_failed_literal (G_VFS_JOB (job),
--                                error->domain,
--                                error->code,
--                                error->message);
-+      g_vfs_job_failed_from_soup_error (G_VFS_JOB (job), error);
-       g_error_free (error);
--      return FALSE;
-     }
-   else
-     {
-       g_vfs_job_seek_read_set_offset (job, g_seekable_tell (G_SEEKABLE (stream)));
-       g_vfs_job_succeeded (G_VFS_JOB (job));
-     }
--
--  return TRUE;
- }
- 
- /* *** read_close () *** */
- static void
--close_read_ready (GObject      *source_object,
--                  GAsyncResult *result,
--                  gpointer      user_data)
-+do_close_read (GVfsBackend       *backend,
-+	       GVfsJobCloseRead  *read_job,
-+               GVfsBackendHandle  handle)
- {
-   GInputStream *stream;
-   GVfsJob      *job;
-   GError       *error;
-   gboolean      res;
- 
--  job = G_VFS_JOB (user_data);
--  stream = G_INPUT_STREAM (source_object);
--  res = g_input_stream_close_finish (stream,
--                                     result,
--                                     &error);
-+  error = NULL;
-+  job = G_VFS_JOB (read_job);
-+  stream = G_INPUT_STREAM (handle);
-+
-+
-+  res = g_input_stream_close (stream,
-+			      job->cancellable,
-+			      &error);
-   if (res == FALSE)
-     {
--      g_vfs_job_failed_literal (G_VFS_JOB (job),
--                                error->domain,
--                                error->code,
--                                error->message);
--
-+      g_vfs_job_failed_from_soup_error (G_VFS_JOB (job), error);
-       g_error_free (error);
-     }
-   else
-@@ -517,24 +484,6 @@ close_read_ready (GObject      *source_o
-   g_object_unref (stream);
- }
- 
--static gboolean 
--try_close_read (GVfsBackend       *backend,
--                GVfsJobCloseRead  *job,
--                GVfsBackendHandle  handle)
--{
--  GInputStream    *stream;
--
--  stream = G_INPUT_STREAM (handle);
--
--  g_input_stream_close_async (stream,
--                              G_PRIORITY_DEFAULT,
--                              G_VFS_JOB (job)->cancellable,
--                              close_read_ready,
--                              job);
--  return TRUE;
--}
--
--
- /* *** query_info () *** */
- 
- static void
-@@ -688,10 +637,12 @@ g_vfs_backend_http_class_init (GVfsBacke
-   backend_class = G_VFS_BACKEND_CLASS (klass); 
- 
-   backend_class->try_mount              = try_mount;
--  backend_class->try_open_for_read      = try_open_for_read;
--  backend_class->try_read               = try_read;
--  backend_class->try_seek_on_read       = try_seek_on_read;
--  backend_class->try_close_read         = try_close_read;
-+
-+  backend_class->open_for_read          = do_open_for_read;
-+  backend_class->close_read             = do_close_read;
-+  backend_class->read                   = do_read;
-+  backend_class->seek_on_read        = do_seek_on_read;
-+
-   backend_class->try_query_info         = try_query_info;
-   backend_class->try_query_info_on_read = try_query_info_on_read;
- }
-Index: gvfs-1.7.3/daemon/soup-input-stream.c
-===================================================================
---- gvfs-1.7.3.orig/daemon/soup-input-stream.c
-+++ gvfs-1.7.3/daemon/soup-input-stream.c
-@@ -18,7 +18,7 @@
-  * Boston, MA 02111-1307, USA.
-  */
- 
--#include <config.h>
-+//#include <config.h>
- 
- #include <string.h>
- 
-@@ -28,6 +28,7 @@
- #include <libsoup/soup.h>
- 
- #include "soup-input-stream.h"
-+#include "gmempipe.h"
- 
- static void soup_input_stream_seekable_iface_init (GSeekableIface *seekable_iface);
- 
-@@ -37,29 +38,23 @@ G_DEFINE_TYPE_WITH_CODE (SoupInputStream
- 
- typedef void (*SoupInputStreamCallback) (GInputStream *);
- 
--typedef struct {
-+struct SoupInputStreamPrivate {
-   SoupSession *session;
--  GMainContext *async_context;
-   SoupMessage *msg;
-+  
-   gboolean got_headers, finished;
-   goffset offset;
- 
--  GCancellable *cancellable;
--  GSource *cancel_watch;
--  SoupInputStreamCallback got_headers_cb;
--  SoupInputStreamCallback got_chunk_cb;
--  SoupInputStreamCallback finished_cb;
--  SoupInputStreamCallback cancelled_cb;
--
--  guchar *leftover_buffer;
--  gsize leftover_bufsize, leftover_offset;
--
--  guchar *caller_buffer;
--  gsize caller_bufsize, caller_nread;
--  GAsyncReadyCallback outstanding_callback;
--  GSimpleAsyncResult *result;
-+  GMutex *lock;
-+  GCond  *cond;
-+  
-+  GMemPipe *mem_pipe;
-+
-+  GInputStream  *in;
-+  GOutputStream *out;
-+
-+};
- 
--} SoupInputStreamPrivate;
- #define SOUP_INPUT_STREAM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUP_TYPE_INPUT_STREAM, SoupInputStreamPrivate))
- 
- 
-@@ -71,24 +66,6 @@ static gssize   soup_input_stream_read
- static gboolean soup_input_stream_close        (GInputStream         *stream,
- 						GCancellable         *cancellable,
- 						GError              **error);
--static void     soup_input_stream_read_async   (GInputStream         *stream,
--						void                 *buffer,
--						gsize                 count,
--						int                   io_priority,
--						GCancellable         *cancellable,
--						GAsyncReadyCallback   callback,
--						gpointer              data);
--static gssize   soup_input_stream_read_finish  (GInputStream         *stream,
--						GAsyncResult         *result,
--						GError              **error);
--static void     soup_input_stream_close_async  (GInputStream         *stream,
--						int                   io_priority,
--						GCancellable         *cancellable,
--						GAsyncReadyCallback   callback,
--						gpointer              data);
--static gboolean soup_input_stream_close_finish (GInputStream         *stream,
--						GAsyncResult         *result,
--						GError              **error);
- 
- static goffset  soup_input_stream_tell         (GSeekable            *seekable);
-   
-@@ -115,13 +92,25 @@ soup_input_stream_finalize (GObject *obj
-   SoupInputStream *stream = SOUP_INPUT_STREAM (object);
-   SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
- 
--  g_object_unref (priv->session);
-+  g_print ("Finalize\n");
-+
-+  if (priv->session)
-+    g_object_unref (priv->session);
-+
-+  if (priv->msg)
-+    g_object_unref (priv->msg);
-+
-+  if (priv->mem_pipe)
-+    {
-+      g_object_unref (priv->mem_pipe);
-+      g_object_unref (priv->in);
-+      g_object_unref (priv->out);
-+    }
-+
-+  g_mutex_free (priv->lock);
-+  g_cond_free (priv->cond);
- 
--  g_signal_handlers_disconnect_by_func (priv->msg, G_CALLBACK (soup_input_stream_got_headers), stream);
--  g_signal_handlers_disconnect_by_func (priv->msg, G_CALLBACK (soup_input_stream_got_chunk), stream);
--  g_signal_handlers_disconnect_by_func (priv->msg, G_CALLBACK (soup_input_stream_finished), stream);
--  g_object_unref (priv->msg);
--  g_free (priv->leftover_buffer);
-+  g_print ("Done!\n");
- 
-   if (G_OBJECT_CLASS (soup_input_stream_parent_class)->finalize)
-     (*G_OBJECT_CLASS (soup_input_stream_parent_class)->finalize) (object);
-@@ -136,41 +125,77 @@ soup_input_stream_class_init (SoupInputS
-   g_type_class_add_private (klass, sizeof (SoupInputStreamPrivate));
-   
-   gobject_class->finalize = soup_input_stream_finalize;
--
--  stream_class->read_fn = soup_input_stream_read;
-+  stream_class->read_fn  = soup_input_stream_read;
-   stream_class->close_fn = soup_input_stream_close;
--  stream_class->read_async = soup_input_stream_read_async;
--  stream_class->read_finish = soup_input_stream_read_finish;
--  stream_class->close_async = soup_input_stream_close_async;
--  stream_class->close_finish = soup_input_stream_close_finish;
- }
- 
- static void
- soup_input_stream_seekable_iface_init (GSeekableIface *seekable_iface)
- {
--  seekable_iface->tell = soup_input_stream_tell;
--  seekable_iface->can_seek = soup_input_stream_can_seek;
--  seekable_iface->seek = soup_input_stream_seek;
-+  seekable_iface->tell         = soup_input_stream_tell;
-+  seekable_iface->can_seek     = soup_input_stream_can_seek;
-+  seekable_iface->seek         = soup_input_stream_seek;
-   seekable_iface->can_truncate = soup_input_stream_can_truncate;
--  seekable_iface->truncate_fn = soup_input_stream_truncate;
-+  seekable_iface->truncate_fn  = soup_input_stream_truncate;
- }
- 
- static void
- soup_input_stream_init (SoupInputStream *stream)
- {
--  ;
-+  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
-+  stream->priv = priv;
-+
-+  priv->lock = g_mutex_new ();
-+  priv->cond = g_cond_new ();
- }
- 
- static void
--soup_input_stream_queue_message (SoupInputStream *stream)
-+_soup_input_stream_queue_msg_and_wait (SoupInputStream *stream)
- {
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
-+  SoupInputStreamPrivate *priv = stream->priv;
-+
-+  g_mutex_lock (priv->lock);
-+
-+  if (priv->mem_pipe)
-+    {
-+      g_object_unref (priv->mem_pipe);
-+      g_object_unref (priv->in);
-+      g_object_unref (priv->out);
-+    }
-+
-+  priv->mem_pipe = g_mem_pipe_new ();
-+  priv->in       = g_mem_pipe_get_input_stream (priv->mem_pipe);
-+  priv->out      = g_mem_pipe_get_output_stream (priv->mem_pipe);
- 
-   priv->got_headers = priv->finished = FALSE;
- 
-   /* Add an extra ref since soup_session_queue_message steals one */
-   g_object_ref (priv->msg);
-   soup_session_queue_message (priv->session, priv->msg, NULL, NULL);
-+
-+  /* wait until we got the headers (or fail?) */
-+  while (!priv->got_headers && !priv->finished)
-+    g_cond_wait (priv->cond, priv->lock);
-+
-+  g_mutex_unlock (priv->lock);
-+}
-+
-+extern void soup_message_io_cleanup (SoupMessage *msg);
-+
-+static void
-+_soup_input_stream_cancel_msg_and_wait (SoupInputStream *stream)
-+{
-+  SoupInputStreamPrivate *priv = stream->priv;
-+
-+  g_mutex_lock (priv->lock);
-+  soup_session_cancel_message (priv->session, priv->msg, SOUP_STATUS_CANCELLED);
-+  soup_message_io_cleanup (priv->msg);
-+
-+  /* FIXME: is this at all necessary? */
-+  while (!priv->got_headers && !priv->finished)
-+     g_cond_wait (priv->cond, priv->lock);
-+  
-+  g_mutex_unlock (priv->lock);
- }
- 
- /**
-@@ -181,21 +206,8 @@ soup_input_stream_queue_message (SoupInp
-  * Prepares to send @msg over @session, and returns a #GInputStream
-  * that can be used to read the response.
-  *
-- * @msg may not be sent until the first read call; if you need to look
-- * at the status code or response headers before reading the body, you
-- * can use soup_input_stream_send() or soup_input_stream_send_async()
-- * to force the message to be sent and the response headers read.
-+ * FIXME
-  *
-- * If @msg gets a non-2xx result, the first read (or send) will return
-- * an error with type %SOUP_INPUT_STREAM_HTTP_ERROR.
-- *
-- * Internally, #SoupInputStream is implemented using asynchronous I/O,
-- * so if you are using the synchronous API (eg,
-- * g_input_stream_read()), you should create a new #GMainContext and
-- * set it as the %SOUP_SESSION_ASYNC_CONTEXT property on @session. (If
-- * you don't, then synchronous #GInputStream calls will cause the main
-- * loop to be run recursively.) The async #GInputStream API works fine
-- * with %SOUP_SESSION_ASYNC_CONTEXT either set or unset.
-  *
-  * Returns: a new #GInputStream.
-  **/
-@@ -211,17 +223,15 @@ soup_input_stream_new (SoupSession *sess
-   priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
- 
-   priv->session = g_object_ref (session);
--  priv->async_context = soup_session_get_async_context (session);
-   priv->msg = g_object_ref (msg);
--
-+  
-   g_signal_connect (msg, "got_headers",
--		    G_CALLBACK (soup_input_stream_got_headers), stream);
-+                    G_CALLBACK (soup_input_stream_got_headers), stream);
-   g_signal_connect (msg, "got_chunk",
--		    G_CALLBACK (soup_input_stream_got_chunk), stream);
-+                    G_CALLBACK (soup_input_stream_got_chunk), stream);
-   g_signal_connect (msg, "finished",
--		    G_CALLBACK (soup_input_stream_finished), stream);
-+                    G_CALLBACK (soup_input_stream_finished), stream);
- 
--  soup_input_stream_queue_message (stream);
-   return G_INPUT_STREAM (stream);
- }
- 
-@@ -230,6 +240,8 @@ soup_input_stream_got_headers (SoupMessa
- {
-   SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
- 
-+  g_mutex_lock (priv->lock);
-+
-   /* If the status is unsuccessful, we just ignore the signal and let
-    * libsoup keep going (eventually either it will requeue the request
-    * (after handling authentication/redirection), or else the
-@@ -239,19 +251,14 @@ soup_input_stream_got_headers (SoupMessa
-     return;
- 
-   priv->got_headers = TRUE;
--  if (!priv->caller_buffer)
--    {
--      /* Not ready to read the body yet */
--      soup_session_pause_message (priv->session, msg);
--    }
--
--  if (priv->got_headers_cb)
--    priv->got_headers_cb (stream);
-+  g_cond_signal (priv->cond);
-+  g_mutex_unlock (priv->lock);
- }
- 
- static void
--soup_input_stream_got_chunk (SoupMessage *msg, SoupBuffer *chunk_buffer,
--			     gpointer stream)
-+soup_input_stream_got_chunk (SoupMessage *msg,
-+                             SoupBuffer  *chunk_buffer,
-+                             gpointer     stream)
- {
-   SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
-   const gchar *chunk = chunk_buffer->data;
-@@ -263,46 +270,14 @@ soup_input_stream_got_chunk (SoupMessage
-   if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
-     return;
- 
--  /* Sanity check */
--  if (priv->caller_bufsize == 0 || priv->leftover_bufsize != 0)
--    g_warning ("soup_input_stream_got_chunk called again before previous chunk was processed");
-+  g_output_stream_write_all (priv->out,
-+			     chunk,
-+			     chunk_size,
-+			     NULL,
-+			     NULL,
-+			     NULL);
- 
--  /* Copy what we can into priv->caller_buffer */
--  if (priv->caller_bufsize - priv->caller_nread > 0)
--    {
--      gsize nread = MIN (chunk_size, priv->caller_bufsize - priv->caller_nread);
--
--      memcpy (priv->caller_buffer + priv->caller_nread, chunk, nread);
--      priv->caller_nread += nread;
--      priv->offset += nread;
--      chunk += nread;
--      chunk_size -= nread;
--    }
--
--  if (chunk_size > 0)
--    {
--      /* Copy the rest into priv->leftover_buffer. If there's already
--       * some data there, realloc and append. Otherwise just copy.
--       */
--      if (priv->leftover_bufsize)
--	{
--	  priv->leftover_buffer = g_realloc (priv->leftover_buffer,
--					     priv->leftover_bufsize + chunk_size);
--	  memcpy (priv->leftover_buffer + priv->leftover_bufsize,
--		  chunk, chunk_size);
--	  priv->leftover_bufsize += chunk_size;
--	}
--      else
--	{
--	  priv->leftover_bufsize = chunk_size;
--	  priv->leftover_buffer = g_memdup (chunk, chunk_size);
--	  priv->leftover_offset = 0;
--	}
--    }
--
--  soup_session_pause_message (priv->session, msg);
--  if (priv->got_chunk_cb)
--    priv->got_chunk_cb (stream);
-+  /* FIXME: handle errors */
- }
- 
- static void
-@@ -310,71 +285,12 @@ soup_input_stream_finished (SoupMessage
- {
-   SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
- 
-+  g_mutex_lock (priv->lock);
-   priv->finished = TRUE;
--
--  if (priv->finished_cb)
--    priv->finished_cb (stream);
--}
--
--static gboolean
--soup_input_stream_cancelled (GIOChannel *chan, GIOCondition condition,
--			     gpointer stream)
--{
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
--
--  priv->cancel_watch = NULL;
--
--  soup_session_pause_message (priv->session, priv->msg);
--  if (priv->cancelled_cb)
--    priv->cancelled_cb (stream);
--
--  return FALSE;
--}  
--
--static void
--soup_input_stream_prepare_for_io (GInputStream *stream,
--				  GCancellable *cancellable,
--				  guchar       *buffer,
--				  gsize         count)
--{
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
--  int cancel_fd;
--
--  priv->cancellable = cancellable;
--  cancel_fd = g_cancellable_get_fd (cancellable);
--  if (cancel_fd != -1)
--    {
--      GIOChannel *chan = g_io_channel_unix_new (cancel_fd);
--      priv->cancel_watch = soup_add_io_watch (priv->async_context, chan,
--					      G_IO_IN | G_IO_ERR | G_IO_HUP,
--					      soup_input_stream_cancelled,
--					      stream);
--      g_io_channel_unref (chan);
--    }
--
--  priv->caller_buffer = buffer;
--  priv->caller_bufsize = count;
--  priv->caller_nread = 0;
--
--  if (priv->got_headers)
--    soup_session_unpause_message (priv->session, priv->msg);
--}
--
--static void
--soup_input_stream_done_io (GInputStream *stream)
--{
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
--
--  if (priv->cancel_watch)
--    {
--      g_source_destroy (priv->cancel_watch);
--      priv->cancel_watch = NULL;
--      g_cancellable_release_fd (priv->cancellable);
--    }
--  priv->cancellable = NULL;
--
--  priv->caller_buffer = NULL;
--  priv->caller_bufsize = 0;
-+  //g_print ("Finished!\n");
-+  g_mem_pipe_close_write (priv->mem_pipe, NULL, NULL);
-+  g_cond_signal (priv->cond);
-+  g_mutex_unlock (priv->lock);
- }
- 
- static gboolean
-@@ -386,58 +302,10 @@ set_error_if_http_failed (SoupMessage *m
- 			   msg->status_code, msg->reason_phrase);
-       return TRUE;
-     }
-+  
-   return FALSE;
- }
- 
--static gsize
--read_from_leftover (SoupInputStreamPrivate *priv,
--		    gpointer buffer, gsize bufsize)
--{
--  gsize nread;
--
--  if (priv->leftover_bufsize - priv->leftover_offset <= bufsize)
--    {
--      nread = priv->leftover_bufsize - priv->leftover_offset;
--      memcpy (buffer, priv->leftover_buffer + priv->leftover_offset, nread);
--
--      g_free (priv->leftover_buffer);
--      priv->leftover_buffer = NULL;
--      priv->leftover_bufsize = priv->leftover_offset = 0;
--    }
--  else
--    {
--      nread = bufsize;
--      memcpy (buffer, priv->leftover_buffer + priv->leftover_offset, nread);
--      priv->leftover_offset += nread;
--    }
--
--  priv->offset += nread;
--  return nread;
--}
--
--/* This does the work of soup_input_stream_send(), assuming that the
-- * GInputStream pending flag has already been set. It is also used by
-- * soup_input_stream_send_async() in some circumstances.
-- */
--static gboolean
--soup_input_stream_send_internal (GInputStream  *stream,
--				 GCancellable  *cancellable,
--				 GError       **error)
--{
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
--
--  soup_input_stream_prepare_for_io (stream, cancellable, NULL, 0);
--  while (!priv->finished && !priv->got_headers &&
--	 !g_cancellable_is_cancelled (cancellable))
--    g_main_context_iteration (priv->async_context, TRUE);
--  soup_input_stream_done_io (stream);
--
--  if (g_cancellable_set_error_if_cancelled (cancellable, error))
--    return FALSE;
--  else if (set_error_if_http_failed (priv->msg, error))
--    return FALSE;
--  return TRUE;
--}
- 
- /**
-  * soup_input_stream_send:
-@@ -454,54 +322,59 @@ soup_input_stream_send_internal (GInputS
-  * not.
-  **/
- gboolean
--soup_input_stream_send (GInputStream *stream,
--			GCancellable *cancellable,
--			GError      **error)
-+soup_input_stream_send (GInputStream *input_stream,
-+                        GCancellable *cancellable,
-+                        GError      **error)
- {
-+  SoupInputStream        *stream;
-+  SoupInputStreamPrivate *priv;
-   gboolean result;
- 
--  g_return_val_if_fail (SOUP_IS_INPUT_STREAM (stream), FALSE);
-+  g_return_val_if_fail (SOUP_IS_INPUT_STREAM (input_stream), FALSE);
-+  
-+  stream = SOUP_INPUT_STREAM (input_stream);
-+  priv = stream->priv;
- 
--  if (!g_input_stream_set_pending (stream, error))
-+  if (!g_input_stream_set_pending (input_stream, error))
-       return FALSE;
--  result = soup_input_stream_send_internal (stream, cancellable, error);
--  g_input_stream_clear_pending (stream);
-+  
-+  _soup_input_stream_queue_msg_and_wait (stream);
-+
-+  g_input_stream_clear_pending (input_stream);
-+  
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    return FALSE;
-+
-+  result = ! set_error_if_http_failed (priv->msg, error);
- 
-   return result;
- }
- 
- static gssize
--soup_input_stream_read (GInputStream *stream,
--			void         *buffer,
--			gsize         count,
--			GCancellable *cancellable,
--			GError      **error)
-+soup_input_stream_read (GInputStream  *stream,
-+                        void          *buffer,
-+                        gsize          count,
-+                        GCancellable  *cancellable,
-+                        GError       **error)
- {
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
-+  SoupInputStream        *istream;
-+  SoupInputStreamPrivate *priv;
-+  gssize nread;
- 
--  if (priv->finished)
--    return 0;
-+  g_return_val_if_fail (SOUP_IS_INPUT_STREAM (stream), -1);
-+  
-+  istream = SOUP_INPUT_STREAM (stream);
-+  priv = istream->priv;
- 
--  /* If there is data leftover from a previous read, return it. */
--  if (priv->leftover_bufsize)
--    return read_from_leftover (priv, buffer, count);
--
--  /* No leftover data, accept one chunk from the network */
--  soup_input_stream_prepare_for_io (stream, cancellable, buffer, count);
--  while (!priv->finished && priv->caller_nread == 0 &&
--	 !g_cancellable_is_cancelled (cancellable))
--    g_main_context_iteration (priv->async_context, TRUE);
--  soup_input_stream_done_io (stream);
-+  nread = g_input_stream_read (priv->in,
-+			       buffer,
-+			       count,
-+			       cancellable,
-+			       error);
- 
--  if (priv->caller_nread > 0)
--    return priv->caller_nread;
-+  priv->offset += nread;
- 
--  if (g_cancellable_set_error_if_cancelled (cancellable, error))
--    return -1;
--  else if (set_error_if_http_failed (priv->msg, error))
--    return -1;
--  else
--    return 0;
-+  return nread;
- }
- 
- static gboolean
-@@ -509,314 +382,25 @@ soup_input_stream_close (GInputStream *s
- 			 GCancellable *cancellable,
- 			 GError      **error)
- {
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
--
--  if (!priv->finished)
--    soup_session_cancel_message (priv->session, priv->msg, SOUP_STATUS_CANCELLED);
--
--  return TRUE;
--}
--
--static void
--wrapper_callback (GObject *source_object, GAsyncResult *res,
--		  gpointer user_data)
--{
--  GInputStream *stream = G_INPUT_STREAM (source_object);
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
--
--  g_input_stream_clear_pending (stream);
--  if (priv->outstanding_callback)
--    (*priv->outstanding_callback) (source_object, res, user_data);
--  priv->outstanding_callback = NULL;
--  g_object_unref (stream);
--}
--
--static void
--send_async_thread (GSimpleAsyncResult *res,
--		   GObject *object,
--		   GCancellable *cancellable)
--{
--  GError *error = NULL;
--  gboolean success;
--
--  success = soup_input_stream_send_internal (G_INPUT_STREAM (object),
--					     cancellable, &error);
--  g_simple_async_result_set_op_res_gboolean (res, success);
--  if (error)
--    {
--      g_simple_async_result_set_from_error (res, error);
--      g_error_free (error);
--    }
--}
--
--static void
--soup_input_stream_send_async_in_thread (GInputStream        *stream,
--					int                  io_priority,
--					GCancellable        *cancellable,
--					GAsyncReadyCallback  callback,
--					gpointer             user_data)
--{
--  GSimpleAsyncResult *res;
--
--  res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data,
--				   soup_input_stream_send_async_in_thread);
--  g_simple_async_result_run_in_thread (res, send_async_thread,
--				       io_priority, cancellable);
--  g_object_unref (res);
--}
--
--static void
--send_async_finished (GInputStream *stream)
--{
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
--  GSimpleAsyncResult *result;
--  GError *error = NULL;
--
--  if (!g_cancellable_set_error_if_cancelled (priv->cancellable, &error))
--    set_error_if_http_failed (priv->msg, &error);
--
--  priv->got_headers_cb = NULL;
--  priv->finished_cb = NULL;
--  soup_input_stream_done_io (stream);
--
--  result = priv->result;
--  priv->result = NULL;
--
--  g_simple_async_result_set_op_res_gboolean (result, error == NULL);
--  if (error)
--    {
--      g_simple_async_result_set_from_error (result, error);
--      g_error_free (error);
--    }
--  g_simple_async_result_complete (result);
--}
--
--static void
--soup_input_stream_send_async_internal (GInputStream        *stream,
--				       int                  io_priority,
--				       GCancellable        *cancellable,
--				       GAsyncReadyCallback  callback,
--				       gpointer             user_data)
--{
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
--
--  g_object_ref (stream);
--  priv->outstanding_callback = callback;
--
--  /* If the session uses the default GMainContext, then we can do
--   * async I/O directly. But if it has its own main context, it's
--   * easier to just run it in another thread.
--   */
--  if (soup_session_get_async_context (priv->session))
--    {
--      soup_input_stream_send_async_in_thread (stream, io_priority, cancellable,
--					      wrapper_callback, user_data);
--      return;
--    }
--
--  priv->got_headers_cb = send_async_finished;
--  priv->finished_cb = send_async_finished;
--
--  soup_input_stream_prepare_for_io (stream, cancellable, NULL, 0);
--  priv->result = g_simple_async_result_new (G_OBJECT (stream),
--					    wrapper_callback, user_data,
--					    soup_input_stream_send_async);
--}
--
--/**
-- * soup_input_stream_send_async:
-- * @stream: a #SoupInputStream
-- * @io_priority: the io priority of the request.
-- * @cancellable: optional #GCancellable object, %NULL to ignore.
-- * @callback: callback to call when the request is satisfied
-- * @user_data: the data to pass to callback function
-- *
-- * Asynchronously sends the HTTP request associated with @stream, and
-- * reads the response headers. Call this after soup_input_stream_new()
-- * and before the first g_input_stream_read_async() if you want to
-- * check the HTTP status code before you start reading.
-- **/
--void
--soup_input_stream_send_async (GInputStream        *stream,
--			      int                  io_priority,
--			      GCancellable        *cancellable,
--			      GAsyncReadyCallback  callback,
--			      gpointer             user_data)
--{
--  GError *error = NULL;
--
--  g_return_if_fail (SOUP_IS_INPUT_STREAM (stream));
--
--  if (!g_input_stream_set_pending (stream, &error))
--    {
--      g_simple_async_report_gerror_in_idle (G_OBJECT (stream),
--					    callback,
--					    user_data,
--					    error);
--      g_error_free (error);
--      return;
--    }
--  soup_input_stream_send_async_internal (stream, io_priority, cancellable,
--					 callback, user_data);
--}
--
--/**
-- * soup_input_stream_send_finish:
-- * @stream: a #SoupInputStream
-- * @result: a #GAsyncResult.
-- * @error: a #GError location to store the error occuring, or %NULL to 
-- * ignore.
-- *
-- * Finishes a soup_input_stream_send_async() operation.
-- *
-- * Return value: %TRUE if the message was sent successfully and
-- * received a successful status code, %FALSE if not.
-- **/
--gboolean
--soup_input_stream_send_finish (GInputStream  *stream,
--			       GAsyncResult  *result,
--			       GError       **error)
--{
--  GSimpleAsyncResult *simple;
--
--  g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE);
--  simple = G_SIMPLE_ASYNC_RESULT (result);
--
--  g_return_val_if_fail (g_simple_async_result_get_source_tag (simple) == soup_input_stream_send_async, FALSE);
--
--  if (g_simple_async_result_propagate_error (simple, error))
--    return FALSE;
--
--  return g_simple_async_result_get_op_res_gboolean (simple);
--}
--
--static void
--read_async_done (GInputStream *stream)
--{
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
--  GSimpleAsyncResult *result;
--  GError *error = NULL;
--
--  result = priv->result;
--  priv->result = NULL;
--
--  if (g_cancellable_set_error_if_cancelled (priv->cancellable, &error) ||
--      set_error_if_http_failed (priv->msg, &error))
--    {
--      g_simple_async_result_set_from_error (result, error);
--      g_error_free (error);
--    }
--  else
--    g_simple_async_result_set_op_res_gssize (result, priv->caller_nread);
--
--  priv->got_chunk_cb = NULL;
--  priv->finished_cb = NULL;
--  priv->cancelled_cb = NULL;
--  soup_input_stream_done_io (stream);
--
--  g_simple_async_result_complete (result);
--  g_object_unref (result);
--}
--
--static void
--soup_input_stream_read_async (GInputStream        *stream,
--			      void                *buffer,
--			      gsize                count,
--			      int                  io_priority,
--			      GCancellable        *cancellable,
--			      GAsyncReadyCallback  callback,
--			      gpointer             user_data)
--{
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (stream);
--  GSimpleAsyncResult *result;
--
--  /* If the session uses the default GMainContext, then we can do
--   * async I/O directly. But if it has its own main context, we fall
--   * back to the async-via-sync-in-another-thread implementation.
--   */
--  if (soup_session_get_async_context (priv->session))
--    {
--      G_INPUT_STREAM_CLASS (soup_input_stream_parent_class)->
--	read_async (stream, buffer, count, io_priority,
--		    cancellable, callback, user_data);
--      return;
--    }
--
--  result = g_simple_async_result_new (G_OBJECT (stream),
--				      callback, user_data,
--				      soup_input_stream_read_async);
--
--  if (priv->finished)
--    {
--      g_simple_async_result_set_op_res_gssize (result, 0);
--      g_simple_async_result_complete_in_idle (result);
--      g_object_unref (result);
--      return;
--    }
--
--  if (priv->leftover_bufsize)
--    {
--      gsize nread = read_from_leftover (priv, buffer, count);
--      g_simple_async_result_set_op_res_gssize (result, nread);
--      g_simple_async_result_complete_in_idle (result);
--      g_object_unref (result);
--      return;
--    }
--
--  priv->result = result;
--
--  priv->got_chunk_cb = read_async_done;
--  priv->finished_cb = read_async_done;
--  priv->cancelled_cb = read_async_done;
--  soup_input_stream_prepare_for_io (stream, cancellable, buffer, count);
--}
--
--static gssize
--soup_input_stream_read_finish (GInputStream  *stream,
--			       GAsyncResult  *result,
--			       GError       **error)
--{
--  GSimpleAsyncResult *simple;
-+  SoupInputStream        *istream;
-+  SoupInputStreamPrivate *priv;
- 
--  g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), -1);
--  simple = G_SIMPLE_ASYNC_RESULT (result);
--  g_return_val_if_fail (g_simple_async_result_get_source_tag (simple) == soup_input_stream_read_async, -1);
-+  g_return_val_if_fail (SOUP_IS_INPUT_STREAM (stream), -1);
- 
--  return g_simple_async_result_get_op_res_gssize (simple);
--}
-+  istream = SOUP_INPUT_STREAM (stream);
-+  priv = istream->priv;
- 
--static void
--soup_input_stream_close_async (GInputStream       *stream,
--			       int                 io_priority,
--			       GCancellable       *cancellable,
--			       GAsyncReadyCallback callback,
--			       gpointer            user_data)
--{
--  GSimpleAsyncResult *result;
--  gboolean success;
--  GError *error = NULL;
--
--  result = g_simple_async_result_new (G_OBJECT (stream),
--				      callback, user_data,
--				      soup_input_stream_close_async);
--  success = soup_input_stream_close (stream, cancellable, &error);
--  g_simple_async_result_set_op_res_gboolean (result, success);
--  if (error)
-+  g_mutex_lock (priv->lock);
-+  if (!priv->finished)
-     {
--      g_simple_async_result_set_from_error (result, error);
--      g_error_free (error);
-+      soup_session_cancel_message (priv->session,
-+				   priv->msg,
-+				   SOUP_STATUS_CANCELLED);
-+      g_print ("Cancelling message\n");
-     }
- 
--  g_simple_async_result_complete_in_idle (result);
--  g_object_unref (result);
--}
--
--static gboolean
--soup_input_stream_close_finish (GInputStream  *stream,
--				GAsyncResult  *result,
--				GError       **error)
--{
--  /* Failures handled in generic close_finish code */
-+  g_mem_pipe_close_read (priv->mem_pipe, cancellable, error);
-+  g_mutex_unlock (priv->lock);
-   return TRUE;
- }
- 
-@@ -834,17 +418,17 @@ soup_input_stream_can_seek (GSeekable *s
-   return TRUE;
- }
- 
--extern void soup_message_io_cleanup (SoupMessage *msg);
- 
- static gboolean
- soup_input_stream_seek (GSeekable     *seekable,
--			goffset        offset,
--			GSeekType      type,
--			GCancellable  *cancellable,
--			GError       **error)
-+                        goffset        offset,
-+                        GSeekType      type,
-+                        GCancellable  *cancellable,
-+                        GError       **error)
- {
-   GInputStream *stream = G_INPUT_STREAM (seekable);
--  SoupInputStreamPrivate *priv = SOUP_INPUT_STREAM_GET_PRIVATE (seekable);
-+  SoupInputStream *istream = SOUP_INPUT_STREAM (stream);
-+  SoupInputStreamPrivate *priv = istream->priv;
-   char *range;
- 
-   if (type == G_SEEK_END)
-@@ -862,8 +446,7 @@ soup_input_stream_seek (GSeekable     *s
-   if (!g_input_stream_set_pending (stream, error))
-       return FALSE;
- 
--  soup_session_cancel_message (priv->session, priv->msg, SOUP_STATUS_CANCELLED);
--  soup_message_io_cleanup (priv->msg);
-+  _soup_input_stream_cancel_msg_and_wait (istream);
- 
-   switch (type)
-     {
-@@ -889,7 +472,7 @@ soup_input_stream_seek (GSeekable     *s
-   soup_message_headers_append (priv->msg->request_headers, "Range", range);
-   g_free (range);
- 
--  soup_input_stream_queue_message (SOUP_INPUT_STREAM (stream));
-+  _soup_input_stream_queue_msg_and_wait (istream);
- 
-   g_input_stream_clear_pending (stream);
-   return TRUE;
-@@ -922,8 +505,8 @@ soup_input_stream_get_message (GInputStr
- GQuark
- soup_http_error_quark (void)
- {
--	static GQuark error;
--	if (!error)
--		error = g_quark_from_static_string ("soup_http_error_quark");
--	return error;
-+  static GQuark error;
-+  if (!error)
-+    error = g_quark_from_static_string ("soup_http_error_quark");
-+  return error;
- }
-Index: gvfs-1.7.3/daemon/soup-input-stream.h
-===================================================================
---- gvfs-1.7.3.orig/daemon/soup-input-stream.h
-+++ gvfs-1.7.3/daemon/soup-input-stream.h
-@@ -33,17 +33,22 @@ G_BEGIN_DECLS
- 
- typedef struct SoupInputStream         SoupInputStream;
- typedef struct SoupInputStreamClass    SoupInputStreamClass;
-+typedef struct SoupInputStreamPrivate  SoupInputStreamPrivate;
- 
- struct SoupInputStream
- {
-   GInputStream parent;
- 
-+  SoupInputStreamPrivate *priv;
-+  
- };
- 
- struct SoupInputStreamClass
- {
-   GInputStreamClass parent_class;
- 
-+
-+
-   /* Padding for future expansion */
-   void (*_g_reserved1) (void);
-   void (*_g_reserved2) (void);
-@@ -61,15 +66,6 @@ gboolean      soup_input_stream_send
- 					     GCancellable        *cancellable,
- 					     GError             **error);
- 
--void          soup_input_stream_send_async  (GInputStream        *stream,
--					     int                  io_priority,
--					     GCancellable        *cancellable,
--					     GAsyncReadyCallback  callback,
--					     gpointer             user_data);
--gboolean      soup_input_stream_send_finish (GInputStream        *stream,
--					     GAsyncResult        *result,
--					     GError             **error);
--
- SoupMessage  *soup_input_stream_get_message (GInputStream         *stream);
- 
- #define SOUP_HTTP_ERROR soup_http_error_quark()
diff --git a/gvfs-nds.patch b/gvfs-nds.patch
index 9f5b0ba..4d2bd9a 100644
--- a/gvfs-nds.patch
+++ b/gvfs-nds.patch
@@ -1,7 +1,7 @@
-Index: gvfs-1.5.4/daemon/gvfsbackendnds.c
+Index: gvfs-1.9.0/daemon/gvfsbackendnds.c
 ===================================================================
 --- /dev/null
-+++ gvfs-1.5.4/daemon/gvfsbackendnds.c
++++ gvfs-1.9.0/daemon/gvfsbackendnds.c
 @@ -0,0 +1,753 @@
 +/* GIO - GLib Input, Output and Streaming Library
 + * 
@@ -756,10 +756,10 @@ Index: gvfs-1.5.4/daemon/gvfsbackendnds.c
 +{
 +  g_set_application_name (_("Displaying Embedded Objects"));
 +}
-Index: gvfs-1.5.4/daemon/gvfsbackendnds.h
+Index: gvfs-1.9.0/daemon/gvfsbackendnds.h
 ===================================================================
 --- /dev/null
-+++ gvfs-1.5.4/daemon/gvfsbackendnds.h
++++ gvfs-1.9.0/daemon/gvfsbackendnds.h
 @@ -0,0 +1,53 @@
 +/* GIO - GLib Input, Output and Streaming Library
 + * 
@@ -814,11 +814,11 @@ Index: gvfs-1.5.4/daemon/gvfsbackendnds.h
 +G_END_DECLS
 +
 +#endif /* __G_VFS_BACKEND_NDS_H__ */
-Index: gvfs-1.5.4/daemon/Makefile.am
+Index: gvfs-1.9.0/daemon/Makefile.am
 ===================================================================
---- gvfs-1.5.4.orig/daemon/Makefile.am
-+++ gvfs-1.5.4/daemon/Makefile.am
-@@ -112,6 +112,10 @@ mount_in_files += nvvfs.mount.in
+--- gvfs-1.9.0.orig/daemon/Makefile.am
++++ gvfs-1.9.0/daemon/Makefile.am
+@@ -113,6 +113,10 @@ mount_in_files += nvvfs.mount.in
  mount_DATA += nvvfs.mount
  libexec_PROGRAMS += gvfsd-nvvfs
  
@@ -829,7 +829,7 @@ Index: gvfs-1.5.4/daemon/Makefile.am
  EXTRA_DIST = 				\
  	gvfs-daemon.service.in		\
  	$(mount_in_files)		\
-@@ -442,6 +446,19 @@ gvfsd_http_CPPFLAGS = \
+@@ -449,6 +453,19 @@ gvfsd_http_CPPFLAGS = \
  
  gvfsd_http_LDADD = $(libraries) $(HTTP_LIBS)
  
@@ -849,10 +849,10 @@ Index: gvfs-1.5.4/daemon/Makefile.am
  gvfsd_nvvfs_SOURCES = \
          gvfsbackendnvvfs.c gvfsbackendnvvfs.h \
          daemon-main.c daemon-main.h \
-Index: gvfs-1.5.4/daemon/nds.mount.in
+Index: gvfs-1.9.0/daemon/nds.mount.in
 ===================================================================
 --- /dev/null
-+++ gvfs-1.5.4/daemon/nds.mount.in
++++ gvfs-1.9.0/daemon/nds.mount.in
 @@ -0,0 +1,5 @@
 +[Mount]
 +Type=nds
diff --git a/gvfs.changes b/gvfs.changes
index a12aa21..f5b5462 100644
--- a/gvfs.changes
+++ b/gvfs.changes
@@ -1,3 +1,31 @@
+-------------------------------------------------------------------
+Wed May 18 03:40:29 CEST 2011 - dimstar@opensuse.org
+
+- Update to version 1.9.0:
+  + fuse:
+    - Make created files visible immediately on WebDAV
+    - Pretend created file exists even if backend didn't create it
+  + afc:
+    - Fix renaming files moving them to the root dir
+    - Use a better display name for jailbroken device access
+  + common: Use libbluray to get Blu-Ray metadata
+  + daemon:
+    - Fix threadsafety of closing channels
+    - Don't leak dbus messages
+  + gdu volume monitor:
+    - Fix setting the BDMV name
+    - Fix check for symlinks in /dev
+    - Automount flash card readers
+  + gphoto2:
+    - Recognize cameras which don't implement get storageinfo
+  + dav:
+    - Fix copying of remote folders to disk
+    - Correctly handle usernames supplied in the url
+  + http/dav: Send Accept-Language header
+  + http: Use Content-Disposition filename if available
+  + Updated translations.
+- Drop gvfs-dav-recursive-directory-ops.patch: fixed upstream.
+
 -------------------------------------------------------------------
 Tue Apr 26 15:16:06 UTC 2011 - fcrozat@novell.com
 
diff --git a/gvfs.spec b/gvfs.spec
index 26a13e6..5b4f6f9 100644
--- a/gvfs.spec
+++ b/gvfs.spec
@@ -18,7 +18,7 @@
 
 
 Name:           gvfs
-Version:        1.8.1
+Version:        1.9.0
 Release:        1
 License:        LGPLv2.0+
 Summary:        VFS functionality for GLib
@@ -32,8 +32,6 @@ Patch1:         gvfs-dice-backend.patch
 Patch5:         gvfs-nvvfs.patch
 # PATCH-FEATURE-OPENSUSE gvfs-nds.patch ksamrat@novell.com -- Provides NDS browsing for nautilus
 Patch6:         gvfs-nds.patch
-# PATCH-FIX-UPSTREAM gvfs-dav-recursive-directory-ops.patch bnc#395225 bgo#551339 hpj@novell.com -- Make DAV recursive copy/move work, taken from http://gitorious.org/lanedo/gvfs/commits/dav_sync_io
-Patch8:         gvfs-dav-recursive-directory-ops.patch
 BuildRequires:  bluez-devel
 BuildRequires:  dbus-1-glib-devel
 BuildRequires:  fuse-devel
@@ -119,7 +117,6 @@ translation-update-upstream
 %patch1 -p1
 %patch5 -p1
 %patch6 -p1
-%patch8 -p1
 autoreconf -f
 libtoolize -c -f