diff --git a/Annex/Branch.hs b/Annex/Branch.hs
--- a/Annex/Branch.hs
+++ b/Annex/Branch.hs
@@ -218,7 +218,7 @@
 commit :: String -> Annex ()
 commit = whenM journalDirty . forceCommit
 
-{- Commits the current index to the branch even without any journalleda
+{- Commits the current index to the branch even without any journalled
  - changes. -}
 forceCommit :: String -> Annex ()
 forceCommit message = lockJournal $ \jl -> do
diff --git a/Annex/Content.hs b/Annex/Content.hs
--- a/Annex/Content.hs
+++ b/Annex/Content.hs
@@ -124,7 +124,16 @@
 			Nothing -> is_unlocked
 	check def Nothing = return def
 #else
-	checkindirect _ = return is_missing
+	checkindirect f = liftIO $ ifM (doesFileExist f)
+		( do
+			v <- lockShared f
+			case v of
+				Nothing -> return is_locked
+				Just lockhandle -> do
+					dropLock lockhandle
+					return is_unlocked
+		, return is_missing
+		)
 	{- In Windows, see if we can take a shared lock. If so, 
 	 - remove the lock file to clean up after ourselves. -}
 	checkdirect contentfile lockfile =
diff --git a/Annex/Journal.hs b/Annex/Journal.hs
--- a/Annex/Journal.hs
+++ b/Annex/Journal.hs
@@ -40,7 +40,12 @@
 	jfile <- fromRepo $ journalFile file
 	let tmpfile = tmp </> takeFileName jfile
 	liftIO $ do
-		writeFileAnyEncoding tmpfile content
+		withFile tmpfile WriteMode $ \h -> do
+			fileEncoding h
+#ifdef mingw32_HOST_OS
+			hSetNewlineMode h noNewlineTranslation
+#endif
+			hPutStr h content
 		moveFile tmpfile jfile
 
 {- Gets any journalled content for a file in the branch. -}
diff --git a/Assistant/MakeRemote.hs b/Assistant/MakeRemote.hs
--- a/Assistant/MakeRemote.hs
+++ b/Assistant/MakeRemote.hs
@@ -90,18 +90,23 @@
 	r <- Command.InitRemote.findExisting name
 	case r of
 		Nothing -> error $ "Cannot find a special remote named " ++ name
-		Just (u, c) -> setupSpecialRemote name remotetype config mcreds (Just u, c)
+		Just (u, c) -> setupSpecialRemote' False name remotetype config mcreds (Just u, c)
 
 setupSpecialRemote :: RemoteName -> RemoteType -> R.RemoteConfig -> Maybe CredPair -> (Maybe UUID, R.RemoteConfig) -> Annex RemoteName
-setupSpecialRemote name remotetype config mcreds (mu, c) = do
+setupSpecialRemote = setupSpecialRemote' True
+
+setupSpecialRemote' :: Bool -> RemoteName -> RemoteType -> R.RemoteConfig -> Maybe CredPair -> (Maybe UUID, R.RemoteConfig) -> Annex RemoteName
+setupSpecialRemote' setdesc name remotetype config mcreds (mu, c) = do
 	{- Currently, only 'weak' ciphers can be generated from the
 	 - assistant, because otherwise GnuPG may block once the entropy
 	 - pool is drained, and as of now there's no way to tell the user
 	 - to perform IO actions to refill the pool. -}
 	(c', u) <- R.setup remotetype mu mcreds $
 		M.insert "highRandomQuality" "false" $ M.union config c
-	describeUUID u name
 	configSet u c'
+	when setdesc $
+		whenM (isNothing . M.lookup u <$> uuidMap) $
+			describeUUID u name
 	return name
 
 {- Returns the name of the git remote it created. If there's already a
diff --git a/Assistant/Ssh.hs b/Assistant/Ssh.hs
--- a/Assistant/Ssh.hs
+++ b/Assistant/Ssh.hs
@@ -312,7 +312,7 @@
 {- This hostname is specific to a given repository on the ssh host,
  - so it is based on the real hostname, the username, and the directory.
  -
- - The mangled hostname has the form "git-annex-realhostname-username_dir".
+ - The mangled hostname has the form "git-annex-realhostname-username-port_dir".
  - The only use of "-" is to separate the parts shown; this is necessary
  - to allow unMangleSshHostName to work. Any unusual characters in the
  - username or directory are url encoded, except using "." rather than "%"
@@ -324,6 +324,7 @@
   where
 	extra = intercalate "_" $ map T.unpack $ catMaybes
 		[ sshUserName sshdata
+		, Just $ T.pack $ show $ sshPort sshdata
 		, Just $ sshDirectory sshdata
 		]
 	safe c
diff --git a/Assistant/Threads/SanityChecker.hs b/Assistant/Threads/SanityChecker.hs
--- a/Assistant/Threads/SanityChecker.hs
+++ b/Assistant/Threads/SanityChecker.hs
@@ -40,6 +40,7 @@
 import Config.Files
 import Utility.DiskFree
 import qualified Annex
+import Annex.Exception
 #ifdef WITH_WEBAPP
 import Assistant.WebApp.Types
 #endif
@@ -84,8 +85,9 @@
 	liftIO $ fixUpSshRemotes
 
 	{- Clean up old temp files. -}
-	liftAnnex cleanOldTmpMisc
-	liftAnnex cleanReallyOldTmp
+	void $ liftAnnex $ tryAnnex $ do
+		cleanOldTmpMisc
+		cleanReallyOldTmp
 
 	{- If there's a startup delay, it's done here. -}
 	liftIO $ maybe noop (threadDelaySeconds . Seconds . fromIntegral . durationSeconds) startupdelay
@@ -310,7 +312,8 @@
 			| otherwise -> noop
 
 cleanOld :: (POSIXTime -> Bool) -> FilePath -> IO ()
-cleanOld check f = do
-	mtime <- realToFrac . modificationTime <$> getFileStatus f
-	when (check mtime) $
-		nukeFile f
+cleanOld check f = go =<< catchMaybeIO getmtime
+  where
+	getmtime = realToFrac . modificationTime <$> getSymbolicLinkStatus f
+	go (Just mtime) | check mtime = nukeFile f
+	go _ = noop
diff --git a/Assistant/WebApp/Configurators/.Local.hs.swp b/Assistant/WebApp/Configurators/.Local.hs.swp
deleted file mode 100644
Binary files a/Assistant/WebApp/Configurators/.Local.hs.swp and /dev/null differ
diff --git a/Assistant/WebApp/Configurators/Edit.hs b/Assistant/WebApp/Configurators/Edit.hs
--- a/Assistant/WebApp/Configurators/Edit.hs
+++ b/Assistant/WebApp/Configurators/Edit.hs
@@ -61,6 +61,10 @@
 
 getRepoConfig :: UUID -> Maybe Remote -> Annex RepoConfig
 getRepoConfig uuid mremote = do
+	-- Ensure we're editing current data by discarding caches.
+	void groupMapLoad
+	void uuidMapLoad
+
 	groups <- lookupGroups uuid
 	remoteconfig <- M.lookup uuid <$> readRemoteLog
 	let (repogroup, associateddirectory) = case getStandardGroup groups of
@@ -285,7 +289,7 @@
 	void $ liftAssistant $ do
 		close <- asIO1 removeAlert
 		addAlert $ connectionNeededAlert $ AlertButton
-			{ buttonLabel = "Connnect"
+			{ buttonLabel = "Connect"
 			, buttonUrl = urlrender ConnectionNeededR
 			, buttonAction = Just close
 			, buttonPrimary = True
diff --git a/Assistant/WebApp/Configurators/Local.hs b/Assistant/WebApp/Configurators/Local.hs
--- a/Assistant/WebApp/Configurators/Local.hs
+++ b/Assistant/WebApp/Configurators/Local.hs
@@ -1,6 +1,6 @@
 {- git-annex assistant webapp configurators for making local repositories
  -
- - Copyright 2012 Joey Hess <joey@kitenet.net>
+ - Copyright 2012-2014 Joey Hess <joey@kitenet.net>
  -
  - Licensed under the GNU AGPL version 3 or higher.
  -}
@@ -19,6 +19,7 @@
 import qualified Git.Construct
 import qualified Git.Config
 import qualified Git.Command
+import qualified Git.Branch
 import qualified Annex
 import Config.Files
 import Utility.FreeDesktop
@@ -196,8 +197,7 @@
 		FormSuccess (RepositoryPath p) -> do
 			let path = T.unpack p
 			isnew <- liftIO $ makeRepo path False
-			u <- liftIO $ initRepo isnew True path Nothing
-			liftH $ liftAnnexOr () $ setStandardGroup u ClientGroup
+			u <- liftIO $ initRepo isnew True path Nothing (Just ClientGroup)
 			liftIO $ addAutoStartFile path
 			liftIO $ startAssistant path
 			askcombine u path
@@ -208,10 +208,17 @@
 		mainrepo <- fromJust . relDir <$> liftH getYesod
 		$(widgetFile "configurators/newrepository/combine")
 
+{- Ensure that a remote's description, group, etc are available by
+ - immediately pulling from it. Also spawns a sync to push to it as well. -}
+immediateSyncRemote :: Remote -> Assistant ()
+immediateSyncRemote r = do
+	currentbranch <- liftAnnex (inRepo Git.Branch.current)
+	void $ manualPull currentbranch [r]
+	syncRemote r
+
 getCombineRepositoryR :: FilePath -> UUID -> Handler Html
 getCombineRepositoryR newrepopath newrepouuid = do
-	r <- combineRepos newrepopath remotename
-	liftAssistant $ syncRemote r
+	liftAssistant . immediateSyncRemote =<< combineRepos newrepopath remotename
 	redirect $ EditRepositoryR $ RepoUUID newrepouuid
   where
 	remotename = takeFileName newrepopath
@@ -321,7 +328,7 @@
 			return (u, r)
 	{- Making a new unencrypted repo, or combining with an existing one. -}
 	makeunencrypted = makewith $ \isnew -> (,)
-		<$> liftIO (initRepo isnew False dir $ Just remotename)
+		<$> liftIO (initRepo isnew False dir (Just remotename) Nothing)
 		<*> combineRepos dir remotename
 	makewith a = do
 		liftIO $ createDirectoryIfMissing True dir
@@ -331,8 +338,9 @@
 			setConfig (ConfigKey "core.fsyncobjectfiles")
 				(Git.Config.boolConfig True)
 		(u, r) <- a isnew
-		liftAnnex $ setStandardGroup u TransferGroup
-		liftAssistant $ syncRemote r
+		when isnew $
+			liftAnnex $ defaultStandardGroup u TransferGroup
+		liftAssistant $ immediateSyncRemote r
 		redirect $ EditNewRepositoryR u
   	mountpoint = T.unpack (mountPoint drive)
 	dir = removableDriveRepository drive
@@ -398,10 +406,8 @@
 	webapp <- getYesod
 	url <- liftIO $ do
 		isnew <- makeRepo path False
-		u <- initRepo isnew True path Nothing
-		inDir path $ do
-			setStandardGroup u repogroup
-			fromMaybe noop setup
+		void $ initRepo isnew True path Nothing (Just repogroup)
+		inDir path $ fromMaybe noop setup
 		addAutoStartFile path
 		setCurrentDirectory path
 		fromJust $ postFirstRun webapp
@@ -432,9 +438,9 @@
 	Annex.eval state a
 
 {- Creates a new repository, and returns its UUID. -}
-initRepo :: Bool -> Bool -> FilePath -> Maybe String -> IO UUID
-initRepo True primary_assistant_repo dir desc = inDir dir $ do
-	initRepo' desc
+initRepo :: Bool -> Bool -> FilePath -> Maybe String -> Maybe StandardGroup -> IO UUID
+initRepo True primary_assistant_repo dir desc mgroup = inDir dir $ do
+	initRepo' desc mgroup
 	{- Initialize the master branch, so things that expect
 	 - to have it will work, before any files are added. -}
 	unlessM (Git.Config.isBare <$> gitRepo) $
@@ -455,17 +461,19 @@
 		inRepo $ Git.Command.run
 			[Param "config", Param "gc.auto", Param "0"]
 	getUUID
-{- Repo already exists, could be a non-git-annex repo though. -}
-initRepo False _ dir desc = inDir dir $ do
-	initRepo' desc
+{- Repo already exists, could be a non-git-annex repo though so
+ - still initialize it. -}
+initRepo False _ dir desc mgroup = inDir dir $ do
+	initRepo' desc mgroup
 	getUUID
 
-initRepo' :: Maybe String -> Annex ()
-initRepo' desc = unlessM isInitialized $ do
+initRepo' :: Maybe String -> Maybe StandardGroup -> Annex ()
+initRepo' desc mgroup = unlessM isInitialized $ do
 	initialize desc
+	u <- getUUID
+	maybe noop (defaultStandardGroup u) mgroup
 	{- Ensure branch gets committed right away so it is
-	 - available for merging when a removable drive repo is being
-	 - added. -}
+	 - available for merging immediately. -}
 	Annex.Branch.commit "update"
 
 {- Checks if the user can write to a directory.
diff --git a/Assistant/WebApp/Configurators/Ssh.hs b/Assistant/WebApp/Configurators/Ssh.hs
--- a/Assistant/WebApp/Configurators/Ssh.hs
+++ b/Assistant/WebApp/Configurators/Ssh.hs
@@ -61,6 +61,10 @@
 	| ExistingSshKey
 	deriving (Eq, Show)
 
+-- Is a repository a new one that's being created, or did it already exist
+-- and is just being added.
+data RepoStatus = NewRepo | ExistingRepo
+
 {- SshInput is only used for applicative form prompting, this converts
  - the result of such a form into a SshData. -}
 mkSshData :: SshInput -> SshData
@@ -135,6 +139,7 @@
 	normalize i = i { inputDirectory = normalizedir <$> inputDirectory i }
 	normalizedir d
 		| "~/" `T.isPrefixOf` d = T.drop 2 d
+		| "/~/" `T.isPrefixOf` d = T.drop 3 d
 		| otherwise = d
 
 data ServerStatus
@@ -425,9 +430,7 @@
 		m <- liftAnnex readRemoteLog
 		case M.lookup "type" =<< M.lookup u m of
 			Just "gcrypt" -> combineExistingGCrypt sshdata' u
-			-- This handles enabling git repositories
-			-- that already exist.
-			_ -> makeSshRepo sshdata'
+			_ -> makeSshRepo ExistingRepo sshdata'
 
 {- The user has confirmed they want to combine with a ssh repository,
  - which is not known to us. So it might be using gcrypt. -}
@@ -435,7 +438,7 @@
 getCombineSshR sshdata = prepSsh False sshdata $ \sshdata' ->
 	sshConfigurator $
 		checkExistingGCrypt sshdata' $
-			void $ liftH $ makeSshRepo sshdata'
+			void $ liftH $ makeSshRepo ExistingRepo sshdata'
 
 getRetrySshR :: SshData -> Handler ()
 getRetrySshR sshdata = do
@@ -444,10 +447,10 @@
 
 {- Making a new git repository. -}
 getMakeSshGitR :: SshData -> Handler Html
-getMakeSshGitR sshdata = prepSsh True sshdata makeSshRepo
+getMakeSshGitR sshdata = prepSsh True sshdata (makeSshRepo NewRepo)
 
 getMakeSshRsyncR :: SshData -> Handler Html
-getMakeSshRsyncR sshdata = prepSsh False (rsyncOnly sshdata) makeSshRepo
+getMakeSshRsyncR sshdata = prepSsh False (rsyncOnly sshdata) (makeSshRepo NewRepo)
 
 rsyncOnly :: SshData -> SshData
 rsyncOnly sshdata = sshdata { sshCapabilities = [RsyncCapable] }
@@ -456,7 +459,7 @@
 getMakeSshGCryptR sshdata NoRepoKey = whenGcryptInstalled $
 	withNewSecretKey $ getMakeSshGCryptR sshdata . RepoKey
 getMakeSshGCryptR sshdata (RepoKey keyid) = whenGcryptInstalled $
-	prepSsh False sshdata $ makeGCryptRepo keyid
+	prepSsh False sshdata $ makeGCryptRepo NewRepo keyid
 	
 {- Detect if the user entered a location with an existing, known
  - gcrypt repository, and enable it. Otherwise, runs the action. -}
@@ -472,10 +475,11 @@
 
 {- Enables an existing gcrypt special remote. -}
 enableGCrypt :: SshData -> RemoteName -> Handler Html
-enableGCrypt sshdata reponame = 
-	setupCloudRemote TransferGroup Nothing $ 
-		enableSpecialRemote reponame GCrypt.remote Nothing $ M.fromList
-			[("gitrepo", genSshUrl sshdata)]
+enableGCrypt sshdata reponame = setupRemote postsetup Nothing Nothing mk
+  where
+	mk = enableSpecialRemote reponame GCrypt.remote Nothing $
+		M.fromList [("gitrepo", genSshUrl sshdata)]
+	postsetup _ = redirect DashboardR
 
 {- Combining with a gcrypt repository that may not be
  - known in remote.log, so probe the gcrypt repo. -}
@@ -523,10 +527,10 @@
 		]
 	rsynconly = onlyCapability origsshdata RsyncCapable
 
-makeSshRepo :: SshData -> Handler Html
-makeSshRepo sshdata
+makeSshRepo :: RepoStatus -> SshData -> Handler Html
+makeSshRepo rs sshdata
 	| onlyCapability sshdata RsyncCapable = setupCloudRemote TransferGroup Nothing mk
-	| otherwise = makeSshRepoConnection mk setup
+	| otherwise = makeSshRepoConnection rs mk setup
   where
 	mk = makeSshRemote sshdata
 	-- Record the location of the ssh remote in the remote log, so it
@@ -539,16 +543,21 @@
 			M.insert "name" (fromMaybe (Remote.name r) (M.lookup "name" c)) c
 		configSet (Remote.uuid r) c'
 
-makeSshRepoConnection :: Annex RemoteName -> (Remote -> Annex ()) -> Handler Html
-makeSshRepoConnection mk setup = setupRemote postsetup TransferGroup Nothing mk
+makeSshRepoConnection :: RepoStatus -> Annex RemoteName -> (Remote -> Annex ()) -> Handler Html
+makeSshRepoConnection rs mk setup = setupRemote postsetup mgroup Nothing mk
   where
+	mgroup = case rs of
+		NewRepo -> Just TransferGroup
+		ExistingRepo -> Nothing
 	postsetup r = do
 		liftAssistant $ sendRemoteControl RELOAD
 		liftAnnex $ setup r
-		redirect $ EditNewRepositoryR (Remote.uuid r)
+		case rs of
+			NewRepo -> redirect $ EditNewRepositoryR (Remote.uuid r)
+			ExistingRepo -> redirect DashboardR
 
-makeGCryptRepo :: KeyId -> SshData -> Handler Html
-makeGCryptRepo keyid sshdata = makeSshRepoConnection mk (const noop)
+makeGCryptRepo :: RepoStatus -> KeyId -> SshData -> Handler Html
+makeGCryptRepo rs keyid sshdata = makeSshRepoConnection rs mk (const noop)
   where
 	mk = makeGCryptRemote (sshRepoName sshdata) (genSshUrl sshdata) keyid
 
@@ -591,21 +600,22 @@
 				$(widgetFile "configurators/rsync.net/encrypt")
 
 getMakeRsyncNetSharedR :: SshData -> Handler Html
-getMakeRsyncNetSharedR = makeSshRepo . rsyncOnly
+getMakeRsyncNetSharedR = makeSshRepo NewRepo . rsyncOnly
 
-{- Make a gcrypt special remote on rsync.net. -}
+{- Make a new gcrypt special remote on rsync.net. -}
 getMakeRsyncNetGCryptR :: SshData -> RepoKey -> Handler Html
 getMakeRsyncNetGCryptR sshdata NoRepoKey = whenGcryptInstalled $
 	withNewSecretKey $ getMakeRsyncNetGCryptR sshdata . RepoKey
 getMakeRsyncNetGCryptR sshdata (RepoKey keyid) = whenGcryptInstalled $
-	sshSetup (mkSshInput sshdata) [sshhost, gitinit] Nothing $ makeGCryptRepo keyid sshdata
+	sshSetup (mkSshInput sshdata) [sshhost, gitinit] Nothing $
+		makeGCryptRepo NewRepo keyid sshdata
   where
 	sshhost = genSshHost (sshHostName sshdata) (sshUserName sshdata)
 	gitinit = "git init --bare " ++ T.unpack (sshDirectory sshdata)
 
 enableRsyncNet :: SshInput -> String -> Handler Html
 enableRsyncNet sshinput reponame = 
-	prepRsyncNet sshinput reponame $ makeSshRepo . rsyncOnly
+	prepRsyncNet sshinput reponame $ makeSshRepo ExistingRepo . rsyncOnly
 
 enableRsyncNetGCrypt :: SshInput -> RemoteName -> Handler Html
 enableRsyncNetGCrypt sshinput reponame = 
diff --git a/Assistant/WebApp/MakeRemote.hs b/Assistant/WebApp/MakeRemote.hs
--- a/Assistant/WebApp/MakeRemote.hs
+++ b/Assistant/WebApp/MakeRemote.hs
@@ -31,13 +31,15 @@
  - This includes displaying the connectionNeeded nudge if appropariate.
  -}
 setupCloudRemote :: StandardGroup -> Maybe Cost -> Annex RemoteName -> Handler a
-setupCloudRemote = setupRemote $ redirect . EditNewCloudRepositoryR . Remote.uuid
+setupCloudRemote = setupRemote postsetup . Just
+  where
+	postsetup = redirect . EditNewCloudRepositoryR . Remote.uuid
 
-setupRemote :: (Remote -> Handler a) -> StandardGroup -> Maybe Cost -> Annex RemoteName -> Handler a
-setupRemote postsetup defaultgroup mcost getname = do
+setupRemote :: (Remote -> Handler a) -> Maybe StandardGroup -> Maybe Cost -> Annex RemoteName -> Handler a
+setupRemote postsetup mgroup mcost getname = do
 	r <- liftAnnex $ addRemote getname
 	liftAnnex $ do
-		setStandardGroup (Remote.uuid r) defaultgroup
+		maybe noop (defaultStandardGroup (Remote.uuid r)) mgroup
 		maybe noop (Config.setRemoteCost (Remote.repo r)) mcost
 	liftAssistant $ syncRemote r
 	postsetup r
diff --git a/Assistant/WebApp/Types.hs b/Assistant/WebApp/Types.hs
--- a/Assistant/WebApp/Types.hs
+++ b/Assistant/WebApp/Types.hs
@@ -83,27 +83,15 @@
 instance RenderMessage WebApp FormMessage where
 	renderMessage _ _ = defaultFormMessage
 
-{- Runs an Annex action from the webapp.
- -
- - When the webapp is run outside a git-annex repository, the fallback
- - value is returned.
- -}
 #if MIN_VERSION_yesod(1,2,0)
-liftAnnexOr :: forall a. a -> Annex a -> Handler a
-#else
-liftAnnexOr :: forall sub a. a -> Annex a -> GHandler sub WebApp a
-#endif
-liftAnnexOr fallback a = ifM (noAnnex <$> getYesod)
-	( return fallback
-	, liftAssistant $ liftAnnex a
-	)
-
-#if MIN_VERSION_yesod(1,2,0)
 instance LiftAnnex Handler where
 #else
 instance LiftAnnex (GHandler sub WebApp) where
 #endif
-	liftAnnex = liftAnnexOr $ error "internal liftAnnex"
+	liftAnnex a = ifM (noAnnex <$> getYesod)
+		( error "internal liftAnnex"
+		, liftAssistant $ liftAnnex a
+		)
 
 #if MIN_VERSION_yesod(1,2,0)
 instance LiftAnnex (WidgetT WebApp IO) where
diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,20 @@
+git-annex (5.20140606) unstable; urgency=medium
+
+  * webapp: When adding a new local repository, fix bug that caused its
+    group and preferred content to be set in the current repository,
+    even when not combining.
+  * webapp: Avoid stomping on existing description, group and
+    preferred content settings when enabling or combining with
+    an already existing remote.
+  * assistant: Make sanity checker tmp dir cleanup code more robust.
+  * unused: Avoid checking view branches for unused files.
+  * webapp: Include ssh port in mangled hostname.
+  * Windows: Fix bug introduced in last release that caused files
+    in the git-annex branch to have lines teminated with \r.
+  * Windows: Fix retrieving of files from local bare git repositories.
+
+ -- Joey Hess <joeyh@debian.org>  Fri, 06 Jun 2014 12:54:06 -0400
+
 git-annex (5.20140529) unstable; urgency=medium
 
   * Fix encoding of data written to git-annex branch. Avoid truncating
diff --git a/Command/Unused.hs b/Command/Unused.hs
--- a/Command/Unused.hs
+++ b/Command/Unused.hs
@@ -35,6 +35,7 @@
 import Annex.CatFile
 import Types.Key
 import Git.FilePath
+import Logs.View (is_branchView)
 
 def :: [Command]
 def = [withOptions [unusedFromOption] $ command "unused" paramNothing seek
@@ -270,6 +271,7 @@
 	ourbranchend = '/' : Git.fromRef Annex.Branch.name
 	ourbranches (_, b) = not (ourbranchend `isSuffixOf` b)
 		&& not ("refs/synced/" `isPrefixOf` b)
+		&& not (is_branchView (Git.Ref b))
 	addHead headRef refs = case headRef of
 		-- if HEAD diverges from all branches (except the branch it
 		-- points to), run the actions on staged keys (and keys
diff --git a/INSTALL b/INSTALL
--- a/INSTALL
+++ b/INSTALL
@@ -3,6 +3,7 @@
 [[!table format=dsv header=yes data="""
 detailed instructions             | quick install
 [[OSX]]                           | [download git-annex.app](http://downloads.kitenet.net/git-annex/OSX/current/)
+&nbsp;&nbsp;[[Homebrew]]            | `brew install git-annex`
 [[Android]]                       | [download git-annex.apk](http://downloads.kitenet.net/git-annex/android/current/) **beta**
 [[Linux|linux_standalone]]        | [download prebuilt linux tarball](http://downloads.kitenet.net/git-annex/linux/current/)
 &nbsp;&nbsp;[[Debian]]            | `apt-get install git-annex`
diff --git a/Logs/PreferredContent.hs b/Logs/PreferredContent.hs
--- a/Logs/PreferredContent.hs
+++ b/Logs/PreferredContent.hs
@@ -18,6 +18,7 @@
 	groupPreferredContentMapRaw,
 	checkPreferredContentExpression,
 	setStandardGroup,
+	defaultStandardGroup,
 	preferredRequiredMapsLoad,
 ) where
 
@@ -133,10 +134,20 @@
 	tokens = exprParser matchAll matchAll emptyGroupMap M.empty Nothing expr
 
 {- Puts a UUID in a standard group, and sets its preferred content to use
- - the standard expression for that group, unless something is already set. -}
+ - the standard expression for that group (unless preferred content is
+ - already set). -}
 setStandardGroup :: UUID -> StandardGroup -> Annex ()
 setStandardGroup u g = do
 	groupSet u $ S.singleton $ fromStandardGroup g
-	m <- preferredContentMap
-	unless (isJust $ M.lookup u m) $
+	unlessM (isJust . M.lookup u <$> preferredContentMap) $
 		preferredContentSet u "standard"
+
+{- Avoids overwriting the UUID's standard group or preferred content
+ - when it's already been configured. -}
+defaultStandardGroup :: UUID -> StandardGroup -> Annex ()
+defaultStandardGroup u g = 
+	unlessM (hasgroup <||> haspc) $
+		setStandardGroup u g
+  where
+	hasgroup = not . S.null <$> lookupGroups u
+	haspc = isJust . M.lookup u <$> preferredContentMap
diff --git a/Logs/View.hs b/Logs/View.hs
--- a/Logs/View.hs
+++ b/Logs/View.hs
@@ -15,6 +15,7 @@
 	removeView,
 	recentViews,
 	branchView,
+	is_branchView,
 	prop_branchView_legal,
 ) where
 
@@ -86,6 +87,11 @@
 	forcelegal s
 		| Git.Ref.legal True s = s
 		| otherwise = map (\c -> if isAlphaNum c then c else '_') s
+
+is_branchView :: Git.Branch -> Bool
+is_branchView (Ref b)
+	| b == branchViewPrefix = True
+	| otherwise = (branchViewPrefix ++ "/") `isPrefixOf` b
 
 prop_branchView_legal :: View -> Bool
 prop_branchView_legal = Git.Ref.legal False . fromRef . branchView
diff --git a/Utility/Hash.hs b/Utility/Hash.hs
--- a/Utility/Hash.hs
+++ b/Utility/Hash.hs
@@ -67,4 +67,4 @@
 #endif
 	]
   where
-	foo = L.fromStrict $ T.encodeUtf8 $ T.pack "foo"
+	foo = L.fromChunks [T.encodeUtf8 $ T.pack "foo"]
diff --git a/Utility/WebApp.hs b/Utility/WebApp.hs
--- a/Utility/WebApp.hs
+++ b/Utility/WebApp.hs
@@ -97,7 +97,14 @@
 
 -- disable buggy sloworis attack prevention code
 webAppSettings :: Settings
-webAppSettings = setTimeout (30 * 60) defaultSettings
+
+#if MIN_VERSION_warp(2,1,0)
+webAppSettings = setTimeout halfhour defaultSettings
+#else
+webAppSettings = defaultSettings { settingsTimeout = halfhour }
+#endif
+  where
+	halfhour = 30 * 60
 
 {- Binds to a local socket, or if specified, to a socket on the specified
  - hostname or address. Selects any free port, unless the hostname ends with
diff --git a/debian/changelog b/debian/changelog
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,20 @@
+git-annex (5.20140606) unstable; urgency=medium
+
+  * webapp: When adding a new local repository, fix bug that caused its
+    group and preferred content to be set in the current repository,
+    even when not combining.
+  * webapp: Avoid stomping on existing description, group and
+    preferred content settings when enabling or combining with
+    an already existing remote.
+  * assistant: Make sanity checker tmp dir cleanup code more robust.
+  * unused: Avoid checking view branches for unused files.
+  * webapp: Include ssh port in mangled hostname.
+  * Windows: Fix bug introduced in last release that caused files
+    in the git-annex branch to have lines teminated with \r.
+  * Windows: Fix retrieving of files from local bare git repositories.
+
+ -- Joey Hess <joeyh@debian.org>  Fri, 06 Jun 2014 12:54:06 -0400
+
 git-annex (5.20140529) unstable; urgency=medium
 
   * Fix encoding of data written to git-annex branch. Avoid truncating
diff --git a/doc/assistant.mdwn b/doc/assistant.mdwn
--- a/doc/assistant.mdwn
+++ b/doc/assistant.mdwn
@@ -13,7 +13,7 @@
 
 ## intro screencast
 
-[[!inline feeds=no template=bare pages=videos/git-annex_assistant_introduction]]
+[[!inline feeds=no template=bare pages=videos/git-annex_assistant_lan]]
 
 ## documentation
 
diff --git a/doc/bugs.mdwn b/doc/bugs.mdwn
--- a/doc/bugs.mdwn
+++ b/doc/bugs.mdwn
@@ -1,8 +1,7 @@
-This is git-annex's bug list, including [[confirmed]], [[unconfirmed]],
-and [[moreinfo]]. Closed bugs are moved to [[done]].
+This is git-annex's bug list. Closed bugs are moved to [[done]].
 
 [[!inline pages="./bugs/* and !./bugs/*/* and !./bugs/done and !link(done) 
-and !./bugs/moreinfo and !./bugs/confirmed and !./bugs/unconfirmed
-and !*/Discussion" actions=yes postform=yes show=0 archive=yes]]
+and !./bugs/moreinfo and !./bugs/confirmed and !./bugs/forwarded and !*/Discussion"
+actions=yes postform=yes show=0 archive=yes template=buglist]]
 
 [[!edittemplate template=templates/bugtemplate match="bugs/*" silent=yes]]
diff --git a/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes.mdwn b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes.mdwn
--- a/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes.mdwn
+++ b/doc/bugs/5.20140517_fails_to_talk_to_other_5.x_git-annex_remotes.mdwn
@@ -33,3 +33,5 @@
 """]]
 
 If this is intended behavior, it seems to me the major version of git annex should be bumped, at the very least... -- [[anarcat]]
+
+[[!tag moreinfo]]
diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn b/doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn
--- a/doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn
+++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn
@@ -17,3 +17,5 @@
 The daemon.log is fairly long, but not particulary interesting: [[https://ssl.zerodogg.org/~zerodogg/private/tmp/daemon.log-2014-02-25.1]]
 
 The «resource vanished (Broken pipe)» at the end is the result of me killing the prune-packed in order to be able to use the machine again.
+
+[[!tag moreinfo]]
diff --git a/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_.mdwn b/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_.mdwn
--- a/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_.mdwn
+++ b/doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_.mdwn
@@ -42,3 +42,5 @@
 
 # End of transcript or log.
 """]]
+
+[[!tag moreinfo]]
diff --git a/doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn
--- a/doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn
+++ b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn
@@ -21,3 +21,5 @@
 Watcher crashed: PauseWatcher
 [2014-03-26 08:54:57 CET] Watcher: warning Watcher crashed: PauseWatcher
 """]]
+
+[[!tag moreinfo]]
diff --git a/doc/bugs/Daemon_stops_working_on_mounted_CIF_share.mdwn b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share.mdwn
--- a/doc/bugs/Daemon_stops_working_on_mounted_CIF_share.mdwn
+++ b/doc/bugs/Daemon_stops_working_on_mounted_CIF_share.mdwn
@@ -8,3 +8,5 @@
 
 ### What version of git-annex are you using? On what operating system?
 Standalone git-annex 5.20140421-g515d251 on CentOS 6.5
+
+> [[done]] --[[Joey]]
diff --git a/doc/bugs/Git-Annex_requires_all_repositories_to_repair.mdwn b/doc/bugs/Git-Annex_requires_all_repositories_to_repair.mdwn
--- a/doc/bugs/Git-Annex_requires_all_repositories_to_repair.mdwn
+++ b/doc/bugs/Git-Annex_requires_all_repositories_to_repair.mdwn
@@ -1,3 +1,3 @@
 I recently had my git-annex repository die and it needed to be repaired. Two of my repositories are external hard drives. When I tried to use git-annex repair, it would churn for some hours, then error because the external hard drives were not plugged in. When I brought the two hard drives home from the various places that they are (safely) stored, it all worked fine, but it would have been great if git-annex repair could somehow do what it could with what was connected and do the rest as and when the other drives are plugged in. This must only become more of a problem as git-annex is used for longer, as one may have a handful of USB keys storing a little on each.
 
-[[moreinfo]]
+[[!taglink moreinfo]]
diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn b/doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn
--- a/doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn
+++ b/doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn
@@ -123,4 +123,4 @@
 """]]
 
 
-> [[confirmed]] (but may be out of scope for git-annex) --[[Joey]] 
+> [[!taglink confirmed]] (but may be out of scope for git-annex) --[[Joey]] 
diff --git a/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn
--- a/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn
+++ b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn
@@ -174,4 +174,4 @@
 fatal: The remote end hung up unexpectedly
 """]]
 
-[[moreinfo]]
+[[!taglink moreinfo]]
diff --git a/doc/bugs/More_build_oddities_under_OpenBSD.mdwn b/doc/bugs/More_build_oddities_under_OpenBSD.mdwn
--- a/doc/bugs/More_build_oddities_under_OpenBSD.mdwn
+++ b/doc/bugs/More_build_oddities_under_OpenBSD.mdwn
@@ -35,3 +35,5 @@
 
 # End of transcript or log.
 """]]
+
+[[!tag moreinfo]]
diff --git a/doc/bugs/Recreating_remote_repository__39__s_annex.mdwn b/doc/bugs/Recreating_remote_repository__39__s_annex.mdwn
--- a/doc/bugs/Recreating_remote_repository__39__s_annex.mdwn
+++ b/doc/bugs/Recreating_remote_repository__39__s_annex.mdwn
@@ -30,3 +30,5 @@
 Please make sure you have the correct access rights
 and the repository exists.
 """]]
+
+[[!tag moreinfo]]
diff --git a/doc/bugs/SanityCheckerStartup_crashed.mdwn b/doc/bugs/SanityCheckerStartup_crashed.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/SanityCheckerStartup_crashed.mdwn
@@ -0,0 +1,28 @@
+### Please describe the problem.
+On startup, the webapp shows the following warning in a box to the upper right of the screen, with an offer to "Restart thread":
+
+    SanityCheckerStartup crashed: /home/anton/Halvhemligt/.git/annex/misctmp/IMG_32978856.JPG: getFileStatus: does not exist (No such file or directory)
+
+Restarting it causes it to crash again immediately. The log shows the same:
+
+    SanityCheckerStartup crashed: /home/anton/Halvhemligt/.git/annex/misctmp/IMG_32978856.JPG: getFileStatus: does not exist (No such file or directory)
+    [2014-06-02 23:31:13 CEST] SanityCheckerStartup: warning SanityCheckerStartup crashed: /home/anton/Halvhemligt/.git/annex/misctmp/IMG_32978856.JPG: getFileStatus: does not exist (No such file or directory)
+
+/home/anton/Halvhemligt/.git/annex/misctmp/ contains the following:
+
+    lrwxrwxrwx 2 anton anton 199 15 maj 21.08 IMG_32978856.JPG -> ../.git/annex/objects/z3/K2/SHA256E-s728022--12de1f194042af3f8c4dbee15c317de0511bbb8b9e8a0463fffb07e7bbc58bb5.JPG/SHA256E-s728022--12de1f194042af3f8c4dbee15c317de0511bbb8b9e8a0463fffb07e7bbc58bb5.JPG
+    lrwxrwxrwx 2 anton anton 199 15 maj 21.09 IMG_32988856.JPG -> ../.git/annex/objects/vw/30/SHA256E-s688301--8bb6d636163b443705c9a333194116da3937d8272b70613ca6345eaf6bba1255.JPG/SHA256E-s688301--8bb6d636163b443705c9a333194116da3937d8272b70613ca6345eaf6bba1255.JPG
+    lrwxrwxrwx 2 anton anton 199 15 maj 21.17 IMG_33198856.JPG -> ../.git/annex/objects/p3/WG/SHA256E-s754900--224e6489370527156293912e11390af517ad4ef9374ee22c8324b5af5fac0dd7.JPG/SHA256E-s754900--224e6489370527156293912e11390af517ad4ef9374ee22c8324b5af5fac0dd7.JPG
+
+The symlinks are all broken. IMG_3297.JPG, IMG_3298.JPG and IMG_3319.JPG exist in the repository, but I do not recognize the appended numbers 8856. git log shows that these three files have not been modified since they were first added.
+
+### What steps will reproduce the problem?
+No idea. I believe this repository was created in the webapp but most of the changes to it has been done in the CLI.
+
+### What version of git-annex are you using? On what operating system?
+Precompiled 5.20140530 on Arch Linux x86_64 (git-annex-bin package from the AUR), but 5.20140518 had the same problem.
+
+### Please provide any additional information below.
+The crash has not caused any real problem for me that I'm aware of. I'm just reporting it because the error message looks a little scary.
+
+> [[dup|done]] --[[Joey]]
diff --git a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn
--- a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn
+++ b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn
@@ -20,3 +20,7 @@
 
 # End of transcript or log.
 """]]
+
+[[!meta title="XMPP does not work with jabber.ccc.de"]]
+
+[[!tag moreinfo]]
diff --git a/doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn b/doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn
--- a/doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn
+++ b/doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn
@@ -19,4 +19,4 @@
 # End of transcript or log.
 """]]
 
-[[moreinfo]]
+[[!tag moreinfo]]
diff --git a/doc/bugs/VFAT_crazy_limit_on_max_filenames_in_directory.mdwn b/doc/bugs/VFAT_crazy_limit_on_max_filenames_in_directory.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/VFAT_crazy_limit_on_max_filenames_in_directory.mdwn
@@ -0,0 +1,2 @@
+VFAT limits have been hit when the .git/annex/journal/
+directory gets a lot of stuff in it. See <http://bugs.debian.org/696313>
diff --git a/doc/bugs/acl_not_honoured_in_rsync_remote.mdwn b/doc/bugs/acl_not_honoured_in_rsync_remote.mdwn
--- a/doc/bugs/acl_not_honoured_in_rsync_remote.mdwn
+++ b/doc/bugs/acl_not_honoured_in_rsync_remote.mdwn
@@ -55,3 +55,5 @@
 this is probably not a bug of git-annex alone, but affects its operation and might be solvable by invoking rsync differently.
 
 (this is kind of a follow-up on [[forum/__34__permission_denied__34___in_fsck_on_shared_repo]])
+
+[[!tag forwarded]]
diff --git a/doc/bugs/adding_existing_repo_as_remote_in_webapp_may_reset_its_group.mdwn b/doc/bugs/adding_existing_repo_as_remote_in_webapp_may_reset_its_group.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/adding_existing_repo_as_remote_in_webapp_may_reset_its_group.mdwn
@@ -0,0 +1,16 @@
+Adding eg a ssh remote when the remote repo already exists, in the webapp,
+resets its group to transfer. It also clears any preferred content
+settings.
+
+Adding existing local repositories or repositories from removable drives
+may have the same problems. Didn't check yet.
+
+[[!tag confirmed]] --[[Joey]] 
+
+> Fixed for local repos and repos on removable drives. Still open for
+> ssh remotes (incl gcrypt). --[[Joey]]
+
+>> Fixed for ssh (including gcrypt) too.
+>>
+>> Also affected enabling existing special remotes, like webdav; that's
+>> also fixed. [[done]] --[[Joey]]
diff --git a/doc/bugs/android_4.3_install_failed_.mdwn b/doc/bugs/android_4.3_install_failed_.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/android_4.3_install_failed_.mdwn
@@ -0,0 +1,19 @@
+### Please describe the problem.
+Impossible installation on Android 4.3
+
+
+### What version of git-annex are you using? On what operating system?
+The lastest version of git-annex, and Android 4.3, **without sdcard** (Wiko Wax)
+
+### Please provide any additional information below.
+
+The message given by git-annex:
+
+
+    Falling back to hardcoded app location; cannot find expected files in /data/app-lib 
+    mkdir: can't create directory '/sdcard/git-annex.home': Permission denied
+    mkdir of /sdcard/git-annex.home failed !
+    lib/lib.runshell.so: line 133: can't create /sdcard/git-annex.home/git-annex-install.log: Permission denied 
+    Installation failed ! Please report a but and attach /sdcard/git-annex.home/git-annex-install.log
+
+
diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn b/doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn
--- a/doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn
+++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn
@@ -29,4 +29,4 @@
 Codename:	precise
 """]]
 
-> [[confirmed]] (but may be out of scope) --[[Joey]] 
+> [[!taglink confirmed]] (but may be out of scope) --[[Joey]] 
diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn b/doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn
--- a/doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn
+++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn
@@ -44,4 +44,4 @@
 Codename:	precise
 """]]
 
-> [[confirmed]] (but may be out of scope) --[[Joey]] 
+> [[!taglink confirmed]] (but may be out of scope) --[[Joey]] 
diff --git a/doc/bugs/confirmed.mdwn b/doc/bugs/confirmed.mdwn
--- a/doc/bugs/confirmed.mdwn
+++ b/doc/bugs/confirmed.mdwn
@@ -1,8 +1,5 @@
-These bug reports have been confirmed to be real bugs, and so are likely
+This tag is for bugs that have been confirmed to be real bugs, and so are likely
 to be the next bugs fixed.
 
-If your bug report is not listed here, you probably need to provide more
-information so that the bug can be reproduced. See also: [[unconfirmed]]
-
-[[!inline pages="./* and link(./confirmed) and !link(./done) and !./unconfirmed" show=0
-archive=yes]]
+If your bug report is not tagged as confirmed, you probably need to provide more
+information so that the bug can be reproduced.
diff --git a/doc/bugs/error_compiling_network-info_when_compiling_git-annex.mdwn b/doc/bugs/error_compiling_network-info_when_compiling_git-annex.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/error_compiling_network-info_when_compiling_git-annex.mdwn
@@ -0,0 +1,10 @@
+### Please describe the problem.
+I'm not sure if you'll consider this a bug, or if I'm just doing something wrong, but I'm having trouble compiling git-annex on OmniOS (a derivative of OpenSolaris). I've got GHC 7.6.3 built and installed (bootstrapped using the Solaris binaries for GHC 7.0.3). I used it to build haskell-platform (although I had to disable the OpenGL-related packages to do so), and now I'm trying to use cabal to build git-annex and its dependencies. I've started with a minimal build; this will end up as an archive remote so it should be sufficient. The instructions <http://git-annex.branchable.com/install/cabal/> say to run
+
+    cabal install git-annex --bindir=$HOME/bin -f"-assistant -webapp -webdav -pairing -xmpp -dns"
+
+This builds a bunch of stuff but then fails to compile the network-info package. As I understand it, the git-annex package only needs network-info if it's compiled with pairing supoort (I'm looking at <https://github.com/joeyh/git-annex/blob/master/git-annex.cabal>), and this command is telling it to disable pairing.
+
+Is there some other dependency that needs network-info? Is there a way to find out?
+
+Thanks
diff --git a/doc/bugs/fails_to_get_content_from_bare_repo_on_windows.mdwn b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows.mdwn
--- a/doc/bugs/fails_to_get_content_from_bare_repo_on_windows.mdwn
+++ b/doc/bugs/fails_to_get_content_from_bare_repo_on_windows.mdwn
@@ -138,3 +138,6 @@
     supported repository version: 5
     upgrade supported from repository versions: 2 3 4
                                                                   
+[[!tag confirmed]]
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/forwarded.mdwn b/doc/bugs/forwarded.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/forwarded.mdwn
@@ -0,0 +1,2 @@
+This tag is for bugs that have been forwarded from git-annex to some other
+software, such as a library it uses.
diff --git a/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog.mdwn b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog.mdwn
--- a/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog.mdwn
+++ b/doc/bugs/git-annex_branch_shows_commit_with_looong_commitlog.mdwn
@@ -70,3 +70,5 @@
 the last line repeats about 4000 times.
 
 i would love to paste the daemon.log.1 file, but it seems like it containts encryption credentials... which i have no idea how to get rid of or change.
+
+[[!tag moreinfo]]
diff --git a/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de.mdwn b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de.mdwn
--- a/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de.mdwn
+++ b/doc/bugs/git_annex_daemon_crashes_when_authenticating_with_jabber.de.mdwn
@@ -20,3 +20,7 @@
 git-annex: <socket: 44>: hGetBuf: resource vanished (Connection reset by peer)
 git-annex: interrupted
 """]]
+
+[[!tag confirmed forwarded]]
+
+[[!meta title="OSX xmpp crash with jabber.de"]]
diff --git a/doc/bugs/git_annex_ignores_GIT__95__SSH__63__.mdwn b/doc/bugs/git_annex_ignores_GIT__95__SSH__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git_annex_ignores_GIT__95__SSH__63__.mdwn
@@ -0,0 +1,24 @@
+### Please describe the problem.
+I'm attempting to set up an ssh remote on windows. I've configured a key pair for it and set GIT_SSH to use plink. git fetch works correctly, but git annex info shows this:
+
+[[!format sh """
+C:\Users\db48x\annex>git annex info
+repository mode: direct
+trusted repositories: "ssh": argonath: no address associated with name
+
+  Remote argonath does not have git-annex installed; setting annex-ignore
+"""]]
+
+etc. Apparently it's trying to use the included ssh binary instead of my GIT_SSH setting.
+
+### What version of git-annex are you using? On what operating system?
+
+    git-annex version: 5.20140529-gb71f9bf
+    build flags: Assistant Pairing Testsuite S3 DNS Feeds Quvi TDFA CryptoHash
+    key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+    remote types: git gcrypt S3 bup directory rsync web tahoe glacier ddar hook external
+    local repository version: 5
+    supported repository version: 5
+    upgrade supported from repository versions: 2 3 4
+
+> [[dup|done]] of [[todo/git-annex_ignores_GIT__95__SSH]] --[[Joey]]
diff --git a/doc/bugs/gpg-agent.mdwn b/doc/bugs/gpg-agent.mdwn
--- a/doc/bugs/gpg-agent.mdwn
+++ b/doc/bugs/gpg-agent.mdwn
@@ -1,6 +1,8 @@
 ### Please describe the problem.
 I'm running git-annex on OSX 10.9.3. The problem is that during sync with an git-annex remote the system gets flooded with gpg-agent processes which are never stopped, eventually running out of user processes.
 
+[[!tag moreinfo]]
+
 ### What steps will reproduce the problem?
 Any synchronization of a lot of files with a git-annex remote.
 
diff --git a/doc/bugs/gpg-agent/comment_1_86860841aaa38541968693ec02f6a506._comment b/doc/bugs/gpg-agent/comment_1_86860841aaa38541968693ec02f6a506._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/gpg-agent/comment_1_86860841aaa38541968693ec02f6a506._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.176"
+ subject="comment 1"
+ date="2014-05-30T19:15:33Z"
+ content="""
+What I see in the log is git-annex is syncing files to/from the remote \"diskstation\". This remote is not encrypted at all, so git-annex is not using gpg. There is no mention of gpg in the log at all.
+
+So, I don't see any indication that whatever is causing too many gpg-agent processes to be spawned is git-annex. Can you share more information that would point toward git-annex being the cause of this problem?
+"""]]
diff --git a/doc/bugs/import_leaves_stray___96__.tmp__96___files_if_interrupted.mdwn b/doc/bugs/import_leaves_stray___96__.tmp__96___files_if_interrupted.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/import_leaves_stray___96__.tmp__96___files_if_interrupted.mdwn
@@ -0,0 +1,9 @@
+### Please describe the problem.
+
+I have found various `.tmp` files in a directory in which I performed various `git annex import` that failed because the destination disk was full.
+
+These files should be removed when import detects that its has no more space to proceed and exists.
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex 5.20140517.4 in Ubuntu 12.04.
diff --git a/doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn b/doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn
--- a/doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn
+++ b/doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn
@@ -46,3 +46,5 @@
 
 # End of transcript or log.
 """]]
+
+> [[done]] --[[Joey]]
diff --git a/doc/bugs/moreinfo.mdwn b/doc/bugs/moreinfo.mdwn
--- a/doc/bugs/moreinfo.mdwn
+++ b/doc/bugs/moreinfo.mdwn
@@ -1,6 +1,2 @@
-If your bug report is listed here, it has been flagged as needing more
-information. Please respond to the bug and provide the requested
-information.
-
-[[!inline pages="./* and link(./moreinfo) and !link(./done) and !*/Discussion" sort=mtime show=0
-archive=yes]]
+This tags is for bugs needing more information from their submitter.
+Please respond to the bug and provide the requested information.
diff --git a/doc/bugs/protocol_mismatch_after_interrupt.mdwn b/doc/bugs/protocol_mismatch_after_interrupt.mdwn
--- a/doc/bugs/protocol_mismatch_after_interrupt.mdwn
+++ b/doc/bugs/protocol_mismatch_after_interrupt.mdwn
@@ -30,4 +30,4 @@
 
 -- [[anarcat]]
 
-[[moreinfo]]
+[[!taglink moreinfo]]
diff --git a/doc/bugs/ssh_portnum_bugs.mdwn b/doc/bugs/ssh_portnum_bugs.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/ssh_portnum_bugs.mdwn
@@ -0,0 +1,14 @@
+### Please describe the problem.
+
+Lots of issues setting up assistant using SSH running on non-standard ports. Tested local pairing (which did seem to show other computer, but then wouldn't sync) and Remote Server.
+
+### What steps will reproduce the problem?
+
+Change Port 22 in /etc/ssh/sshd_config to Port 9999, restart ssh on both computers. With a clean local .ssh/config and directory, try to set up local pairing or remote server. It appears to work, especially if XMPP is working properly with remote server, but then some operations fail. (Iirc, metadata does sync but not data.) Ultimately, I had to go back to using Port 22 and using denyhosts/fail2ban (which occasionally erroneously ban my IP).
+
+(Although it's probably not relevant to the bug report, it could be argued that this is security through obscurity. There is some truth in this, but scanning an entire machine is 65,535 times slower than scanning just port 22, so it introduces a real cost to bulk scanning. I almost never, ever have attacks on random ports, whereas I have dozens per day on each server on port 22, and often thousands of attacks.)
+
+### What version of git-annex are you using? On what operating system?
+
+When I was experiencing this issue, I was running the default on Jessie/Wheezy. Now I'm running the latest (via auto-update and distributed binary) but don't know if this is still an issue with latest versions (I switched to 22 as a workaround).
+
diff --git a/doc/bugs/unconfirmed.mdwn b/doc/bugs/unconfirmed.mdwn
deleted file mode 100644
--- a/doc/bugs/unconfirmed.mdwn
+++ /dev/null
@@ -1,7 +0,0 @@
-These bug reports have not yet been [[confirmed]] by the git-annex developers
-to be actually bugs in git-annex, rather than some other problem.
-
-See also: [[moreinfo]]
-
-[[!inline pages="./* and !link(./confirmed) and !link(./moreinfo) and !link(./done) and !./done and !./confirmed" show=0
-archive=yes]]
diff --git a/doc/bugs/unwanted_repository_version_upgrades.mdwn b/doc/bugs/unwanted_repository_version_upgrades.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/unwanted_repository_version_upgrades.mdwn
@@ -0,0 +1,25 @@
+Is it possible to freeze or peg repositories at a particular version, or to prevent automatic repository version upgrades?  Is it possible to "downgrade" a repository?
+
+### Please describe the problem.
+
+We have a number of repositories on a shared file server.  These repositories are accessed by multiple machines.  Some of these repositories appear to have gotten upgraded and are now unusable on machines running older versions of git-annex.
+
+We're getting this message:
+[[!format sh """
+user@system:/path/to/repository$ git annex status
+git-annex: Repository version 5 is not supported. Upgrade git-annex.
+"""]]
+
+The machine experiencing the problem is running Debian Wheezy (Stable).
+[[!format sh """
+user@system:/path/to/repository$ git version
+git version 1.7.10.4
+user@system:/path/to/repository$ git annex version
+git-annex version: 3.20120629
+local repository version: 5
+default repository version: 3
+supported repository versions: 3
+upgrade supported from repository versions: 0 1 2
+"""]]
+
+I'm guessing that one of the machines with access to this repository was running a newer version of git-annex, and that the repository was upgraded in the course of some action.
diff --git a/doc/contribute.mdwn b/doc/contribute.mdwn
--- a/doc/contribute.mdwn
+++ b/doc/contribute.mdwn
@@ -17,8 +17,8 @@
 posted asking the submitter for details.
 
 Joey spends a lot of time dealing with this kind of bug triage. If you can
-take the time to pick a bug from the list of
-[[unconfirmed_bugs|bugs/unconfirmed]], try to reproduce it and follow up either
+take the time to pick a bug that is not marked as "confirmed" or "moreinfo"
+from the list of [[bugs]], try to reproduce it and follow up either
 confirming that the problem exists, or asking the submitter for more info,
 you'll make Joey more productive!
 
diff --git a/doc/design/roadmap.mdwn b/doc/design/roadmap.mdwn
--- a/doc/design/roadmap.mdwn
+++ b/doc/design/roadmap.mdwn
@@ -6,13 +6,13 @@
 
 * Month 1 [[!traillink assistant/encrypted_git_remotes]]
 * Month 2 [[!traillink assistant/disaster_recovery]]
-* Month 3 [[!traillink todo/direct_mode_guard]] [[!traillink assistant/upgrading]]
-* Month 4 [[!traillink assistant/windows text="Windows webapp"]], Linux arm, [[!traillink todo/support_for_writing_external_special_remotes]]
+* Month 3 [[!traillink direct_mode]] guard [[!traillink assistant/upgrading]]
+* Month 4 [[!traillink assistant/windows text="Windows webapp"]], Linux arm, external special remotes
 * Month 5 user-driven features and polishing
 * Month 6 get Windows out of beta, [[!traillink design/metadata text="metadata and views"]]
 * Month 7 user-driven features and polishing
 * Month 8 [[!traillink git-remote-daemon]]
-* **Month 9 Brazil!, [[!traillink assistant/sshpassword]]**
-* Month 10 get [[assistant/Android]] out of beta
+* Month 9 Brazil!, [[!traillink assistant/sshpassword]]
+* **Month 10 get [[assistant/Android]] out of beta**
 * Month 11 [[!traillink assistant/chunks]], [[!traillink assistant/deltas]], [[!traillink assistant/gpgkeys]] (pick 2?)
 * Month 12 [[!traillink assistant/telehash]]
diff --git a/doc/devblog/day_177__enabling.mdwn b/doc/devblog/day_177__enabling.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_177__enabling.mdwn
@@ -0,0 +1,21 @@
+After making a release yesterday, I've been fixing some bugs in the
+webapp, all to do with repository configuration stored on the git-annex
+branch. I was led into this by a strange little bug where the webapp stored
+configuration in the wrong repo in one situation. From there, I noticed
+that often when enabling an existing repository, the webapp would stomp on
+its group and preferred content and description, replacing them with
+defaults.
+
+This was a systematic problem, it had to be fixed in several places. And
+some of the fixes were quite tricky. For example, when adding a ssh
+repository, and it turns out there's already a git-annex repository at the
+entered location, it needs to avoid changing its configuration. But also,
+the configuration of that repo won't be known until after the first git
+pull from it. So it doesn't make sense to show the repository edit form
+after enabling such a repository.
+
+Also worked on a couple other bugs, and further cleaned up the [[bugs]]
+page. I think I am finally happy with how the bug list is displayed,
+with confirmed/moreinfo/etc tags.
+
+Today's work was sponsored by François Deppierraz.
diff --git a/doc/devblog/day_178-179__screencast_and_what_next.mdwn b/doc/devblog/day_178-179__screencast_and_what_next.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_178-179__screencast_and_what_next.mdwn
@@ -0,0 +1,12 @@
+Yesterday I recorded a new screencast, demoing using the assistant on a
+local network with a small server. [[videos/git-annex_assistant_lan]].
+That's the best screencast yet; having a real framing story was nice;
+recent improvements to git-annex are taken advantage of without being made
+a big deal; and audio and video are improved. (But there are some minor
+encoding glitches which I'd have to re-edit it to fix.)
+
+The [[design/roadmap]] has this month dedicated to improving Android.
+But I think what I'd more like to do is whatever makes the assistant usable
+by the most people. This might mean doing more on Windows, since I hear
+from many who would benefit from that. Or maybe something not related to
+porting?
diff --git a/doc/devblog/day_180__porting.mdwn b/doc/devblog/day_180__porting.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_180__porting.mdwn
@@ -0,0 +1,13 @@
+Did work on Windows porting today. First, fixed a reversion in the last
+release, that broke the git-annex branch pretty badly on Windows, causing
+\r to be written to files on that branch that should never have DOS line
+endings. Second, fixed a long-standing bug that prevented getting a file
+from a local bare repository on Windows.
+
+Also refreshed all autobuilders to deal with the gnutls and openssl
+security holes-of-the-week. (git-annex uses gnutls only for XMPP,
+and does not use openssl itself, but a few programs bundled with it,
+like curl, do use openssl.)
+
+A nice peice of news: OSX Homebrew now contains git-annex, so it can be
+easily installed with `brew install git-annex`
diff --git a/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__.mdwn b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Need_to_recover_unused_files_because_of_bad_sync__63__.mdwn
@@ -0,0 +1,23 @@
+I've two huge annex repos (about 100G) with all my photos.
+One is on my laptop and it uses indirect mode; the other one is on my NAS and I mount it into a CIFS folder, then it uses direct mode because of the crippled fs.
+Each repo is remote of the other one. The NAS repo belongs to backup group with the standard preferred content.
+I changed about 1000 photos in my PC repo (mainly renamed them) and I wanted to sync changes to the NAS repo, so I went through this sequence:
+
+* "git annex add" and "git annex sync" on my PC => OK;
+
+* "git annex sync" on the NAS repo => it started copying all the content BUT I stopped it because I had not enough time to wait at that very moment;
+
+* again "git anne sync" on the NAS repo => I had more time to wait BUT it didn't resume the copy from the PC repo, it just said something like "all done, nothing to do"
+
+* I checked that several files were missing on the NAS that I had modified/renamed on the PC repo so I did "git annex add" again on the PC => nothing new to add, nothing to do;
+
+* I did again "git annex sync" on the PC repo => it deleted also from my PC repo all the photos that were also missing on the NAS repo;
+
+* I've also checked for unused files on the PC repo and it now gives about 1000 files.
+
+So here are my questions:
+
+1. where was I wrong?
+
+2. can I restore my photos on my PC repo (which uses indirect mode) ?
+
diff --git a/doc/forum/Revert_to_a_precedent_state_in_direct_mode.mdwn b/doc/forum/Revert_to_a_precedent_state_in_direct_mode.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Revert_to_a_precedent_state_in_direct_mode.mdwn
@@ -0,0 +1,3 @@
+I have made some mistakes while using `git annex import` in direct mode. Now I see that some files have been erroneously added and there are other problems. I have not yet used `git annex sync`.
+
+How can I tell git-annex in direct mode (or bare git) to forget about all these changes and revert back to the last known good (pre-import) state? This means also removing the few imported files and recreate their links.
diff --git a/doc/forum/git-annex_sync_content_available_from_which_version__63__.mdwn b/doc/forum/git-annex_sync_content_available_from_which_version__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/git-annex_sync_content_available_from_which_version__63__.mdwn
@@ -0,0 +1,12 @@
+Hi,
+
+I'm on a centos 6.4 64bits & installed git-annex
+version : git-annex-3.20120522-2.1.el6.x86_64
+
+From my understanding of the help page, I should be able to sync content with :
+
+git annex sync --content
+
+but it is not recognized. The help tells me I may be able to use "get" but I'm unclear how...
+
+Thanks for any help
diff --git a/doc/forum/views___40__branches__41___never_get_deleted.mdwn b/doc/forum/views___40__branches__41___never_get_deleted.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/views___40__branches__41___never_get_deleted.mdwn
@@ -0,0 +1,16 @@
+Hello everyone,
+I would like to know if this is normal behavior or if it's a problem with my repository:
+
+Whenever I set a view with 
+
+git annex view attr="\*"'
+
+a new branch representing the selected view gets created, as expected. The problem is that when I switch back to master ('git checkout master' or even 'git annex vpop') the view branch stays there, and all subsequent operations on the annex also consider the view branch, resulting a great slowdown if one has done many views (attr="this", attr="that", etc.). Is this normal? If so, why is it necessary for the branch to stay on? Does it speed up going back to the branch? Redoing git annex view attr="*" does not seem to take less time. 
+
+Am I doing it wrong? Should I be deleting used view branches on my own? How?
+
+thanks for your replies.
+
+**EDIT:** I just found out that even if I delete view branches with git branch -D "views/attr=_" (which I'm not sure I should be doing), the branches are still checked when doing "git annex unused". That is, "git annex unused" lists "checking..." a whole lot of past views/branches which are not even there anymore (not listed with "git branch"). I also suspect that this is preventing deleted (git-rm) files from being collected from "unused". Is this a problem with my repo? Any way to fix this?
+
+=== git-annex version: **5.20140529-gb71f9bf** ===
diff --git a/doc/install.mdwn b/doc/install.mdwn
--- a/doc/install.mdwn
+++ b/doc/install.mdwn
@@ -3,6 +3,7 @@
 [[!table format=dsv header=yes data="""
 detailed instructions             | quick install
 [[OSX]]                           | [download git-annex.app](http://downloads.kitenet.net/git-annex/OSX/current/)
+&nbsp;&nbsp;[[Homebrew]]            | `brew install git-annex`
 [[Android]]                       | [download git-annex.apk](http://downloads.kitenet.net/git-annex/android/current/) **beta**
 [[Linux|linux_standalone]]        | [download prebuilt linux tarball](http://downloads.kitenet.net/git-annex/linux/current/)
 &nbsp;&nbsp;[[Debian]]            | `apt-get install git-annex`
diff --git a/doc/install/Docker.mdwn b/doc/install/Docker.mdwn
--- a/doc/install/Docker.mdwn
+++ b/doc/install/Docker.mdwn
@@ -5,22 +5,27 @@
 
 	docker run -i -t joeyh/debian-unstable apt-get install git-annex
 
-# autobuilders
+# containers for autobuilders
 
-The git-annex Linux autobuilds are built using a Docker container.
-If you'd like to set up your own autobuilder in a Docker container,
-the image that is used is not currently published, but you can build
-a new image using [Propellor](http://joeyh.name/code/propellor). Just
-install Propellor and add this to its `config.hs`:
+The git-annex Linux autobuilds are built using Docker containers.
+Most of these are not published, but you can build your own. (See below.)
 
+Since the Android autobuilder container can take quite a lot of work to get
+built, it is published. `docker pull joeyh/git-annex-android-builder`
+
+# building autobuilder containers using Propellor
+
+The Docker containers are built using
+[Propellor](http://joeyh.name/code/propellor). To generate your own image,
+Just install Propellor and add this to its `config.hs`:
+
 [[!format haskell """
-host hostname@"your.machine.net" = Just $ props
-        & Docker.configured
-        & Docker.docked container hostname "amd64-git-annex-builder"
+import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder
 
-container _ "amd64-git-annex-builder" = in Just $ Docker.containerFrom
-	(image $ System (Debian Unstable) "amd64")
-	[ Docker.inside $ props & GitAnnexBuilder.builder "amd64" "15 * * * *" False ]
+	, host hostname@"your.machine.net" = Just $ props
+	        & Docker.configured
+		& Docker.docked container hostname "amd64-git-annex-builder"
+	, GitAnnexBuilder.standardAutoBuilderContainer dockerImage "amd64" 15 "2h"
 """]]
 
 This will autobuild every hour at :15, and the autobuilt image will be
diff --git a/doc/install/Homebrew.mdwn b/doc/install/Homebrew.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/install/Homebrew.mdwn
@@ -0,0 +1,21 @@
+[Homebrew](http://brew.sh/) has [a formula](https://github.com/Homebrew/homebrew/commits/master/Library/Formula/git-annex.rb) for git-annex.
+
+Homebrew users can simply run `brew install git-annex` to install git-annex.
+
+## buiding git-annex from sources
+
+This is the old recipe for building git-annex from source, using
+packages from homebrew. Useful if you want a newer version than the version
+in homebrew.
+
+<pre>
+brew install haskell-platform git ossp-uuid md5sha1sum coreutils gnutls libidn gsasl pkg-config libxml2
+brew link libxml2 --force
+cabal update
+mkdir $HOME/bin
+PATH=$HOME/bin:$PATH
+PATH=$HOME/.cabal/bin:$PATH
+cabal install c2hs --bindir=$HOME/bin
+cabal install gnuidn
+cabal install git-annex --bindir=$HOME/bin
+</pre>
diff --git a/doc/install/OSX.mdwn b/doc/install/OSX.mdwn
--- a/doc/install/OSX.mdwn
+++ b/doc/install/OSX.mdwn
@@ -24,20 +24,9 @@
 
 * [autobuild of git-annex.dmg](https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-mavericks/git-annex.dmg) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-mavericks/))
 
-## using Brew
+## using Homebrew
 
-<pre>
-brew update
-brew install haskell-platform git ossp-uuid md5sha1sum coreutils gnutls libidn gsasl pkg-config libxml2
-brew link libxml2 --force
-cabal update
-mkdir $HOME/bin
-PATH=$HOME/bin:$PATH
-PATH=$HOME/.cabal/bin:$PATH
-cabal install c2hs --bindir=$HOME/bin
-cabal install gnuidn
-cabal install git-annex --bindir=$HOME/bin
-</pre>
+git-annex is now [[available in Homebrew|Homebrew]]!
 
 ## using MacPorts
 
diff --git a/doc/news/version_5.20140411.mdwn b/doc/news/version_5.20140411.mdwn
deleted file mode 100644
--- a/doc/news/version_5.20140411.mdwn
+++ /dev/null
@@ -1,13 +0,0 @@
-git-annex 5.20140411 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * importfeed: Filename template can now contain an itempubdate variable.
-     Needs feed 0.3.9.2.
-   * Fix rsync progress parsing in locales that use comma in number display.
-     Closes: #[744148](http://bugs.debian.org/744148)
-   * assistant: Fix high CPU usage triggered when a monthly fsck is scheduled,
-     and the last time the job ran was a day of the month &gt; 12. This caused a
-     runaway loop. Thanks to Anarcat for his assistance, and to Maximiliano
-     Curia for identifying the cause of this bug.
-   * Remove wget from OSX dmg, due to issues with cert paths that broke
-     git-annex automatic upgrading. Instead, curl is used, unless the
-     OSX system has wget installed, which will then be used."""]]
diff --git a/doc/news/version_5.20140606.mdwn b/doc/news/version_5.20140606.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/news/version_5.20140606.mdwn
@@ -0,0 +1,14 @@
+git-annex 5.20140606 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * webapp: When adding a new local repository, fix bug that caused its
+     group and preferred content to be set in the current repository,
+     even when not combining.
+   * webapp: Avoid stomping on existing description, group and
+     preferred content settings when enabling or combining with
+     an already existing remote.
+   * assistant: Make sanity checker tmp dir cleanup code more robust.
+   * unused: Avoid checking view branches for unused files.
+   * webapp: Include ssh port in mangled hostname.
+   * Windows: Fix bug introduced in last release that caused files
+     in the git-annex branch to have lines teminated with \r.
+   * Windows: Fix retrieving of files from local bare git repositories."""]]
diff --git a/doc/privacy.mdwn b/doc/privacy.mdwn
--- a/doc/privacy.mdwn
+++ b/doc/privacy.mdwn
@@ -32,7 +32,7 @@
 
 ## bug reporting
 
-When you file a [[bug]] report on git-annex, you may need to provide
+When you file a [[bug|bugs]] report on git-annex, you may need to provide
 debugging output or details about your repository. In general, git-annex
 does not sanitize `--debug` output at all, so it may include the names of
 files or other repository details. You should review any debug or other
diff --git a/doc/publicrepos.mdwn b/doc/publicrepos.mdwn
--- a/doc/publicrepos.mdwn
+++ b/doc/publicrepos.mdwn
@@ -4,7 +4,7 @@
 * [downloads.kitenet.net](http://downloads.kitenet.net/)  
   `git clone https://downloads.kitenet.net/.git/`  
   Various downloads of things produced by Joey Hess, including git-annex
-  builds.
+  builds and videos.
 * debconf-share  
   `git clone http://annex.debconf.org/debconf-share/.git/`  
   [DebConf](http://debconf.org/) Media, photos, videos, etc.
@@ -12,6 +12,8 @@
   `git clone https://github.com/RichiH/conference_proceedings.git`  
   A growing collection of videos of technology conferences.
   Submit a pull request to add your own!
+* [ocharles's papers](https://github.com/ocharles/papers)  
+  Lots of CS papers read by [Oliver](http://ocharles.org.uk/blog/).
 
 This is a wiki -- add your own public repository to the list!
 See [[tips/centralized_git_repository_tutorial]].
diff --git a/doc/templates/buglist.tmpl b/doc/templates/buglist.tmpl
new file mode 100644
--- /dev/null
+++ b/doc/templates/buglist.tmpl
@@ -0,0 +1,25 @@
+<div class="archivepage">
+<TMPL_IF PERMALINK>
+<a href="<TMPL_VAR PERMALINK>"><TMPL_VAR TITLE></a>
+<TMPL_ELSE>
+<a href="<TMPL_VAR PAGEURL>"><TMPL_VAR TITLE></a>
+</TMPL_IF>
+<TMPL_IF TAGS>
+<TMPL_LOOP TAGS>
+ [<TMPL_VAR LINK>]
+</TMPL_LOOP>
+</TMPL_IF>
+<br />
+<span class="archivepagedate">
+Posted <TMPL_VAR CTIME>
+<TMPL_IF AUTHOR>
+by <span class="author">
+<TMPL_IF AUTHORURL>
+<a href="<TMPL_VAR AUTHORURL>"><TMPL_VAR AUTHOR></a>
+<TMPL_ELSE>
+<TMPL_VAR AUTHOR>
+</TMPL_IF>
+</span>
+</TMPL_IF>
+</span>
+</div>
diff --git a/doc/todo/notifications.mdwn b/doc/todo/notifications.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/notifications.mdwn
@@ -0,0 +1,3 @@
+Just started today with git-annex and it looks great replacement for proprietary syncing solutions (well in allot of aspects it's much better than proprietary solutions) but I do believe desktop and email notifications are must have features.
+
+I think these services would be nice to have: growl, libnotify, email, twitter (publicly sharing with a group or repository stored on public server for users to download).  
diff --git a/doc/todo/view_git_annex_log_in_webapp.mdwn b/doc/todo/view_git_annex_log_in_webapp.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/view_git_annex_log_in_webapp.mdwn
@@ -0,0 +1,5 @@
+Just gave git annex a quick try for a few minutes and I must admit it's pretty great.
+
+A must have feature for me is to be able to view git annex log in the web app as "git annex log" doesn't got BIDI support (RTL scripts like Arabic, Farsi, Hebrew).
+Adding Bi-directional text support would be too much to ask from a developer that don't know these languages thus the solution is to use the already the web browser to handle that.
+
diff --git a/doc/users/anarcat.mdwn b/doc/users/anarcat.mdwn
--- a/doc/users/anarcat.mdwn
+++ b/doc/users/anarcat.mdwn
@@ -32,13 +32,13 @@
 ... same.
 
 [[!inline pages="bugs/* and !bugs/done and !link(bugs/done) and
-link(users/anarcat)" sort=mtime feeds=no actions=yes archive=yes show=0]]
+link(users/anarcat)" sort=mtime feeds=no actions=yes archive=yes show=0  template=buglist]]
 
 Fixed
 -----
 
 [[!inline pages="bugs/* and !bugs/done and link(bugs/done) and
-link(users/anarcat)" feeds=no actions=yes archive=yes show=0]]
+link(users/anarcat)" feeds=no actions=yes archive=yes show=0  template=buglist]]
 
 Forum posts
 ===========
diff --git a/doc/videos/git-annex_assistant_lan.mdwn b/doc/videos/git-annex_assistant_lan.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/videos/git-annex_assistant_lan.mdwn
@@ -0,0 +1,6 @@
+<video controls width=400>
+<source src="https://downloads.kitenet.net/videos/git-annex/git-annex-lan.webm">
+</video><br>
+A <a href="https://downloads.kitenet.net/videos/git-annex/git-annex-lan.webm">10 minute screencast</a>
+showing how to get started using the [[git-annex assistant|/assistant]],
+including sharing files on a local network, and installation on a server.
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.20140529
+Version: 5.20140606
 Cabal-Version: >= 1.8
 License: GPL-3
 Maintainer: Joey Hess <joey@kitenet.net>
