diff --git a/backends/apt/aptBackend.py b/backends/apt/aptBackend.py
index c942590..a192089 100755
--- a/backends/apt/aptBackend.py
+++ b/backends/apt/aptBackend.py
@@ -606,7 +606,11 @@ class PackageKitAptBackend(PackageKitBaseBackend):
             time.sleep(1)
         #FIXME: Add support for description
         if meta_release.new_dist != None:
+<<<<<<< HEAD:backends/apt/aptBackend.py
+            self.distro_upgrade("stable",
+=======
             self.distro_upgrade("stable", 
+>>>>>>> master:backends/apt/aptBackend.py
                                 "%s %s" % (meta_release.new_dist.name,
                                            meta_release.new_dist.version),
                                 "The latest stable release")
diff --git a/backends/dummy/pk-backend-dummy.c b/backends/dummy/pk-backend-dummy.c
index 8ce7775..70c61f1 100644
--- a/backends/dummy/pk-backend-dummy.c
+++ b/backends/dummy/pk-backend-dummy.c
@@ -46,6 +46,7 @@ static gboolean _use_eula = FALSE;
 static gboolean _use_media = FALSE;
 static gboolean _use_gpg = FALSE;
 static gboolean _use_distro_upgrade = FALSE;
+static PkBitfield _filters = 0;
 
 /**
  * backend_initialize:
@@ -612,13 +613,17 @@ backend_resolve (PkBackend *backend, PkBitfield filters, gchar **packages)
 	/* each one has a different detail for testing */
 	len = g_strv_length (packages);
 	for (i=0; i<len; i++) {
-		if (g_strcmp0 (packages[i], "vips-doc") == 0)
-			pk_backend_package (backend, PK_INFO_ENUM_AVAILABLE,
-					    "vips-doc;7.12.4-2.fc8;noarch;linva", "The vips documentation package.");
-		else if (g_strcmp0 (packages[i], "glib2") == 0)
-			pk_backend_package (backend, PK_INFO_ENUM_INSTALLED,
-					    "glib2;2.14.0;i386;fedora", "The GLib library");
-		else if (g_strcmp0 (packages[i], "powertop") == 0)
+		if (g_strcmp0 (packages[i], "vips-doc") == 0) {
+			if (!pk_bitfield_contain (filters, PK_FILTER_ENUM_INSTALLED)) {
+				pk_backend_package (backend, PK_INFO_ENUM_AVAILABLE,
+						    "vips-doc;7.12.4-2.fc8;noarch;linva", "The vips documentation package.");
+			}
+		} else if (g_strcmp0 (packages[i], "glib2") == 0) {
+			if (!pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_INSTALLED)) {
+				pk_backend_package (backend, PK_INFO_ENUM_INSTALLED,
+						    "glib2;2.14.0;i386;fedora", "The GLib library");
+			}
+		} else if (g_strcmp0 (packages[i], "powertop") == 0)
 			pk_backend_package (backend, PK_INFO_ENUM_UPDATING,
 					    "powertop;1.8-1.fc8;i386;fedora", "Power consumption monitor");
 		else if (g_strcmp0 (packages[i], "kernel") == 0)
@@ -1086,12 +1091,19 @@ backend_what_provides_timeout (gpointer data)
 					    "gstreamer-plugins-flumpegdemux;0.10.15-5.lvn;i386;available",
 					    "MPEG demuxer for GStreamer");
 		} else {
-			pk_backend_package (backend, PK_INFO_ENUM_INSTALLED,
-					    "evince;0.9.3-5.fc8;i386;installed",
-					    "PDF Document viewer");
-			pk_backend_package (backend, PK_INFO_ENUM_AVAILABLE,
-					    "scribus;1.3.4-1.fc8;i386;fedora",
-					    "Scribus is an desktop open source page layout program");
+			// pkcon install vips-doc says it's installed cause evince is INSTALLED
+			if (g_strcmp0 (_search, "vips-doc") != 0) {
+				if (!pk_bitfield_contain (_filters, PK_FILTER_ENUM_NOT_INSTALLED)) {
+					pk_backend_package (backend, PK_INFO_ENUM_INSTALLED,
+							    "evince;0.9.3-5.fc8;i386;installed",
+							    "PDF Document viewer");
+				}
+				if (!pk_bitfield_contain (_filters, PK_FILTER_ENUM_INSTALLED)) {
+					pk_backend_package (backend, PK_INFO_ENUM_AVAILABLE,
+							    "scribus;1.3.4-1.fc8;i386;fedora",
+							    "Scribus is an desktop open source page layout program");
+				}
+			}
 		}
 		pk_backend_finished (backend);
 		return FALSE;
@@ -1110,6 +1122,7 @@ backend_what_provides (PkBackend *backend, PkBitfield filters, PkProvidesEnum pr
 	_progress_percentage = 0;
 	_search = search;
 	_signal_timeout = g_timeout_add (200, backend_what_provides_timeout, backend);
+	_filters = filters;
 	pk_backend_set_status (backend, PK_STATUS_ENUM_REQUEST);
 	pk_backend_set_allow_cancel (backend, TRUE);
 	pk_backend_set_percentage (backend, _progress_percentage);
@@ -1177,7 +1190,11 @@ backend_simulate_install_packages (PkBackend *backend, gchar **package_ids)
 	pk_backend_package (backend, PK_INFO_ENUM_UPDATING,
 			    "lib7;7.0.1-6.fc13;i386;fedora", "C Libraries");
 
+<<<<<<< HEAD:backends/dummy/pk-backend-dummy.c
+	pk_backend_package (backend, PK_INFO_ENUM_REINSTALLING,
+=======
 	pk_backend_package (backend, PK_INFO_ENUM_INSTALLING,
+>>>>>>> master:backends/dummy/pk-backend-dummy.c
 			    "libssl;3.5.7-2.fc13;i386;fedora", "SSL Libraries");
 
 	pk_backend_package (backend, PK_INFO_ENUM_AVAILABLE,
diff --git a/backends/yum/yumMediaManagerDeviceKit.py b/backends/yum/yumMediaManagerDeviceKit.py
index a32766b..1fd0042 100644
--- a/backends/yum/yumMediaManagerDeviceKit.py
+++ b/backends/yum/yumMediaManagerDeviceKit.py
@@ -5,7 +5,11 @@
 # the Free Software Foundation; either version 2 of the License, or
 # (at your option) any later version.
 #
+<<<<<<< HEAD:backends/yum/yumMediaManagerDeviceKit.py
+# This program is distributed in the hope that it will be useful,
+=======
 # This program is distributed in the hope that it will be useful, 
+>>>>>>> master:backends/yum/yumMediaManagerDeviceKit.py
 # 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.
@@ -71,7 +75,11 @@ class MediaDeviceDeviceKit(MediaDevice):
     """
     def __init__(self, media_id):
         """
+<<<<<<< HEAD:backends/yum/yumMediaManagerDeviceKit.py
+        media_id argument is the implementation-specific id in our case it's udi in hal,
+=======
         media_id argument is the implementation-specific id in our case it's udi in hal, 
+>>>>>>> master:backends/yum/yumMediaManagerDeviceKit.py
         it's provided by MediaManager.
         """
         self._unmount_needed = False
@@ -87,7 +95,11 @@ class MediaDeviceDeviceKit(MediaDevice):
 
     def is_mounted(self):
         return bool(self.get_device_property('device-is-mounted'))
+<<<<<<< HEAD:backends/yum/yumMediaManagerDeviceKit.py
+
+=======
  
+>>>>>>> master:backends/yum/yumMediaManagerDeviceKit.py
     def is_locked(self):
         return False
 
diff --git a/client/pk-console.c b/client/pk-console.c
index 2bd7cea..f4bd0c3 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -1482,6 +1482,243 @@ pk_console_get_update_detail (PkClient *client, const gchar *package, GError **e
 }
 
 /**
+ * pk_console_simulate_install_stuff:
+ **/
+static gboolean
+pk_console_simulate_install_stuff (PkClient *client, gchar **packages, GError **error)
+{
+	gboolean ret = TRUE;
+	gboolean installed;
+	gboolean is_local;
+	gchar *package_id = NULL;
+	gchar **package_ids = NULL;
+	gchar **files = NULL;
+	guint i;
+	guint length;
+	GPtrArray *array_packages;
+	GPtrArray *array_files;
+	GError *error_local = NULL;
+
+	array_packages = g_ptr_array_new ();
+	array_files = g_ptr_array_new ();
+	length = g_strv_length (packages);
+	for (i=2; i<length; i++) {
+		/* are we a local file */
+		is_local = g_file_test (packages[i], G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR);
+		if (is_local) {
+			g_ptr_array_add (array_files, g_strdup (packages[i]));
+		} else {
+			/* if already installed, then abort */
+			installed = pk_console_is_installed (packages[i]);
+			if (installed) {
+				/* TRANSLATORS: The package is already installed on the system */
+				*error = g_error_new (1, 0, _("The package %s is already installed"), packages[i]);
+				ret = FALSE;
+				break;
+			}
+			/* try and find a package */
+			package_id = pk_console_perhaps_resolve (client, pk_bitfield_value (PK_FILTER_ENUM_NOT_INSTALLED), packages[i], &error_local);
+			if (package_id == NULL) {
+				/* TRANSLATORS: The package name was not found in any software sources. The detailed error follows */
+				*error = g_error_new (1, 0, _("The package %s could not be installed: %s"), packages[i], error_local->message);
+				g_error_free (error_local);
+				ret = FALSE;
+				break;
+			}
+			g_ptr_array_add (array_packages, package_id);
+		}
+	}
+
+	/* one of the resolves failed */
+	if (!ret) {
+		egg_warning ("resolve failed");
+		goto out;
+	}
+
+
+	/* any to process? */
+	if (array_packages->len > 0) {
+		/* convert to strv */
+		package_ids = pk_ptr_array_to_strv (array_packages);
+		/* reset */
+		ret = pk_client_reset (client, &error_local);
+		if (!ret) {
+			/* TRANSLATORS: There was a programming error that shouldn't happen. The detailed error follows */
+			*error = g_error_new (1, 0, _("Internal error: %s"), error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+		ret = pk_client_simulate_install_packages (client, package_ids, &error_local);
+		if (!ret) {
+			/* TRANSLATORS: There was an error installing the packages. The detailed error follows */
+			*error = g_error_new (1, 0, _("This tool could not install the packages: %s"), error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	/* any to process? */
+	if (array_files->len > 0) {
+		/* convert to strv */
+		files = pk_ptr_array_to_strv (array_files);
+
+		/* reset */
+		ret = pk_client_reset (client, &error_local);
+		if (!ret) {
+			/* TRANSLATORS: There was a programming error that shouldn't happen. The detailed error follows */
+			*error = g_error_new (1, 0, _("Internal error: %s"), error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+
+		ret = pk_client_simulate_install_files (client, files, &error_local);
+		if (!ret) {
+			/* TRANSLATORS: There was an error installing the files. The detailed error follows */
+			*error = g_error_new (1, 0, _("This tool could not install the files: %s"), error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+out:
+	g_strfreev (package_ids);
+	g_strfreev (files);
+	g_ptr_array_foreach (array_files, (GFunc) g_free, NULL);
+	g_ptr_array_free (array_files, TRUE);
+	g_ptr_array_foreach (array_packages, (GFunc) g_free, NULL);
+	g_ptr_array_free (array_packages, TRUE);
+	return ret;
+}
+
+/**
+ * pk_console_simulate_remove_packages:
+ **/
+static gboolean
+pk_console_simulate_remove_packages (PkClient *client, gchar **packages, GError **error)
+{
+	gboolean ret = TRUE;
+	gchar *package_id = NULL;
+	gchar **package_ids = NULL;
+	guint i;
+	guint length;
+	GPtrArray *array_packages;
+	GError *error_local = NULL;
+
+	array_packages = g_ptr_array_new ();
+	length = g_strv_length (packages);
+	for (i=2; i<length; i++) {
+		/* try and find a package */
+		package_id = pk_console_perhaps_resolve (client, pk_bitfield_value (PK_FILTER_ENUM_INSTALLED), packages[i], &error_local);
+		if (package_id == NULL) {
+			/* TRANSLATORS: The package name was not found in the installed list. The detailed error follows */
+			*error = g_error_new (1, 0, _("This tool could not find %s: %s"), packages[i], error_local->message);
+			g_error_free (error_local);
+			ret = FALSE;
+			break;
+		}
+		g_ptr_array_add (array_packages, package_id);
+		egg_debug ("resolved to %s", package_id);
+	}
+
+	/* one of the resolves failed */
+	if (!ret) {
+		egg_warning ("resolve failed");
+		goto out;
+	}
+
+	/* any to process? */
+	if (array_packages->len > 0) {
+		/* convert to strv */
+		package_ids = pk_ptr_array_to_strv (array_packages);
+		/* reset */
+		ret = pk_client_reset (client, &error_local);
+		if (!ret) {
+			/* TRANSLATORS: There was a programming error that shouldn't happen. The detailed error follows */
+			*error = g_error_new (1, 0, _("Internal error: %s"), error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+		ret = pk_client_simulate_remove_packages (client, package_ids, &error_local);
+		if (!ret) {
+			/* TRANSLATORS: There was an error simulating a package removal. The detailed error follows */
+			*error = g_error_new (1, 0, _("This tool could not simulate a package removal: %s"), error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+out:
+	g_strfreev (package_ids);
+	g_ptr_array_foreach (array_packages, (GFunc) g_free, NULL);
+	g_ptr_array_free (array_packages, TRUE);
+	return ret;
+}
+
+/**
+ * pk_console_simulate_update_packages:
+ **/
+static gboolean
+pk_console_simulate_update_packages (PkClient *client, gchar **packages, GError **error)
+{
+	gboolean ret = TRUE;
+	gchar *package_id = NULL;
+	gchar **package_ids = NULL;
+	guint i;
+	guint length;
+	GPtrArray *array_packages;
+	GError *error_local = NULL;
+
+	array_packages = g_ptr_array_new ();
+	length = g_strv_length (packages);
+	for (i=2; i<length; i++) {
+		/* try and find a package */
+		package_id = pk_console_perhaps_resolve (client, pk_bitfield_value (PK_FILTER_ENUM_INSTALLED), packages[i], &error_local);
+		if (package_id == NULL) {
+			/* TRANSLATORS: The package name was not found in the installed list. The detailed error follows */
+			*error = g_error_new (1, 0, _("This tool could not find %s: %s"), packages[i], error_local->message);
+			g_error_free (error_local);
+			ret = FALSE;
+			break;
+		}
+		g_ptr_array_add (array_packages, package_id);
+		egg_debug ("resolved to %s", package_id);
+	}
+
+	/* one of the resolves failed */
+	if (!ret) {
+		egg_warning ("resolve failed");
+		goto out;
+	}
+
+	/* any to process? */
+	if (array_packages->len > 0) {
+		/* convert to strv */
+		package_ids = pk_ptr_array_to_strv (array_packages);
+		/* reset */
+		ret = pk_client_reset (client, &error_local);
+		if (!ret) {
+			/* TRANSLATORS: There was a programming error that shouldn't happen. The detailed error follows */
+			*error = g_error_new (1, 0, _("Internal error: %s"), error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+		ret = pk_client_simulate_update_packages (client, package_ids, &error_local);
+		if (!ret) {
+			/* TRANSLATORS: There was an error simulating a package update. The detailed error follows */
+			*error = g_error_new (1, 0, _("This tool could not simulate a package update: %s"), error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+out:
+	g_strfreev (package_ids);
+	g_ptr_array_foreach (array_packages, (GFunc) g_free, NULL);
+	g_ptr_array_free (array_packages, TRUE);
+	return ret;
+}
+
+/**
  * pk_console_error_code_cb:
  **/
 static void
@@ -1797,6 +2034,13 @@ pk_console_get_summary (void)
 		g_string_append_printf (string, "  %s\n", "accept-eula [eula-id]");
 	if (pk_bitfield_contain (roles, PK_ROLE_ENUM_GET_CATEGORIES))
 		g_string_append_printf (string, "  %s\n", "get-categories");
+	if (pk_bitfield_contain (roles, PK_ROLE_ENUM_SIMULATE_INSTALL_PACKAGES) ||
+	    pk_bitfield_contain (roles, PK_ROLE_ENUM_SIMULATE_INSTALL_FILES))
+		g_string_append_printf (string, "  %s\n", "simulate-install [packages|files]");
+	if (pk_bitfield_contain (roles, PK_ROLE_ENUM_SIMULATE_REMOVE_PACKAGES))
+		g_string_append_printf (string, "  %s\n", "simulate-remove [package]");
+	if (pk_bitfield_contain (roles, PK_ROLE_ENUM_SIMULATE_UPDATE_PACKAGES))
+		g_string_append_printf (string, "  %s\n", "simulate-update [package]");
 	return g_string_free (string, FALSE);
 }
 
@@ -2283,6 +2527,33 @@ main (int argc, char *argv[])
 		pk_console_start_bar ("refresh-cache");
 		ret = pk_client_refresh_cache (client_primary, FALSE, &error);
 
+	} else if (strcmp (mode, "simulate-install") == 0) {
+		if (value == NULL) {
+			/* TRANSLATORS: The user did not provide a package name */
+			error = g_error_new (1, 0, "%s", _("A package name or filename to simulate an installation is required"));
+			retval = PK_EXIT_CODE_SYNTAX_INVALID;
+			goto out;
+		}
+		ret = pk_console_simulate_install_stuff (client_primary, argv, &error);
+
+	} else if (strcmp (mode, "simulate-remove") == 0) {
+		if (value == NULL) {
+			/* TRANSLATORS: the user did not specify what they wanted to remove */
+			error = g_error_new (1, 0, "%s", _("A package name to simulate a removal is required"));
+			retval = PK_EXIT_CODE_SYNTAX_INVALID;
+			goto out;
+		}
+		ret = pk_console_simulate_remove_packages (client_primary, argv, &error);
+
+	} else if (strcmp (mode, "simulate-update") == 0) {
+		if (value == NULL) {
+			/* TRANSLATORS: the user did not specify what they wanted to remove */
+			error = g_error_new (1, 0, "%s", _("A package name to simulate an update is required"));
+			retval = PK_EXIT_CODE_SYNTAX_INVALID;
+			goto out;
+		}
+		ret = pk_console_simulate_update_packages (client_primary, argv, &error);
+
 	} else {
 		/* TRANSLATORS: The user tried to use an unsupported option on the command line */
 		error = g_error_new (1, 0, _("Option '%s' is not supported"), mode);
diff --git a/contrib/browser-plugin/pk-plugin-install.c b/contrib/browser-plugin/pk-plugin-install.c
index cc12f81..18fab56 100644
--- a/contrib/browser-plugin/pk-plugin-install.c
+++ b/contrib/browser-plugin/pk-plugin-install.c
@@ -1088,6 +1088,62 @@ pk_plugin_install_motion (PkPlugin *plugin,
 	return FALSE;
 }
 
+<<<<<<< HEAD:contrib/browser-plugin/pk-plugin-install.c
+/**
+ * pk_plugin_set_cursor:
+ **/
+static void
+pk_plugin_set_cursor (GdkWindow     *window,
+		      GdkCursorType  cursor)
+{
+	Display *display;
+	Cursor xcursor;
+
+	display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default());
+	if (cursor >= 0)
+		xcursor = XCreateFontCursor (display, cursor);
+	else
+		xcursor = None;
+	XDefineCursor (display, GDK_WINDOW_XID (window), xcursor);
+
+}
+
+/**
+ * pk_plugin_install_motion:
+ **/
+static gboolean
+pk_plugin_install_motion (PkPlugin *plugin,
+			  gint      x,
+			  gint      y)
+{
+	PkPluginInstall *self = PK_PLUGIN_INSTALL (plugin);
+	GdkWindow *window;
+	gint idx;
+
+	idx = pk_plugin_install_get_link_index (self, x, y);
+	g_object_get (plugin, "gdk-window", &window, NULL);
+
+	if (idx < 0) {
+		pk_plugin_set_cursor (window, -1);
+		return FALSE;
+	}
+	switch (self->priv->status) {
+	case IN_PROGRESS:
+	case INSTALLING:
+	case UNAVAILABLE:
+		pk_plugin_set_cursor (window, -1);
+		break;
+	case INSTALLED:
+	case UPGRADABLE:
+	case AVAILABLE:
+		pk_plugin_set_cursor (window, GDK_HAND2);
+		break;
+	}
+	return FALSE;
+}
+
+=======
+>>>>>>> master:contrib/browser-plugin/pk-plugin-install.c
 /**
  * pk_plugin_install_finalize:
  **/
diff --git a/lib/packagekit-glib/pk-enum.c b/lib/packagekit-glib/pk-enum.c
index 41eef4f..eb58450 100644
--- a/lib/packagekit-glib/pk-enum.c
+++ b/lib/packagekit-glib/pk-enum.c
@@ -322,6 +322,7 @@ static const PkEnumMatch enum_info[] = {
 	{PK_INFO_ENUM_COLLECTION_INSTALLED,	"collection-installed"},
 	{PK_INFO_ENUM_COLLECTION_AVAILABLE,	"collection-available"},
 	{PK_INFO_ENUM_FINISHED,			"finished"},
+	{PK_INFO_ENUM_REINSTALLING,		"reinstalling"},
 	{0, NULL}
 };
 
diff --git a/lib/packagekit-glib/pk-enum.h b/lib/packagekit-glib/pk-enum.h
index 2542ce8..ab10470 100644
--- a/lib/packagekit-glib/pk-enum.h
+++ b/lib/packagekit-glib/pk-enum.h
@@ -394,6 +394,7 @@ typedef enum {
 	PK_INFO_ENUM_COLLECTION_INSTALLED,
 	PK_INFO_ENUM_COLLECTION_AVAILABLE,
 	PK_INFO_ENUM_FINISHED,
+	PK_INFO_ENUM_REINSTALLING,
 	PK_INFO_ENUM_UNKNOWN
 } PkInfoEnum;
 
diff --git a/lib/packagekit-qt/src/client.cpp b/lib/packagekit-qt/src/client.cpp
index aba8cc9..141afde 100644
--- a/lib/packagekit-qt/src/client.cpp
+++ b/lib/packagekit-qt/src/client.cpp
@@ -410,6 +410,46 @@ Package* Client::searchFromDesktopFile(const QString& path)
 
 }
 
+Transaction* Client::simulateInstallFiles(const QStringList& files)
+{
+	RUN_TRANSACTION(SimulateInstallFiles(files))
+}
+
+Transaction* Client::simulateInstallFile(const QString& file)
+{
+	return simulateInstallFiles(QStringList() << file);
+}
+
+Transaction* Client::simulateInstallPackages(const QList<Package*>& packages)
+{
+	RUN_TRANSACTION(SimulateInstallFiles(Util::packageListToPids(packages)))
+}
+
+Transaction* Client::simulateInstallPackage(Package* package)
+{
+	return simulateInstallPackages(QList<Package*>() << package);
+}
+
+Transaction* Client::simulateRemovePackages(const QList<Package*>& packages)
+{
+	RUN_TRANSACTION(SimulateRemovePackages(Util::packageListToPids(packages)))
+}
+
+Transaction* Client::simulateRemovePackage(Package* package)
+{
+	return simulateRemovePackages(QList<Package*>() << package);
+}
+
+Transaction* Client::simulateUpdatePackages(const QList<Package*>& packages)
+{
+	RUN_TRANSACTION(SimulateUpdatePackages(Util::packageListToPids(packages)))
+}
+
+Transaction* Client::simulateUpdatePackage(Package* package)
+{
+	return simulateUpdatePackages(QList<Package*>() << package);
+}
+
 Transaction* Client::updatePackages(bool only_trusted, const QList<Package*>& packages)
 {
 	RUN_TRANSACTION(UpdatePackages(only_trusted, Util::packageListToPids(packages)))
diff --git a/lib/packagekit-qt/src/client.h b/lib/packagekit-qt/src/client.h
index d46bb65..6243ad7 100644
--- a/lib/packagekit-qt/src/client.h
+++ b/lib/packagekit-qt/src/client.h
@@ -83,37 +83,41 @@ public:
 	 * \sa getActions
 	 */
 	typedef enum {
-		ActionCancel		 = 0x00000001,
-		ActionGetDepends	 = 0x00000002,
-		ActionGetDetails	 = 0x00000004,
-		ActionGetFiles		 = 0x00000008,
-		ActionGetPackages	 = 0x00000010,
-		ActionGetRepoList	 = 0x00000020,
-		ActionGetRequires	 = 0x00000040,
-		ActionGetUpdateDetail	 = 0x00000080,
-		ActionGetUpdates	 = 0x00000100,
-		ActionInstallFiles	 = 0x00000200,
-		ActionInstallPackages	 = 0x00000400,
-		ActionInstallSignature	 = 0x00000800,
-		ActionRefreshCache	 = 0x00001000,
-		ActionRemovePackages	 = 0x00002000,
-		ActionRepoEnable	 = 0x00004000,
-		ActionRepoSetData	 = 0x00008000,
-		ActionResolve		 = 0x00010000,
-		ActionRollback		 = 0x00020000,
-		ActionSearchDetails	 = 0x00040000,
-		ActionSearchFile	 = 0x00080000,
-		ActionSearchGroup	 = 0x00100000,
-		ActionSearchName	 = 0x00200000,
-		ActionUpdatePackages	 = 0x00400000,
-		ActionUpdateSystem	 = 0x00800000,
-		ActionWhatProvides	 = 0x01000000,
-		ActionAcceptEula	 = 0x02000000,
-		ActionDownloadPackages	 = 0x04000000,
-		ActionGetDistroUpgrades	 = 0x08000000,
-		ActionGetCategories	 = 0x10000000,
-		ActionGetOldTransactions = 0x20000000,
-		UnknownAction		 = 0x40000000
+		ActionCancel			 = 0x000000001,
+		ActionGetDepends		 = 0x000000002,
+		ActionGetDetails		 = 0x000000004,
+		ActionGetFiles			 = 0x000000008,
+		ActionGetPackages		 = 0x000000010,
+		ActionGetRepoList		 = 0x000000020,
+		ActionGetRequires		 = 0x000000040,
+		ActionGetUpdateDetail		 = 0x000000080,
+		ActionGetUpdates		 = 0x000000100,
+		ActionInstallFiles		 = 0x000000200,
+		ActionInstallPackages		 = 0x000000400,
+		ActionInstallSignature		 = 0x000000800,
+		ActionRefreshCache		 = 0x000001000,
+		ActionRemovePackages		 = 0x000002000,
+		ActionRepoEnable		 = 0x000004000,
+		ActionRepoSetData		 = 0x000008000,
+		ActionResolve			 = 0x000010000,
+		ActionRollback			 = 0x000020000,
+		ActionSearchDetails		 = 0x000040000,
+		ActionSearchFile		 = 0x000080000,
+		ActionSearchGroup		 = 0x000100000,
+		ActionSearchName		 = 0x000200000,
+		ActionUpdatePackages		 = 0x000400000,
+		ActionUpdateSystem		 = 0x000800000,
+		ActionWhatProvides		 = 0x001000000,
+		ActionAcceptEula		 = 0x002000000,
+		ActionDownloadPackages		 = 0x004000000,
+		ActionGetDistroUpgrades		 = 0x008000000,
+		ActionGetCategories		 = 0x010000000,
+		ActionGetOldTransactions	 = 0x020000000,
+		ActionSimulateInstallFiles	 = 0x040000000,
+		ActionSimulateInstallPackages	 = 0x080000000,
+		ActionSimulateRemovePackages	 = 0x100000000,
+		ActionSimulateUpdatePackages	 = 0x200000000,
+		UnknownAction			 = 0x400000000
 	} Action;
 	Q_DECLARE_FLAGS(Actions, Action);
 
@@ -708,6 +712,46 @@ public:
 	Package* searchFromDesktopFile(const QString& path);
 
 	/**
+	 * \brief Simulates an installation of \p files.
+	 *
+	 * You should call this method before installing \p files
+	 * \note: This method might emit packages with INSTALLING, REMOVING, UPDATING,
+	 *        REINSTALLING or OBSOLETING status.
+	 */
+	Transaction* simulateInstallFiles(const QStringList& files);
+	Transaction* simulateInstallFile(const QString& file);
+
+	/**
+	 * \brief Simulates an installation of \p packages.
+	 *
+	 * You should call this method before installing \p packages
+	 * \note: This method might emit packages with INSTALLING, REMOVING, UPDATING,
+	 *        REINSTALLING or OBSOLETING status.
+	 */
+	Transaction* simulateInstallPackages(const QList<Package*>& packages);
+	Transaction* simulateInstallPackage(Package* package);
+
+	/**
+	 * \brief Simulates a removal of \p packages.
+	 *
+	 * You should call this method before removing \p packages
+	 * \note: This method might emit packages with INSTALLING, REMOVING, UPDATING,
+	 *        REINSTALLING or OBSOLETING status.
+	 */
+	Transaction* simulateRemovePackages(const QList<Package*>& packages);
+	Transaction* simulateRemovePackage(Package* package);
+
+	/**
+	 * \brief Simulates an update of \p packages.
+	 *
+	 * You should call this method before updating \p packages
+	 * \note: This method might emit packages with INSTALLING, REMOVING, UPDATING,
+	 *        REINSTALLING or OBSOLETING status.
+	 */
+	Transaction* simulateUpdatePackages(const QList<Package*>& packages);
+	Transaction* simulateUpdatePackage(Package* package);
+
+	/**
 	 * Update the given \p packages
 	 */
 	Transaction* updatePackages(bool only_trusted, const QList<Package*>& packages);
diff --git a/lib/packagekit-qt/src/package.h b/lib/packagekit-qt/src/package.h
index 6385c8e..d859f69 100644
--- a/lib/packagekit-qt/src/package.h
+++ b/lib/packagekit-qt/src/package.h
@@ -102,6 +102,7 @@ public:
 		StateCollectionInstalled,
 		StateCollectionAvailable,
 		StateFinished,
+		StateReinstalling,
 		UnknownState
 	} State;
 	/**
diff --git a/lib/packagekit-qt/src/transactionproxy.h b/lib/packagekit-qt/src/transactionproxy.h
index 68e9a33..015091a 100644
--- a/lib/packagekit-qt/src/transactionproxy.h
+++ b/lib/packagekit-qt/src/transactionproxy.h
@@ -277,6 +277,34 @@ public Q_SLOTS: // METHODS
         return callWithArgumentList(QDBus::Block, QLatin1String("SetLocale"), argumentList);
     }
 
+    inline QDBusReply<void> SimulateInstallFiles(const QStringList &full_paths)
+    {
+        QList<QVariant> argumentList;
+        argumentList << qVariantFromValue(full_paths);
+        return callWithArgumentList(QDBus::Block, QLatin1String("SimulateInstallFiles"), argumentList);
+    }
+
+    inline QDBusReply<void> SimulateInstallPackages(const QStringList &package_ids)
+    {
+        QList<QVariant> argumentList;
+        argumentList << qVariantFromValue(package_ids);
+        return callWithArgumentList(QDBus::Block, QLatin1String("SimulateInstallPackages"), argumentList);
+    }
+
+    inline QDBusReply<void> SimulateRemovePackages(const QStringList &package_ids)
+    {
+        QList<QVariant> argumentList;
+        argumentList << qVariantFromValue(package_ids);
+        return callWithArgumentList(QDBus::Block, QLatin1String("SimulateRemovePackages"), argumentList);
+    }
+
+    inline QDBusReply<void> SimulateUpdatePackages(const QStringList &package_ids)
+    {
+        QList<QVariant> argumentList;
+        argumentList << qVariantFromValue(package_ids);
+        return callWithArgumentList(QDBus::Block, QLatin1String("SimulateUpdatePackages"), argumentList);
+    }
+
     inline QDBusReply<void> UpdatePackages(bool only_trusted, const QStringList &package_ids)
     {
         QList<QVariant> argumentList;
@@ -287,7 +315,7 @@ public Q_SLOTS: // METHODS
     inline QDBusReply<void> UpdateSystem(bool only_trusted)
     {
         QList<QVariant> argumentList;
-		argumentList << qVariantFromValue (only_trusted);
+        argumentList << qVariantFromValue (only_trusted);
         return callWithArgumentList(QDBus::Block, QLatin1String("UpdateSystem"), argumentList);
     }
 
diff --git a/po/es.po b/po/es.po
index 43be14d..f3d20f8 100644
--- a/po/es.po
+++ b/po/es.po
@@ -1558,6 +1558,14 @@ msgid "Malicious software can damage your computer or cause other harm."
 msgstr ""
 "Un software considerado maligno puede provocar diferentes clases de daño, "
 "por ejemplo, podría dañar su computadora. "
+<<<<<<< HEAD:po/es.po
+
+#. TRANSLATORS: warn the user that all bets are off
+#: ../src/pk-polkit-action-lookup.c:199
+msgid "Malicious software can damage your computer or cause other harm."
+msgstr "Un software considerado maligno puede provocar diferentes clases de daño, por ejemplo, podría dañar su computadora. "
+=======
+>>>>>>> master:po/es.po
 
 #. TRANSLATORS: too many packages to list each one
 #: ../src/pk-polkit-action-lookup.c:274
diff --git a/po/pt_BR.po b/po/pt_BR.po
index b60b236..5a90229 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -1559,6 +1559,14 @@ msgid "Malicious software can damage your computer or cause other harm."
 msgstr ""
 "Programas maliciosos podem danificar o seu computador ou causar outros "
 "prejuízos."
+<<<<<<< HEAD:po/pt_BR.po
+
+#. TRANSLATORS: warn the user that all bets are off
+#: ../src/pk-polkit-action-lookup.c:199
+msgid "Malicious software can damage your computer or cause other harm."
+msgstr "Programas maliciosos podem danificar o seu computador ou causar outros prejuízos."
+=======
+>>>>>>> master:po/pt_BR.po
 
 #. TRANSLATORS: too many packages to list each one
 #: ../src/pk-polkit-action-lookup.c:274
diff --git a/src/pk-backend.c b/src/pk-backend.c
index 0e6955d..81da3c7 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -816,12 +816,16 @@ pk_backend_package_emulate_finished (PkBackend *backend)
 
 	/* only makes sense for some values */
 	info = backend->priv->last_package->info;
-	if (info == PK_INFO_ENUM_DOWNLOADING ||
-	    info == PK_INFO_ENUM_UPDATING ||
-	    info == PK_INFO_ENUM_INSTALLING ||
-	    info == PK_INFO_ENUM_REMOVING ||
-	    info == PK_INFO_ENUM_CLEANUP ||
-	    info == PK_INFO_ENUM_OBSOLETING) {
+	if ((info == PK_INFO_ENUM_DOWNLOADING ||
+	     info == PK_INFO_ENUM_UPDATING ||
+	     info == PK_INFO_ENUM_INSTALLING ||
+	     info == PK_INFO_ENUM_REMOVING ||
+	     info == PK_INFO_ENUM_CLEANUP ||
+	     info == PK_INFO_ENUM_OBSOLETING) &&
+	    (backend->priv->role != PK_ROLE_ENUM_SIMULATE_INSTALL_FILES &&
+	     backend->priv->role != PK_ROLE_ENUM_SIMULATE_INSTALL_PACKAGES &&
+	     backend->priv->role != PK_ROLE_ENUM_SIMULATE_REMOVE_PACKAGES &&
+	     backend->priv->role != PK_ROLE_ENUM_SIMULATE_UPDATE_PACKAGES)) {
 		package_id = pk_package_id_to_string (backend->priv->last_package->id);
 		pk_backend_package (backend, PK_INFO_ENUM_FINISHED, package_id, backend->priv->last_package->summary);
 		g_free (package_id);
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 6a80e63..f8ff127 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -3131,7 +3131,7 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean only_trusted,
 	GError *error;
 	GError *error_local = NULL;
 	PkServicePack *service_pack;
-	gchar *content_type = NULL;
+	gchar *content_type;
 	guint length;
 	guint i;
 
@@ -3148,7 +3148,7 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean only_trusted,
 				     "InstallFiles not yet supported by backend");
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
-		goto out;
+		return;
 	}
 
 	/* check if the sender is the same */
@@ -3156,7 +3156,7 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean only_trusted,
 	if (!ret) {
 		/* don't release tid */
 		pk_transaction_dbus_return_error (context, error);
-		goto out;
+		return;
 	}
 
 	/* check all files exists and are valid */
@@ -3170,7 +3170,7 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean only_trusted,
 					     "No such file %s", full_paths[i]);
 			pk_transaction_release_tid (transaction);
 			pk_transaction_dbus_return_error (context, error);
-			goto out;
+			return;
 		}
 
 		/* get content type */
@@ -3180,17 +3180,18 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean only_trusted,
 					     "Failed to get content type for file %s", full_paths[i]);
 			pk_transaction_release_tid (transaction);
 			pk_transaction_dbus_return_error (context, error);
-			goto out;
+			return;
 		}
 
 		/* supported content type? */
 		ret = pk_transaction_is_supported_content_type (transaction, content_type);
+		g_free (content_type);
 		if (!ret) {
 			error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_MIME_TYPE_NOT_SUPPORTED,
-					     "MIME type '%s' not supported %s", content_type, full_paths[i]);
+					     "MIME type not supported %s", full_paths[i]);
 			pk_transaction_release_tid (transaction);
 			pk_transaction_dbus_return_error (context, error);
-			goto out;
+			return;
 		}
 
 		/* valid */
@@ -3204,7 +3205,7 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean only_trusted,
 				pk_transaction_release_tid (transaction);
 				pk_transaction_dbus_return_error (context, error);
 				g_error_free (error_local);
-				goto out;
+				return;
 			}
 		}
 	}
@@ -3214,7 +3215,7 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean only_trusted,
 	if (!ret) {
 		pk_transaction_release_tid (transaction);
 		pk_transaction_dbus_return_error (context, error);
-		goto out;
+		return;
 	}
 
 	/* save so we can run later */
@@ -3224,8 +3225,6 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean only_trusted,
 
 	/* return from async with success */
 	pk_transaction_dbus_return (context);
-out:
-	g_free (content_type);
 	return;
 }
 
