diff --git a/src/frogr-facade.c b/src/frogr-facade.c
index 3587daf..45bb252 100644
--- a/src/frogr-facade.c
+++ b/src/frogr-facade.c
@@ -89,12 +89,22 @@ _upload_picture_thread (upload_picture_st *up_st)
   flickcurl_upload_params *uparams;
   flickcurl_upload_status *ustatus;
 
-  /* Upload picture and gather photo ID */
-
+  /* Creating cache file before uploading (for remote pictures like BT, samba, etc) */
+  const gchar* local_path = frogr_picture_get_local_path (fpicture);
+  if (! local_path) {
+    g_warning ("There is no local path for %s...\n",
+	       frogr_picture_get_title (fpicture));
+
+    g_idle_add ((GSourceFunc)_picture_uploaded, up_st);
+    return;
+  }
+  
+  /* Upload picture and gather photo ID */  
+  
   /* Prepare upload params */
   uparams = g_slice_new (flickcurl_upload_params);
+  uparams->photo_file = local_path;
   uparams->title = frogr_picture_get_title (fpicture);
-  uparams->photo_file = frogr_picture_get_filepath (fpicture);
   uparams->description = frogr_picture_get_description (fpicture);
   uparams->tags = frogr_picture_get_tags (fpicture);
   uparams->is_public = frogr_picture_is_public (fpicture);
diff --git a/src/frogr-main-window.c b/src/frogr-main-window.c
index 62ef4ab..e108989 100644
--- a/src/frogr-main-window.c
+++ b/src/frogr-main-window.c
@@ -40,7 +40,7 @@
 
 
 enum {
-  FILEPATH_COL,
+  URI_COL,
   PIXBUF_COL,
   FPICTURE_COL
 };
@@ -282,19 +282,19 @@ _on_picture_loaded (FrogrMainWindow *fmainwin, FrogrPicture *fpicture)
   FrogrMainWindowPrivate *priv = FROGR_MAIN_WINDOW_GET_PRIVATE (fmainwin);
   GdkPixbuf *pixbuf;
   GtkTreeIter iter;
-  const gchar *filepath;
+  const gchar *uri;
 
   /* Add to model */
   g_object_ref (fpicture);
   frogr_main_window_model_add_picture (priv->model, fpicture);
 
   /* Add to GtkIconView */
-  filepath = frogr_picture_get_filepath (fpicture);
+  uri = frogr_picture_get_uri (fpicture);
   pixbuf = frogr_picture_get_pixbuf (fpicture);
 
   gtk_list_store_append (GTK_LIST_STORE (priv->tree_model), &iter);
   gtk_list_store_set (GTK_LIST_STORE (priv->tree_model), &iter,
-                      FILEPATH_COL, filepath,
+                      URI_COL, uri,
                       PIXBUF_COL, pixbuf,
                       FPICTURE_COL, fpicture,
                       -1);
@@ -492,7 +492,7 @@ _on_icon_view_drag_data_received (GtkWidget *widget,
                                   gpointer data)
 {
   FrogrMainWindow *fmainwin = FROGR_MAIN_WINDOW (data);
-  GSList *filepaths_list = NULL;
+  GSList *uris_list = NULL;
   gchar *files_string;
   gchar **fileuris_array = NULL;
   gint i;
@@ -504,19 +504,27 @@ _on_icon_view_drag_data_received (GtkWidget *widget,
   files_string = ((gchar *) selection_data->data);
 
   fileuris_array = g_strsplit (files_string, "\r\n", -1);
-  for (i = 0;  fileuris_array[i]; i++)
-    {
-      gchar *filepath = g_filename_from_uri (fileuris_array[i], NULL, NULL);
-      if (filepath && !g_str_equal (g_strstrip (filepath), ""))
-        filepaths_list = g_slist_append (filepaths_list, filepath);
+  for (i = 0;  fileuris_array[i]; i++) {
+    gchar* fileuri = g_strdup (fileuris_array[i]);
+    
+    if (! fileuri) {
+      continue;
+    }
+
+    if (! g_str_equal (g_strstrip (fileuri), "")) {
+      uris_list = g_slist_append (uris_list, fileuri);
+    }
+    else {
+      g_free (fileuri);
     }
+  }
 
   /* Load pictures */
-  if (filepaths_list != NULL)
+  if (uris_list != NULL)
     {
       FrogrPictureLoader *fploader;
       fploader =
-        frogr_picture_loader_new (filepaths_list,
+        frogr_picture_loader_new (uris_list,
                                   (GFunc)_on_picture_loaded,
                                   (GFunc)_on_pictures_loaded,
                                   fmainwin);
@@ -530,7 +538,7 @@ _on_icon_view_drag_data_received (GtkWidget *widget,
 
   /* Free */
   g_strfreev (fileuris_array);
-  g_slist_free (filepaths_list);
+  g_slist_free (uris_list);
 }
 
 void
@@ -557,19 +565,20 @@ _on_add_button_clicked (GtkButton *widget,
   gtk_file_filter_add_mime_type (filter, "image/gif");
   gtk_file_filter_set_name (filter, "images");
   gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
+  gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), FALSE);
   gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE);
 
-  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
     {
-      GSList *filepaths;
+      GSList *uris;
 
       /* Add selected pictures to icon view area */
-      filepaths = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER (dialog));
-      if (filepaths != NULL)
+      uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (dialog));
+      if (uris != NULL)
         {
           FrogrPictureLoader *fploader;
           fploader =
-            frogr_picture_loader_new (filepaths,
+            frogr_picture_loader_new (uris,
                                       (GFunc)_on_picture_loaded,
                                       (GFunc)_on_pictures_loaded,
                                       fmainwin);
@@ -578,7 +587,7 @@ _on_add_button_clicked (GtkButton *widget,
         }
 
       /* Free memory */
-      g_slist_free (filepaths);
+      g_slist_free (uris);
     }
 
   /* Close dialog */
diff --git a/src/frogr-picture-loader.c b/src/frogr-picture-loader.c
index 46572a4..93c4dff 100644
--- a/src/frogr-picture-loader.c
+++ b/src/frogr-picture-loader.c
@@ -41,7 +41,7 @@ typedef struct _FrogrPictureLoaderPrivate FrogrPictureLoaderPrivate;
 struct _FrogrPictureLoaderPrivate
 {
   FrogrMainWindow *mainwin;
-  GSList *filepaths;
+  GSList *uris;
   GSList *current;
   guint index;
   guint n_pictures;
@@ -81,8 +81,8 @@ _update_status_and_progress (FrogrPictureLoader *fploader)
 
   if (priv->current)
     {
-      const gchar *filepath = (const gchar *)priv->current->data;
-      gchar *filename = g_path_get_basename (filepath);
+      const gchar *uri = (const gchar *)priv->current->data;
+      gchar *filename = g_path_get_basename (uri);
 
       /* Update progress */
       status_text = g_strdup_printf ("Loading '%s'...", filename);
@@ -141,18 +141,25 @@ _load_next_picture (FrogrPictureLoader *fploader)
     {
       GFile *gfile = NULL;
       GFileInfo *file_info;
-      gchar *filepath = (gchar *)priv->current->data;
+      gchar *uri = (gchar *)priv->current->data;
       const gchar *mime_type;
       gboolean valid_mime = FALSE;
       gint i;
 
+      GError* error = 0;
       /* Get file info */
-      gfile = g_file_new_for_path (filepath);
+      gfile = g_file_new_for_uri (uri);
       file_info = g_file_query_info (gfile,
                                      G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
                                      G_FILE_QUERY_INFO_NONE,
                                      NULL,
-                                     NULL);
+                                     &error);
+
+      if (error) {
+	g_warning ("Unable to load content type from %s: %s\n", uri, error->message);
+	return;
+      }
+      
       /* Check mimetype */
       mime_type = g_file_info_get_content_type (file_info);
       for (i = 0; valid_mimetypes[i]; i++)
@@ -164,7 +171,7 @@ _load_next_picture (FrogrPictureLoader *fploader)
             }
         }
 
-      g_debug ("Adding file %s (%s)\n", filepath, mime_type);
+      g_debug ("Adding file %s (%s)\n", uri, mime_type);
       g_object_unref (file_info);
 
       /* Asynchronously load the picture if mime is valid */
@@ -223,11 +230,11 @@ _load_next_picture_cb (GObject *object,
         {
           GdkPixbuf *pixbuf;
           GdkPixbuf *s_pixbuf;
-          gchar *filepath;
+          gchar *uri;
           gchar *filename;
 
           /* Gather needed information */
-          filepath = g_file_get_path (file);
+          uri = g_file_get_uri (file);
           filename = g_file_get_basename (file);
           gdk_pixbuf_loader_close (pixbuf_loader, NULL);
           pixbuf = gdk_pixbuf_loader_get_pixbuf (pixbuf_loader);
@@ -236,12 +243,12 @@ _load_next_picture_cb (GObject *object,
           s_pixbuf = _get_scaled_pixbuf (pixbuf);
 
           /* Build the FrogrPicture and set pixbuf */
-          fpicture = frogr_picture_new (filepath, filename, FALSE);
+          fpicture = frogr_picture_new (uri, filename, FALSE);
           frogr_picture_set_pixbuf (fpicture, s_pixbuf);
 
           /* Free */
           g_object_unref (s_pixbuf);
-          g_free (filepath);
+          g_free (uri);
           g_free (filename);
         }
       else
@@ -293,8 +300,8 @@ _frogr_picture_loader_finalize (GObject* object)
 
   /* Free */
   g_object_unref (priv->mainwin);
-  g_slist_foreach (priv->filepaths, (GFunc)g_free, NULL);
-  g_slist_free (priv->filepaths);
+  g_slist_foreach (priv->uris, (GFunc)g_free, NULL);
+  g_slist_free (priv->uris);
 
   G_OBJECT_CLASS (frogr_picture_loader_parent_class)->finalize(object);
 }
@@ -323,7 +330,7 @@ frogr_picture_loader_init (FrogrPictureLoader *fploader)
   g_object_unref (controller);
 
   /* Init the rest of private data */
-  priv->filepaths = NULL;
+  priv->uris = NULL;
   priv->current = NULL;
   priv->index = -1;
   priv->n_pictures = 0;
@@ -332,7 +339,7 @@ frogr_picture_loader_init (FrogrPictureLoader *fploader)
 /* Public API */
 
 FrogrPictureLoader *
-frogr_picture_loader_new (GSList *filepaths,
+frogr_picture_loader_new (GSList *uris,
                           GFunc picture_loaded_cb,
                           GFunc pictures_loaded_cb,
                           gpointer object)
@@ -344,10 +351,10 @@ frogr_picture_loader_new (GSList *filepaths,
     FROGR_PICTURE_LOADER_GET_PRIVATE (fploader);
 
   /* Internal data */
-  priv->filepaths = g_slist_copy (filepaths);
-  priv->current = priv->filepaths;
+  priv->uris = g_slist_copy (uris);
+  priv->current = priv->uris;
   priv->index = 0;
-  priv->n_pictures = g_slist_length (priv->filepaths);
+  priv->n_pictures = g_slist_length (priv->uris);
 
   /* Callback data */
   priv->picture_loaded_cb = picture_loaded_cb;
@@ -366,7 +373,7 @@ frogr_picture_loader_load (FrogrPictureLoader *fploader)
     FROGR_PICTURE_LOADER_GET_PRIVATE (fploader);
 
   /* Check first whether there's something to load */
-  if (priv->filepaths == NULL)
+  if (priv->uris == NULL)
     return;
 
   /* Set proper state */
diff --git a/src/frogr-picture-loader.h b/src/frogr-picture-loader.h
index edbc984..79ab6fb 100644
--- a/src/frogr-picture-loader.h
+++ b/src/frogr-picture-loader.h
@@ -51,7 +51,7 @@ struct _FrogrPictureLoaderClass
 
 GType frogr_picture_loader_get_type(void) G_GNUC_CONST;
 
-FrogrPictureLoader *frogr_picture_loader_new (GSList *filepaths,
+FrogrPictureLoader *frogr_picture_loader_new (GSList *uri,
                                               GFunc picture_loaded_cb,
                                               GFunc pictures_loaded_cb,
                                               gpointer object);
diff --git a/src/frogr-picture-uploader.c b/src/frogr-picture-uploader.c
index 9d4ce55..477dea2 100644
--- a/src/frogr-picture-uploader.c
+++ b/src/frogr-picture-uploader.c
@@ -130,6 +130,10 @@ _upload_next_picture_cb (FrogrPictureUploader *fpuploader,
 
   /* Update internal status */
   priv->current = g_slist_next (priv->current);
+
+  // XXX - urizev: When upload finishes, the local file is deleted. Maybe this is not the best place to released.
+  frogr_picture_delete_local_path (fpicture);
+  
   priv->index++;
 
   /* Update status and progress bars */
diff --git a/src/frogr-picture.c b/src/frogr-picture.c
index 532b7a4..01e42ac 100644
--- a/src/frogr-picture.c
+++ b/src/frogr-picture.c
@@ -24,6 +24,8 @@
 
 #define TAGS_DELIMITER " "
 
+#define FROGR_LOCAL_PREFFIX "file://"
+
 #define FROGR_PICTURE_GET_PRIVATE(object)             \
   (G_TYPE_INSTANCE_GET_PRIVATE ((object),             \
                                 FROGR_TYPE_PICTURE,   \
@@ -36,7 +38,8 @@ typedef struct _FrogrPicturePrivate FrogrPicturePrivate;
 struct _FrogrPicturePrivate
 {
   gchar *id;
-  gchar *filepath;
+  gchar *uri;
+  gchar *local_path; // Cache file
   gchar *title;
   gchar *description;
   gchar *tags_string;
@@ -53,7 +56,7 @@ struct _FrogrPicturePrivate
 enum  {
   PROP_0,
   PROP_ID,
-  PROP_FILEPATH,
+  PROP_URI,
   PROP_TITLE,
   PROP_DESCRIPTION,
   PROP_TAGS_STRING,
@@ -177,9 +180,9 @@ _frogr_picture_set_property (GObject *object,
       g_free (priv->id);
       priv->id = g_value_dup_string (value);
       break;
-    case PROP_FILEPATH:
-      g_free (priv->filepath);
-      priv->filepath = g_value_dup_string (value);
+    case PROP_URI:
+      g_free (priv->uri);
+      priv->uri = g_value_dup_string (value);
       break;
     case PROP_TITLE:
       g_free (priv->title);
@@ -224,8 +227,8 @@ _frogr_picture_get_property (GObject *object,
     case PROP_ID:
       g_value_set_string (value, priv->id);
       break;
-    case PROP_FILEPATH:
-      g_value_set_string (value, priv->filepath);
+    case PROP_URI:
+      g_value_set_string (value, priv->uri);
       break;
     case PROP_TITLE:
       g_value_set_string (value, priv->title);
@@ -261,7 +264,7 @@ _frogr_picture_finalize (GObject* object)
 
   /* free strings */
   g_free (priv->id);
-  g_free (priv->filepath);
+  g_free (priv->uri);
   g_free (priv->title);
   g_free (priv->description);
   g_free (priv->tags_string);
@@ -298,11 +301,10 @@ frogr_picture_class_init(FrogrPictureClass *klass)
                                                         G_PARAM_READWRITE));
 
   g_object_class_install_property (obj_class,
-                                   PROP_FILEPATH,
-                                   g_param_spec_string ("filepath",
-                                                        "filepath",
-                                                        "Full filepath at disk "
-                                                        "for the picture",
+                                   PROP_URI,
+                                   g_param_spec_string ("uri",
+                                                        "uri",
+                                                        "Full URI of the picture",
                                                         NULL,
                                                         G_PARAM_READWRITE));
   g_object_class_install_property (obj_class,
@@ -372,7 +374,7 @@ frogr_picture_init (FrogrPicture *fpicture)
 
   /* Default values */
   priv->id = NULL;
-  priv->filepath = NULL;
+  priv->uri = NULL;
   priv->title = NULL;
   priv->description = NULL;
   priv->tags_string = NULL;
@@ -389,15 +391,15 @@ frogr_picture_init (FrogrPicture *fpicture)
 /* Public API */
 
 FrogrPicture *
-frogr_picture_new (const gchar *filepath,
+frogr_picture_new (const gchar *uri,
                    const gchar *title,
                    gboolean public)
 {
-  g_return_val_if_fail (filepath, NULL);
+  g_return_val_if_fail (uri, NULL);
   g_return_val_if_fail (title, NULL);
 
   GObject *new = g_object_new(FROGR_TYPE_PICTURE,
-                              "filepath", filepath,
+                              "uri", uri,
                               "title", title,
                               "is-public", public,
                               NULL);
@@ -432,27 +434,105 @@ frogr_picture_set_id (FrogrPicture *fpicture,
 }
 
 const gchar *
-frogr_picture_get_filepath (FrogrPicture *fpicture)
+frogr_picture_get_uri (FrogrPicture *fpicture)
 {
   g_return_val_if_fail(FROGR_IS_PICTURE(fpicture), NULL);
 
   FrogrPicturePrivate *priv =
     FROGR_PICTURE_GET_PRIVATE (fpicture);
 
-  return (const gchar *)priv->filepath;
+  return (const gchar *)priv->uri;
 }
 
 void
-frogr_picture_set_filepath (FrogrPicture *fpicture,
-                            const gchar *filepath)
+frogr_picture_set_uri (FrogrPicture *fpicture,
+                            const gchar *uri)
 {
   g_return_if_fail(FROGR_IS_PICTURE(fpicture));
 
   FrogrPicturePrivate *priv =
     FROGR_PICTURE_GET_PRIVATE (fpicture);
 
-  g_free (priv->filepath);
-  priv->filepath = g_strdup (filepath);
+  g_free (priv->uri);
+  priv->uri = g_strdup (uri);
+}
+
+static
+gboolean
+frogr_uri_is_local (const gchar* uri)
+{
+  return g_str_has_prefix (uri, FROGR_LOCAL_PREFFIX);
+}
+
+const gchar *
+frogr_picture_get_local_path (FrogrPicture *fpicture)
+{
+  g_return_if_fail(FROGR_IS_PICTURE(fpicture));
+
+  FrogrPicturePrivate *priv =
+    FROGR_PICTURE_GET_PRIVATE (fpicture);
+
+  if (priv->local_path) {
+    return priv->local_path;
+  }
+
+  if (frogr_uri_is_local (priv->uri)) {
+    int offset = sizeof (FROGR_LOCAL_PREFFIX) - 1;
+    priv->local_path = g_strdup (&priv->uri[offset]);
+    return priv->local_path;
+  }
+
+  GError* error = 0;
+  
+  gint fd = g_file_open_tmp ("frogr-XXXXXX", &priv->local_path, &error);
+  if (fd < 0) {
+    g_warning ("Unable to create a temporary file: %s\n", error->message);
+    return NULL;
+  }
+  
+  close (fd);
+
+  GFile* local = g_file_new_for_path (priv->local_path);
+  GFile* remote = g_file_new_for_uri (priv->uri);
+
+  error = 0;
+  g_debug ("Copying '%s' to '%s'\n", priv->uri, priv->local_path);
+  if (! g_file_copy (remote, local,
+		     G_FILE_COPY_OVERWRITE |
+		     G_FILE_COPY_NOFOLLOW_SYMLINKS |
+		     G_FILE_COPY_ALL_METADATA,
+		     NULL, NULL, NULL, &error)) {
+    g_warning ("Unable to copy the remote file '%s' to the local file '%s': %s\n", priv->uri, priv->local_path, error->message);
+    // XXX - urizev: is it not necessary to release local and remote variables?
+    return 0;
+  }
+
+  return priv->local_path;
+}
+
+void
+frogr_picture_delete_local_path (FrogrPicture *fpicture)
+{
+  g_return_if_fail(FROGR_IS_PICTURE(fpicture));
+  
+  FrogrPicturePrivate *priv =
+    FROGR_PICTURE_GET_PRIVATE (fpicture);
+
+  if (! priv->local_path) {
+    return;
+  }
+
+  if (frogr_uri_is_local (priv->uri)) {
+      return;
+  }
+
+  GError *error = 0;
+  GFile *file = g_file_new_for_path (priv->local_path);
+
+  g_debug ("Deleting local file of '%s': '%s'\n", priv->uri, priv->local_path);
+  if ((! g_file_delete (file, NULL, &error)) || error) {
+    g_warning ("Unable to delete temporary file: %s\n", priv->local_path);
+  }
 }
 
 const gchar *
diff --git a/src/frogr-picture.h b/src/frogr-picture.h
index d8180a6..8e3b4d4 100644
--- a/src/frogr-picture.h
+++ b/src/frogr-picture.h
@@ -53,7 +53,7 @@ struct _FrogrPictureClass
 GType frogr_picture_get_type(void) G_GNUC_CONST;
 
 /* Constructor */
-FrogrPicture *frogr_picture_new (const gchar *filepath,
+FrogrPicture *frogr_picture_new (const gchar *uri,
                                  const gchar *title,
                                  gboolean public);
 
@@ -71,9 +71,12 @@ const gchar *frogr_picture_get_description (FrogrPicture *fpicture);
 void frogr_picture_set_description (FrogrPicture *fpicture,
                                     const gchar *description);
 
-const gchar *frogr_picture_get_filepath (FrogrPicture *fpicture);
-void frogr_picture_set_filepath (FrogrPicture *fpicture,
-                                 const gchar *filepath);
+const gchar *frogr_picture_get_uri (FrogrPicture *fpicture);
+void frogr_picture_set_uri (FrogrPicture *fpicture,
+			    const gchar *uri);
+
+const gchar *frogr_picture_get_local_path (FrogrPicture *fpicture);
+void frogr_picture_delete_local_path (FrogrPicture *fpicture);
 
 const GSList *frogr_picture_get_tags_list (FrogrPicture *fpicture);
 const gchar *frogr_picture_get_tags (FrogrPicture *fpicture);
