diff --exclude=.svn -Naur gst-plugins-base/ext/gnomevfs/gstgnomevfssrc.c gst-plugins-base-mod/ext/gnomevfs/gstgnomevfssrc.c
--- gst-plugins-base/ext/gnomevfs/gstgnomevfssrc.c	2006-10-11 20:12:33.000000000 +0200
+++ gst-plugins-base-mod/ext/gnomevfs/gstgnomevfssrc.c	2006-10-11 20:12:46.000000000 +0200
@@ -155,6 +155,8 @@
 static GstFlowReturn gst_gnome_vfs_src_create (GstBaseSrc * basesrc,
     guint64 offset, guint size, GstBuffer ** buffer);
 
+static gboolean gst_gnome_vfs_src_blocking_start (GstGnomeVFSSrc *src);
+
 static GstElementClass *parent_class = NULL;
 
 GType
@@ -267,6 +269,7 @@
 static void
 gst_gnome_vfs_src_init (GstGnomeVFSSrc * gnomevfssrc)
 {
+  gnomevfssrc->opened = FALSE;
   gnomevfssrc->uri = NULL;
   gnomevfssrc->uri_name = NULL;
   gnomevfssrc->handle = NULL;
@@ -642,6 +645,11 @@
   GST_DEBUG ("now at %llu, reading %lld, size %u", src->curoffset, offset,
       size);
 
+  if (!src->opened) {
+    if (!gst_gnome_vfs_src_blocking_start (src))
+      return GST_FLOW_ERROR;
+  }
+
   /* seek if required */
   if (G_UNLIKELY (src->curoffset != offset)) {
     GST_DEBUG ("need to seek");
@@ -718,6 +726,9 @@
 
   src = GST_GNOME_VFS_SRC (basesrc);
 
+  if (!src->opened)
+    GST_WARNING_OBJECT (src, "seekability is unknown yet");
+
   return src->seekable;
 }
 
@@ -773,6 +784,11 @@
 
   src = GST_GNOME_VFS_SRC (basesrc);
 
+  if (!src->opened) {
+    GST_INFO_OBJECT (src, "size is unknown yet");
+    return FALSE;
+  }
+
   GST_DEBUG_OBJECT (src, "size %" G_GUINT64_FORMAT, src->size);
 
   if (src->size == (GnomeVFSFileSize) - 1)
@@ -783,17 +799,15 @@
   return TRUE;
 }
 
-/* open the file, do stuff necessary to go to PAUSED state */
+/* open the file/remote location, do stuff necessary to go to PAUSED state */
 static gboolean
-gst_gnome_vfs_src_start (GstBaseSrc * basesrc)
+gst_gnome_vfs_src_blocking_start (GstGnomeVFSSrc *src)
 {
   GnomeVFSFileInfoOptions options;
   GnomeVFSResult res;
   GnomeVFSFileInfo *info;
-  GstGnomeVFSSrc *src;
-
-  src = GST_GNOME_VFS_SRC (basesrc);
 
+  src->opened = TRUE;
   gst_gnome_vfs_src_push_callbacks (src);
 
   if (src->uri != NULL) {
@@ -874,6 +888,17 @@
 }
 
 static gboolean
+gst_gnome_vfs_src_start (GstBaseSrc *basesrc)
+{
+  GstGnomeVFSSrc *src = GST_GNOME_VFS_SRC (basesrc);
+
+  if (src->uri != NULL && gnome_vfs_uri_is_local (src->uri))
+    return gst_gnome_vfs_src_blocking_start (src);
+  else
+    return TRUE;
+}
+
+static gboolean
 gst_gnome_vfs_src_stop (GstBaseSrc * basesrc)
 {
   GstGnomeVFSSrc *src;
@@ -882,6 +907,7 @@
 
   gst_gnome_vfs_src_pop_callbacks (src);
 
+  src->opened = FALSE;
   if (src->own_handle) {
     gnome_vfs_close (src->handle);
     src->handle = NULL;
diff --exclude=.svn -Naur gst-plugins-base/ext/gnomevfs/gstgnomevfssrc.h gst-plugins-base-mod/ext/gnomevfs/gstgnomevfssrc.h
--- gst-plugins-base/ext/gnomevfs/gstgnomevfssrc.h	2006-10-11 20:12:33.000000000 +0200
+++ gst-plugins-base-mod/ext/gnomevfs/gstgnomevfssrc.h	2006-10-11 20:12:46.000000000 +0200
@@ -55,6 +55,7 @@
 {
   GstBaseSrc basesrc;
 
+  gboolean opened;
   /* uri, file, ... */
   GnomeVFSURI *uri;
   gchar *uri_name;
