diff --git a/common b/common
index e572c87..011bcc8 160000
--- a/common
+++ b/common
@@ -1 +1 @@
-Subproject commit e572c87c582166a6c65edf2a6a0fa73e31a3b04c
+Subproject commit 011bcc8a0fc7f798ee874a7ba899123fb2470e22
diff --git a/ext/soup/gstsouphttpsrc.c b/ext/soup/gstsouphttpsrc.c
index 4d77984..156fbc4 100644
--- a/ext/soup/gstsouphttpsrc.c
+++ b/ext/soup/gstsouphttpsrc.c
@@ -113,6 +113,7 @@ enum
   PROP_IRADIO_URL,
   PROP_IRADIO_TITLE,
   PROP_TIMEOUT,
+  PROP_SAVE_TO_PATH,
   PROP_EXTRA_HEADERS
 };
 
@@ -139,6 +140,8 @@ static gboolean gst_soup_http_src_unlock (GstBaseSrc * bsrc);
 static gboolean gst_soup_http_src_unlock_stop (GstBaseSrc * bsrc);
 static gboolean gst_soup_http_src_set_location (GstSoupHTTPSrc * src,
     const gchar * uri);
+static gboolean gst_soup_http_src_set_save_to_path (GstSoupHTTPSrc * src,
+    const gchar * path);
 static gboolean gst_soup_http_src_set_proxy (GstSoupHTTPSrc * src,
     const gchar * uri);
 static char *gst_soup_http_src_unicodify (const char *str);
@@ -263,6 +266,11 @@ gst_soup_http_src_class_init (GstSoupHTTPSrcClass * klass)
       g_param_spec_uint ("timeout", "timeout",
           "Value in seconds to timeout a blocking I/O (0 = No timeout).", 0,
           3600, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  g_object_class_install_property (gobject_class,
+      PROP_SAVE_TO_PATH,
+      g_param_spec_string ("save-to-path", "Save-To-Path",
+          "path to save file to", "",
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
   g_object_class_install_property (gobject_class, PROP_EXTRA_HEADERS,
       g_param_spec_boxed ("extra-headers", "Extra Headers",
           "Extra headers to append to the HTTP request",
@@ -357,6 +365,8 @@ gst_soup_http_src_init (GstSoupHTTPSrc * src, GstSoupHTTPSrcClass * g_class)
         "The proxy in the http_proxy env var (\"%s\") cannot be parsed.",
         proxy);
   }
+  src->file = NULL;
+  src->save_to_path = NULL;
 
   gst_soup_http_src_reset (src);
 }
@@ -379,6 +389,10 @@ gst_soup_http_src_finalize (GObject * gobject)
   g_free (src->proxy_pw);
   g_strfreev (src->cookies);
 
+  if (src->file != NULL) {
+    fclose (src->file);
+  }
+  g_free (src->save_to_path);
   G_OBJECT_CLASS (parent_class)->finalize (gobject);
 }
 
@@ -462,6 +476,20 @@ gst_soup_http_src_set_property (GObject * object, guint prop_id,
     case PROP_TIMEOUT:
       src->timeout = g_value_get_uint (value);
       break;
+    case PROP_SAVE_TO_PATH:
+    {
+      const gchar *path;
+      path = g_value_get_string (value);
+      if (path == NULL) {
+        GST_WARNING ("save-to-path property cannot be NULL");
+        goto done;
+      }
+      if (!gst_soup_http_src_set_save_to_path (src, path)) {
+        GST_WARNING ("badly formatted save-to-path");
+        goto done;
+      }
+      break;
+    }
     case PROP_EXTRA_HEADERS:{
       const GstStructure *s = gst_value_get_structure (value);
 
@@ -541,6 +569,9 @@ gst_soup_http_src_get_property (GObject * object, guint prop_id,
     case PROP_TIMEOUT:
       g_value_set_uint (value, src->timeout);
       break;
+    case PROP_SAVE_TO_PATH:
+      g_value_set_string (value, src->save_to_path);
+      break;
     case PROP_EXTRA_HEADERS:
       gst_value_set_structure (value, src->extra_headers);
       break;
@@ -1009,6 +1040,9 @@ gst_soup_http_src_got_chunk_cb (SoupMessage * msg, SoupBuffer * chunk,
   GST_DEBUG_OBJECT (src, "got chunk of %" G_GSIZE_FORMAT " bytes",
       chunk->length);
 
+  if (src->file != NULL) {
+    fwrite (chunk->data, chunk->length, 1, src->file);
+  }
   /* Extract the GstBuffer from the SoupBuffer and set its fields. */
   *src->outbuf = GST_BUFFER_CAST (soup_buffer_get_owner (chunk));
 
@@ -1240,6 +1274,14 @@ static gboolean
 gst_soup_http_src_start (GstBaseSrc * bsrc)
 {
   GstSoupHTTPSrc *src = GST_SOUP_HTTP_SRC (bsrc);
+  gchar *media_file_name, *save_to_file;
+  GstStructure *s;
+  GstMessage *msg;
+
+  /* post a message to GstBus, so application can set set-to-path */
+  s = gst_structure_new ("prepare-save-to-path", NULL);
+  msg = gst_message_new_element (GST_OBJECT (src), s);
+  gst_element_post_message (GST_ELEMENT (src), msg);
 
   GST_DEBUG_OBJECT (src, "start(\"%s\")", src->location);
 
@@ -1248,6 +1290,13 @@ gst_soup_http_src_start (GstBaseSrc * bsrc)
         ("Missing location property"));
     return FALSE;
   }
+  if (src->save_to_path) {
+    media_file_name = g_strrstr (src->location, "/");
+    GST_DEBUG_OBJECT (src, "media filename(\"%s\")", media_file_name);
+    save_to_file = g_strdup_printf ("%s%s", src->save_to_path, media_file_name);
+    GST_DEBUG_OBJECT (src, "save_to_file(\"%s\")", save_to_file);
+    src->file = fopen (save_to_file, "wb");
+  }
 
   src->context = g_main_context_new ();
 
@@ -1389,12 +1438,28 @@ gst_soup_http_src_do_seek (GstBaseSrc * bsrc, GstSegment * segment)
     GST_WARNING_OBJECT (src, "Seeking behind end of file, will go to EOS soon");
   }
 
+  if (src->file != NULL) {
+    fseek (src->file, (long) segment->start, SEEK_SET);
+  }
+
   /* Wait for create() to handle the jump in offset. */
   src->request_position = segment->start;
   return TRUE;
 }
 
 static gboolean
+gst_soup_http_src_set_save_to_path (GstSoupHTTPSrc * src, const gchar * path)
+{
+  if (src->save_to_path) {
+    g_free (src->save_to_path);
+    src->save_to_path = NULL;
+  }
+  GST_DEBUG_OBJECT (src, "set save-to-path:%s", path);
+  src->save_to_path = g_strdup (path);
+  return TRUE;
+}
+
+static gboolean
 gst_soup_http_src_set_location (GstSoupHTTPSrc * src, const gchar * uri)
 {
   if (src->location) {
diff --git a/ext/soup/gstsouphttpsrc.h b/ext/soup/gstsouphttpsrc.h
index 1427e1c..ad40390 100644
--- a/ext/soup/gstsouphttpsrc.h
+++ b/ext/soup/gstsouphttpsrc.h
@@ -87,6 +87,8 @@ struct _GstSoupHTTPSrc {
   GstStructure *extra_headers;
 
   guint timeout;
+  FILE *file;
+  gchar *save_to_path;
 };
 
 struct _GstSoupHTTPSrcClass {
