diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py
index 2e383cc..0a9e523 100644
--- a/pym/_emerge/Scheduler.py
+++ b/pym/_emerge/Scheduler.py
@@ -33,7 +33,9 @@
 from portage.package.ebuild.digestgen import digestgen
 from portage.package.ebuild.prepare_build_dirs import prepare_build_dirs
 
+from _emerge.BinpkgFetcher import BinpkgFetcher
 from _emerge.BinpkgPrefetcher import BinpkgPrefetcher
+from _emerge.BinpkgVerifier import BinpkgVerifier
 from _emerge.Blocker import Blocker
 from _emerge.BlockerDB import BlockerDB
 from _emerge.clear_caches import clear_caches
@@ -979,9 +981,19 @@
 		os.execv(mynewargv[0], mynewargv)
 
 	def _run_pkg_pretend(self):
+		"""
+		Since pkg_pretend output may be important, this method sends all
+		output directly to stdout (regardless of options like --quiet or
+		--jobs).
+		"""
 
 		failures = 0
 
+		# Use a local PollScheduler instance here, since we don't
+		# want tasks here to trigger the usual Scheduler callbacks
+		# that handle job scheduling and status display.
+		sched_iface = PollScheduler().sched_iface
+
 		for x in self._mergelist:
 			if not isinstance(x, Package):
 				continue
@@ -1005,60 +1017,71 @@
 			tmpdir_orig = settings["PORTAGE_TMPDIR"]
 			settings["PORTAGE_TMPDIR"] = tmpdir
 
-			if x.built:
-				tree = "bintree"
-				bintree = root_config.trees["bintree"].dbapi.bintree
-				if bintree.isremote(x.cpv):
-					fetcher = BinpkgPrefetcher(background=self._background,
-						logfile=self.settings.get("PORTAGE_LOG_FILE"), pkg=x, scheduler=self._sched_iface)
-					fetcher.start()
-					fetcher.wait()
+			try:
+				if x.built:
+					tree = "bintree"
+					bintree = root_config.trees["bintree"].dbapi.bintree
 
-				tbz2_file = bintree.getname(x.cpv)
-				infloc = os.path.join(tmpdir, x.category, x.pf, "build-info")
-				os.makedirs(infloc)
-				portage.xpak.tbz2(tbz2_file).unpackinfo(infloc)
-				ebuild_path = os.path.join(infloc, x.pf + ".ebuild")
-				settings.configdict["pkg"]["EMERGE_FROM"] = "binary"
-				settings.configdict["pkg"]["MERGE_TYPE"] = "binary"
+					# Display fetch on stdout, so that it's always clear what
+					# is consuming time here.
+					if bintree.isremote(x.cpv):
+						fetcher = BinpkgFetcher(pkg=x,
+							scheduler=sched_iface)
+						fetcher.start()
+						if fetcher.wait() != os.EX_OK:
+							failures += 1
+							continue
 
-			else:
-				tree = "porttree"
-				portdb = root_config.trees["porttree"].dbapi
-				ebuild_path = portdb.findname(x.cpv, myrepo=x.repo)
-				if ebuild_path is None:
-					raise AssertionError("ebuild not found for '%s'" % x.cpv)
-				settings.configdict["pkg"]["EMERGE_FROM"] = "ebuild"
-				if self._build_opts.buildpkgonly:
-					settings.configdict["pkg"]["MERGE_TYPE"] = "buildonly"
+					verifier = BinpkgVerifier(pkg=x,
+						scheduler=sched_iface)
+					verifier.start()
+					if verifier.wait() != os.EX_OK:
+						failures += 1
+						continue
+
+					tbz2_file = bintree.getname(x.cpv)
+					infloc = os.path.join(tmpdir, x.category, x.pf, "build-info")
+					os.makedirs(infloc)
+					portage.xpak.tbz2(tbz2_file).unpackinfo(infloc)
+					ebuild_path = os.path.join(infloc, x.pf + ".ebuild")
+					settings.configdict["pkg"]["EMERGE_FROM"] = "binary"
+					settings.configdict["pkg"]["MERGE_TYPE"] = "binary"
+
 				else:
-					settings.configdict["pkg"]["MERGE_TYPE"] = "source"
+					tree = "porttree"
+					portdb = root_config.trees["porttree"].dbapi
+					ebuild_path = portdb.findname(x.cpv, myrepo=x.repo)
+					if ebuild_path is None:
+						raise AssertionError("ebuild not found for '%s'" % x.cpv)
+					settings.configdict["pkg"]["EMERGE_FROM"] = "ebuild"
+					if self._build_opts.buildpkgonly:
+						settings.configdict["pkg"]["MERGE_TYPE"] = "buildonly"
+					else:
+						settings.configdict["pkg"]["MERGE_TYPE"] = "source"
 
-			portage.package.ebuild.doebuild.doebuild_environment(ebuild_path,
-				"pretend", settings=settings,
-				db=self.trees[settings["ROOT"]][tree].dbapi)
-			prepare_build_dirs(root_config.root, settings, cleanup=0)
+				portage.package.ebuild.doebuild.doebuild_environment(ebuild_path,
+					"pretend", settings=settings,
+					db=self.trees[settings["ROOT"]][tree].dbapi)
+				prepare_build_dirs(root_config.root, settings, cleanup=0)
 
-			vardb = root_config.trees['vartree'].dbapi
-			settings["REPLACING_VERSIONS"] = " ".join(
-				set(portage.versions.cpv_getversion(match) \
-					for match in vardb.match(x.slot_atom) + \
-					vardb.match('='+x.cpv)))
-			pretend_phase = EbuildPhase(background=self._background,
-				phase="pretend", scheduler=self._sched_iface,
-				settings=settings)
+				vardb = root_config.trees['vartree'].dbapi
+				settings["REPLACING_VERSIONS"] = " ".join(
+					set(portage.versions.cpv_getversion(match) \
+						for match in vardb.match(x.slot_atom) + \
+						vardb.match('='+x.cpv)))
+				pretend_phase = EbuildPhase(
+					phase="pretend", scheduler=sched_iface,
+					settings=settings)
 
-			pretend_phase.start()
-			ret = pretend_phase.wait()
-
-			portage.elog.elog_process(x.cpv, settings)
-
-			if ret == os.EX_OK:
+				pretend_phase.start()
+				ret = pretend_phase.wait()
+				if ret != os.EX_OK:
+					failures += 1
+				portage.elog.elog_process(x.cpv, settings)
+			finally:
 				shutil.rmtree(tmpdir)
-			settings["PORTAGE_TMPDIR"] = tmpdir_orig
+				settings["PORTAGE_TMPDIR"] = tmpdir_orig
 
-			if ret != os.EX_OK:
-				failures += 1
 		if failures:
 			return 1
 		return os.EX_OK
