diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -15,8 +15,6 @@
 git-annex-shell.1
 git-union-merge
 git-union-merge.1
-git-recover-repository
-git-recover-repository.1
 doc/.ikiwiki
 html
 *.tix
diff --git a/Annex/Branch.hs b/Annex/Branch.hs
--- a/Annex/Branch.hs
+++ b/Annex/Branch.hs
@@ -351,7 +351,7 @@
 		Annex.changeState $ \s -> s { Annex.repo = g' }
 		checkIndexOnce $ unlessM (liftIO $ doesFileExist f) $ do
 			unless bootstrapping create
-			liftIO $ createDirectoryIfMissing True $ takeDirectory f
+			createAnnexDirectory $ takeDirectory f
 			unless bootstrapping $ inRepo genIndex
 		a
 	Annex.changeState $ \s -> s { Annex.repo = (Annex.repo s) { gitEnv = gitEnv g} }
@@ -386,7 +386,7 @@
 setIndexSha ref = do
 	f <- fromRepo gitAnnexIndexStatus
 	liftIO $ writeFile f $ show ref ++ "\n"
-	setAnnexPerm f
+	setAnnexFilePerm f
 
 {- Stages the journal into the index and returns an action that will
  - clean up the staged journal files, which should only be run once
diff --git a/Annex/Content.hs b/Annex/Content.hs
--- a/Annex/Content.hs
+++ b/Annex/Content.hs
@@ -53,9 +53,7 @@
 import Annex.Link
 import Annex.Content.Direct
 import Annex.ReplaceFile
-#ifndef mingw32_HOST_OS
 import Annex.Exception
-#endif
 
 {- Checks if a given key's content is currently present. -}
 inAnnex :: Key -> Annex Bool
diff --git a/Annex/Perms.hs b/Annex/Perms.hs
--- a/Annex/Perms.hs
+++ b/Annex/Perms.hs
@@ -6,7 +6,8 @@
  -}
 
 module Annex.Perms (
-	setAnnexPerm,
+	setAnnexFilePerm,
+	setAnnexDirPerm,
 	annexFileMode,
 	createAnnexDirectory,
 	noUmask,
@@ -33,17 +34,27 @@
 		Annex.changeState $ \s -> s { Annex.shared = Just shared }
 		a shared
 
+setAnnexFilePerm :: FilePath -> Annex ()
+setAnnexFilePerm = setAnnexPerm False
+
+setAnnexDirPerm :: FilePath -> Annex ()
+setAnnexDirPerm = setAnnexPerm True
+
 {- Sets appropriate file mode for a file or directory in the annex,
  - other than the content files and content directory. Normally,
  - use the default mode, but with core.sharedRepository set,
  - allow the group to write, etc. -}
-setAnnexPerm :: FilePath -> Annex ()
-setAnnexPerm file = unlessM crippledFileSystem $
+setAnnexPerm :: Bool -> FilePath -> Annex ()
+setAnnexPerm isdir file = unlessM crippledFileSystem $
 	withShared $ liftIO . go
   where
-	go GroupShared = groupWriteRead file
+	go GroupShared = modifyFileMode file $ addModes $
+		groupSharedModes ++
+		if isdir then [ ownerExecuteMode, groupExecuteMode ] else []
 	go AllShared = modifyFileMode file $ addModes $
-		[ ownerWriteMode, groupWriteMode ] ++ readModes
+		readModes ++
+		[ ownerWriteMode, groupWriteMode ] ++
+		if isdir then executeModes else []
 	go _ = noop
 
 {- Gets the appropriate mode to use for creating a file in the annex
@@ -54,10 +65,7 @@
 	go GroupShared = sharedmode
 	go AllShared = combineModes (sharedmode:readModes)
 	go _ = stdFileMode
-	sharedmode = combineModes
-		[ ownerWriteMode, groupWriteMode
-		, ownerReadMode, groupReadMode
-		]
+	sharedmode = combineModes groupSharedModes
 
 {- Creates a directory inside the gitAnnexDir, including any parent
  - directories. Makes directories with appropriate permissions. -}
@@ -74,7 +82,7 @@
 	  where
 		done = forM_ below $ \p -> do
 			liftIO $ createDirectoryIfMissing True p
-			setAnnexPerm p
+			setAnnexDirPerm p
 
 {- Blocks writing to the directory an annexed file is in, to prevent the
  - file accidentially being deleted. However, if core.sharedRepository
diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,17 @@
+git-annex (5.20131120) unstable; urgency=low
+
+  * Fix Debian package to not try to run test suite, since haskell-tasty
+    is not out of new or in Build-Depends yet.
+  * dropunused, addunused: Allow "all" instead of a range to
+    act on all unused data.
+  * Ensure execute bit is set on directories when core.sharedrepository is set.
+  * Ensure that core.sharedrepository is honored when creating the .git/annex
+    directory.
+  * Improve repair code in the case where the index file is corrupt,
+    and this hides other problems from git fsck.
+
+ -- Joey Hess <joeyh@debian.org>  Wed, 20 Nov 2013 12:54:18 -0400
+
 git-annex (5.20131118) unstable; urgency=low
 
   * Direct mode repositories now have core.bare=true set, to prevent
diff --git a/Command/SendKey.hs b/Command/SendKey.hs
--- a/Command/SendKey.hs
+++ b/Command/SendKey.hs
@@ -46,6 +46,4 @@
 	ok <- maybe (a $ const noop)
 		(\u -> runTransfer (Transfer direction (toUUID u) key) afile noRetry a)
 		=<< Fields.getField Fields.remoteUUID
-	liftIO $ if ok
-		then exitSuccess
-		else exitFailure
+	liftIO $ exitBool ok
diff --git a/Command/TransferKey.hs b/Command/TransferKey.hs
--- a/Command/TransferKey.hs
+++ b/Command/TransferKey.hs
@@ -56,4 +56,4 @@
 		getViaTmp key $ \t -> Remote.retrieveKeyFile remote key file t p
 
 go :: Annex Bool -> CommandPerform
-go a = ifM a ( liftIO exitSuccess,  liftIO exitFailure)
+go a = a >>= liftIO . exitBool
diff --git a/Command/Unused.hs b/Command/Unused.hs
--- a/Command/Unused.hs
+++ b/Command/Unused.hs
@@ -332,11 +332,13 @@
 	unused <- readUnusedLog ""
 	unusedbad <- readUnusedLog "bad"
 	unusedtmp <- readUnusedLog "tmp"
+	let m = unused `M.union` unusedbad `M.union` unusedtmp
 	return $ map (a $ UnusedMaps unused unusedbad unusedtmp) $
-		concatMap unusedSpec params
+		concatMap (unusedSpec m) params
 
-unusedSpec :: String -> [Int]
-unusedSpec spec
+unusedSpec :: UnusedMap -> String -> [Int]
+unusedSpec m spec
+	| spec == "all" = [fst (M.findMin m)..fst (M.findMax m)]
 	| "-" `isInfixOf` spec = range $ separate (== '-') spec
 	| otherwise = maybe badspec (: []) (readish spec)
   where
diff --git a/Git/Repair.hs b/Git/Repair.hs
--- a/Git/Repair.hs
+++ b/Git/Repair.hs
@@ -8,6 +8,7 @@
 module Git.Repair (
 	runRepair,
 	runRepairOf,
+	successfulRepair,
 	cleanCorruptObjects,
 	retrieveMissingObjects,
 	resetLocalBranches,
@@ -47,7 +48,7 @@
  - Since git fsck may crash on corrupt objects, and so not
  - report the full set of corrupt or missing objects,
  - this removes corrupt objects, and re-runs fsck, until it
- - stabalizes.
+ - stabilizes.
  -
  - To remove corrupt objects, unpack all packs, and remove the packs
  - (to handle corrupt packs), and remove loose object files.
@@ -78,11 +79,13 @@
 		putStrLn "Re-running git fsck to see if it finds more problems."
 		v <- findBroken False r
 		case v of
-			Nothing -> error $ unwords
-				[ "git fsck found a problem, which was not corrected after removing"
-				, show (S.size oldbad)
-				, "corrupt objects."
-				]
+			Nothing -> do
+				hPutStrLn stderr $ unwords
+					[ "git fsck found a problem, which was not corrected after removing"
+					, show (S.size oldbad)
+					, "corrupt objects."
+					]
+				return S.empty
 			Just newbad -> do
 				removed <- removeLoose r newbad
 				let s = S.union oldbad newbad
@@ -452,6 +455,9 @@
 			putStrLn "No problems found."
 			return (True, S.empty, [])
 
+successfulRepair :: (Bool, MissingObjects, [Branch]) -> Bool
+successfulRepair = fst3
+
 runRepairOf :: FsckResults -> Bool -> Maybe FilePath -> Repo -> IO (Bool, MissingObjects, [Branch])
 runRepairOf fsckresult forced referencerepo g = do
 	missing <- cleanCorruptObjects fsckresult g
@@ -512,8 +518,12 @@
 	
 	corruptedindex = do
 		nukeIndex g
+		-- The corrupted index can prevent fsck from finding other
+		-- problems, so re-run repair.
+		fsckresult' <- findBroken False g
+		result <- runRepairOf fsckresult' forced referencerepo g
 		putStrLn "Removed the corrupted index file. You should look at what files are present in your working tree and git add them back to the index when appropriate."
-		return (True, S.empty, [])
+		return result
 
 	successfulfinish stillmissing modifiedbranches = do
 		mapM_ putStrLn
@@ -525,10 +535,10 @@
 	unsuccessfulfinish stillmissing = do
 		if repoIsLocalBare g
 			then do
-				putStrLn "If you have a clone of this bare repository, you should add it as a remote of this repository, and re-run git-recover-repository."
-				putStrLn "If there are no clones of this repository, you can instead run git-recover-repository with the --force parameter to force recovery to a possibly usable state."
+				putStrLn "If you have a clone of this bare repository, you should add it as a remote of this repository, and retry."
+				putStrLn "If there are no clones of this repository, you can instead retry with the --force parameter to force recovery to a possibly usable state."
 				return (False, stillmissing, [])
 			else needforce stillmissing
 	needforce stillmissing = do
-		putStrLn "To force a recovery to a usable state, run this command again with the --force parameter."
+		putStrLn "To force a recovery to a usable state, retry with the --force parameter."
 		return (False, stillmissing, [])
diff --git a/Init.hs b/Init.hs
--- a/Init.hs
+++ b/Init.hs
@@ -29,6 +29,7 @@
 import Annex.Direct
 import Annex.Content.Direct
 import Annex.Environment
+import Annex.Perms
 import Backend
 #ifndef mingw32_HOST_OS
 import Utility.UserInfo
@@ -111,9 +112,8 @@
 #else
 	tmp <- fromRepo gitAnnexTmpDir
 	let f = tmp </> "gaprobe"
-	liftIO $ do
-		createDirectoryIfMissing True tmp
-		writeFile f ""
+	createAnnexDirectory tmp
+	liftIO $ writeFile f ""
 	uncrippled <- liftIO $ probe f
 	liftIO $ removeFile f
 	return $ not uncrippled
@@ -149,8 +149,8 @@
 #else
 	tmp <- fromRepo gitAnnexTmpDir
 	let f = tmp </> "gaprobe"
+	createAnnexDirectory tmp
 	liftIO $ do
-		createDirectoryIfMissing True tmp
 		nukeFile f
 		ms <- tryIO $ do
 			createNamedPipe f ownerReadMode
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -30,12 +30,8 @@
 # These are not built normally.
 git-union-merge.1: doc/git-union-merge.mdwn
 	./Build/mdwn2man git-union-merge 1 doc/git-union-merge.mdwn > git-union-merge.1
-git-recover-repository.1: doc/git-recover-repository.mdwn
-	./Build/mdwn2man git-recover-repository 1 doc/git-recover-repository.mdwn > git-recover-repository.1
 git-union-merge:
 	$(GHC) --make -threaded $@
-git-recover-repository:
-	$(GHC) --make -threaded $@
 
 install-mans: $(mans)
 	install -d $(DESTDIR)$(PREFIX)/share/man/man1
@@ -82,7 +78,7 @@
 		doc/.ikiwiki html dist tags Build/SysConfig.hs build-stamp \
 		Setup Build/InstallDesktopFile Build/EvilSplicer \
 		Build/Standalone Build/OSXMkLibs \
-		git-union-merge git-recover-repository
+		git-union-merge
 	find . -name \*.o -exec rm {} \;
 	find . -name \*.hi -exec rm {} \;
 
diff --git a/Utility/FileMode.hs b/Utility/FileMode.hs
--- a/Utility/FileMode.hs
+++ b/Utility/FileMode.hs
@@ -65,11 +65,14 @@
 allowWrite f = modifyFileMode f $ addModes [ownerWriteMode]
 
 {- Allows owner and group to read and write to a file. -}
-groupWriteRead :: FilePath -> IO ()
-groupWriteRead f = modifyFileMode f $ addModes
+groupSharedModes :: [FileMode]
+groupSharedModes =
 	[ ownerWriteMode, groupWriteMode
 	, ownerReadMode, groupReadMode
 	]
+
+groupWriteRead :: FilePath -> IO ()
+groupWriteRead f = modifyFileMode f $ addModes groupSharedModes
 
 checkMode :: FileMode -> FileMode -> Bool
 checkMode checkfor mode = checkfor `intersectFileModes` mode == checkfor
diff --git a/Utility/Misc.hs b/Utility/Misc.hs
--- a/Utility/Misc.hs
+++ b/Utility/Misc.hs
@@ -15,6 +15,7 @@
 import Data.Char
 import Data.List
 import Control.Applicative
+import System.Exit
 #ifndef mingw32_HOST_OS
 import System.Posix.Process (getAnyProcessStatus)
 import Utility.Exception
@@ -136,3 +137,7 @@
 #else
 reapZombies = return ()
 #endif
+
+exitBool :: Bool -> IO a
+exitBool False = exitFailure
+exitBool True = exitSuccess
diff --git a/Utility/Tmp.hs b/Utility/Tmp.hs
--- a/Utility/Tmp.hs
+++ b/Utility/Tmp.hs
@@ -62,7 +62,7 @@
 withTmpDirIn tmpdir template = bracket create remove
   where
 	remove d = whenM (doesDirectoryExist d) $
-		removeDirectoryRecursive d
+		return () -- removeDirectoryRecursive d
 	create = do
 		createDirectoryIfMissing True tmpdir
 		makenewdir (tmpdir </> template) (0 :: Int)
diff --git a/debian/changelog b/debian/changelog
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,17 @@
+git-annex (5.20131120) unstable; urgency=low
+
+  * Fix Debian package to not try to run test suite, since haskell-tasty
+    is not out of new or in Build-Depends yet.
+  * dropunused, addunused: Allow "all" instead of a range to
+    act on all unused data.
+  * Ensure execute bit is set on directories when core.sharedrepository is set.
+  * Ensure that core.sharedrepository is honored when creating the .git/annex
+    directory.
+  * Improve repair code in the case where the index file is corrupt,
+    and this hides other problems from git fsck.
+
+ -- Joey Hess <joeyh@debian.org>  Wed, 20 Nov 2013 12:54:18 -0400
+
 git-annex (5.20131118) unstable; urgency=low
 
   * Direct mode repositories now have core.bare=true set, to prevent
diff --git a/debian/rules b/debian/rules
--- a/debian/rules
+++ b/debian/rules
@@ -9,6 +9,9 @@
 %:
 	dh $@
 
+override_dh_auto_test:
+	echo test suite currently disabled until haskell-tasty is out of NEW
+
 # Not intended for use by anyone except the author.
 announcedir:
 	@echo ${HOME}/src/git-annex/doc/news
diff --git a/doc/bugs/127.0.0.1_references_on_remote_assistant_access.mdwn b/doc/bugs/127.0.0.1_references_on_remote_assistant_access.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/127.0.0.1_references_on_remote_assistant_access.mdwn
@@ -0,0 +1,20 @@
+### Please describe the problem.
+When I use git-annex webapp with a remote IP of a headless computer, I am sometimes redirected to a 127.0.0.1 address (with a different port as well)
+
+### What steps will reproduce the problem?
+1. Install git-annex as usual. 
+2. Open git-annex assistant from a headless machine and access the webapp with the --listen option. (e.g. git annex webapp --listen=xxx.yyy.zzz.www)
+3. Create your first local repository. Then create a second local repository.
+4. When assistant asks you if you want to merge these 2 repositories, try to select the second option (to keep them separated).
+5. You are redirected from your remote IP to 127.0.0.1 to a new port number.
+
+(I also encountered the same error at another menu or function, but I don't remember where. Sorry.) 
+
+### What version of git-annex are you using? On what operating system?
+4.20130815
+Ubuntu 13.10 64-bit (kernel 3.11.0-13-generic x86_64)
+
+### Please provide any additional information below.
+Please ask me for any additional information that may be useful.
+
+> [[dup]] of [[Hangs_on_creating_repository_when_using_--listen]]; [[done]] --[[Joey]]
diff --git a/doc/design/assistant/polls/Android_default_directory.mdwn b/doc/design/assistant/polls/Android_default_directory.mdwn
--- a/doc/design/assistant/polls/Android_default_directory.mdwn
+++ b/doc/design/assistant/polls/Android_default_directory.mdwn
@@ -4,4 +4,4 @@
 want the first time they run it, but to save typing on android, anything
 that gets enough votes will be included in a list of choices as well.
 
-[[!poll open=yes expandable=yes 61 "/sdcard/annex" 6 "Whole /sdcard" 4 "DCIM directory (photos and videos only)" 1 "Same as for regular git-annex. ~/annex/"]]
+[[!poll open=yes expandable=yes 62 "/sdcard/annex" 6 "Whole /sdcard" 4 "DCIM directory (photos and videos only)" 1 "Same as for regular git-annex. ~/annex/"]]
diff --git a/doc/devblog/day_59__release_day.mdwn b/doc/devblog/day_59__release_day.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_59__release_day.mdwn
@@ -0,0 +1,11 @@
+Release today, right on bi-weekly schedule. Rather startled
+at the size of the changelog for this one; along with the direct mode
+guard, it adds support for OS X Mavericks, Android 4.3/4.4, and fixes
+numerous bugs.
+
+Posted another question in the survey,
+<http://git-annex-survey.branchable.com/polls/2013/roadmap/>.
+
+Spun off git-repair as an independant package from git-annex. Of course,
+most of the source code is shared with git-annex. I need to do something
+with libraries eventually..
diff --git a/doc/devblog/day_60__damage_driven_development.mdwn b/doc/devblog/day_60__damage_driven_development.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_60__damage_driven_development.mdwn
@@ -0,0 +1,36 @@
+Wrote some evil code you don't want to run today. Git.Destroyer randomly
+generates Damage, and applies it to a git repository, in a way that is
+reproducible -- applying the same Damage to clones of the same git repo 
+will always yeild the same result.
+
+This let me build a test harness for git-repair, which repeatedly clones,
+damages, and repairs a repository. And when it fails, I can just ask it to
+retry after fixing the bug and it'll re-run every attempt it's logged.
+
+This is already yeilding improvements to the git-repair code.
+The first randomly constructed Damage that it failed to recover
+turned out to be a truncated index file that hid some other
+corrupted object files from being repaired.
+
+	[Damage Empty (FileSelector 1),
+	 Damage Empty (FileSelector 2),
+	 Damage Empty (FileSelector 3),
+	 Damage Reverse (FileSelector 3),
+	 Damage (ScrambleFileMode 3) (FileSelector 5),
+	 Damage Delete (FileSelector 9),
+	 Damage (PrependGarbage "¥SOH¥STX¥ENQ¥f¥a¥ACK¥b¥DLE¥n") (FileSelector 9),
+	 Damage Empty (FileSelector 12),
+	 Damage (CorruptByte 11 25) (FileSelector 6),
+	 Damage Empty (FileSelector 5),
+	 Damage (ScrambleFileMode 4294967281) (FileSelector 14)
+	]
+
+I need to improve the ranges of files that it damages -- currently QuickCheck
+seems to only be selecting one of the first 20 or so files. Also, it's quite
+common that it will damage `.git/config` so badly that git thinks it's not
+a git repository anymore. I am not sure if that is something `git-repair`
+should try to deal with.
+
+---
+
+Today's work was sponsored by the WikiMedia Foundation.
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -509,6 +509,7 @@
   `git annex unused`
 
   You can also specify ranges of numbers, such as "1-1000".
+  Or, specify "all" to drop all unused data.
 
   To drop the data from a remote, specify `--from.`
 
diff --git a/doc/git-recover-repository.mdwn b/doc/git-recover-repository.mdwn
deleted file mode 100644
--- a/doc/git-recover-repository.mdwn
+++ /dev/null
@@ -1,40 +0,0 @@
-# NAME
-
-git-recover-repository - Fix a broken git repository
-
-# SYNOPSIS
-
-git-recover-repository [--force]
-
-# DESCRIPTION
-
-This can fix a corrupt or broken git repository, which git fsck would
-only complain has problems.
-
-It does by deleting all corrupt objects, and retreiving all missing
-objects that it can from the remotes of the repository.
-
-If that is not sufficient to fully recover the repository, it can also
-reset branches back to commits before the corruption happened, delete
-branches that are no longer available due to the lost data, and remove any
-missing files from the index. It will only do this if run with the
-`--force` option, since that rewrites history and throws out missing data.
-Note that the `--force` option never touches tags, even if they are no
-longer usable due to missing data.
-
-After running this command, you will probably want to run `git fsck` to
-verify it fixed the repository. Note that fsck may still complain about
-objects referenced by the reflog, or the stash, if they were unable to be
-recovered. This command does not try to clean up either the reflog or the
-stash.
-
-Since this command unpacks all packs in the repository, you may want to
-run `git gc` afterwards.
-
-# AUTHOR
-
-Joey Hess <joey@kitenet.net>
-
-<http://git-annex.branchable.com/>
-
-Warning: Automatically converted into a man page by mdwn2man. Edit with care
diff --git a/doc/install/OSX.mdwn b/doc/install/OSX.mdwn
--- a/doc/install/OSX.mdwn
+++ b/doc/install/OSX.mdwn
@@ -3,9 +3,9 @@
 [[!img /assistant/osx-app.png align=right link=/assistant]]
 For easy installation, use the prebuilt app bundle.
 
-* 10.9 Mavericks: [git-annex.dmg.bz2](https://downloads.kitenet.net/git-annex/OSX/current/10.9_Mavericks/git-annex.dmg.bz2)
+* 10.9 Mavericks: [git-annex.dmg](https://downloads.kitenet.net/git-annex/OSX/current/10.9_Mavericks/git-annex.dmg)
 * 10.8.2 Mountain Lion: [git-annex.dmg.bz2](https://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/git-annex.dmg.bz2) **warning: not being updated any longer**
-* 10.7.5 Lion: [git-annex.dmg.bz2](https://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/git-annex.dmg.bz2)
+* 10.7.5 Lion: [git-annex.dmg](https://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/git-annex.dmg)
 
 To run the [[git-annex_assistant|/assistant]], just
 install the app, look for the icon, and start it up. 
diff --git a/doc/news/version_4.20131002.mdwn b/doc/news/version_4.20131002.mdwn
deleted file mode 100644
--- a/doc/news/version_4.20131002.mdwn
+++ /dev/null
@@ -1,42 +0,0 @@
-News for git-annex 4.20131002:
-
-    The layout of gcrypt repositories has changed, and
-    if you created one you must manually upgrade it.
-    See /usr/share/doc/git-annex/html/upgrades/gcrypt.html
-
-git-annex 4.20131002 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Note that the layout of gcrypt repositories has changed, and
-     if you created one you must manually upgrade it.
-     See http://git-annex.branchable.com/upgrades/gcrypt/
-   * webapp: Support setting up and using encrypted git repositories on
-     any ssh server, as well as on rsync.net.
-   * git-annex-shell: Added support for operating inside gcrypt repositories.
-   * Disable receive.denyNonFastForwards when setting up a gcrypt special
-     remote, since gcrypt needs to be able to fast-forward the master branch.
-   * import: Preserve top-level directory structure.
-   * Use cryptohash rather than SHA for hashing when no external hash program
-     is available. This is a significant speedup for SHA256 on OSX, for
-     example.
-   * Added SKEIN256 and SKEIN512 backends.
-   * Android build redone from scratch, many dependencies updated,
-     and entire build can now be done using provided scripts.
-   * assistant: Clear the list of failed transfers when doing a full transfer
-     scan. This prevents repeated retries to download files that are not
-     available, or are not referenced by the current git tree.
-   * indirect, direct: Better behavior when a file is not owned by
-     the user running the conversion.
-   * add, import, assistant: Better preserve the mtime of symlinks,
-     when when adding content that gets deduplicated.
-   * Send a git-annex user-agent when downloading urls.
-     Overridable with --user-agent option.
-     (Not yet done for S3 or WebDAV due to limitations of libraries used.)
-   * webapp: Fixed a bug where when a new remote is added, one file
-     may fail to sync to or from it due to the transferrer process not
-     yet knowing about the new remote.
-   * OSX: Bundled gpg upgraded, now compatible with config files
-     written by MacGPG.
-   * assistant: More robust inotify handling; avoid crashing if a directory
-     cannot be read.
-   * Moved list of backends and remote types from status to version
-     command."""]]
diff --git a/doc/news/version_5.20131120.mdwn b/doc/news/version_5.20131120.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/news/version_5.20131120.mdwn
@@ -0,0 +1,11 @@
+git-annex 5.20131120 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Fix Debian package to not try to run test suite, since haskell-tasty
+     is not out of new or in Build-Depends yet.
+   * dropunused, addunused: Allow "all" instead of a range to
+     act on all unused data.
+   * Ensure execute bit is set on directories when core.sharedrepository is set.
+   * Ensure that core.sharedrepository is honored when creating the .git/annex
+     directory.
+   * Improve repair code in the case where the index file is corrupt,
+     and this hides other problems from git fsck."""]]
diff --git a/doc/sync.mdwn b/doc/sync.mdwn
--- a/doc/sync.mdwn
+++ b/doc/sync.mdwn
@@ -7,7 +7,7 @@
 
 But it can be harder to use git in a fully decentralized fashion, with no
 central repository and still keep repositories in sync with one another.
-You have to remember to pull from each remote, and merge the appopriate
+You have to remember to pull from each remote, and merge the appropriate
 branch after pulling. It's difficult to *push* to a remote, since git does
 not allow pushes into the currently checked out branch.
 
diff --git a/doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration.mdwn b/doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration.mdwn
@@ -0,0 +1,1 @@
+When starting the assistant when logging in to the system (`--autostart`) it choses a new port an secret everytime. Having the assistant open in a pinned firefox tab which automatically restores when firefox starts we need to get the url from `.git/annex/url` and copy/paste it into the pinned tab. It would be very nice to have a configuration option which assigns a fixed port and secret so everytime the assistant is autostarted it uses the same settings and firefox is happy to open it automatically on start.
diff --git a/git-annex.1 b/git-annex.1
--- a/git-annex.1
+++ b/git-annex.1
@@ -468,6 +468,7 @@
 \fBgit annex unused\fP
 .IP
 You can also specify ranges of numbers, such as "1\-1000".
+Or, specify "all" to drop all unused data.
 .IP
 To drop the data from a remote, specify \fB\-\-from.\fP
 .IP
diff --git a/git-annex.cabal b/git-annex.cabal
--- a/git-annex.cabal
+++ b/git-annex.cabal
@@ -1,5 +1,5 @@
 Name: git-annex
-Version: 5.20131118
+Version: 5.20131120
 Cabal-Version: >= 1.8
 License: GPL-3
 Maintainer: Joey Hess <joey@kitenet.net>
diff --git a/git-recover-repository.hs b/git-recover-repository.hs
deleted file mode 100644
--- a/git-recover-repository.hs
+++ /dev/null
@@ -1,42 +0,0 @@
-{- git-recover-repository program
- -
- - Copyright 2013 Joey Hess <joey@kitenet.net>
- -
- - Licensed under the GNU GPL version 3 or higher.
- -}
-
-import System.Environment
-import qualified Data.Set as S
-import Data.Tuple.Utils
-
-import Common
-import qualified Git
-import qualified Git.CurrentRepo
-import qualified Git.Fsck
-import qualified Git.Repair
-import qualified Git.Config
-import qualified Git.Branch
-
-header :: String
-header = "Usage: git-recover-repository"
-
-usage :: a
-usage = error $ "bad parameters\n\n" ++ header
-
-parseArgs :: IO Bool
-parseArgs = do
-	args <- getArgs
-	return $ or $ map parse args
-  where
-	parse "--force" = True
-	parse _ = usage
-
-main :: IO ()
-main = do
-	forced <- parseArgs
-	
-	g <- Git.Config.read =<< Git.CurrentRepo.get
-	ifM (fst3 <$> Git.Repair.runRepair forced g)
-		( exitSuccess
-		, exitFailure
-		)
