diff --git a/baobab/data/baobab-main-window.ui b/baobab/data/baobab-main-window.ui
index ba90c8f..cc7d1ec 100644
--- a/baobab/data/baobab-main-window.ui
+++ b/baobab/data/baobab-main-window.ui
@@ -46,6 +46,22 @@
           </object>
         </child>
         <child>
+          <object class="GtkAction" id="menu_import">
+            <property name="stock_id">gtk-open</property>
+            <property name="name">menu_import</property>
+            <property name="label" translatable="yes">Open Snapshot...</property>
+            <signal handler="on_menu_import_activate" name="activate"/>
+          </object>
+        </child>
+        <child>
+          <object class="GtkAction" id="menu_export">
+            <property name="stock_id">gtk-save</property>
+            <property name="name">menu_export</property>
+            <property name="label" translatable="yes">Save Snapshot...</property>
+            <signal handler="on_menu_export_activate" name="activate"/>
+          </object>
+        </child>
+        <child>
           <object class="GtkAction" id="menustop">
             <property name="stock_id">gtk-stop</property>
             <property name="name">menustop</property>
@@ -155,6 +171,9 @@
           <menuitem action="menuscandir"/>
           <menuitem action="menu_scan_rem"/>
           <separator/>
+          <menuitem action="menu_import"/>
+          <menuitem action="menu_export"/>
+          <separator/>
           <menuitem action="menustop"/>
           <menuitem action="menurescan"/>
           <separator/>
diff --git a/baobab/src/Makefile.am b/baobab/src/Makefile.am
index 47dd7be..8598a15 100644
--- a/baobab/src/Makefile.am
+++ b/baobab/src/Makefile.am
@@ -21,6 +21,8 @@ baobab_SOURCES = \
 	baobab-ringschart.h \
 	baobab-scan.c \
 	baobab-scan.h \
+	baobab-export.c \
+	baobab-export.h \
 	baobab-treeview.c \
 	baobab-treeview.h \
 	baobab-utils.c \
@@ -41,6 +43,7 @@ baobab_CFLAGS = 			\
 	$(GIO_CFLAGS)			\
 	$(GTK_CFLAGS)			\
 	$(LIBGTOP_CFLAGS)		\
+	$(LIBXML_CFLAGS)		\
 	$(NULL)
 
 baobab_LDFLAGS = -export-dynamic
@@ -50,5 +53,6 @@ baobab_LDADD = 				\
 	$(GIO_LIBS)			\
 	$(GTK_LIBS)			\
 	$(LIBGTOP_LIBS)			\
+	$(LIBXML_LIBS)			\
 	$(NULL)
 
diff --git a/baobab/src/baobab-export.c b/baobab/src/baobab-export.c
new file mode 100644
index 0000000..8b7556b
--- /dev/null
+++ b/baobab/src/baobab-export.c
@@ -0,0 +1,363 @@
+/*
+ * baobab-export.c
+ * This file is part of baobab
+ *
+ * Copyright (C) 2011 Oliver Gerlich
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, 
+ * Boston, MA  02110-1301  USA
+ */
+
+
+#include <config.h>
+
+#include <errno.h>
+#include <libxml/parser.h>
+#include <libxml/xmlwriter.h>
+
+#include "baobab-export.h"
+#include "baobab.h"
+#include "baobab-treeview.h"
+
+
+GQuark
+baobab_import_error_quark (void)
+{
+	return g_quark_from_static_string ("baobab-import-error-quark");
+}
+
+
+static gboolean
+load_node (xmlNodePtr cur, int depth, int* max_depth, GError **error)
+{
+	if (baobab.STOP_SCANNING)
+	{
+		return TRUE;
+	}
+
+	gboolean errorFound = FALSE;
+
+	if (depth > *max_depth)
+		*max_depth = depth;
+	depth++;
+
+	if (xmlStrcmp(cur->name, "dir") == 0)
+	{
+		struct chan_data entry;
+		entry.size = 0;
+		entry.alloc_size = 0;
+		entry.depth = depth -1;
+		entry.elements = -1;
+		entry.display_name = NULL;
+		entry.parse_name = NULL;
+		entry.tempHLsize = 0;
+
+		/* parse attributes from XML */
+		xmlChar* value;
+		value = xmlGetProp(cur, "name");
+		char* name = g_uri_unescape_string(value, NULL);
+		printf("dir name: %s\n", name);
+		entry.parse_name = name;
+		entry.display_name = g_filename_display_name(entry.parse_name);
+		xmlFree(value);
+
+		gchar* endPtr;
+		gboolean allParsed;
+
+		value = xmlGetProp(cur, "size");
+		errno = 0;
+		entry.size = g_ascii_strtoull(value, &endPtr, 10);
+		allParsed = (*endPtr == '\0');
+		xmlFree(value);
+		if (!allParsed || errno != 0)
+		{
+			g_set_error(error, BAOBAB_IMPORT_ERROR, 0, "invalid size value");
+			errorFound = TRUE;
+			goto end;
+		}
+
+		value = xmlGetProp(cur, "allocated");
+		errno = 0;
+		entry.alloc_size = g_ascii_strtoull(value, &endPtr, 10);
+		allParsed = (*endPtr == '\0');
+		xmlFree(value);
+		if (!allParsed || errno != 0)
+		{
+			g_set_error(error, BAOBAB_IMPORT_ERROR, 0, "invalid alloc_size value");
+			errorFound = TRUE;
+			goto end;
+		}
+
+		value = xmlGetProp(cur, "hardlinksize");
+		errno = 0;
+		entry.tempHLsize = g_ascii_strtoull(value, &endPtr, 10);
+		allParsed = (*endPtr == '\0');
+		xmlFree(value);
+		if (!allParsed || errno != 0)
+		{
+			g_set_error(error, BAOBAB_IMPORT_ERROR, 0, "invalid tempHLsize value");
+			errorFound = TRUE;
+			goto end;
+		}
+
+		/* prefill the model */
+		baobab_fill_model(&entry);
+
+		/* load children */
+		xmlNodePtr child = cur->xmlChildrenNode;
+		while (child)
+		{
+			const gboolean success = load_node(child, depth, max_depth, error);
+			if (!success)
+			{
+				errorFound = TRUE;
+				goto end;
+			}
+
+			child = child->next;
+		}
+
+		/* set final values for this directory */
+		value = xmlGetProp(cur, "elements");
+		entry.elements = atoi(value);
+		xmlFree(value);
+
+		if (entry.elements >= 0)
+		{
+			baobab_fill_model(&entry);
+		}
+
+	end:
+		g_free(entry.display_name);
+		g_free(entry.parse_name);
+	}
+
+	return (!errorFound);
+}
+
+
+void
+baobab_import (GFile *infileName, GError **error)
+{
+	printf("loading snapshot...\n");
+
+	char* fileContents;
+	gsize contentLength;
+	if (!g_file_load_contents(infileName, NULL, &fileContents, &contentLength, NULL, error))
+	{
+		return;
+	}
+
+	xmlDocPtr doc = xmlParseMemory(fileContents, contentLength);
+	g_free(fileContents);
+	if (!doc)
+	{
+		g_set_error(error, BAOBAB_IMPORT_ERROR, 0, "file could not be read");
+		return;
+	}
+
+	xmlNodePtr cur = xmlDocGetRootElement(doc);
+	if (!cur)
+	{
+		g_set_error(error, BAOBAB_IMPORT_ERROR, 0, "file is empty");
+		xmlFreeDoc(doc);
+		return;
+	}
+
+	if (xmlStrcmp(cur->name, "dump") != 0)
+	{
+		g_set_error(error, BAOBAB_IMPORT_ERROR, 0, "file is invalid (missing root node)");
+		xmlFreeDoc(doc);
+		return;
+	}
+
+	/* retrieve base path */
+	GFile* targetPath = NULL;
+	xmlChar* baseUri = xmlGetProp(cur, "baseuri");
+	if (baseUri)
+	{
+		targetPath = g_file_new_for_uri(baseUri);
+		xmlFree(baseUri);
+	}
+	else
+	{
+		xmlChar* basePath = xmlGetProp(cur, "basepath");
+		if (basePath)
+		{
+			targetPath = g_file_new_for_path(basePath);
+			xmlFree(basePath);
+		}
+		else
+		{
+			g_set_error(error, BAOBAB_IMPORT_ERROR, 0, "file is invalid (missing base path/URI)");
+			xmlFreeDoc(doc);
+			return;
+		}
+	}
+
+	/* find root <dir> node */
+	for (cur = cur->xmlChildrenNode; cur; cur = cur->next)
+	{
+		if (xmlStrcmp(cur->name, "dir") == 0)
+		{
+			break;
+		}
+	}
+
+	if (!cur)
+	{
+		g_set_error(error, BAOBAB_IMPORT_ERROR, 0, "file is invalid (missing root directory node)");
+		xmlFreeDoc(doc);
+		return;
+	}
+
+	baobab_scan_prepare(targetPath);
+
+	/* for simplicity, completely disable "Rescan" if data was loaded from file */
+	g_object_unref(baobab.current_location);
+	baobab.current_location = NULL;
+
+	int max_depth = 0;
+	load_node(cur, 0, &max_depth, error);
+
+	baobab.model_max_depth = max_depth;
+	baobab_scan_finish();
+
+	xmlFreeDoc(doc);
+	printf("done.\n");
+}
+
+
+static void
+export_iter (GtkTreeModel* model, GtkTreeIter* it, xmlTextWriterPtr writer)
+{
+	gboolean valid = TRUE;
+	while (valid)
+	{
+		xmlTextWriterStartElement(writer, "dir");
+		GValue value = {0};
+
+		gtk_tree_model_get_value(model, it, COL_H_PARSENAME, &value);
+		g_assert( G_VALUE_HOLDS_STRING(&value) );
+		char* escapedName;
+		const char* parsedName = g_value_get_string(&value);
+		if (parsedName[0] == '\0')
+		{
+			// if scan is stopped, it can happen that some top elements have no parse_name set;
+			// fall back to display_name in that case:
+			g_value_unset(&value);
+			gtk_tree_model_get_value(model, it, COL_DIR_NAME, &value);
+			g_assert( G_VALUE_HOLDS_STRING(&value) );
+			const char* displayName = g_value_get_string(&value);
+			escapedName = g_uri_escape_string(displayName, NULL, TRUE);
+		}
+		else
+		{
+			GFile* path = g_file_parse_name(parsedName);
+			escapedName = g_uri_escape_string(g_file_get_basename(path), NULL, TRUE);
+		}
+		xmlTextWriterWriteAttribute(writer, "name", escapedName);
+		g_free(escapedName);
+		g_value_unset(&value);
+
+		gtk_tree_model_get_value(model, it, COL_H_SIZE, &value);
+		g_assert( G_VALUE_HOLDS_UINT64(&value) );
+		xmlTextWriterWriteFormatAttribute(writer, "size", "%" G_GUINT64_FORMAT, g_value_get_uint64(&value));
+		g_value_unset(&value);
+
+		gtk_tree_model_get_value(model, it, COL_H_ALLOCSIZE, &value);
+		g_assert( G_VALUE_HOLDS_UINT64(&value) );
+		xmlTextWriterWriteFormatAttribute(writer, "allocated", "%" G_GUINT64_FORMAT, g_value_get_uint64(&value));
+		g_value_unset(&value);
+
+		gtk_tree_model_get_value(model, it, COL_H_ELEMENTS, &value);
+		g_assert( G_VALUE_HOLDS_INT(&value) );
+		xmlTextWriterWriteFormatAttribute(writer, "elements", "%d", g_value_get_int(&value));
+		g_value_unset(&value);
+
+		gtk_tree_model_get_value(model, it, COL_H_HARDLINK, &value);
+		g_assert( G_VALUE_HOLDS_UINT64(&value) );
+		xmlTextWriterWriteFormatAttribute(writer, "hardlinksize", "%" G_GUINT64_FORMAT, g_value_get_uint64(&value));
+		g_value_unset(&value);
+
+		if (gtk_tree_model_iter_has_child(model, it))
+		{
+			GtkTreeIter childIt;
+			gtk_tree_model_iter_children(model, &childIt, it);
+			export_iter(model, &childIt, writer);
+		}
+		xmlTextWriterEndElement(writer);
+
+		valid = gtk_tree_model_iter_next(model, it);
+	}
+}
+
+void
+baobab_export (GFile *outfileName)
+{
+	printf("saving snapshot...\n");
+
+	xmlBufferPtr xmlOutBuffer = xmlBufferCreate();
+	xmlTextWriterPtr writer = xmlNewTextWriterMemory(xmlOutBuffer, 0);
+
+	xmlTextWriterSetIndent(writer, 2);
+	xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL);
+	xmlTextWriterStartElement(writer, "dump");
+
+	if (g_file_is_native(baobab.current_location))
+	{
+		xmlTextWriterWriteAttribute(writer, "basepath", g_file_get_path(baobab.current_location));
+	}
+	else
+	{
+		xmlTextWriterWriteAttribute(writer, "baseuri", g_file_get_uri(baobab.current_location));
+	}
+
+	{
+		GDateTime *now_time = g_date_time_new_now_utc ();
+		gchar *time_str = g_date_time_format (now_time, "%Y-%m-%dT%H:%M:%SZ");
+		g_date_time_unref(now_time);
+		xmlTextWriterWriteAttribute(writer, "created", time_str);
+		g_free(time_str);
+	}
+
+	xmlTextWriterWriteComment(writer, " Baobab directory structure dump ");
+
+	GtkTreeModel* model = GTK_TREE_MODEL(baobab.model);
+	GtkTreeIter it;
+	const gboolean valid = gtk_tree_model_get_iter_first(model, &it);
+
+	if (valid)
+	{
+		export_iter(model, &it, writer);
+	}
+
+	xmlTextWriterEndDocument(writer);
+	xmlFreeTextWriter(writer);
+
+	gboolean success = g_file_replace_contents(outfileName,
+		xmlOutBuffer->content, xmlBufferLength(xmlOutBuffer),
+		NULL, FALSE,
+		G_FILE_CREATE_REPLACE_DESTINATION,
+		NULL, NULL, NULL);
+	if (!success)
+	{
+		printf("error saving snapshot file\n");
+	}
+
+	xmlBufferFree(xmlOutBuffer);
+
+	printf("done\n");
+}
diff --git a/baobab/src/baobab-export.h b/baobab/src/baobab-export.h
new file mode 100644
index 0000000..dfa1d5d
--- /dev/null
+++ b/baobab/src/baobab-export.h
@@ -0,0 +1,35 @@
+/*
+ * baobab-export.h
+ * This file is part of baobab
+ *
+ * Copyright (C) 2011 Oliver Gerlich
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, 
+ * Boston, MA  02110-1301  USA
+ */
+
+#ifndef __BAOBAB_EXPORT_H__
+#define __BAOBAB_EXPORT_H__
+
+#include <gio/gio.h>
+
+
+#define BAOBAB_IMPORT_ERROR baobab_import_error_quark ()
+GQuark baobab_import_error_quark (void);
+
+void baobab_import (GFile* infileName, GError **error);
+void baobab_export (GFile* outfileName);
+
+#endif /* __BAOBAB_EXPORT_H_ */
diff --git a/baobab/src/baobab-utils.c b/baobab/src/baobab-utils.c
index 8103197..5b021ec 100644
--- a/baobab/src/baobab-utils.c
+++ b/baobab/src/baobab-utils.c
@@ -111,6 +111,90 @@ on_toggled (GtkToggleButton *togglebutton, gpointer dialog)
 					  (GTK_FILE_CHOOSER (dialog)));
 }
 
+
+void
+filechooser_import_export_cb (GtkWidget *chooser,
+                              gint response,
+                              gpointer data)
+{
+	if (response == GTK_RESPONSE_OK) {
+		gchar *uri;
+		GFile *file;
+
+		uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser));
+		gtk_widget_destroy (chooser);
+
+		file = g_file_new_for_uri (uri);
+		if (GPOINTER_TO_INT(data) == TRUE)
+		{
+			baobab_export(file);
+		}
+		else
+		{
+			GError *err = NULL;
+			baobab_import(file, &err);
+			if (err != NULL)
+			{
+				printf("error loading file: %s\n", err->message);
+
+				GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(baobab.window),
+					GTK_DIALOG_DESTROY_WITH_PARENT,
+					GTK_MESSAGE_ERROR,
+					GTK_BUTTONS_CLOSE,
+					"Error loading file");
+				gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
+					"The file \"%s\" could not be loaded (%s)", uri, err->message);
+				gtk_dialog_run(GTK_DIALOG(dialog));
+				gtk_widget_destroy(dialog);
+
+				g_error_free(err);
+			}
+		}
+		g_free (uri);
+		g_object_unref (file);
+	}
+	else {
+		gtk_widget_destroy (chooser);
+	}
+}
+
+/*
+ * GtkFileChooser to select a file to import or export
+ */
+void
+import_export_file_select (GtkWidget *parent, gboolean do_export)
+{
+	GtkWidget *file_chooser = NULL;
+
+	file_chooser = gtk_file_chooser_dialog_new (_("Select File"),
+				      GTK_WINDOW (parent),
+				      do_export ? GTK_FILE_CHOOSER_ACTION_SAVE : GTK_FILE_CHOOSER_ACTION_OPEN,
+				      GTK_STOCK_CANCEL,
+				      GTK_RESPONSE_CANCEL,
+				      do_export ? GTK_STOCK_SAVE : GTK_STOCK_OPEN,
+				      GTK_RESPONSE_OK, NULL);
+
+	if (do_export)
+	{
+		GDateTime *now_time = g_date_time_new_now_local ();
+		gchar *time_str = g_date_time_format (now_time, "baobab-export-%Y%m%d-%H%M.xml");
+		g_date_time_unref(now_time);
+		gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (file_chooser), time_str);
+		g_free(time_str);
+
+		gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (file_chooser), TRUE);
+	}
+
+	g_signal_connect (file_chooser, "response",
+			  G_CALLBACK (filechooser_import_export_cb), GINT_TO_POINTER (do_export));
+
+	gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER (file_chooser), FALSE);
+	gtk_window_set_modal (GTK_WINDOW (file_chooser), TRUE);
+	gtk_window_set_position (GTK_WINDOW (file_chooser), GTK_WIN_POS_CENTER_ON_PARENT);
+	gtk_widget_show (GTK_WIDGET (file_chooser));
+}
+
+
 void
 set_ui_action_sens (const gchar *name, gboolean sens)
 {
diff --git a/baobab/src/baobab-utils.h b/baobab/src/baobab-utils.h
index 737b0b6..9aa928a 100644
--- a/baobab/src/baobab-utils.h
+++ b/baobab/src/baobab-utils.h
@@ -27,6 +27,7 @@
 
 gchar* dir_select (gboolean, GtkWidget *);
 void on_toggled (GtkToggleButton *, gpointer);
+void import_export_file_select (GtkWidget *, gboolean);
 void stop_scan (void);
 gboolean show_bars (GtkTreeModel *model,
 		    GtkTreePath *path,
diff --git a/baobab/src/baobab.c b/baobab/src/baobab.c
index 02e8ddb..a0adffa 100644
--- a/baobab/src/baobab.c
+++ b/baobab/src/baobab.c
@@ -145,6 +145,8 @@ check_menu_sens (gboolean scanning)
 	set_ui_action_sens ("menuscandir", !scanning);
 	set_ui_action_sens ("menustop", scanning);
 	set_ui_action_sens ("menurescan", !scanning && has_current_location);
+	set_ui_action_sens ("menu_import", !scanning);
+	set_ui_action_sens ("menu_export", !scanning && has_current_location);
 	set_ui_action_sens ("preferenze1", !scanning);
 	set_ui_action_sens ("menu_scan_rem", !scanning);
 	set_ui_action_sens ("ck_allocated", !scanning && baobab.is_local);
@@ -233,13 +235,10 @@ baobab_update_filesystem (void)
 }
 
 void
-baobab_scan_location (GFile *file)
+baobab_scan_prepare (GFile *file)
 {
 	GtkToggleAction *ck_allocated;
 
-	if (!baobab_check_dir (file))
-		return;
-
 	if (iterstack !=NULL)
 		return;
 
@@ -266,9 +265,22 @@ baobab_scan_location (GFile *file)
 	else {
 		gtk_action_set_sensitive (GTK_ACTION (ck_allocated), TRUE);
 	}
+}
 
+void
+baobab_scan_location (GFile *file)
+{
+    if (!baobab_check_dir (file))
+        return;
+
+    baobab_scan_prepare (file);
 	baobab_scan_execute (file);
+    baobab_scan_finish ();
+}
 
+void
+baobab_scan_finish ()
+{
 	/* set statusbar, percentage and allocated/normal size */
 	baobab_set_statusbar (_("Calculating percentage bars..."));
 	gtk_tree_model_foreach (GTK_TREE_MODEL (baobab.model),
@@ -1313,6 +1325,7 @@ main (int argc, char *argv[])
 	baobab.tree_view = create_directory_treeview ();
 
 	set_ui_action_sens ("menurescan", FALSE);
+	set_ui_action_sens ("menu_export", FALSE);
 
 	/* set allocated space checkbox */
 	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (gtk_builder_get_object (baobab.main_ui,
diff --git a/baobab/src/baobab.h b/baobab/src/baobab.h
index bfdbb0a..4a0edde 100644
--- a/baobab/src/baobab.h
+++ b/baobab/src/baobab.h
@@ -106,6 +106,8 @@ struct chan_data {
 
 void baobab_set_busy (gboolean busy);
 void baobab_update_filesystem (void);
+void baobab_scan_prepare (GFile *);
+void baobab_scan_finish ();
 void baobab_scan_location (GFile *);
 void baobab_scan_home (void);
 void baobab_scan_root (void);
diff --git a/baobab/src/callbacks.c b/baobab/src/callbacks.c
index 64c1cd6..7403aa0 100644
--- a/baobab/src/callbacks.c
+++ b/baobab/src/callbacks.c
@@ -36,6 +36,7 @@
 #include "baobab-prefs.h"
 #include "baobab-remote-connect-dialog.h"
 #include "baobab-chart.h"
+#include "baobab-export.h"
 
 void
 on_quit_activate (GtkMenuItem *menuitem, gpointer user_data)
@@ -62,6 +63,18 @@ on_menuscandir_activate (GtkMenuItem *menuitem, gpointer user_data)
 }
 
 void
+on_menu_import_activate (GtkMenuItem *menuitem, gpointer user_data)
+{
+	import_export_file_select(baobab.window, FALSE);
+}
+
+void
+on_menu_export_activate (GtkMenuItem *menuitem, gpointer user_data)
+{
+	import_export_file_select(baobab.window, TRUE);
+}
+
+void
 on_about_activate (GtkMenuItem *menuitem, gpointer user_data)
 {
 	const gchar * const authors[] = {
diff --git a/baobab/src/callbacks.h b/baobab/src/callbacks.h
index 0f51796..b70433b 100644
--- a/baobab/src/callbacks.h
+++ b/baobab/src/callbacks.h
@@ -31,6 +31,8 @@ void on_about_activate (GtkMenuItem *menuitem, gpointer user_data);
 void on_menuscanhome_activate (GtkMenuItem *menuitem, gpointer user_data);
 void on_menuallfs_activate (GtkMenuItem *menuitem, gpointer user_data);
 void on_menuscandir_activate (GtkMenuItem *menuitem, gpointer user_data);
+void on_menu_import_activate (GtkMenuItem *menuitem, gpointer user_data);
+void on_menu_export_activate (GtkMenuItem *menuitem, gpointer user_data);
 void on_menu_stop_activate (GtkMenuItem *menuitem, gpointer user_data);
 void on_menu_rescan_activate (GtkMenuItem *menuitem, gpointer user_data);
 void on_tbscandir_clicked (GtkToolButton *toolbutton, gpointer user_data);
diff --git a/configure.ac b/configure.ac
index d75bbe2..856d933 100644
--- a/configure.ac
+++ b/configure.ac
@@ -151,6 +151,10 @@ PKG_CHECK_MODULES([LIBCANBERRA_GTK], [libcanberra-gtk3 >= $LIBCANBERRA_GTK_REQUI
 AC_SUBST(LIBCANBERRA_GTK_CFLAGS)
 AC_SUBST(LIBCANBERRA_GTK_LIBS)
 
+PKG_CHECK_MODULES(LIBXML, libxml-2.0)
+AC_SUBST(LIBXML_CFLAGS)
+AC_SUBST(LIBXML_LIBS)
+
 dnl ***************************************************************
 dnl Other miscellaneous checks 
 dnl ***************************************************************
