diff --git a/hadrian/bindist/Makefile b/hadrian/bindist/Makefile
index 79f9a9f2f2de1279e80bc72e0d3f28468ccf6b40..d043cf2425f98e42306ff1d5e53b2233755bc5ea 100644
--- a/hadrian/bindist/Makefile
+++ b/hadrian/bindist/Makefile
@@ -71,23 +71,38 @@ endef
 
 
 .PHONY: install
-install: install_lib install_bin install_includes
-install: install_docs install_wrappers install_ghci
-install: install_mingw update_package_db
+
+ifeq "$(TargetOS_CPP)" "mingw32"
+install_bin: install_mingw install_bin_direct
+else
+install_bin: install_bin_libdir install_wrappers
+endif
+
+install: install_bin install_lib install_includes
+install: install_docs install_ghci update_package_db
 
 ActualBinsDir=${ghclibdir}/bin
+ifeq "$(TargetOS_CPP)" "mingw32"
+ActualLibsDir=${ghclibdir}
+else
 ActualLibsDir=${ghclibdir}/lib
+endif
 WrapperBinsDir=${bindir}
 
 # We need to install binaries relative to libraries.
 BINARIES = $(wildcard ./bin/*)
-install_bin:
+install_bin_libdir:
 	@echo "Copying binaries to $(ActualBinsDir)"
 	$(INSTALL_DIR) "$(ActualBinsDir)"
 	for i in $(BINARIES); do \
 		cp -R $$i "$(ActualBinsDir)"; \
 	done
 
+install_bin_direct:
+	@echo "Copying binaries to $(WrapperBinsDir)"
+	$(INSTALL_DIR) "$(WrapperBinsDir)"
+	cp ./bin/* "$(WrapperBinsDir)/"
+
 install_ghci:
 	@echo "Copying and installing ghci"
 	$(CREATE_SCRIPT) '$(WrapperBinsDir)/ghci'
@@ -105,7 +120,7 @@ install_lib:
 
 INCLUDES = $(wildcard ./include/*)
 install_includes:
-	@echo "Copying libraries to $(includedir)"
+	@echo "Copying include files to $(includedir)"
 	$(INSTALL_DIR) "$(includedir)"
 	for i in $(INCLUDES); do \
 		cp -R $$i "$(includedir)/"; \
@@ -113,34 +128,30 @@ install_includes:
 
 DOCS = $(wildcard ./docs/*)
 install_docs:
-	@echo "Copying libraries to $(docdir)"
+	@echo "Copying docs to $(docdir)"
 	$(INSTALL_DIR) "$(docdir)"
 	for i in $(DOCS); do \
 		cp -R $$i "$(docdir)/"; \
 	done
 
 BINARY_NAMES=$(shell ls ./wrappers/)
-install_wrappers:
-	@echo "Installing Wrapper scripts"
+install_wrappers: install_bin_libdir
+	@echo "Installing wrapper scripts"
 	$(INSTALL_DIR) "$(WrapperBinsDir)"
 	$(foreach p, $(BINARY_NAMES),\
 		$(call installscript,$p,$(WrapperBinsDir)/$p,$(WrapperBinsDir),$(ActualBinsDir),$(ActualBinsDir)/$p,$(ActualLibsDir),$(docdir),$(includedir)))
 
 PKG_CONFS = $(shell find "$(ActualLibsDir)/package.conf.d" -name '*.conf' | sed 's:   :xxx:g')
-update_package_db:
+update_package_db: install_bin install_lib
 	@echo "$(PKG_CONFS)"
 	@echo "Updating the package DB"
 	$(foreach p, $(PKG_CONFS),\
 		$(call patchpackageconf,$(shell echo $(notdir $p) | sed 's/-\([0-9]*[0-9]\.\)*conf//g'),$(shell echo "$p" | sed 's:xxx:   :g'),$(docdir),$(shell realpath --relative-to="$(libdir)" "$(docdir)")))
 	'$(WrapperBinsDir)/ghc-pkg' recache
 
-# The 'foreach' that copies the mingw directory will only trigger a copy
-# when the wildcard matches, therefore only on Windows.
-MINGW = $(wildcard ./mingw)
 install_mingw:
 	@echo "Installing MingGW"
 	$(INSTALL_DIR) "$(prefix)/mingw"
-	$(foreach d, $(MINGW),\
-		cp -R ./mingw "$(prefix)")
+	cp -R ./mingw "$(prefix)"
 # END INSTALL
 # ----------------------------------------------------------------------
diff --git a/hadrian/src/Rules/BinaryDist.hs b/hadrian/src/Rules/BinaryDist.hs
index 42efb95420d00ecf2bda1203578e76ff110a6688..8ec3ea137d11a51b820381b166d1e9e542b231e1 100644
--- a/hadrian/src/Rules/BinaryDist.hs
+++ b/hadrian/src/Rules/BinaryDist.hs
@@ -136,10 +136,11 @@ bindistRules = do
           -- shipping it
           removeFile (bindistFilesDir -/- mingwStamp)
 
-        -- We copy the binary (<build root>/stage1/bin/haddock) to
+        -- We copy the binary (<build root>/stage1/bin/haddock[.exe]) to
         -- the bindist's bindir (<build root>/bindist/ghc-.../bin/).
         haddockPath <- programPath (vanillaContext Stage1 haddock)
-        copyFile haddockPath (bindistFilesDir -/- "bin" -/- "haddock")
+        copyFile haddockPath
+                 (bindistFilesDir -/- "bin" -/- takeFileName haddockPath)
 
         -- We then 'need' all the files necessary to configure and install
         -- (as in, './configure [...] && make install') this build on some
diff --git a/hadrian/src/Rules/Test.hs b/hadrian/src/Rules/Test.hs
index 8f1523724cb2866a652c38c21244edf398b6fab6..2f7594fd7cdc8bca0ee5092f33567956ad595f3d 100644
--- a/hadrian/src/Rules/Test.hs
+++ b/hadrian/src/Rules/Test.hs
@@ -140,7 +140,7 @@ timeoutProgBuilder = do
     root    <- buildRoot
     if windowsHost
         then do
-            prog <- programPath =<< programContext Stage1 timeout
+            prog <- programPath =<< programContext Stage0 timeout
             copyFile prog (root -/- timeoutPath)
         else do
             python <- builderPath Python
@@ -154,12 +154,12 @@ timeoutProgBuilder = do
 needTestBuilders :: Action ()
 needTestBuilders = do
     testGhc <- testCompiler <$> userSetting defaultTestArgs
-    when (testGhc `elem` ["stage1", "stage2", "stage3"]) needTestsuitePackages
+    when (testGhc `elem` ["stage1", "stage2", "stage3"])
+         (needTestsuitePackages testGhc)
 
 -- | Build extra programs and libraries required by testsuite
-needTestsuitePackages :: Action ()
-needTestsuitePackages = do
-    testGhc <- testCompiler <$> userSetting defaultTestArgs
+needTestsuitePackages :: String -> Action ()
+needTestsuitePackages testGhc = do
     when (testGhc `elem` ["stage1", "stage2", "stage3"]) $ do
         let stg = stageOf testGhc
         allpkgs   <- packages <$> flavour
diff --git a/hadrian/src/Settings/Default.hs b/hadrian/src/Settings/Default.hs
index 1b73bf1113680d14ed2a45a9976330aee51ac6a0..81f5e98e3fbc6ac1b95438045049e15abd80af94 100644
--- a/hadrian/src/Settings/Default.hs
+++ b/hadrian/src/Settings/Default.hs
@@ -77,6 +77,7 @@ stage0Packages = do
              , transformers
              , unlit                         ]
           ++ [ terminfo | not windowsHost, not cross ]
+          ++ [ timeout  | windowsHost                ]
           ++ [ touchy   | windowsHost                ]
 
 -- | Packages built in 'Stage1' by default. You can change this in "UserSettings".