diff --git a/NEWS b/NEWS
index ad32afeb..85e6b2e6 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,16 @@
 xbps-0.12.0 (???):
 
+ * xbps-bin: new dry-run mode (-n) to show the actions that would
+   be executed in a transaction. This mode takes effect in the
+   autoremove, autoupdate, install, remove and update targets. Example:
+
+	$ xbps-bin -n install kernel-snapshot
+	kernel-snapshot install 3.3.0rc2 /mnt/xbps_builder/host/binpkgs/x86_64
+	$
+
+   The format is "%s %s %s[ %s]\n" for `pkgname', `action', `version'
+   and `repository' (optional).
+
  * xbps-bin: the install target will now install the best package
    version available in repository pool if just package name has
    been specified, otherwise the first repository matching the
diff --git a/bin/xbps-bin/defs.h b/bin/xbps-bin/defs.h
index e22b6310..ec25792f 100644
--- a/bin/xbps-bin/defs.h
+++ b/bin/xbps-bin/defs.h
@@ -48,9 +48,9 @@ struct list_pkgver_cb {
 int	install_new_pkg(const char *, bool);
 int	update_pkg(const char *);
 int	remove_pkg(const char *, bool);
-int	autoupdate_pkgs(bool, bool);
-int	autoremove_pkgs(bool);
-int	exec_transaction(bool, bool);
+int	autoupdate_pkgs(bool, bool, bool);
+int	autoremove_pkgs(bool, bool);
+int	exec_transaction(bool, bool, bool);
 
 /* from remove.c */
 int	remove_installed_pkgs(int, char **, bool, bool, bool, bool);
diff --git a/bin/xbps-bin/main.c b/bin/xbps-bin/main.c
index 9045f0c5..3c553c3f 100644
--- a/bin/xbps-bin/main.c
+++ b/bin/xbps-bin/main.c
@@ -65,14 +65,14 @@ main(int argc, char **argv)
 	const char *rootdir, *cachedir, *conffile, *option;
 	int i, c, flags, rv;
 	bool yes, reqby_force, force_rm_with_deps, recursive_rm;
-	bool reinstall, show_download_pkglist_url;
+	bool reinstall, show_download_pkglist_url, dry_run;
 
 	rootdir = cachedir = conffile = option = NULL;
 	flags = rv = 0;
-	reqby_force = yes = force_rm_with_deps = false;
+	reqby_force = yes = dry_run = force_rm_with_deps = false;
 	recursive_rm = reinstall = show_download_pkglist_url = false;
 
-	while ((c = getopt(argc, argv, "AC:c:dDFfMo:Rr:Vvy")) != -1) {
+	while ((c = getopt(argc, argv, "AC:c:dDFfMno:Rr:Vvy")) != -1) {
 		switch (c) {
 		case 'A':
 			flags |= XBPS_FLAG_INSTALL_AUTO;
@@ -100,6 +100,9 @@ main(int argc, char **argv)
 		case 'M':
 			flags |= XBPS_FLAG_INSTALL_MANUAL;
 			break;
+		case 'n':
+			dry_run = true;
+			break;
 		case 'o':
 			option = optarg;
 			break;
@@ -214,7 +217,7 @@ main(int argc, char **argv)
 			if ((rv = install_new_pkg(argv[i], reinstall)) != 0)
 				goto out;
 
-		rv = exec_transaction(yes, show_download_pkglist_url);
+		rv = exec_transaction(yes, dry_run, show_download_pkglist_url);
 
 	} else if (strcasecmp(argv[0], "update") == 0) {
 		/* Update an installed package. */
@@ -225,7 +228,7 @@ main(int argc, char **argv)
 			if ((rv = update_pkg(argv[i])) != 0)
 				goto out;
 
-		rv = exec_transaction(yes, show_download_pkglist_url);
+		rv = exec_transaction(yes, dry_run, show_download_pkglist_url);
 
 	} else if (strcasecmp(argv[0], "remove") == 0) {
 		/* Removes a package. */
@@ -245,7 +248,7 @@ main(int argc, char **argv)
 			rv = EINVAL;
 			goto out;
 		}
-		rv = exec_transaction(yes, false);
+		rv = exec_transaction(yes, dry_run, false);
 
 	} else if (strcasecmp(argv[0], "show") == 0) {
 		/* Shows info about an installed binary package. */
@@ -286,7 +289,7 @@ main(int argc, char **argv)
 		if (argc != 1)
 			usage();
 
-		rv = autoupdate_pkgs(yes, show_download_pkglist_url);
+		rv = autoupdate_pkgs(yes, dry_run, show_download_pkglist_url);
 
 	} else if (strcasecmp(argv[0], "show-orphans") == 0) {
 		/*
@@ -307,7 +310,7 @@ main(int argc, char **argv)
 		if (argc != 1)
 			usage();
 
-		rv = autoremove_pkgs(yes);
+		rv = autoremove_pkgs(yes, dry_run);
 
 	} else if (strcasecmp(argv[0], "reconfigure") == 0) {
 		/*
diff --git a/bin/xbps-bin/transaction.c b/bin/xbps-bin/transaction.c
index 9b0826b7..26cdadc7 100644
--- a/bin/xbps-bin/transaction.c
+++ b/bin/xbps-bin/transaction.c
@@ -63,6 +63,24 @@ show_missing_deps(prop_array_t a)
 	}
 }
 
+static void
+show_actions(prop_object_iterator_t iter)
+{
+	prop_object_t obj;
+	const char *repoloc, *trans, *pkgname, *version;
+
+	while ((obj = prop_object_iterator_next(iter)) != NULL) {
+		prop_dictionary_get_cstring_nocopy(obj, "transaction", &trans);
+		prop_dictionary_get_cstring_nocopy(obj, "pkgname", &pkgname);
+		prop_dictionary_get_cstring_nocopy(obj, "version", &version);
+		printf("%s %s %s", pkgname, trans, version);
+		if (prop_dictionary_get_cstring_nocopy(obj,
+		    "repository", &repoloc))
+			printf(" %s", repoloc);
+		printf("\n");
+	}
+}
+
 static int
 show_binpkgs_url(prop_object_iterator_t iter)
 {
@@ -193,7 +211,7 @@ show_transaction_sizes(struct transaction *trans)
 }
 
 int
-autoupdate_pkgs(bool yes, bool show_download_pkglist_url)
+autoupdate_pkgs(bool yes, bool dry_run, bool show_download_pkglist_url)
 {
 	int rv = 0;
 
@@ -218,11 +236,11 @@ autoupdate_pkgs(bool yes, bool show_download_pkglist_url)
 			return -1;
 		}
 	}
-	return exec_transaction(yes, show_download_pkglist_url);
+	return exec_transaction(yes, dry_run, show_download_pkglist_url);
 }
 
 int
-autoremove_pkgs(bool yes)
+autoremove_pkgs(bool yes, bool dry_run)
 {
 	int rv;
 
@@ -236,7 +254,7 @@ autoremove_pkgs(bool yes)
 			return rv;
 		}
 	}
-	return exec_transaction(yes, false);
+	return exec_transaction(yes, dry_run, false);
 }
 
 int
@@ -325,7 +343,7 @@ remove_pkg(const char *pkgname, bool recursive)
 }
 
 int
-exec_transaction(bool yes, bool show_download_urls)
+exec_transaction(bool yes, bool dry_run, bool show_download_urls)
 {
 	prop_array_t mdeps;
 	struct transaction *trans;
@@ -359,6 +377,13 @@ exec_transaction(bool yes, bool show_download_urls)
 		    strerror(errno));
 		goto out;
 	}
+	/*
+	 * dry-run mode, show what would be done but don't run anything.
+	 */
+	if (dry_run) {
+		show_actions(trans->iter);
+		goto out;
+	}
 	/*
 	 * Only show URLs to download binary packages.
 	 */
diff --git a/bin/xbps-bin/xbps-bin.8 b/bin/xbps-bin/xbps-bin.8
index 218592f5..237067bd 100644
--- a/bin/xbps-bin/xbps-bin.8
+++ b/bin/xbps-bin/xbps-bin.8
@@ -1,4 +1,4 @@
-.Dd January 19, 2012
+.Dd February 3, 2012
 .Os Void GNU/Linux
 .Dt xbps-bin 8
 .Sh NAME
@@ -86,6 +86,17 @@ and
 .Em update
 targets
 and target packages and its required dependencies will be matched.
+.It Fl n
+Enables dry-run mode.
+To show the actions that would be executed in a transaction.
+This mode takes effect in the
+.Em autoremove ,
+.Em autoupdate ,
+.Em install ,
+.Rm remove
+and
+.Em update
+targets.
 .It Fl o Ar key Op key2,...
 Used currently in the
 .Em show