diff --git a/configure.ac b/configure.ac
index d657a2d..7f274e0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -60,9 +60,9 @@ EOG_HAS_PYTHON=1
 
 AC_MSG_CHECKING([which plugins to build])
 
-ALL_PLUGINS="postr champlain fit-to-width exif-display send-by-mail"
-USEFUL_PLUGINS="postr champlain fit-to-width exif-display send-by-mail"
-DEFAULT_PLUGINS="postr champlain fit-to-width exif-display send-by-mail"
+ALL_PLUGINS="postr champlain fit-to-width exif-display send-by-mail postasa"
+USEFUL_PLUGINS="postr champlain fit-to-width exif-display send-by-mail postasa"
+DEFAULT_PLUGINS="postr champlain fit-to-width exif-display send-by-mail postasa"
 
 PYTHON_ALL_PLUGINS="slideshowshuffle pythonconsole"
 PYTHON_USEFUL_PLUGINS="slideshowshuffle pythonconsole"
@@ -82,7 +82,7 @@ AC_ARG_WITH([plugins],
 	    [AS_HELP_STRING([--with-plugins=LIST],
 			    [Comma-separated list specifying the plugins to build.
 			    Available: champlain, exif-display, fit-to-width,
-			    postr, pythonconsole, slideshowshuffle,
+			    postr, postasa, pythonconsole, slideshowshuffle,
 			    as well as the aliases default,
 			    all, and really-all])],
 	    [plugins=$with_plugins],
@@ -289,6 +289,33 @@ then
 	fi
 fi
 
+# *******
+# Postasa
+# *******
+plugin_defined postasa
+if test "$?" = 1
+then
+    PKG_CHECK_MODULES(POSTASA,
+        [ libgdata >= 0.5.0 ],
+        [],[have_postasa=no])
+    AC_SUBST(POSTASA_LIBS)
+    AC_SUBST(POSTASA_CFLAGS)
+    if test "x$have_postasa" = "xno"
+    then
+        undef_plugin postasa "libgdata was not found"
+    fi
+fi
+
+if test -z "$disabled_plugins"
+then
+	disabled_plugins="none"
+fi
+
+PLUGINS=$(echo $PLUGINS | tr ' ' '\n' | sort | uniq | tr '\n' ' ')
+AC_SUBST([DIST_PLUGINS])
+AC_SUBST([BUILD_PLUGINS],[$PLUGINS])
+
+
 # *********
 # Champlain 
 # *********
@@ -356,6 +383,7 @@ plugins/exif-display/Makefile
 plugins/send-by-mail/Makefile
 plugins/slideshowshuffle/Makefile
 plugins/postr/Makefile
+plugins/postasa/Makefile
 plugins/pythonconsole/Makefile
 po/Makefile.in])
 
diff --git a/plugins/postasa/Makefile.am b/plugins/postasa/Makefile.am
new file mode 100644
index 0000000..827ab45
--- /dev/null
+++ b/plugins/postasa/Makefile.am
@@ -0,0 +1,43 @@
+# Postasa plugin
+plugindir = $(libdir)/eog/plugins
+
+INCLUDES = \
+	-I$(top_srcdir) 				\
+	$(EOG_CFLAGS) 					\
+	$(WARN_CFLAGS)					\
+	$(POSTASA_CFLAGS) 				\
+	-DEOG_LOCALEDIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \
+	-DEOG_PLUGINDIR=\""$(plugindir)"\"
+
+plugin_LTLIBRARIES = libpostasa.la
+
+libpostasa_la_SOURCES = \
+	eog-postasa-plugin.h				\
+	eog-postasa-plugin.c
+
+libpostasa_la_LDFLAGS = \
+	$(PLUGIN_LIBTOOL_FLAGS)				\
+	$(EOG_LIBS)
+
+libpostasa_la_LIBADD = $(EOG_LIBS)			\
+	$(POSTASA_LIBS)
+
+
+# Plugin Info
+
+plugin_in_files = postasa.eog-plugin.desktop.in
+
+UI_FILES = postasa-config.xml
+ui_DATA = $(UI_FILES)
+uidir = $(plugindir)/postasa
+
+%.eog-plugin: %.eog-plugin.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*po) ; $(AM_V_GEN)$(INTLTOOL_MERGE) $(top_srcdir)/po $< $@ -d -u -c $(top_builddir)/po/.intltool-merge-cache
+
+plugin_DATA = $(plugin_in_files:.eog-plugin.desktop.in=.eog-plugin)
+
+EXTRA_DIST = $(plugin_in_files)
+
+CLEANFILES = $(plugin_DATA)
+DISTCLEANFILES = $(plugin_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/plugins/postasa/eog-postasa-plugin.c b/plugins/postasa/eog-postasa-plugin.c
new file mode 100644
index 0000000..b2e3e6d
--- /dev/null
+++ b/plugins/postasa/eog-postasa-plugin.c
@@ -0,0 +1,427 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "eog-postasa-plugin.h"
+
+#include <gmodule.h>
+#include <glib/gi18n-lib.h>
+
+#include <eog/eog-debug.h>
+#include <eog/eog-thumb-view.h>
+#include <eog/eog-image.h>
+
+#include <gdata/gdata.h>
+
+#define WINDOW_DATA_KEY "EogPostasaWindowData"
+#define MENU_PATH "/MainMenu/ToolsMenu/ToolsOps_2"
+
+#define GTKBUILDER_CONFIG_FILE EOG_PLUGINDIR"/postasa/postasa-config.xml"
+
+EOG_PLUGIN_REGISTER_TYPE(EogPostasaPlugin, eog_postasa_plugin)
+
+struct _EogPostasaPluginPrivate {
+	GDataPicasaWebService *service;
+	GCancellable *cancellable;
+
+	/* TODO: consider using GConf to store the username in; perhaps not the password */
+	GtkEntry  *username_entry;
+	GtkEntry  *password_entry;
+	GtkLabel  *login_message;
+	GtkButton *login_button;
+	GtkButton *cancel_button;
+	GtkDialog *dialog;
+};
+
+typedef struct
+{
+	GtkActionGroup *ui_action_group;
+	guint ui_id;
+	EogPostasaPlugin *plugin;
+} WindowData;
+
+static GtkWidget *impl_create_config_dialog (EogPlugin *_plugin);
+static void picasaweb_upload_cb (GtkAction *action, EogWindow *window);
+static void close_config_window_cb (GtkWidget *cancel_button, gpointer _plugin);
+
+static const GtkActionEntry action_entries[] =
+{
+	{ "RunPostasa",
+	  "postasa",
+	  N_("Upload to PicasaWeb"),
+	  NULL,
+	  N_("Upload your pictures to PicasaWeb"),
+	  G_CALLBACK (picasaweb_upload_cb) }
+};
+
+
+/**
+ * picasaweb_login_dialog_response_cb:
+ *
+ * Used to catch and block the "response" emission; we don't want
+ * gtk_dialog_run () returning unless we've cancelled or closed it, so
+ * we can use the login button to wait asynchronously
+ **/
+static void
+picasaweb_login_dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer _plugin)
+{
+	g_signal_stop_emission_by_name (G_OBJECT (dialog), "response");
+}
+
+/**
+ * picasaweb_upload_cb:
+ *
+ * This checks that we are authenticated (popping up the login window
+ * if we're not) and, if we are, attempts to upload the selected
+ * files.  It provides a message near the end indicating the number
+ * successfully uploaded, and any error messages encountered along the
+ * way.
+ **/
+static void
+picasaweb_upload_cb (GtkAction	*action,
+		     EogWindow *window)
+{
+	WindowData *data = g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY);
+	EogPostasaPlugin *plugin = data->plugin;
+	GtkDialog *dialog;
+
+	if (gdata_service_is_authenticated (GDATA_SERVICE (plugin->priv->service)) == FALSE) {
+		dialog = GTK_DIALOG (impl_create_config_dialog (EOG_PLUGIN (plugin)));
+		/* we handle and block "response" so we don't return prematurely */
+		g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (picasaweb_login_dialog_response_cb), plugin);
+		
+		gtk_label_set_text (plugin->priv->login_message, "Please log in to continue upload.");
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		/* doing this manually since gtk_dialog_run () is returning on alt-F4/metacity close without destroying window,
+		   and I can't get delete-event or close signals to handle that for me :| */
+		close_config_window_cb (NULL, plugin);
+
+		if (gdata_service_is_authenticated (GDATA_SERVICE (plugin->priv->service)) == FALSE) {
+			g_warning ("PicasaWeb could not be authenticated.  Aborting upload.");
+			return;
+		}
+	}
+
+	GtkWidget *thumbview = eog_window_get_thumb_view (window);
+	GList *images, *i;
+
+	EogImage *image;
+	GFile *imgfile;
+	gchar *imgpath;
+
+	GDataPicasaWebFile *file_entry;
+	GError *error = NULL;
+	gchar *filename;
+
+	GString *warnings = g_string_new ("");
+	int num_uploaded = 0;
+	GtkDialog *warning_dialog;
+	
+	// g_message ("Uploading, we hope.");
+
+	images = eog_thumb_view_get_selected_images (EOG_THUMB_VIEW (thumbview));
+
+	for (i = g_list_first (images); i; i = i->next) {
+		image = (EogImage *) i->data;
+
+		imgfile = eog_image_get_file (image);
+		imgpath = g_file_get_path (imgfile);
+
+		if (G_LIKELY (imgpath != NULL)) {
+			if (g_file_query_exists (imgfile, NULL)) {
+				file_entry = gdata_picasaweb_file_new (NULL);
+				filename = g_file_get_basename (imgfile);
+				gdata_entry_set_title (GDATA_ENTRY (file_entry), filename);
+				g_free (filename);
+				
+				/* TODO: really want an async version of *_upload_file () */
+				g_object_unref (gdata_picasaweb_service_upload_file (plugin->priv->service,
+										     NULL /* Uploading to Drop Box */, file_entry,
+										     imgfile, NULL, &error));
+				if (error) {
+					g_string_append_printf (warnings, "Upload of %s failed: %d:%s\n",
+								imgpath, error->code, error->message);
+					g_clear_error (&error);
+				} else {
+					num_uploaded++;
+				}
+				g_object_unref (file_entry);
+			} else {
+				g_string_append_printf (warnings, "File requested for upload does not exist: %s", imgpath);
+			}
+		}
+
+		// g_message ("File at %s has uploaded.", imgpath);
+
+		g_free (imgpath);
+		g_object_unref (imgfile);
+	}
+
+	if (warnings->len > 0) {
+		g_warning (warnings->str);
+	}
+
+	g_string_append_printf (warnings, "%d file%s successfully uploaded.", num_uploaded, num_uploaded == 1 ? "" : "s");
+
+	warning_dialog = GTK_DIALOG (gtk_message_dialog_new (GTK_WINDOW (window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING,
+							     GTK_BUTTONS_OK, warnings->str));
+	gtk_dialog_run (warning_dialog);
+	gtk_widget_destroy (GTK_WIDGET (warning_dialog));
+
+	g_string_free (warnings, TRUE);
+}
+
+/**
+ * picasaweb_login_async_cb:
+ *
+ * Called when @gdata_service_authenticate_async, called by
+ * @picasaweb_login_cb, gets a respones from PicasaWeb and processes
+ * it.  Upon success, it switches Cancel to Close.  Regardless, it
+ * re-enables the Login button.
+ **/
+static void
+picasaweb_login_async_cb (GDataPicasaWebService *service, GAsyncResult *result, EogPostasaPlugin *plugin)
+{
+	GError *error = NULL;
+	gchar *message;
+
+	gdata_service_authenticate_finish (GDATA_SERVICE (service), result, &error);
+
+	gtk_widget_set_sensitive (GTK_WIDGET (plugin->priv->login_button), TRUE);
+	if (error) {
+		message = g_strdup_printf ("Login failed. %s", error->message);
+		gtk_label_set_text (plugin->priv->login_message, message);
+		g_free (message); /* TODO: do we want to free this? */
+	} else {
+		gtk_label_set_text (plugin->priv->login_message, "Logged in successully.");
+		gtk_button_set_label (plugin->priv->cancel_button, "Close"); /* does this make it harder to translate? */
+	}
+}
+
+/**
+ * picasaweb_login_cb:
+ *
+ * Handles "clicked" for the Login button.  Attempts to use input from
+ * the username and password entries to authenticate.  It does this
+ * asynchronously, leaving it to @picasaweb_login_async_cb to handle
+ * the result.  It disables the Login button while authenticating
+ * (re-enabled when done) and ensures the Close/Cancel button says
+ * Cancel (which, incidentally, will call g_cancellable_cancel on the
+ * provided #GCancellable.
+ **/
+static void
+picasaweb_login_cb (GtkWidget *login_button, gpointer _plugin)
+{
+	EogPostasaPlugin *plugin = EOG_POSTASA_PLUGIN (_plugin);
+
+	gtk_button_set_label (plugin->priv->cancel_button, "Cancel"); 
+	gtk_widget_set_sensitive (login_button, FALSE); 
+	
+	/* TODO: want to handle passwords more securely */
+	gtk_label_set_text (plugin->priv->login_message, "Logging in...");
+	g_cancellable_reset (plugin->priv->cancellable);
+	gdata_service_authenticate_async (GDATA_SERVICE (plugin->priv->service),
+					  gtk_entry_get_text (plugin->priv->username_entry),
+					  gtk_entry_get_text (plugin->priv->password_entry),
+					  plugin->priv->cancellable, (GAsyncReadyCallback)picasaweb_login_async_cb, plugin);
+}
+
+/* Memory Clean Up */
+
+static void
+free_window_data (WindowData *data)
+{
+	g_return_if_fail (data != NULL);
+
+	eog_debug (DEBUG_PLUGINS);
+
+	g_object_unref (data->ui_action_group);
+
+	g_free (data);
+}
+
+/**
+ * close_config_window_cb:
+ *
+ * Called when we try to close the configure/login dialog.  Also sets
+ * the widget members of the plugin to NULL, since they no longer
+ * exist when their dialog is destroyed.
+ */
+static void
+close_config_window_cb (GtkWidget *cancel_button, gpointer _plugin)
+{
+	EogPostasaPlugin *plugin = EOG_POSTASA_PLUGIN (_plugin);
+
+	if (GTK_IS_WIDGET (plugin->priv->dialog)) {
+		/* abort the authentication attempt if in progress and we're cancelling */
+		g_cancellable_cancel (plugin->priv->cancellable);
+		gtk_widget_destroy (GTK_WIDGET (gtk_widget_get_toplevel (GTK_WIDGET (plugin->priv->dialog))));
+		
+		plugin->priv->username_entry = NULL;
+		plugin->priv->password_entry = NULL;
+		plugin->priv->dialog         = NULL;
+		plugin->priv->cancel_button  = NULL;
+		plugin->priv->login_button   = NULL;
+	}
+}
+
+/*** EogPlugin Functions ***/
+
+static GtkWidget *
+impl_create_config_dialog (EogPlugin *_plugin)
+{
+	EogPostasaPlugin *plugin = EOG_POSTASA_PLUGIN (_plugin);
+	GtkBuilder *builder;
+	GError *error = NULL;
+
+	builder = gtk_builder_new ();
+	gtk_builder_add_from_file (builder, GTKBUILDER_CONFIG_FILE, &error);
+	if (error) {
+		g_warning ("Couldn't load Postasa configuration UI file:%d:%s", error->code, error->message);
+		g_error_free (error);
+	}
+	
+	plugin->priv->username_entry = GTK_ENTRY  (gtk_builder_get_object (builder, "username_entry"));
+	plugin->priv->password_entry = GTK_ENTRY  (gtk_builder_get_object (builder, "password_entry"));
+	plugin->priv->dialog         = GTK_DIALOG (gtk_builder_get_object (builder, "postasa_login_dialog"));
+	plugin->priv->cancel_button  = GTK_BUTTON (gtk_builder_get_object (builder, "cancel_button"));
+	plugin->priv->login_button   = GTK_BUTTON (gtk_builder_get_object (builder, "login_button"));
+	plugin->priv->login_message  = GTK_LABEL  (gtk_builder_get_object (builder, "login_message"));
+	
+	g_object_unref (builder);
+
+	g_signal_connect (G_OBJECT (plugin->priv->login_button),  "clicked", G_CALLBACK (picasaweb_login_cb),     plugin);
+	g_signal_connect (G_OBJECT (plugin->priv->cancel_button), "clicked", G_CALLBACK (close_config_window_cb), plugin);
+	
+	if (gdata_service_is_authenticated (GDATA_SERVICE (plugin->priv->service))) {
+		gtk_entry_set_text (plugin->priv->username_entry, gdata_service_get_username (GDATA_SERVICE (plugin->priv->service)));
+		gtk_entry_set_text (plugin->priv->password_entry, gdata_service_get_password (GDATA_SERVICE (plugin->priv->service)));
+	}
+
+	return GTK_WIDGET (plugin->priv->dialog);
+}
+
+static void
+impl_activate (EogPlugin *plugin,
+	       EogWindow *window)
+{
+	GtkUIManager *manager;
+	WindowData *data;
+
+	eog_debug (DEBUG_PLUGINS);
+
+	data = g_new (WindowData, 1);
+	manager = eog_window_get_ui_manager (window);
+
+	data->plugin = EOG_POSTASA_PLUGIN (plugin);
+	data->ui_action_group = gtk_action_group_new ("EogPostasaPluginActions");
+
+	gtk_action_group_set_translation_domain (data->ui_action_group,
+						 GETTEXT_PACKAGE);
+	gtk_action_group_add_actions (data->ui_action_group,
+				      action_entries,
+				      G_N_ELEMENTS (action_entries),
+				      window);
+
+	gtk_ui_manager_insert_action_group (manager,
+					    data->ui_action_group,
+					    -1);
+
+	data->ui_id = gtk_ui_manager_new_merge_id (manager);
+
+	g_object_set_data_full (G_OBJECT (window),
+				WINDOW_DATA_KEY,
+				data,
+				(GDestroyNotify) free_window_data);
+
+	gtk_ui_manager_add_ui (manager,
+			       data->ui_id,
+			       MENU_PATH,
+			       "RunPostasa",
+			       "RunPostasa",
+			       GTK_UI_MANAGER_MENUITEM,
+			       FALSE);
+}
+
+static void
+impl_deactivate	(EogPlugin *plugin,
+		 EogWindow *window)
+{
+	GtkUIManager *manager;
+	WindowData *data;
+
+	eog_debug (DEBUG_PLUGINS);
+
+	manager = eog_window_get_ui_manager (window);
+
+	data = (WindowData *) g_object_get_data (G_OBJECT (window),
+						 WINDOW_DATA_KEY);
+	g_return_if_fail (data != NULL);
+
+	gtk_ui_manager_remove_ui (manager,
+				  data->ui_id);
+
+	gtk_ui_manager_remove_action_group (manager,
+					    data->ui_action_group);
+
+	g_object_set_data (G_OBJECT (window),
+			   WINDOW_DATA_KEY,
+			   NULL);
+}
+
+static void
+impl_update_ui (EogPlugin *plugin,
+		EogWindow *window)
+{
+	WindowData *data;
+
+	eog_debug (DEBUG_PLUGINS);
+
+	data = (WindowData *) g_object_get_data (G_OBJECT (window),
+						 WINDOW_DATA_KEY);
+}
+
+
+/*** GObject Functions ***/
+
+static void
+eog_postasa_plugin_init (EogPostasaPlugin *plugin)
+{
+	eog_debug_message (DEBUG_PLUGINS, "EogPostasaPlugin initializing");
+
+	plugin->priv = G_TYPE_INSTANCE_GET_PRIVATE (plugin, EOG_TYPE_POSTASA_PLUGIN, EogPostasaPluginPrivate);
+	plugin->priv->service = gdata_picasaweb_service_new ("EogPostasa");
+	plugin->priv->cancellable = g_cancellable_new ();
+}
+
+static void
+eog_postasa_plugin_finalize (GObject *_plugin)
+{
+	EogPostasaPlugin *plugin = EOG_POSTASA_PLUGIN (_plugin);
+
+	eog_debug_message (DEBUG_PLUGINS, "EogPostasaPlugin finalizing");
+
+	/* TODO: clean up service, etc */
+	g_object_unref (plugin->priv->service);
+	g_object_unref (plugin->priv->cancellable);
+	
+	G_OBJECT_CLASS (eog_postasa_plugin_parent_class)->finalize (_plugin);
+}
+
+static void
+eog_postasa_plugin_class_init (EogPostasaPluginClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	EogPluginClass *plugin_class = EOG_PLUGIN_CLASS (klass);
+
+	g_type_class_add_private (klass, sizeof (EogPostasaPluginPrivate));
+
+	object_class->finalize = eog_postasa_plugin_finalize;
+
+	plugin_class->activate = impl_activate;
+	plugin_class->deactivate = impl_deactivate;
+	plugin_class->update_ui = impl_update_ui;
+	plugin_class->create_configure_dialog = impl_create_config_dialog;
+}
diff --git a/plugins/postasa/eog-postasa-plugin.h b/plugins/postasa/eog-postasa-plugin.h
new file mode 100644
index 0000000..3fb5445
--- /dev/null
+++ b/plugins/postasa/eog-postasa-plugin.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+#ifndef __EOG_POSTASA_PLUGIN_H__
+#define __EOG_POSTASA_PLUGIN_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <eog/eog-plugin.h>
+
+G_BEGIN_DECLS
+
+/*
+ * Type checking and casting macros
+ */
+#define EOG_TYPE_POSTASA_PLUGIN		(eog_postasa_plugin_get_type ())
+#define EOG_POSTASA_PLUGIN(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), EOG_TYPE_POSTASA_PLUGIN, EogPostasaPlugin))
+#define EOG_POSTASA_PLUGIN_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k),     EOG_TYPE_POSTASA_PLUGIN, EogPostasaPluginClass))
+#define EOG_IS_POSTASA_PLUGIN(o)	        (G_TYPE_CHECK_INSTANCE_TYPE ((o), EOG_TYPE_POSTASA_PLUGIN))
+#define EOG_IS_POSTASA_PLUGIN_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k),    EOG_TYPE_POSTASA_PLUGIN))
+#define EOG_POSTASA_PLUGIN_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o),  EOG_TYPE_POSTASA_PLUGIN, EogPostasaPluginClass))
+
+/* Private structure type */
+typedef struct _EogPostasaPluginPrivate	EogPostasaPluginPrivate;
+
+/*
+ * Main object structure
+ */
+typedef struct _EogPostasaPlugin		EogPostasaPlugin;
+
+struct _EogPostasaPlugin
+{
+	EogPlugin parent_instance;
+	EogPostasaPluginPrivate *priv;
+};
+
+/*
+ * Class definition
+ */
+typedef struct _EogPostasaPluginClass	EogPostasaPluginClass;
+
+struct _EogPostasaPluginClass
+{
+	EogPluginClass parent_class;
+};
+
+/*
+ * Public methods
+ */
+GType	eog_postasa_plugin_get_type		(void) G_GNUC_CONST;
+
+/* All the plugins must implement this function */
+G_MODULE_EXPORT GType register_eog_plugin (GTypeModule *module);
+
+G_END_DECLS
+
+#endif /* __EOG_POSTASA_PLUGIN_H__ */
diff --git a/plugins/postasa/postasa-config.xml b/plugins/postasa/postasa-config.xml
new file mode 100644
index 0000000..4eee067
--- /dev/null
+++ b/plugins/postasa/postasa-config.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkDialog" id="postasa_login_dialog">
+    <property name="height_request">150</property>
+    <property name="border_width">5</property>
+    <property name="type_hint">normal</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog_vbox">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child>
+          <object class="GtkVBox" id="login_box">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkLabel" id="title">
+                <property name="visible">True</property>
+                <property name="ypad">6</property>
+                <property name="label" translatable="yes">PicasaWeb Login</property>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="username_hbox">
+                <property name="width_request">300</property>
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkLabel" id="username_label">
+                    <property name="width_request">60</property>
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Username</property>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="username_entry">
+                    <property name="width_request">240</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">&#x25CF;</property>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="password_hbox">
+                <property name="width_request">300</property>
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkLabel" id="password_label">
+                    <property name="width_request">60</property>
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Password</property>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="password_entry">
+                    <property name="width_request">240</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="visibility">False</property>
+                    <property name="invisible_char">&#x25CF;</property>
+                    <property name="invisible_char_set">True</property>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="login_message">
+                <property name="visible">True</property>
+                <property name="ypad">7</property>
+              </object>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="button_box">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="cancel_button">
+                <property name="label" translatable="yes">Cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="login_button">
+                <property name="label" translatable="yes">Login</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">cancel_button</action-widget>
+      <action-widget response="-1">login_button</action-widget>
+    </action-widgets>
+  </object>
+</interface>
diff --git a/plugins/postasa/postasa.eog-plugin.desktop.in b/plugins/postasa/postasa.eog-plugin.desktop.in
new file mode 100644
index 0000000..efef5f5
--- /dev/null
+++ b/plugins/postasa/postasa.eog-plugin.desktop.in
@@ -0,0 +1,9 @@
+[Eog Plugin]
+Module=postasa
+IAge=2
+_Name=PicasaWeb Uploader
+Icon=postasa
+_Description=Upload your pictures to PicasaWeb
+Authors=Richard Schwarting <aquarichy@gmail.com>, Lucas Rocha <lucasr@gnome.org>
+Copyright=Copyright © 2009 Richard Schwarting, Copyright © 2007 Lucas Rocha
+Website=http://www.gnome.org/projects/eog
