diff --git a/.stack-work/install/x86_64-linux/lts-5.5/7.10.3/pkgdb/package.cache b/.stack-work/install/x86_64-linux/lts-5.5/7.10.3/pkgdb/package.cache
new file mode 100644
Binary files /dev/null and b/.stack-work/install/x86_64-linux/lts-5.5/7.10.3/pkgdb/package.cache differ
diff --git a/.stack-work/logs/HUnit-1.3.1.1.log b/.stack-work/logs/HUnit-1.3.1.1.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/HUnit-1.3.1.1.log
@@ -0,0 +1,12 @@
+Configuring HUnit-1.3.1.1...
+Building HUnit-1.3.1.1...
+Preprocessing library HUnit-1.3.1.1...
+[1 of 5] Compiling Test.HUnit.Terminal ( Test/HUnit/Terminal.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Test/HUnit/Terminal.o )
+[2 of 5] Compiling Test.HUnit.Lang  ( Test/HUnit/Lang.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Test/HUnit/Lang.o )
+[3 of 5] Compiling Test.HUnit.Base  ( Test/HUnit/Base.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Test/HUnit/Base.o )
+[4 of 5] Compiling Test.HUnit.Text  ( Test/HUnit/Text.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Test/HUnit/Text.o )
+[5 of 5] Compiling Test.HUnit       ( Test/HUnit.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Test/HUnit.o )
+In-place registering HUnit-1.3.1.1...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/HUnit-1.3.1.1-7IPmJa5HmrxHl6ny5upchm
+Registering HUnit-1.3.1.1...
diff --git a/.stack-work/logs/IfElse-0.85.log b/.stack-work/logs/IfElse-0.85.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/IfElse-0.85.log
@@ -0,0 +1,13 @@
+Configuring IfElse-0.85...
+Building IfElse-0.85...
+Preprocessing library IfElse-0.85...
+[1 of 1] Compiling Control.Monad.IfElse ( Control/Monad/IfElse.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Monad/IfElse.o )
+
+Control/Monad/IfElse.hs:159:11: Warning:
+    Rule "maybeMP/id" may never fire
+      because ‘maybeMP’ might inline first
+    Probable fix: add an INLINE[n] or NOINLINE[n] pragma on ‘maybeMP’
+In-place registering IfElse-0.85...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/IfElse-0.85-EkfAH5IXGLU4RHYa9FeF8K
+Registering IfElse-0.85...
diff --git a/.stack-work/logs/StateVar-1.1.0.3.log b/.stack-work/logs/StateVar-1.1.0.3.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/StateVar-1.1.0.3.log
@@ -0,0 +1,8 @@
+Configuring StateVar-1.1.0.3...
+Building StateVar-1.1.0.3...
+Preprocessing library StateVar-1.1.0.3...
+[1 of 1] Compiling Data.StateVar    ( src/Data/StateVar.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/StateVar.o )
+In-place registering StateVar-1.1.0.3...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/StateVar-1.1.0.3-8WYLUQJECQz8PFb9p2aPSq
+Registering StateVar-1.1.0.3...
diff --git a/.stack-work/logs/asn1-encoding-0.9.3.log b/.stack-work/logs/asn1-encoding-0.9.3.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/asn1-encoding-0.9.3.log
@@ -0,0 +1,33 @@
+Configuring asn1-encoding-0.9.3...
+Building asn1-encoding-0.9.3...
+Preprocessing library asn1-encoding-0.9.3...
+[ 1 of 12] Compiling Data.ASN1.Get    ( Data/ASN1/Get.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Get.o )
+
+Data/ASN1/Get.hs:30:1: Warning:
+    The import of ‘Applicative’
+    from module ‘Control.Applicative’ is redundant
+[ 2 of 12] Compiling Data.ASN1.Internal ( Data/ASN1/Internal.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Internal.o )
+[ 3 of 12] Compiling Data.ASN1.Serialize ( Data/ASN1/Serialize.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Serialize.o )
+
+Data/ASN1/Serialize.hs:17:1: Warning:
+    The import of ‘Control.Applicative’ is redundant
+      except perhaps to import instances from ‘Control.Applicative’
+    To import instances alone, use: import Control.Applicative()
+[ 4 of 12] Compiling Data.ASN1.Object ( Data/ASN1/Object.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Object.o )
+[ 5 of 12] Compiling Data.ASN1.BinaryEncoding.Writer ( Data/ASN1/BinaryEncoding/Writer.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/BinaryEncoding/Writer.o )
+[ 6 of 12] Compiling Data.ASN1.Stream ( Data/ASN1/Stream.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Stream.o )
+[ 7 of 12] Compiling Data.ASN1.Error  ( Data/ASN1/Error.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Error.o )
+[ 8 of 12] Compiling Data.ASN1.Encoding ( Data/ASN1/Encoding.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Encoding.o )
+[ 9 of 12] Compiling Data.ASN1.BinaryEncoding.Parse ( Data/ASN1/BinaryEncoding/Parse.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/BinaryEncoding/Parse.o )
+[10 of 12] Compiling Data.ASN1.BinaryEncoding.Raw ( Data/ASN1/BinaryEncoding/Raw.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/BinaryEncoding/Raw.o )
+[11 of 12] Compiling Data.ASN1.Prim   ( Data/ASN1/Prim.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Prim.o )
+
+Data/ASN1/Prim.hs:59:1: Warning:
+    The import of ‘Control.Applicative’ is redundant
+      except perhaps to import instances from ‘Control.Applicative’
+    To import instances alone, use: import Control.Applicative()
+[12 of 12] Compiling Data.ASN1.BinaryEncoding ( Data/ASN1/BinaryEncoding.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/BinaryEncoding.o )
+In-place registering asn1-encoding-0.9.3...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/asn1-encoding-0.9.3-A0jeMIoYyiZ4PSPkybrUpF
+Registering asn1-encoding-0.9.3...
diff --git a/.stack-work/logs/asn1-parse-0.9.4.log b/.stack-work/logs/asn1-parse-0.9.4.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/asn1-parse-0.9.4.log
@@ -0,0 +1,13 @@
+Configuring asn1-parse-0.9.4...
+Building asn1-parse-0.9.4...
+Preprocessing library asn1-parse-0.9.4...
+[1 of 1] Compiling Data.ASN1.Parse  ( Data/ASN1/Parse.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Parse.o )
+
+Data/ASN1/Parse.hs:30:1: Warning:
+    The import of ‘Control.Applicative’ is redundant
+      except perhaps to import instances from ‘Control.Applicative’
+    To import instances alone, use: import Control.Applicative()
+In-place registering asn1-parse-0.9.4...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/asn1-parse-0.9.4-LrLFPvrxagO8jGmFd1SmqK
+Registering asn1-parse-0.9.4...
diff --git a/.stack-work/logs/asn1-types-0.3.2.log b/.stack-work/logs/asn1-types-0.3.2.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/asn1-types-0.3.2.log
@@ -0,0 +1,17 @@
+Configuring asn1-types-0.3.2...
+Building asn1-types-0.3.2...
+Preprocessing library asn1-types-0.3.2...
+[1 of 6] Compiling Data.ASN1.Types.String ( Data/ASN1/Types/String.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Types/String.o )
+
+Data/ASN1/Types/String.hs:154:22: Warning:
+    This binding for ‘b’ shadows the existing binding
+      bound at Data/ASN1/Types/String.hs:151:13
+[2 of 6] Compiling Data.ASN1.Types.Lowlevel ( Data/ASN1/Types/Lowlevel.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Types/Lowlevel.o )
+[3 of 6] Compiling Data.ASN1.OID    ( Data/ASN1/OID.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/OID.o )
+[4 of 6] Compiling Data.ASN1.BitArray ( Data/ASN1/BitArray.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/BitArray.o )
+[5 of 6] Compiling Data.ASN1.Types  ( Data/ASN1/Types.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Types.o )
+[6 of 6] Compiling Data.ASN1.Pretty ( Data/ASN1/Pretty.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ASN1/Pretty.o )
+In-place registering asn1-types-0.3.2...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/asn1-types-0.3.2-BR43uodYA6j1oMVNuWbt5p
+Registering asn1-types-0.3.2...
diff --git a/.stack-work/logs/async-2.1.0.log b/.stack-work/logs/async-2.1.0.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/async-2.1.0.log
@@ -0,0 +1,8 @@
+Configuring async-2.1.0...
+Building async-2.1.0...
+Preprocessing library async-2.1.0...
+[1 of 1] Compiling Control.Concurrent.Async ( Control/Concurrent/Async.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Concurrent/Async.o )
+In-place registering async-2.1.0...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/async-2.1.0-KuqnF1GrhHK5nNp6Zzm3jy
+Registering async-2.1.0...
diff --git a/.stack-work/logs/base-orphans-0.5.2.log b/.stack-work/logs/base-orphans-0.5.2.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/base-orphans-0.5.2.log
@@ -0,0 +1,9 @@
+Configuring base-orphans-0.5.2...
+Building base-orphans-0.5.2...
+Preprocessing library base-orphans-0.5.2...
+[1 of 2] Compiling Data.Orphans.Prelude ( src/Data/Orphans/Prelude.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Orphans/Prelude.o )
+[2 of 2] Compiling Data.Orphans     ( src/Data/Orphans.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Orphans.o )
+In-place registering base-orphans-0.5.2...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/base-orphans-0.5.2-HxKyLMrSk4gBsNUM7D4Xui
+Registering base-orphans-0.5.2...
diff --git a/.stack-work/logs/bytestring-builder-0.10.6.0.0.log b/.stack-work/logs/bytestring-builder-0.10.6.0.0.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/bytestring-builder-0.10.6.0.0.log
@@ -0,0 +1,7 @@
+Configuring bytestring-builder-0.10.6.0.0...
+Building bytestring-builder-0.10.6.0.0...
+Preprocessing library bytestring-builder-0.10.6.0.0...
+In-place registering bytestring-builder-0.10.6.0.0...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/bytestring-builder-0.10.6.0.0-DW2JeazcMjm0XCS5oqEEA4
+Registering bytestring-builder-0.10.6.0.0...
diff --git a/.stack-work/logs/case-insensitive-1.2.0.5.log b/.stack-work/logs/case-insensitive-1.2.0.5.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/case-insensitive-1.2.0.5.log
@@ -0,0 +1,10 @@
+Configuring case-insensitive-1.2.0.5...
+Building case-insensitive-1.2.0.5...
+Preprocessing library case-insensitive-1.2.0.5...
+[1 of 3] Compiling Data.CaseInsensitive.Internal ( Data/CaseInsensitive/Internal.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/CaseInsensitive/Internal.o )
+[2 of 3] Compiling Data.CaseInsensitive.Unsafe ( Data/CaseInsensitive/Unsafe.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/CaseInsensitive/Unsafe.o )
+[3 of 3] Compiling Data.CaseInsensitive ( Data/CaseInsensitive.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/CaseInsensitive.o )
+In-place registering case-insensitive-1.2.0.5...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/case-insensitive-1.2.0.5-DNSVdyEjyyl9Og6G8xHN9C
+Registering case-insensitive-1.2.0.5...
diff --git a/.stack-work/logs/cereal-0.5.1.0.log b/.stack-work/logs/cereal-0.5.1.0.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/cereal-0.5.1.0.log
@@ -0,0 +1,11 @@
+Configuring cereal-0.5.1.0...
+Building cereal-0.5.1.0...
+Preprocessing library cereal-0.5.1.0...
+[1 of 4] Compiling Data.Serialize.Put ( src/Data/Serialize/Put.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Serialize/Put.o )
+[2 of 4] Compiling Data.Serialize.Get ( src/Data/Serialize/Get.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Serialize/Get.o )
+[3 of 4] Compiling Data.Serialize.IEEE754 ( src/Data/Serialize/IEEE754.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Serialize/IEEE754.o )
+[4 of 4] Compiling Data.Serialize   ( src/Data/Serialize.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Serialize.o )
+In-place registering cereal-0.5.1.0...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/cereal-0.5.1.0-843xOxvPj94HAJ9SD4EJuq
+Registering cereal-0.5.1.0...
diff --git a/.stack-work/logs/cryptonite-0.10.log b/.stack-work/logs/cryptonite-0.10.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/cryptonite-0.10.log
diff --git a/.stack-work/logs/disk-free-space-0.1.0.1.log b/.stack-work/logs/disk-free-space-0.1.0.1.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/disk-free-space-0.1.0.1.log
@@ -0,0 +1,8 @@
+Configuring disk-free-space-0.1.0.1...
+Building disk-free-space-0.1.0.1...
+Preprocessing library disk-free-space-0.1.0.1...
+[1 of 1] Compiling System.DiskSpace ( .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/System/DiskSpace.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/System/DiskSpace.o )
+In-place registering disk-free-space-0.1.0.1...
+Installing library in
+/home/joey/src/git-annex/.stack-work/install/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/disk-free-space-0.1.0.1-CjEBDT0Sn2mACUKc5Cnz8d
+Registering disk-free-space-0.1.0.1...
diff --git a/.stack-work/logs/enclosed-exceptions-1.0.1.1.log b/.stack-work/logs/enclosed-exceptions-1.0.1.1.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/enclosed-exceptions-1.0.1.1.log
@@ -0,0 +1,8 @@
+Configuring enclosed-exceptions-1.0.1.1...
+Building enclosed-exceptions-1.0.1.1...
+Preprocessing library enclosed-exceptions-1.0.1.1...
+[1 of 1] Compiling Control.Exception.Enclosed ( src/Control/Exception/Enclosed.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Exception/Enclosed.o )
+In-place registering enclosed-exceptions-1.0.1.1...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/enclosed-exceptions-1.0.1.1-JGFT1bQLY7rHZgsD1TY8wq
+Registering enclosed-exceptions-1.0.1.1...
diff --git a/.stack-work/logs/exceptions-0.8.2.1.log b/.stack-work/logs/exceptions-0.8.2.1.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/exceptions-0.8.2.1.log
@@ -0,0 +1,9 @@
+Configuring exceptions-0.8.2.1...
+Building exceptions-0.8.2.1...
+Preprocessing library exceptions-0.8.2.1...
+[1 of 2] Compiling Control.Monad.Catch ( src/Control/Monad/Catch.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Monad/Catch.o )
+[2 of 2] Compiling Control.Monad.Catch.Pure ( src/Control/Monad/Catch/Pure.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Monad/Catch/Pure.o )
+In-place registering exceptions-0.8.2.1...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/exceptions-0.8.2.1-6lgwjdgwblY7rzh5s6SLd8
+Registering exceptions-0.8.2.1...
diff --git a/.stack-work/logs/feed-0.3.11.1.log b/.stack-work/logs/feed-0.3.11.1.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/feed-0.3.11.1.log
@@ -0,0 +1,34 @@
+Configuring feed-0.3.11.1...
+Building feed-0.3.11.1...
+Preprocessing library feed-0.3.11.1...
+[ 1 of 23] Compiling Text.RSS.Syntax  ( src/Text/RSS/Syntax.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/RSS/Syntax.o )
+[ 2 of 23] Compiling Text.RSS.Export  ( src/Text/RSS/Export.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/RSS/Export.o )
+[ 3 of 23] Compiling Text.DublinCore.Types ( src/Text/DublinCore/Types.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/DublinCore/Types.o )
+[ 4 of 23] Compiling Text.RSS1.Syntax ( src/Text/RSS1/Syntax.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/RSS1/Syntax.o )
+[ 5 of 23] Compiling Text.RSS1.Utils  ( src/Text/RSS1/Utils.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/RSS1/Utils.o )
+[ 6 of 23] Compiling Text.RSS1.Export ( src/Text/RSS1/Export.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/RSS1/Export.o )
+[ 7 of 23] Compiling Text.RSS.Import  ( src/Text/RSS/Import.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/RSS/Import.o )
+[ 8 of 23] Compiling Text.RSS1.Import ( src/Text/RSS1/Import.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/RSS1/Import.o )
+[ 9 of 23] Compiling Text.Atom.Feed.Link ( src/Text/Atom/Feed/Link.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Atom/Feed/Link.o )
+[10 of 23] Compiling Text.Atom.Feed   ( src/Text/Atom/Feed.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Atom/Feed.o )
+[11 of 23] Compiling Text.Atom.Feed.Export ( src/Text/Atom/Feed/Export.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Atom/Feed/Export.o )
+[12 of 23] Compiling Text.Atom.Feed.Import ( src/Text/Atom/Feed/Import.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Atom/Feed/Import.o )
+[13 of 23] Compiling Text.Atom.Feed.Validate ( src/Text/Atom/Feed/Validate.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Atom/Feed/Validate.o )
+[14 of 23] Compiling Text.Atom.Pub    ( src/Text/Atom/Pub.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Atom/Pub.o )
+[15 of 23] Compiling Text.Atom.Pub.Export ( src/Text/Atom/Pub/Export.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Atom/Pub/Export.o )
+[16 of 23] Compiling Text.Feed.Types  ( src/Text/Feed/Types.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Feed/Types.o )
+[17 of 23] Compiling Text.Feed.Constructor ( src/Text/Feed/Constructor.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Feed/Constructor.o )
+
+src/Text/Feed/Constructor.hs:131:5: Warning:
+    Pattern match(es) are non-exhaustive
+    In a case alternative: Patterns not matched: XMLFeed _
+[18 of 23] Compiling Text.Feed.Export ( src/Text/Feed/Export.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Feed/Export.o )
+[19 of 23] Compiling Text.Feed.Import ( src/Text/Feed/Import.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Feed/Import.o )
+[20 of 23] Compiling Text.Feed.Util   ( src/Text/Feed/Util.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Feed/Util.o )
+[21 of 23] Compiling Text.Feed.Query  ( src/Text/Feed/Query.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Feed/Query.o )
+[22 of 23] Compiling Text.Feed.Translate ( src/Text/Feed/Translate.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Text/Feed/Translate.o )
+[23 of 23] Compiling Paths_feed       ( .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/autogen/Paths_feed.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Paths_feed.o )
+In-place registering feed-0.3.11.1...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/feed-0.3.11.1-Bx5SR4O8Rb3DZHunpzkbxZ
+Registering feed-0.3.11.1...
diff --git a/.stack-work/logs/file-embed-0.0.9.1.log b/.stack-work/logs/file-embed-0.0.9.1.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/file-embed-0.0.9.1.log
@@ -0,0 +1,13 @@
+Configuring file-embed-0.0.9.1...
+Building file-embed-0.0.9.1...
+Preprocessing library file-embed-0.0.9.1...
+[1 of 1] Compiling Data.FileEmbed   ( Data/FileEmbed.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/FileEmbed.o )
+
+Data/FileEmbed.hs:64:1: Warning:
+    The import of ‘Control.Applicative’ is redundant
+      except perhaps to import instances from ‘Control.Applicative’
+    To import instances alone, use: import Control.Applicative()
+In-place registering file-embed-0.0.9.1...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/file-embed-0.0.9.1-ID0BQq7SkFm2s7BTdE1urr
+Registering file-embed-0.0.9.1...
diff --git a/.stack-work/logs/hashable-1.2.4.0.log b/.stack-work/logs/hashable-1.2.4.0.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/hashable-1.2.4.0.log
@@ -0,0 +1,15 @@
+Configuring hashable-1.2.4.0...
+Building hashable-1.2.4.0...
+Preprocessing library hashable-1.2.4.0...
+[1 of 3] Compiling Data.Hashable.Class ( Data/Hashable/Class.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hashable/Class.o )
+
+Data/Hashable/Class.hs:460:28: Warning:
+    In the use of ‘B.inlinePerformIO’
+    (imported from Data.ByteString.Internal):
+    Deprecated: "If you think you know what you are doing, use 'unsafePerformIO'. If you are sure you know what you are doing, use 'unsafeDupablePerformIO'. If you enjoy sharing an address space with a malevolent agent of chaos, try 'accursedUnutterablePerformIO'."
+[2 of 3] Compiling Data.Hashable.Generic ( Data/Hashable/Generic.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hashable/Generic.o )
+[3 of 3] Compiling Data.Hashable    ( Data/Hashable.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hashable.o )
+In-place registering hashable-1.2.4.0...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/hashable-1.2.4.0-8GjadD03dR57AKCJdr90LD
+Registering hashable-1.2.4.0...
diff --git a/.stack-work/logs/hex-0.1.2.log b/.stack-work/logs/hex-0.1.2.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/hex-0.1.2.log
@@ -0,0 +1,8 @@
+Configuring hex-0.1.2...
+Building hex-0.1.2...
+Preprocessing library hex-0.1.2...
+[1 of 1] Compiling Data.Hex         ( Data/Hex.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hex.o )
+In-place registering hex-0.1.2...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/hex-0.1.2-7uuCvFVHDBfKR1vfBI01P9
+Registering hex-0.1.2...
diff --git a/.stack-work/logs/hourglass-0.2.10.log b/.stack-work/logs/hourglass-0.2.10.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/hourglass-0.2.10.log
@@ -0,0 +1,43 @@
+Configuring hourglass-0.2.10...
+Building hourglass-0.2.10...
+Preprocessing library hourglass-0.2.10...
+[ 1 of 17] Compiling Data.Hourglass.Zone ( Data/Hourglass/Zone.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Zone.o )
+[ 2 of 17] Compiling Data.Hourglass.Utils ( Data/Hourglass/Utils.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Utils.o )
+[ 3 of 17] Compiling Time.Types       ( Time/Types.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Time/Types.o )
+[ 4 of 17] Compiling Data.Hourglass.Types ( Data/Hourglass/Types.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Types.o )
+[ 5 of 17] Compiling Data.Hourglass.Internal.Unix ( Data/Hourglass/Internal/Unix.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Internal/Unix.o )
+
+Data/Hourglass/Internal/Unix.hs:24:1: Warning:
+    The import of ‘Control.Applicative’ is redundant
+      except perhaps to import instances from ‘Control.Applicative’
+    To import instances alone, use: import Control.Applicative()
+[ 6 of 17] Compiling Data.Hourglass.Internal ( Data/Hourglass/Internal.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Internal.o )
+[ 7 of 17] Compiling Data.Hourglass.Calendar ( Data/Hourglass/Calendar.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Calendar.o )
+[ 8 of 17] Compiling Data.Hourglass.Diff ( Data/Hourglass/Diff.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Diff.o )
+
+Data/Hourglass/Diff.hs:22:1: Warning:
+    The import of ‘Data.Monoid’ is redundant
+      except perhaps to import instances from ‘Data.Monoid’
+    To import instances alone, use: import Data.Monoid()
+[ 9 of 17] Compiling Data.Hourglass.Time ( Data/Hourglass/Time.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Time.o )
+[10 of 17] Compiling Data.Hourglass.Epoch ( Data/Hourglass/Epoch.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Epoch.o )
+[11 of 17] Compiling Data.Hourglass.Local ( Data/Hourglass/Local.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Local.o )
+[12 of 17] Compiling Time.System      ( Time/System.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Time/System.o )
+
+Time/System.hs:23:1: Warning:
+    The import of ‘Control.Applicative’ is redundant
+      except perhaps to import instances from ‘Control.Applicative’
+    To import instances alone, use: import Control.Applicative()
+[13 of 17] Compiling System.Hourglass ( System/Hourglass.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/System/Hourglass.o )
+[14 of 17] Compiling Data.Hourglass.Format ( Data/Hourglass/Format.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Format.o )
+[15 of 17] Compiling Data.Hourglass   ( Data/Hourglass.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass.o )
+
+Data/Hourglass.hs:40:1: Warning:
+    The import of ‘daysInMonth’
+    from module ‘Data.Hourglass.Calendar’ is redundant
+[16 of 17] Compiling Time.Compat      ( Time/Compat.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Time/Compat.o )
+[17 of 17] Compiling Data.Hourglass.Compat ( Data/Hourglass/Compat.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Hourglass/Compat.o )
+In-place registering hourglass-0.2.10...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/hourglass-0.2.10-LCfvpegcEVDEeuH0foNCGl
+Registering hourglass-0.2.10...
diff --git a/.stack-work/logs/http-api-data-0.2.2.log b/.stack-work/logs/http-api-data-0.2.2.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/http-api-data-0.2.2.log
@@ -0,0 +1,14 @@
+Configuring http-api-data-0.2.2...
+Building http-api-data-0.2.2...
+Preprocessing library http-api-data-0.2.2...
+[1 of 2] Compiling Web.HttpApiData.Internal ( Web/HttpApiData/Internal.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Web/HttpApiData/Internal.o )
+
+Web/HttpApiData/Internal.hs:472:30: Warning:
+    In the use of ‘parseTime’
+    (imported from Data.Time, but defined in time-1.5.0.1:Data.Time.Format.Parse):
+    Deprecated: "use "parseTimeM True" instead"
+[2 of 2] Compiling Web.HttpApiData  ( Web/HttpApiData.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Web/HttpApiData.o )
+In-place registering http-api-data-0.2.2...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/http-api-data-0.2.2-4PIMg2QbRyT0SZyC9tOKTV
+Registering http-api-data-0.2.2...
diff --git a/.stack-work/logs/http-types-0.9.log b/.stack-work/logs/http-types-0.9.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/http-types-0.9.log
@@ -0,0 +1,30 @@
+Configuring http-types-0.9...
+Building http-types-0.9...
+Preprocessing library http-types-0.9...
+[1 of 7] Compiling Network.HTTP.Types.Version ( Network/HTTP/Types/Version.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Network/HTTP/Types/Version.o )
+[2 of 7] Compiling Network.HTTP.Types.URI ( Network/HTTP/Types/URI.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Network/HTTP/Types/URI.o )
+
+Network/HTTP/Types/URI.hs:148:26: Warning:
+    In the use of ‘B.breakByte’ (imported from Data.ByteString):
+    Deprecated: "It is an internal function and should never have been exported. Use 'break (== x)' instead. (There are rewrite rules that handle this special case of 'break'.)"
+
+Network/HTTP/Types/URI.hs:283:22: Warning:
+    In the use of ‘B.breakByte’ (imported from Data.ByteString):
+    Deprecated: "It is an internal function and should never have been exported. Use 'break (== x)' instead. (There are rewrite rules that handle this special case of 'break'.)"
+
+Network/HTTP/Types/URI.hs:313:20: Warning:
+    In the use of ‘B.breakByte’ (imported from Data.ByteString):
+    Deprecated: "It is an internal function and should never have been exported. Use 'break (== x)' instead. (There are rewrite rules that handle this special case of 'break'.)"
+
+Network/HTTP/Types/URI.hs:325:18: Warning:
+    In the use of ‘B.breakByte’ (imported from Data.ByteString):
+    Deprecated: "It is an internal function and should never have been exported. Use 'break (== x)' instead. (There are rewrite rules that handle this special case of 'break'.)"
+[3 of 7] Compiling Network.HTTP.Types.Status ( Network/HTTP/Types/Status.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Network/HTTP/Types/Status.o )
+[4 of 7] Compiling Network.HTTP.Types.QueryLike ( Network/HTTP/Types/QueryLike.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Network/HTTP/Types/QueryLike.o )
+[5 of 7] Compiling Network.HTTP.Types.Method ( Network/HTTP/Types/Method.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Network/HTTP/Types/Method.o )
+[6 of 7] Compiling Network.HTTP.Types.Header ( Network/HTTP/Types/Header.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Network/HTTP/Types/Header.o )
+[7 of 7] Compiling Network.HTTP.Types ( Network/HTTP/Types.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Network/HTTP/Types.o )
+In-place registering http-types-0.9...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/http-types-0.9-3Bf1bEHnPYIAJ2rfQRlloD
+Registering http-types-0.9...
diff --git a/.stack-work/logs/lifted-base-0.2.3.6.log b/.stack-work/logs/lifted-base-0.2.3.6.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/lifted-base-0.2.3.6.log
@@ -0,0 +1,43 @@
+Configuring lifted-base-0.2.3.6...
+Building lifted-base-0.2.3.6...
+Preprocessing library lifted-base-0.2.3.6...
+[1 of 9] Compiling System.Timeout.Lifted ( System/Timeout/Lifted.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/System/Timeout/Lifted.o )
+
+System/Timeout/Lifted.hs:4:14: Warning:
+    ‘System.Timeout.Lifted’ is marked as Trustworthy but has been inferred as safe!
+[2 of 9] Compiling Foreign.Marshal.Utils.Lifted ( Foreign/Marshal/Utils/Lifted.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Foreign/Marshal/Utils/Lifted.o )
+
+Foreign/Marshal/Utils/Lifted.hs:6:14: Warning:
+    ‘Foreign.Marshal.Utils.Lifted’ is marked as Trustworthy but has been inferred as safe!
+[3 of 9] Compiling Data.IORef.Lifted ( Data/IORef/Lifted.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/IORef/Lifted.o )
+
+Data/IORef/Lifted.hs:6:14: Warning:
+    ‘Data.IORef.Lifted’ is marked as Trustworthy but has been inferred as safe!
+[4 of 9] Compiling Control.Concurrent.QSemN.Lifted ( Control/Concurrent/QSemN/Lifted.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Concurrent/QSemN/Lifted.o )
+
+Control/Concurrent/QSemN/Lifted.hs:7:14: Warning:
+    ‘Control.Concurrent.QSemN.Lifted’ is marked as Trustworthy but has been inferred as safe!
+[5 of 9] Compiling Control.Concurrent.QSem.Lifted ( Control/Concurrent/QSem/Lifted.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Concurrent/QSem/Lifted.o )
+
+Control/Concurrent/QSem/Lifted.hs:7:14: Warning:
+    ‘Control.Concurrent.QSem.Lifted’ is marked as Trustworthy but has been inferred as safe!
+[6 of 9] Compiling Control.Concurrent.Chan.Lifted ( Control/Concurrent/Chan/Lifted.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Concurrent/Chan/Lifted.o )
+
+Control/Concurrent/Chan/Lifted.hs:6:14: Warning:
+    ‘Control.Concurrent.Chan.Lifted’ is marked as Trustworthy but has been inferred as safe!
+[7 of 9] Compiling Control.Concurrent.MVar.Lifted ( Control/Concurrent/MVar/Lifted.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Concurrent/MVar/Lifted.o )
+
+Control/Concurrent/MVar/Lifted.hs:7:14: Warning:
+    ‘Control.Concurrent.MVar.Lifted’ is marked as Trustworthy but has been inferred as safe!
+[8 of 9] Compiling Control.Exception.Lifted ( Control/Exception/Lifted.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Exception/Lifted.o )
+
+Control/Exception/Lifted.hs:11:14: Warning:
+    ‘Control.Exception.Lifted’ is marked as Trustworthy but has been inferred as safe!
+[9 of 9] Compiling Control.Concurrent.Lifted ( Control/Concurrent/Lifted.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Concurrent/Lifted.o )
+
+Control/Concurrent/Lifted.hs:4:14: Warning:
+    ‘Control.Concurrent.Lifted’ is marked as Trustworthy but has been inferred as safe!
+In-place registering lifted-base-0.2.3.6...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/lifted-base-0.2.3.6-30rpZxN2vBHCGvcAJlKDqd
+Registering lifted-base-0.2.3.6...
diff --git a/.stack-work/logs/memory-0.11.log b/.stack-work/logs/memory-0.11.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/memory-0.11.log
@@ -0,0 +1,55 @@
+Configuring memory-0.11...
+Building memory-0.11...
+Preprocessing library memory-0.11...
+[ 1 of 28] Compiling Data.Memory.MemMap.Posix ( .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/MemMap/Posix.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/MemMap/Posix.o )
+[ 2 of 28] Compiling Data.Memory.Internal.DeepSeq ( Data/Memory/Internal/DeepSeq.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Internal/DeepSeq.o )
+[ 3 of 28] Compiling Data.Memory.Internal.CompatPrim64 ( Data/Memory/Internal/CompatPrim64.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Internal/CompatPrim64.o )
+[ 4 of 28] Compiling Data.Memory.Internal.CompatPrim ( Data/Memory/Internal/CompatPrim.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Internal/CompatPrim.o )
+[ 5 of 28] Compiling Data.Memory.Internal.Scrubber ( Data/Memory/Internal/Scrubber.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Internal/Scrubber.o )
+[ 6 of 28] Compiling Data.Memory.ExtendedWords ( Data/Memory/ExtendedWords.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/ExtendedWords.o )
+[ 7 of 28] Compiling Data.Memory.Internal.Imports ( Data/Memory/Internal/Imports.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Internal/Imports.o )
+[ 8 of 28] Compiling Data.Memory.PtrMethods ( Data/Memory/PtrMethods.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/PtrMethods.o )
+[ 9 of 28] Compiling Data.Memory.Internal.Compat ( Data/Memory/Internal/Compat.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Internal/Compat.o )
+[10 of 28] Compiling Data.Memory.Encoding.Base16 ( Data/Memory/Encoding/Base16.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Encoding/Base16.o )
+[11 of 28] Compiling Data.Memory.Encoding.Base32 ( Data/Memory/Encoding/Base32.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Encoding/Base32.o )
+[12 of 28] Compiling Data.Memory.Encoding.Base64 ( Data/Memory/Encoding/Base64.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Encoding/Base64.o )
+[13 of 28] Compiling Data.Memory.Endian ( Data/Memory/Endian.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Endian.o )
+[14 of 28] Compiling Data.Memory.Hash.SipHash ( Data/Memory/Hash/SipHash.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Hash/SipHash.o )
+[15 of 28] Compiling Data.Memory.Hash.FNV ( Data/Memory/Hash/FNV.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/Memory/Hash/FNV.o )
+[16 of 28] Compiling Data.ByteArray.Types ( Data/ByteArray/Types.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/Types.o )
+
+Data/ByteArray/Types.hs:15:1: Warning:
+    The import of ‘Data.Monoid’ is redundant
+      except perhaps to import instances from ‘Data.Monoid’
+    To import instances alone, use: import Data.Monoid()
+[17 of 28] Compiling Data.ByteArray.Bytes ( Data/ByteArray/Bytes.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/Bytes.o )
+
+Data/ByteArray/Bytes.hs:20:1: Warning:
+    The import of ‘Data.Monoid’ is redundant
+      except perhaps to import instances from ‘Data.Monoid’
+    To import instances alone, use: import Data.Monoid()
+[18 of 28] Compiling Data.ByteArray.ScrubbedBytes ( Data/ByteArray/ScrubbedBytes.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/ScrubbedBytes.o )
+
+Data/ByteArray/ScrubbedBytes.hs:19:1: Warning:
+    The import of ‘Data.Monoid’ is redundant
+      except perhaps to import instances from ‘Data.Monoid’
+    To import instances alone, use: import Data.Monoid()
+[19 of 28] Compiling Data.ByteArray.MemView ( Data/ByteArray/MemView.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/MemView.o )
+[20 of 28] Compiling Data.ByteArray.Pack.Internal ( Data/ByteArray/Pack/Internal.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/Pack/Internal.o )
+
+Data/ByteArray/Pack/Internal.hs:20:1: Warning:
+    The import of ‘Data.Memory.Internal.Imports’ is redundant
+      except perhaps to import instances from ‘Data.Memory.Internal.Imports’
+    To import instances alone, use: import Data.Memory.Internal.Imports()
+[21 of 28] Compiling Data.ByteArray.Methods ( Data/ByteArray/Methods.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/Methods.o )
+[22 of 28] Compiling Data.ByteArray.View ( Data/ByteArray/View.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/View.o )
+[23 of 28] Compiling Data.ByteArray.Encoding ( Data/ByteArray/Encoding.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/Encoding.o )
+[24 of 28] Compiling Data.ByteArray.Mapping ( Data/ByteArray/Mapping.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/Mapping.o )
+[25 of 28] Compiling Data.ByteArray.Parse ( Data/ByteArray/Parse.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/Parse.o )
+[26 of 28] Compiling Data.ByteArray.Hash ( Data/ByteArray/Hash.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/Hash.o )
+[27 of 28] Compiling Data.ByteArray   ( Data/ByteArray.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray.o )
+[28 of 28] Compiling Data.ByteArray.Pack ( Data/ByteArray/Pack.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Data/ByteArray/Pack.o )
+In-place registering memory-0.11...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/memory-0.11-0EiEBIg44i8KGjAeoKnPDs
+Registering memory-0.11...
diff --git a/.stack-work/logs/mmorph-1.0.6.log b/.stack-work/logs/mmorph-1.0.6.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/mmorph-1.0.6.log
@@ -0,0 +1,53 @@
+Configuring mmorph-1.0.6...
+Building mmorph-1.0.6...
+Preprocessing library mmorph-1.0.6...
+[1 of 2] Compiling Control.Monad.Morph ( src/Control/Monad/Morph.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Monad/Morph.o )
+
+src/Control/Monad/Morph.hs:76:1: Warning:
+    Module ‘Control.Monad.Trans.Error’ is deprecated:
+      Use Control.Monad.Trans.Except instead
+
+src/Control/Monad/Morph.hs:112:20: Warning:
+    In the use of type constructor or class ‘E.ErrorT’
+    (imported from Control.Monad.Trans.Error):
+    Deprecated: "Use Control.Monad.Trans.Except instead"
+
+src/Control/Monad/Morph.hs:113:19: Warning:
+    In the use of data constructor ‘E.ErrorT’
+    (imported from Control.Monad.Trans.Error):
+    Deprecated: "Use Control.Monad.Trans.Except instead"
+
+src/Control/Monad/Morph.hs:113:34: Warning:
+    In the use of ‘E.runErrorT’
+    (imported from Control.Monad.Trans.Error):
+    Deprecated: "Use Control.Monad.Trans.Except instead"
+
+src/Control/Monad/Morph.hs:233:11: Warning:
+    In the use of type constructor or class ‘E.Error’
+    (imported from Control.Monad.Trans.Error):
+    Deprecated: "Use Control.Monad.Trans.Except instead"
+
+src/Control/Monad/Morph.hs:233:33: Warning:
+    In the use of type constructor or class ‘E.ErrorT’
+    (imported from Control.Monad.Trans.Error):
+    Deprecated: "Use Control.Monad.Trans.Except instead"
+
+src/Control/Monad/Morph.hs:234:17: Warning:
+    In the use of data constructor ‘E.ErrorT’
+    (imported from Control.Monad.Trans.Error):
+    Deprecated: "Use Control.Monad.Trans.Except instead"
+
+src/Control/Monad/Morph.hs:235:14: Warning:
+    In the use of ‘E.runErrorT’
+    (imported from Control.Monad.Trans.Error):
+    Deprecated: "Use Control.Monad.Trans.Except instead"
+
+src/Control/Monad/Morph.hs:235:30: Warning:
+    In the use of ‘E.runErrorT’
+    (imported from Control.Monad.Trans.Error):
+    Deprecated: "Use Control.Monad.Trans.Except instead"
+[2 of 2] Compiling Control.Monad.Trans.Compose ( src/Control/Monad/Trans/Compose.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Monad/Trans/Compose.o )
+In-place registering mmorph-1.0.6...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/mmorph-1.0.6-42KUkOfzC6q3qCtAMiSHam
+Registering mmorph-1.0.6...
diff --git a/.stack-work/logs/monad-control-1.0.0.5.log b/.stack-work/logs/monad-control-1.0.0.5.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/monad-control-1.0.0.5.log
@@ -0,0 +1,8 @@
+Configuring monad-control-1.0.0.5...
+Building monad-control-1.0.0.5...
+Preprocessing library monad-control-1.0.0.5...
+[1 of 1] Compiling Control.Monad.Trans.Control ( Control/Monad/Trans/Control.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Control/Monad/Trans/Control.o )
+In-place registering monad-control-1.0.0.5...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/monad-control-1.0.0.5-0V0Z5ArSaI68lPP0A0bpaP
+Registering monad-control-1.0.0.5...
diff --git a/.stack-work/logs/mountpoints-1.0.1.log b/.stack-work/logs/mountpoints-1.0.1.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/mountpoints-1.0.1.log
@@ -0,0 +1,8 @@
+Configuring mountpoints-1.0.1...
+Building mountpoints-1.0.1...
+Preprocessing library mountpoints-1.0.1...
+[1 of 1] Compiling System.MountPoints ( .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/System/MountPoints.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/System/MountPoints.o )
+In-place registering mountpoints-1.0.1...
+Installing library in
+/home/joey/src/git-annex/.stack-work/install/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/mountpoints-1.0.1-BgeHc197DxiDAiNIQ8ipJs
+Registering mountpoints-1.0.1...
diff --git a/.stack-work/logs/mtl-compat-0.2.1.3.log b/.stack-work/logs/mtl-compat-0.2.1.3.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/mtl-compat-0.2.1.3.log
@@ -0,0 +1,7 @@
+Configuring mtl-compat-0.2.1.3...
+Building mtl-compat-0.2.1.3...
+Preprocessing library mtl-compat-0.2.1.3...
+In-place registering mtl-compat-0.2.1.3...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/mtl-compat-0.2.1.3-HNwvu6hpyqBLqGyy8DsC5w
+Registering mtl-compat-0.2.1.3...
diff --git a/.stack-work/logs/mwc-random-0.13.4.0.log b/.stack-work/logs/mwc-random-0.13.4.0.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/mwc-random-0.13.4.0.log
@@ -0,0 +1,1 @@
+Configuring mwc-random-0.13.4.0...
diff --git a/.stack-work/logs/nats-1.1.log b/.stack-work/logs/nats-1.1.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/nats-1.1.log
@@ -0,0 +1,7 @@
+Configuring nats-1.1...
+Building nats-1.1...
+Preprocessing library nats-1.1...
+In-place registering nats-1.1...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/nats-1.1-4rT3BkPz6Fa0j9LJSDe5FB
+Registering nats-1.1...
diff --git a/.stack-work/logs/prelude-extras-0.4.0.3.log b/.stack-work/logs/prelude-extras-0.4.0.3.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/prelude-extras-0.4.0.3.log
@@ -0,0 +1,8 @@
+Configuring prelude-extras-0.4.0.3...
+Building prelude-extras-0.4.0.3...
+Preprocessing library prelude-extras-0.4.0.3...
+[1 of 1] Compiling Prelude.Extras   ( src/Prelude/Extras.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/Prelude/Extras.o )
+In-place registering prelude-extras-0.4.0.3...
+Installing library in
+/home/joey/.stack/snapshots/x86_64-linux/lts-5.5/7.10.3/lib/x86_64-linux-ghc-7.10.3/prelude-extras-0.4.0.3-1gQpKVfMHul71LsAFgGRhv
+Registering prelude-extras-0.4.0.3...
diff --git a/.stack-work/logs/process-1.3.0.0.log b/.stack-work/logs/process-1.3.0.0.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/process-1.3.0.0.log
@@ -0,0 +1,53 @@
+[1 of 1] Compiling Main             ( /home/joey/tmp/stack17642/process-1.3.0.0/Setup.hs, /home/joey/tmp/stack17642/process-1.3.0.0/.stack-work/dist/x86_64-linux/Cabal-1.22.5.0/setup/Main.o )
+Linking /home/joey/tmp/stack17642/process-1.3.0.0/.stack-work/dist/x86_64-linux/Cabal-1.22.5.0/setup/setup ...
+Configuring process-1.3.0.0...
+configure: WARNING: unrecognized options: --with-compiler, --with-gcc
+checking for gcc... gcc
+checking whether the C compiler works... yes
+checking for C compiler default output file name... a.out
+checking for suffix of executables... 
+checking whether we are cross compiling... no
+checking for suffix of object files... o
+checking whether we are using the GNU C compiler... yes
+checking whether gcc accepts -g... yes
+checking for gcc option to accept ISO C89... none needed
+checking how to run the C preprocessor... gcc -E
+checking for grep that handles long lines and -e... /bin/grep
+checking for egrep... /bin/grep -E
+checking for ANSI C header files... yes
+checking for sys/types.h... yes
+checking for sys/stat.h... yes
+checking for stdlib.h... yes
+checking for string.h... yes
+checking for memory.h... yes
+checking for strings.h... yes
+checking for inttypes.h... yes
+checking for stdint.h... yes
+checking for unistd.h... yes
+checking for pid_t... yes
+checking vfork.h usability... no
+checking vfork.h presence... no
+checking for vfork.h... no
+checking for fork... yes
+checking for vfork... yes
+checking for working fork... yes
+checking for working vfork... (cached) yes
+checking signal.h usability... yes
+checking signal.h presence... yes
+checking for signal.h... yes
+checking sys/wait.h usability... yes
+checking sys/wait.h presence... yes
+checking for sys/wait.h... yes
+checking fcntl.h usability... yes
+checking fcntl.h presence... yes
+checking for fcntl.h... yes
+checking for setitimer... yes
+checking for sysconf... yes
+checking value of SIG_DFL... -1
+checking value of SIG_IGN... -1
+configure: creating ./config.status
+config.status: creating include/HsProcessConfig.h
+configure: WARNING: unrecognized options: --with-compiler, --with-gcc
+Building process-1.3.0.0...
+Preprocessing library process-1.3.0.0...
+[1 of 3] Compiling System.Process.Internals ( System/Process/Internals.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/System/Process/Internals.o )
diff --git a/.stack-work/logs/psqueues-0.2.2.0.log b/.stack-work/logs/psqueues-0.2.2.0.log
new file mode 100644
--- /dev/null
+++ b/.stack-work/logs/psqueues-0.2.2.0.log
diff --git a/Annex.hs b/Annex.hs
--- a/Annex.hs
+++ b/Annex.hs
@@ -42,6 +42,7 @@
 import qualified Git.Config
 import Annex.Fixup
 import Git.CatFile
+import Git.HashObject
 import Git.CheckAttr
 import Git.CheckIgnore
 import qualified Git.Hook
@@ -106,6 +107,7 @@
 	, branchstate :: BranchState
 	, repoqueue :: Maybe Git.Queue.Queue
 	, catfilehandles :: M.Map FilePath CatFileHandle
+	, hashobjecthandle :: Maybe HashObjectHandle
 	, checkattrhandle :: Maybe CheckAttrHandle
 	, checkignorehandle :: Maybe (Maybe CheckIgnoreHandle)
 	, forcebackend :: Maybe String
@@ -151,6 +153,7 @@
 	, branchstate = startBranchState
 	, repoqueue = Nothing
 	, catfilehandles = M.empty
+	, hashobjecthandle = Nothing
 	, checkattrhandle = Nothing
 	, checkignorehandle = Nothing
 	, forcebackend = Nothing
diff --git a/Annex/Branch.hs b/Annex/Branch.hs
--- a/Annex/Branch.hs
+++ b/Annex/Branch.hs
@@ -45,7 +45,8 @@
 import qualified Git.UnionMerge
 import qualified Git.UpdateIndex
 import Git.LsTree (lsTreeParams)
-import Git.HashObject
+import qualified Git.HashObject
+import Annex.HashObject
 import Git.Types
 import Git.FilePath
 import Annex.CatFile
@@ -342,8 +343,9 @@
 mergeIndex :: JournalLocked -> [Git.Ref] -> Annex ()
 mergeIndex jl branches = do
 	prepareModifyIndex jl
-	h <- catFileHandle
-	inRepo $ \g -> Git.UnionMerge.mergeIndex h g branches
+	hashhandle <- hashObjectHandle
+	ch <- catFileHandle
+	inRepo $ \g -> Git.UnionMerge.mergeIndex hashhandle ch g branches
 
 {- Removes any stale git lock file, to avoid git falling over when
  - updating the index.
@@ -423,11 +425,10 @@
 	let dir = gitAnnexJournalDir g
 	(jlogf, jlogh) <- openjlog
 	liftIO $ fileEncoding jlogh
-	withJournalHandle $ \jh -> do
-		h <- hashObjectStart g
+	h <- hashObjectHandle
+	withJournalHandle $ \jh ->
 		Git.UpdateIndex.streamUpdateIndex g
 			[genstream dir h jh jlogh]
-		hashObjectStop h
 	return $ cleanup dir jlogh jlogf
   where
 	genstream dir h jh jlogh streamer = do
@@ -437,7 +438,7 @@
 			Just file -> do
 				unless (dirCruft file) $ do
 					let path = dir </> file
-					sha <- hashFile h path
+					sha <- Git.HashObject.hashFile h path
 					hPutStrLn jlogh file
 					streamer $ Git.UpdateIndex.updateIndexLine
 						sha FileBlob (asTopFilePath $ fileJournal file)
@@ -549,13 +550,11 @@
 	run changers = do
 		trustmap <- calcTrustMap <$> getRaw trustLog
 		fs <- branchFiles
-		hasher <- inRepo hashObjectStart
 		forM_ fs $ \f -> do
 			content <- getRaw f
-			apply changers hasher f content trustmap
-		liftIO $ hashObjectStop hasher
-	apply [] _ _ _ _ = return ()
-	apply (changer:rest) hasher file content trustmap =
+			apply changers f content trustmap
+	apply [] _ _ _ = return ()
+	apply (changer:rest) file content trustmap =
 		case changer file content trustmap of
 			RemoveFile -> do
 				Annex.Queue.addUpdateIndex
@@ -564,12 +563,12 @@
 				-- transitions on it.
 				return ()
 			ChangeFile content' -> do
-				sha <- inRepo $ hashObject BlobObject content'
+				sha <- hashBlob content'
 				Annex.Queue.addUpdateIndex $ Git.UpdateIndex.pureStreamer $
 					Git.UpdateIndex.updateIndexLine sha FileBlob (asTopFilePath file)
-				apply rest hasher file content' trustmap
+				apply rest file content' trustmap
 			PreserveFile ->
-				apply rest hasher file content trustmap
+				apply rest file content trustmap
 
 checkBranchDifferences :: Git.Ref -> Annex ()
 checkBranchDifferences ref = do
diff --git a/Annex/Concurrent.hs b/Annex/Concurrent.hs
--- a/Annex/Concurrent.hs
+++ b/Annex/Concurrent.hs
@@ -11,6 +11,7 @@
 import Annex
 import Annex.CatFile
 import Annex.CheckAttr
+import Annex.HashObject
 import Annex.CheckIgnore
 import qualified Annex.Queue
 
@@ -64,4 +65,5 @@
 	closehandles = do
 		catFileStop
 		checkAttrStop
+		hashObjectStop
 		checkIgnoreStop
diff --git a/Annex/Content.hs b/Annex/Content.hs
--- a/Annex/Content.hs
+++ b/Annex/Content.hs
@@ -41,8 +41,6 @@
 	saveState,
 	downloadUrl,
 	preseedTmp,
-	freezeContent,
-	thawContent,
 	dirKeys,
 	withObjectLoc,
 	staleKeysPrune,
@@ -67,7 +65,6 @@
 import Utility.Metered
 import Config
 import Git.FilePath
-import Git.SharedRepository
 import Annex.Perms
 import Annex.Link
 import qualified Annex.Content.Direct as Direct
@@ -916,47 +913,6 @@
 				, return False
 				)
 		)
-
-{- Normally, blocks writing to an annexed file, and modifies file
- - permissions to allow reading it.
- -
- - When core.sharedRepository is set, the write bits are not removed from
- - the file, but instead the appropriate group write bits are set. This is
- - necessary to let other users in the group lock the file.
- -}
-freezeContent :: FilePath -> Annex ()
-freezeContent file = unlessM crippledFileSystem $
-	withShared go
-  where
-	go GroupShared = liftIO $ modifyFileMode file $
-		addModes [ownerReadMode, groupReadMode, ownerWriteMode, groupWriteMode]
-	go AllShared = liftIO $ modifyFileMode file $
-		addModes (readModes ++ writeModes)
-	go _ = liftIO $ modifyFileMode file $
-		removeModes writeModes .
-		addModes [ownerReadMode]
-
-{- Adjusts read mode of annexed file per core.sharedRepository setting. -}
-chmodContent :: FilePath -> Annex ()
-chmodContent file = unlessM crippledFileSystem $
-	withShared go
-  where
-	go GroupShared = liftIO $ modifyFileMode file $
-		addModes [ownerReadMode, groupReadMode]
-	go AllShared = liftIO $ modifyFileMode file $
-		addModes readModes
-	go _ = liftIO $ modifyFileMode file $
-		addModes [ownerReadMode]
-
-{- Allows writing to an annexed file that freezeContent was called on
- - before. -}
-thawContent :: FilePath -> Annex ()
-thawContent file = unlessM crippledFileSystem $
-	withShared go
-  where
-	go GroupShared = liftIO $ groupWriteRead file
-	go AllShared = liftIO $ groupWriteRead file
-	go _ = liftIO $ allowWrite file
 
 {- Finds files directly inside a directory like gitAnnexBadDir 
  - (not in subdirectories) and returns the corresponding keys. -}
diff --git a/Annex/HashObject.hs b/Annex/HashObject.hs
new file mode 100644
--- /dev/null
+++ b/Annex/HashObject.hs
@@ -0,0 +1,47 @@
+{- git hash-object interface, with handle automatically stored in the Annex monad
+ -
+ - Copyright 2016 Joey Hess <id@joeyh.name>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Annex.HashObject (
+	hashFile,
+	hashBlob,
+	hashObjectHandle,
+	hashObjectStop,
+) where
+
+import Annex.Common
+import qualified Git.HashObject
+import qualified Annex
+import Git.Types
+
+hashObjectHandle :: Annex Git.HashObject.HashObjectHandle
+hashObjectHandle = maybe startup return =<< Annex.getState Annex.hashobjecthandle
+  where
+	startup = do
+		h <- inRepo $ Git.HashObject.hashObjectStart
+		Annex.changeState $ \s -> s { Annex.hashobjecthandle = Just h }
+		return h
+
+hashObjectStop :: Annex ()
+hashObjectStop = maybe noop stop =<< Annex.getState Annex.hashobjecthandle
+  where
+	stop h = do
+		liftIO $ Git.HashObject.hashObjectStop h
+		Annex.changeState $ \s -> s { Annex.hashobjecthandle = Nothing }
+		return ()
+
+hashFile :: FilePath -> Annex Sha
+hashFile f = do
+	h <- hashObjectHandle
+	liftIO $ Git.HashObject.hashFile h f
+
+{- Note that the content will be written to a temp file.
+ - So it may be faster to use Git.HashObject.hashObject for large
+ - blob contents. -}
+hashBlob :: String -> Annex Sha
+hashBlob content = do
+	h <- hashObjectHandle
+	liftIO $ Git.HashObject.hashBlob h content
diff --git a/Annex/Ingest.hs b/Annex/Ingest.hs
--- a/Annex/Ingest.hs
+++ b/Annex/Ingest.hs
@@ -5,8 +5,6 @@
  - Licensed under the GNU GPL version 3 or higher.
  -}
 
-{-# LANGUAGE CPP #-}
-
 module Annex.Ingest (
 	LockedDown(..),
 	LockDownConfig(..),
@@ -42,13 +40,9 @@
 import Annex.ReplaceFile
 import Utility.Tmp
 import Utility.CopyFile
+import Utility.Touch
 import Git.FilePath
 import Annex.InodeSentinal
-#ifdef WITH_CLIBS
-#ifndef __ANDROID__
-import Utility.Touch
-#endif
-#endif
 
 import Control.Exception (IOException)
 
@@ -282,11 +276,7 @@
 	-- touch symlink to have same time as the original file,
 	-- as provided in the InodeCache
 	case mcache of
-#if defined(WITH_CLIBS) && ! defined(__ANDROID__)
 		Just c -> liftIO $ touch file (TimeSpec $ inodeCacheToMtime c) False
-#else
-		Just _ -> noop
-#endif
 		Nothing -> noop
 
 	return l
diff --git a/Annex/Link.hs b/Annex/Link.hs
--- a/Annex/Link.hs
+++ b/Annex/Link.hs
@@ -18,11 +18,11 @@
 
 import Annex.Common
 import qualified Annex
-import qualified Git.HashObject
 import qualified Git.UpdateIndex
 import qualified Annex.Queue
 import Git.Types
 import Git.FilePath
+import Annex.HashObject
 
 import qualified Data.ByteString.Lazy as L
 import Data.Int
@@ -105,12 +105,7 @@
 
 {- Injects a symlink target into git, returning its Sha. -}
 hashSymlink :: LinkTarget -> Annex Sha
-hashSymlink linktarget = inRepo $ Git.HashObject.hashObject BlobObject $ 
-	toInternalGitPath linktarget
-
-hashSymlink' :: Git.HashObject.HashObjectHandle -> LinkTarget -> Annex Sha
-hashSymlink' h linktarget = liftIO $ Git.HashObject.hashBlob h $
-	toInternalGitPath linktarget
+hashSymlink linktarget = hashBlob (toInternalGitPath linktarget)
 
 {- Stages a symlink to an annexed object, using a Sha of its target. -}
 stageSymlink :: FilePath -> Sha -> Annex ()
@@ -120,8 +115,7 @@
 
 {- Injects a pointer file content into git, returning its Sha. -}
 hashPointerFile :: Key -> Annex Sha
-hashPointerFile key = inRepo $ Git.HashObject.hashObject BlobObject $
-	formatPointer key
+hashPointerFile key = hashBlob (formatPointer key)
 
 {- Stages a pointer file, using a Sha of its content -}
 stagePointerFile :: FilePath -> Sha -> Annex ()
@@ -159,7 +153,9 @@
 formatPointer k = 
 	toInternalGitPath (pathSeparator:objectDir </> keyFile k) ++ "\n"
 
-{- Checks if a file is a pointer to a key. -}
+{- Checks if a worktree file is a pointer to a key.
+ -
+ - Unlocked files whose content is present are not detected by this. -}
 isPointerFile :: FilePath -> IO (Maybe Key)
 isPointerFile f = catchDefaultIO Nothing $ do
 	b <- L.take maxPointerSz <$> L.readFile f
diff --git a/Annex/LockPool/PosixOrPid.hs b/Annex/LockPool/PosixOrPid.hs
--- a/Annex/LockPool/PosixOrPid.hs
+++ b/Annex/LockPool/PosixOrPid.hs
@@ -47,8 +47,14 @@
 tryLockExclusive m f = tryPidLock m f $ Posix.tryLockExclusive m f
 
 checkLocked :: LockFile -> Annex (Maybe Bool)
-checkLocked f = Posix.checkLocked f
-	`pidLockCheck` Pid.checkLocked
+checkLocked f = Posix.checkLocked f `pidLockCheck` checkpid
+  where
+	checkpid pidlock = do
+		v <- Pid.checkLocked pidlock
+		case v of
+			-- Only return true when the posix lock file exists.
+			Just _ -> Posix.checkLocked f
+			Nothing -> return Nothing
 
 getLockStatus :: LockFile -> Annex LockStatus
 getLockStatus f = Posix.getLockStatus f
@@ -88,6 +94,6 @@
 
 -- The posix lock file is created even when using pid locks, in order to
 -- avoid complicating any code that might expect to be able to see that
--- lock file.
+-- lock file. But, it's not locked.
 dummyPosixLock :: Maybe FileMode -> LockFile -> IO ()
 dummyPosixLock m f = closeFd =<< openLockFile ReadLock m f
diff --git a/Annex/MetaData.hs b/Annex/MetaData.hs
--- a/Annex/MetaData.hs
+++ b/Annex/MetaData.hs
@@ -61,7 +61,7 @@
 parseModMeta :: String -> Either String ModMeta
 parseModMeta p = case lastMaybe f of
 	Just '+' -> AddMeta <$> mkMetaField f' <*> v
-	Just '-' -> DelMeta <$> mkMetaField f' <*> v
+	Just '-' -> DelMeta <$> mkMetaField f' <*> (Just <$> v)
 	Just '?' -> MaybeSetMeta <$> mkMetaField f' <*> v
 	_ -> SetMeta <$> mkMetaField f <*> v
   where
diff --git a/Annex/Perms.hs b/Annex/Perms.hs
--- a/Annex/Perms.hs
+++ b/Annex/Perms.hs
@@ -11,6 +11,9 @@
 	annexFileMode,
 	createAnnexDirectory,
 	noUmask,
+	freezeContent,
+	thawContent,
+	chmodContent,
 	createContentDir,
 	freezeContentDir,
 	thawContentDir,
@@ -77,6 +80,55 @@
 			liftIO $ createDirectoryIfMissing True p
 			setAnnexDirPerm p
 
+{- Normally, blocks writing to an annexed file, and modifies file
+ - permissions to allow reading it.
+ -
+ - When core.sharedRepository is set, the write bits are not removed from
+ - the file, but instead the appropriate group write bits are set. This is
+ - necessary to let other users in the group lock the file.
+ -}
+freezeContent :: FilePath -> Annex ()
+freezeContent file = unlessM crippledFileSystem $
+	withShared go
+  where
+	go GroupShared = liftIO $ modifyFileMode file $
+		addModes [ownerReadMode, groupReadMode, ownerWriteMode, groupWriteMode]
+	go AllShared = liftIO $ modifyFileMode file $
+		addModes (readModes ++ writeModes)
+	go _ = liftIO $ modifyFileMode file $
+		removeModes writeModes .
+		addModes [ownerReadMode]
+
+{- Adjusts read mode of annexed file per core.sharedRepository setting. -}
+chmodContent :: FilePath -> Annex ()
+chmodContent file = unlessM crippledFileSystem $
+	withShared go
+  where
+	go GroupShared = liftIO $ modifyFileMode file $
+		addModes [ownerReadMode, groupReadMode]
+	go AllShared = liftIO $ modifyFileMode file $
+		addModes readModes
+	go _ = liftIO $ modifyFileMode file $
+		addModes [ownerReadMode]
+
+{- Allows writing to an annexed file that freezeContent was called on
+ - before. -}
+thawContent :: FilePath -> Annex ()
+thawContent file = thawPerms $ withShared go
+  where
+	go GroupShared = liftIO $ groupWriteRead file
+	go AllShared = liftIO $ groupWriteRead file
+	go _ = liftIO $ allowWrite file
+
+{- Runs an action that thaws a file's permissions. This will probably
+ - fail on a crippled filesystem. But, if file modes are supported on a
+ - crippled filesystem, the file may be frozen, so try to thaw it. -}
+thawPerms :: Annex () -> Annex ()
+thawPerms a = ifM crippledFileSystem
+	( void $ tryNonAsync a
+	, a
+	)
+
 {- Blocks writing to the directory an annexed file is in, to prevent the
  - file accidentially being deleted. However, if core.sharedRepository
  - is set, this is not done, since the group must be allowed to delete the
@@ -92,8 +144,7 @@
 	go _ = liftIO $ preventWrite dir
 
 thawContentDir :: FilePath -> Annex ()
-thawContentDir file = unlessM crippledFileSystem $
-	liftIO $ allowWrite $ parentDir file
+thawContentDir file = thawPerms $ liftIO $ allowWrite $ parentDir file
 
 {- Makes the directory tree to store an annexed file's content,
  - with appropriate permissions on each level. -}
diff --git a/Annex/View.hs b/Annex/View.hs
--- a/Annex/View.hs
+++ b/Annex/View.hs
@@ -19,7 +19,7 @@
 import qualified Git.Ref
 import Git.UpdateIndex
 import Git.Sha
-import Git.HashObject
+import Annex.HashObject
 import Git.Types
 import Git.FilePath
 import Annex.WorkTree
@@ -340,38 +340,36 @@
 	(l, clean) <- inRepo $ Git.LsFiles.inRepo [top]
 	liftIO . nukeFile =<< fromRepo gitAnnexViewIndex
 	uh <- withViewIndex $ inRepo Git.UpdateIndex.startUpdateIndex
-	hasher <- inRepo hashObjectStart
 	forM_ l $ \f -> do
 		relf <- getTopFilePath <$> inRepo (toTopFilePath f)
-		go uh hasher relf =<< lookupFile f
+		go uh relf =<< lookupFile f
 	liftIO $ do
-		hashObjectStop hasher
 		void $ stopUpdateIndex uh
 		void clean
 	genViewBranch view
   where
 	genviewedfiles = viewedFiles view mkviewedfile -- enables memoization
-	go uh hasher f (Just k) = do
+	go uh f (Just k) = do
 		metadata <- getCurrentMetaData k
 		let metadata' = getfilemetadata f `unionMetaData` metadata
 		forM_ (genviewedfiles f metadata') $ \fv -> do
 			f' <- fromRepo $ fromTopFilePath $ asTopFilePath fv
-			stagesymlink uh hasher f' =<< calcRepo (gitAnnexLink f' k)
-	go uh hasher f Nothing
+			stagesymlink uh f' =<< calcRepo (gitAnnexLink f' k)
+	go uh f Nothing
 		| "." `isPrefixOf` f = do
 			s <- liftIO $ getSymbolicLinkStatus f
 			if isSymbolicLink s
-				then stagesymlink uh hasher f =<< liftIO (readSymbolicLink f)
+				then stagesymlink uh f =<< liftIO (readSymbolicLink f)
 				else do
-					sha <- liftIO $ Git.HashObject.hashFile hasher f
+					sha <- hashFile f
 					let blobtype = if isExecutable (fileMode s)
 						then ExecutableBlob
 						else FileBlob
 					liftIO . Git.UpdateIndex.streamUpdateIndex' uh
 						=<< inRepo (Git.UpdateIndex.stageFile sha blobtype f)
 		| otherwise = noop
-	stagesymlink uh hasher f linktarget = do
-		sha <- hashSymlink' hasher linktarget
+	stagesymlink uh f linktarget = do
+		sha <- hashSymlink linktarget
 		liftIO . Git.UpdateIndex.streamUpdateIndex' uh
 			=<< inRepo (Git.UpdateIndex.stageSymlink f sha)
 
diff --git a/Assistant.hs b/Assistant.hs
--- a/Assistant.hs
+++ b/Assistant.hs
@@ -25,7 +25,7 @@
 import Assistant.Threads.SanityChecker
 import Assistant.Threads.Cronner
 import Assistant.Threads.ProblemFixer
-#ifdef WITH_CLIBS
+#ifndef mingw32_HOST_OS
 import Assistant.Threads.MountWatcher
 #endif
 import Assistant.Threads.NetWatcher
@@ -170,7 +170,7 @@
 				, assist $ sanityCheckerDailyThread urlrenderer
 				, assist sanityCheckerHourlyThread
 				, assist $ problemFixerThread urlrenderer
-#ifdef WITH_CLIBS
+#ifndef mingw32_HOST_OS
 				, assist $ mountWatcherThread urlrenderer
 #endif
 				, assist netWatcherThread
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
@@ -24,9 +24,7 @@
 import Config.Files
 import Utility.FreeDesktop
 import Utility.DiskFree
-#ifdef WITH_CLIBS
 import Utility.Mounts
-#endif
 import Utility.DataUnits
 import Remote (prettyUUID)
 import Annex.UUID
@@ -359,7 +357,6 @@
 -- Could use wmic, but it only works for administrators.
 driveList = mapM (\d -> genRemovableDrive $ d:":\\") ['A'..'Z']
 #else
-#ifdef WITH_CLIBS
 driveList = mapM (genRemovableDrive . mnt_dir) =<< filter sane <$> getMounts
   where
 	-- filter out some things that are surely not removable drives
@@ -379,9 +376,6 @@
 		| dir == "/sdcard" = False
 #endif
 		| otherwise = True
-#else
-driveList = return []
-#endif
 #endif
 
 genRemovableDrive :: FilePath -> IO RemovableDrive
diff --git a/Build/DistributionUpdate.hs b/Build/DistributionUpdate.hs
--- a/Build/DistributionUpdate.hs
+++ b/Build/DistributionUpdate.hs
@@ -13,6 +13,7 @@
 import Build.Version (getChangelogVersion, Version)
 import Utility.UserInfo
 import Utility.Url
+import Utility.Tmp
 import qualified Git.Construct
 import qualified Annex
 import Annex.Content
@@ -56,7 +57,8 @@
 	state <- Annex.new =<< Git.Construct.fromPath "."
 	Annex.eval state (makeinfos updated version)
 
--- Download a build from the autobuilder, and return its version.
+-- Download a build from the autobuilder, virus check it, and return its
+-- version.
 -- It's very important that the version matches the build, otherwise
 -- auto-upgrades can loop reatedly. So, check build-version before
 -- and after downloading the file.
@@ -72,18 +74,21 @@
 		putStrLn $ "*** " ++ s
 		return Nothing
 	ifM (download url tmp def)
-		( do
-			bv2 <- getbv
-			case bv2 of
-				Nothing -> oops $ "no build-version file for " ++ url
-				(Just v)
-					| bv2 == bv1 -> do
-						nukeFile dest
-						renameFile tmp dest
-						-- remove git rev part of version
-						let v' = takeWhile (/= '-') v
-						return $ Just (f, v')
-					| otherwise -> oops $ "build version changed while downloading " ++ url ++ " " ++ show (bv1, bv2)
+		( ifM (liftIO $ virusFree tmp)
+			( do
+				bv2 <- getbv
+				case bv2 of
+					Nothing -> oops $ "no build-version file for " ++ url
+					(Just v)
+						| bv2 == bv1 -> do
+							nukeFile dest
+							renameFile tmp dest
+							-- remove git rev part of version
+							let v' = takeWhile (/= '-') v
+							return $ Just (f, v')
+						| otherwise -> oops $ "build version changed while downloading " ++ url ++ " " ++ show (bv1, bv2)
+			, oops $ "VIRUS detected in " ++ url
+			)
 		, oops $ "failed to download " ++ url
 		)
   where
@@ -170,3 +175,30 @@
 		]
 	liftIO $ rename (f ++ ".asc") (f ++ ".sig")
 	void $ inRepo $ runBool [Param "add", File (f ++ ".sig")]
+
+-- clamscan should handle unpacking archives, but did not in my
+-- testing, so do it manually.
+virusFree :: FilePath -> IO Bool
+virusFree f 
+	| ".tar.gz" `isSuffixOf` f = unpack $ \tmpdir ->
+		boolSystem "tar" [ Param "xf", File f, Param "-C", File tmpdir ]
+	| ".dmg" `isSuffixOf` f = unpack $ \tmpdir -> do
+		-- 7z can extract partitions from a dmg, and then
+		-- run on partitions can extract their files
+		unhfs tmpdir f
+		parts <- filter (".hfs" `isSuffixOf`) <$> getDirectoryContents tmpdir
+		forM_ parts $ unhfs tmpdir
+		return True
+	| otherwise = clamscan f
+  where
+	clamscan f' = boolSystem "clamscan"
+		[ Param "--no-summary"
+		, Param "-r"
+		, Param f'
+		]
+	unpack unpacker = withTmpDir "clamscan" $ \tmpdir -> do
+		unlessM (unpacker tmpdir) $
+			error $ "Failed to unpack " ++ f ++ " for virus scan"
+		clamscan tmpdir
+	unhfs dest f' = unlessM (boolSystem "7z" [ Param "x", Param ("-o" ++ dest), File f' ]) $
+		error $ "Failed extracting hfs " ++ f'
diff --git a/Build/OSXMkLibs.hs b/Build/OSXMkLibs.hs
--- a/Build/OSXMkLibs.hs
+++ b/Build/OSXMkLibs.hs
@@ -49,6 +49,10 @@
 		let fulllib = dropWhile (== '/') lib
 		let dest = appbase </> fulllib
 		let symdest = appbase </> shortlib
+		-- This is a hack; libraries need to be in the same
+		-- directory as the program, so also link them into the
+		-- extra directory.
+		let symdestextra = appbase </> "extra" </> shortlib
 		ifM (doesFileExist dest)
 			( return Nothing
 			, do
@@ -56,7 +60,8 @@
 				putStrLn $ "installing " ++ pathlib ++ " as " ++ shortlib
 				unlessM (boolSystem "cp" [File pathlib, File dest]
 					<&&> boolSystem "chmod" [Param "644", File dest]
-					<&&> boolSystem "ln" [Param "-s", File fulllib, File symdest]) $
+					<&&> boolSystem "ln" [Param "-s", File fulllib, File symdest]
+					<&&> boolSystem "ln" [Param "-s", File (".." </> fulllib), File symdestextra]) $
 					error "library install failed"
 				return $ Just appbase
 			)
diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,24 @@
+git-annex (6.20160318) unstable; urgency=medium
+
+  * metadata: Added -r to remove all current values of a field.
+  * Fix data loss that can occur when annex.pidlock is set in a repository.
+  * Fix bug preventing moving files to/from a repository with annex.pidlock set.
+  * Fix shared lock file FD leak.
+  * Fix metadata hook behavior when multiple files are added at once.
+    Thanks, Klaus Ethgen.
+  * Added dependencies on haskell mountpoints and disk-free-space
+    libraries, removing FFI code from git-annex.
+  * dropkey: Add --batch and --json.
+  * Fix OSX dmg to include libraries needed by bundled gpg,
+    lost in last release.
+  * Always try to thaw content, even when annex.crippledfilesystem is set.
+  * Correct git-annex info to include unlocked files in v6 repository.
+  * Sped up git-annex add in direct mode and v6 by using
+    git hash-object --stdin-paths.
+  * Sped up git-annex merge by using git hash-object --stdin-paths.
+
+ -- Joey Hess <id@joeyh.name>  Fri, 18 Mar 2016 11:30:36 -0400
+
 git-annex (6.20160229) unstable; urgency=medium
 
   * Update perlmagick build dependency. Closes: #789225
diff --git a/COPYRIGHT b/COPYRIGHT
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -35,10 +35,6 @@
 License: other
   Free to modify and redistribute with due credit, and obviously free to use.
 
-Files: Utility/Mounts.hsc
-Copyright: Volker Wysk <hsss@volker-wysk.de>
-License: LGPL-2.1+
-
 Files: Annex/DirHashes.hs
 Copyright: 2001 Ian Lynagh
            2010-2015 Joey Hess <id@joeyh.name>
@@ -49,42 +45,6 @@
            2016 Klaus Ethgen <Klaus@Ethgen.ch>
 License: GPL-3+
 
-Files: Utility/libmounts.c
-Copyright: 1980, 1989, 1993, 1994 The Regents of the University of California
-           2001 David Rufino <daverufino@btinternet.com>
-           2012 Joey Hess <id@joeyh.name>
-License: BSD-3-clause
- * Copyright (c) 1980, 1989, 1993, 1994
- *      The Regents of the University of California.  All rights reserved.
- * Copyright (c) 2001
- *      David Rufino <daverufino@btinternet.com>
- * Copyright 2012
- *      Joey Hess <id@joeyh.name>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
-
 Files: static/jquery*
 Copyright: © 2005-2011 by John Resig, Branden Aaron & Jörn Zaefferer
            © 2011 The Dojo Foundation
@@ -139,11 +99,6 @@
  The full text of version 3 of the GPL is distributed as doc/license/GPL in
  this package's source, or in /usr/share/common-licenses/GPL-3 on
  Debian systems.
-
-License: LGPL-2.1+
- The full text of version 2.1 of the LGPL is distributed as doc/license/LGPL
- in this package's source, or in /usr/share/common-licenses/LGPL-2.1
- on Debian systems.
 
 License: BSD-2-clause
  Redistribution and use in source and binary forms, with or without
diff --git a/Command/DropKey.hs b/Command/DropKey.hs
--- a/Command/DropKey.hs
+++ b/Command/DropKey.hs
@@ -1,6 +1,6 @@
 {- git-annex command
  -
- - Copyright 2010 Joey Hess <id@joeyh.name>
+ - Copyright 2010,2016 Joey Hess <id@joeyh.name>
  -
  - Licensed under the GNU GPL version 3 or higher.
  -}
@@ -13,26 +13,45 @@
 import Annex.Content
 
 cmd :: Command
-cmd = noCommit $ 
+cmd = noCommit $ withGlobalOptions [jsonOption] $
 	command "dropkey" SectionPlumbing
 		"drops annexed content for specified keys"
 		(paramRepeating paramKey)
-		(withParams seek)
+		(seek <$$> optParser)
 
-seek :: CmdParams -> CommandSeek
-seek = withKeys start
+data DropKeyOptions = DropKeyOptions
+	{ toDrop :: [String]
+	, batchOption :: BatchMode
+	}
 
-start :: Key -> CommandStart
-start key = stopUnless (inAnnex key) $ do
+optParser :: CmdParamsDesc -> Parser DropKeyOptions
+optParser desc = DropKeyOptions
+	<$> cmdParams desc
+	<*> parseBatchOption
+
+seek :: DropKeyOptions -> CommandSeek
+seek o = do
 	unlessM (Annex.getState Annex.force) $
 		error "dropkey can cause data loss; use --force if you're sure you want to do this"
+	withKeys start (toDrop o)
+	case batchOption o of
+		Batch -> batchInput parsekey $ batchCommandAction . start
+		NoBatch -> noop
+  where
+	parsekey = maybe (Left "bad key") Right . file2key
+
+start :: Key -> CommandStart
+start key = do
 	showStart' "dropkey" key Nothing
 	next $ perform key
 
 perform :: Key -> CommandPerform
-perform key = lockContentForRemoval key $ \contentlock -> do
-	removeAnnex contentlock
-	next $ cleanup key
+perform key = ifM (inAnnex key)
+	( lockContentForRemoval key $ \contentlock -> do
+		removeAnnex contentlock
+		next $ cleanup key
+	, next $ return True
+	)
 
 cleanup :: Key -> CommandCleanup
 cleanup key = do
diff --git a/Command/Fix.hs b/Command/Fix.hs
--- a/Command/Fix.hs
+++ b/Command/Fix.hs
@@ -18,11 +18,7 @@
 import Annex.Perms
 import qualified Annex.Queue
 import qualified Database.Keys
-#ifdef WITH_CLIBS
-#ifndef __ANDROID__
 import Utility.Touch
-#endif
-#endif
 
 cmd :: Command
 cmd = notDirect $ noCommit $ withGlobalOptions annexedMatchingOptions $
@@ -90,20 +86,16 @@
 fixSymlink :: FilePath -> FilePath -> CommandPerform
 fixSymlink file link = do
 	liftIO $ do
-#ifdef WITH_CLIBS
-#ifndef __ANDROID__
+#if ! defined(mingw32_HOST_OS) && ! defined(__ANDROID__)
 		-- preserve mtime of symlink
 		mtime <- catchMaybeIO $ TimeSpec . modificationTime
 			<$> getSymbolicLinkStatus file
 #endif
-#endif
 		createDirectoryIfMissing True (parentDir file)
 		removeFile file
 		createSymbolicLink link file
-#ifdef WITH_CLIBS
-#ifndef __ANDROID__
+#if ! defined(mingw32_HOST_OS) && ! defined(__ANDROID__)
 		maybe noop (\t -> touch file t False) mtime
-#endif
 #endif
 	next $ cleanupSymlink file
 
diff --git a/Command/MetaData.hs b/Command/MetaData.hs
--- a/Command/MetaData.hs
+++ b/Command/MetaData.hs
@@ -46,10 +46,14 @@
 			( long "tag" <> short 't' <> metavar "TAG"
 			<> help "set a tag"
 			))
-		<|> (AddMeta tagMetaField . mkMetaValue (CurrentlySet False) <$> strOption
+		<|> (DelMeta tagMetaField . Just . toMetaValue <$> strOption
 			( long "untag" <> short 'u' <> metavar "TAG"
 			<> help "remove a tag"
 			))
+		<|> option (eitherReader (\f -> DelMeta <$> mkMetaField f <*> pure Nothing))
+			( long "remove"  <> short 'r' <> metavar "FIELD"
+			<> help "remove all values of a field"
+			)
 
 seek :: MetaDataOptions -> CommandSeek
 seek o = do
diff --git a/Command/Sync.hs b/Command/Sync.hs
--- a/Command/Sync.hs
+++ b/Command/Sync.hs
@@ -487,6 +487,5 @@
 				)
 		, return []
 		)
-	put dest = includeCommandAction $ do
-		showStart' "copy" k af
+	put dest = includeCommandAction $ 
 		Command.Move.toStart' dest False af k
diff --git a/Command/Unannex.hs b/Command/Unannex.hs
--- a/Command/Unannex.hs
+++ b/Command/Unannex.hs
@@ -13,6 +13,7 @@
 import Config
 import qualified Annex
 import Annex.Content
+import Annex.Perms
 import Annex.Content.Direct
 import Annex.Version
 import qualified Git.Command
diff --git a/Command/Unlock.hs b/Command/Unlock.hs
--- a/Command/Unlock.hs
+++ b/Command/Unlock.hs
@@ -9,6 +9,7 @@
 
 import Command
 import Annex.Content
+import Annex.Perms
 import Annex.CatFile
 import Annex.Version
 import Annex.Link
diff --git a/Command/Unused.hs b/Command/Unused.hs
--- a/Command/Unused.hs
+++ b/Command/Unused.hs
@@ -27,6 +27,7 @@
 import qualified Annex.Branch
 import Annex.Link
 import Annex.CatFile
+import Annex.WorkTree
 import Types.RefSpec
 import Git.Types
 import Git.Sha
@@ -215,10 +216,7 @@
 		Just dir -> inRepo $ LsFiles.inRepo [dir]
 	go v [] = return v
 	go v (f:fs) = do
-		mk <- getM id
-			[ isAnnexLink f
-			, liftIO (isPointerFile f)
-			]
+		mk <- lookupFile f
 		case mk of
 			Nothing -> go v fs
 			Just k -> do
diff --git a/Git/UnionMerge.hs b/Git/UnionMerge.hs
--- a/Git/UnionMerge.hs
+++ b/Git/UnionMerge.hs
@@ -30,12 +30,14 @@
  -}
 merge :: Ref -> Ref -> Repo -> IO ()
 merge x y repo = do
-	h <- catFileStart repo
+	hashhandle <- hashObjectStart repo
+	ch <- catFileStart repo
 	streamUpdateIndex repo
 		[ lsTree x repo
-		, mergeTrees x y h repo
+		, mergeTrees x y hashhandle ch repo
 		]
-	catFileStop h
+	catFileStop ch
+	hashObjectStop hashhandle
 
 {- Merges a list of branches into the index. Previously staged changes in
  - the index are preserved (and participate in the merge).
@@ -45,17 +47,18 @@
  - harder to calculate a single union merge involving all the refs, as well
  - as the index.
  -}
-mergeIndex :: CatFileHandle -> Repo -> [Ref] -> IO ()
-mergeIndex h repo bs = forM_ bs $ \b ->
-	streamUpdateIndex repo [mergeTreeIndex b h repo]
+mergeIndex :: HashObjectHandle -> CatFileHandle -> Repo -> [Ref] -> IO ()
+mergeIndex hashhandle ch repo bs = forM_ bs $ \b ->
+	streamUpdateIndex repo [mergeTreeIndex b hashhandle ch repo]
 
 {- For merging two trees. -}
-mergeTrees :: Ref -> Ref -> CatFileHandle -> Repo -> Streamer
-mergeTrees (Ref x) (Ref y) h = doMerge h $ "diff-tree":diffOpts ++ [x, y, "--"]
+mergeTrees :: Ref -> Ref -> HashObjectHandle -> CatFileHandle -> Repo -> Streamer
+mergeTrees (Ref x) (Ref y) hashhandle ch = doMerge hashhandle ch
+	("diff-tree":diffOpts ++ [x, y, "--"])
 
 {- For merging a single tree into the index. -}
-mergeTreeIndex :: Ref -> CatFileHandle -> Repo -> Streamer
-mergeTreeIndex (Ref r) h = doMerge h $
+mergeTreeIndex :: Ref -> HashObjectHandle -> CatFileHandle -> Repo -> Streamer
+mergeTreeIndex (Ref r) hashhandle ch = doMerge hashhandle ch $
 	"diff-index" : diffOpts ++ ["--cached", r, "--"]
 
 diffOpts :: [String]
@@ -63,26 +66,26 @@
 
 {- Streams update-index changes to perform a merge,
  - using git to get a raw diff. -}
-doMerge :: CatFileHandle -> [String] -> Repo -> Streamer
-doMerge ch differ repo streamer = do
+doMerge :: HashObjectHandle -> CatFileHandle -> [String] -> Repo -> Streamer
+doMerge hashhandle ch differ repo streamer = do
 	(diff, cleanup) <- pipeNullSplit (map Param differ) repo
 	go diff
 	void $ cleanup
   where
 	go [] = noop
-	go (info:file:rest) = mergeFile info file ch repo >>=
+	go (info:file:rest) = mergeFile info file hashhandle ch >>=
 		maybe (go rest) (\l -> streamer l >> go rest)
 	go (_:[]) = error $ "parse error " ++ show differ
 
 {- Given an info line from a git raw diff, and the filename, generates
  - a line suitable for update-index that union merges the two sides of the
  - diff. -}
-mergeFile :: String -> FilePath -> CatFileHandle -> Repo -> IO (Maybe String)
-mergeFile info file h repo = case filter (/= nullSha) [Ref asha, Ref bsha] of
+mergeFile :: String -> FilePath -> HashObjectHandle -> CatFileHandle -> IO (Maybe String)
+mergeFile info file hashhandle h = case filter (/= nullSha) [Ref asha, Ref bsha] of
 	[] -> return Nothing
 	(sha:[]) -> use sha
 	shas -> use
-		=<< either return (\s -> hashObject BlobObject (unlines s) repo)
+		=<< either return (\s -> hashBlob hashhandle (unlines s))
 		=<< calcMerge . zip shas <$> mapM getcontents shas
   where
 	[_colonmode, _bmode, asha, bsha, _status] = words info
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -135,7 +135,7 @@
 	sed -i -e 's/^GIT_ANNEX_PACKAGE_INSTALL=/GIT_ANNEX_PACKAGE_INSTALL=$(GIT_ANNEX_PACKAGE_INSTALL)/' "$(LINUXSTANDALONE_DEST)/runshell"
 	
 	install -d "$(LINUXSTANDALONE_DEST)/bin"
-	cp dist/build/git-annex/git-annex "$(LINUXSTANDALONE_DEST)/bin/"
+	cp git-annex "$(LINUXSTANDALONE_DEST)/bin/"
 	strip "$(LINUXSTANDALONE_DEST)/bin/git-annex"
 	ln -sf git-annex "$(LINUXSTANDALONE_DEST)/bin/git-annex-shell"
 	zcat standalone/licences.gz > $(LINUXSTANDALONE_DEST)/LICENSE
diff --git a/Messages.hs b/Messages.hs
--- a/Messages.hs
+++ b/Messages.hs
@@ -54,12 +54,12 @@
 import qualified Annex
 
 showStart :: String -> FilePath -> Annex ()
-showStart command file = outputMessage (JSON.start command $ Just file) $
+showStart command file = outputMessage (JSON.start command (Just file) Nothing) $
 	command ++ " " ++ file ++ " "
 
 showStart' :: String -> Key -> Maybe FilePath -> Annex ()
-showStart' command key afile = showStart command $
-	fromMaybe (key2file key) afile
+showStart' command key afile = outputMessage (JSON.start command afile (Just key)) $
+	command ++ " " ++ fromMaybe (key2file key) afile ++ " "
 
 showNote :: String -> Annex ()
 showNote s = outputMessage (JSON.note s) $ "(" ++ s ++ ") "
@@ -166,7 +166,7 @@
  -}
 showCustom :: String -> Annex Bool -> Annex ()
 showCustom command a = do
-	outputMessage (JSON.start command Nothing) ""
+	outputMessage (JSON.start command Nothing Nothing) ""
 	r <- a
 	outputMessage (JSON.end r) ""
 
diff --git a/Messages/JSON.hs b/Messages/JSON.hs
--- a/Messages/JSON.hs
+++ b/Messages/JSON.hs
@@ -17,13 +17,18 @@
 import Text.JSON
 
 import qualified Utility.JSONStream as Stream
+import Types.Key
+import Data.Maybe
 
-start :: String -> Maybe String -> IO ()
-start command file =
-	putStr $ Stream.start $ ("command", command) : filepart file
+start :: String -> Maybe FilePath -> Maybe Key -> IO ()
+start command file key = putStr $ Stream.start $ catMaybes
+	[ part "command" (Just command)
+	, part "file" file
+	, part "key" (fmap key2file key)
+	]
   where
-	filepart Nothing = []
-	filepart (Just f) = [("file", f)]
+	part _ Nothing = Nothing
+	part l (Just v) = Just (l, v)
 
 end :: Bool -> IO ()
 end b = putStr $ Stream.add [("success", b)] ++ Stream.end
diff --git a/Types/MetaData.hs b/Types/MetaData.hs
--- a/Types/MetaData.hs
+++ b/Types/MetaData.hs
@@ -219,9 +219,13 @@
 {- Ways that existing metadata can be modified -}
 data ModMeta
 	= AddMeta MetaField MetaValue
-	| DelMeta MetaField MetaValue
-	| SetMeta MetaField MetaValue -- removes any existing values
-	| MaybeSetMeta MetaField MetaValue -- when field has no existing value
+	| DelMeta MetaField (Maybe MetaValue)
+	-- ^ delete value of a field. With Just, only that specific value
+	-- is deleted; with Nothing, all current values are deleted.
+	| SetMeta MetaField MetaValue
+	-- ^ removes any existing values
+	| MaybeSetMeta MetaField MetaValue
+	-- ^ set when field has no existing value
 	deriving (Show)
 
 {- Applies a ModMeta, generating the new MetaData.
@@ -229,7 +233,10 @@
  - values set in the input metadata. It only contains changed values. -}
 modMeta :: MetaData -> ModMeta -> MetaData
 modMeta _ (AddMeta f v) = updateMetaData f v emptyMetaData
-modMeta _ (DelMeta f oldv) = updateMetaData f (unsetMetaValue oldv) emptyMetaData
+modMeta _ (DelMeta f (Just oldv)) =
+	updateMetaData f (unsetMetaValue oldv) emptyMetaData
+modMeta m (DelMeta f Nothing) = MetaData $ M.singleton f $
+	S.fromList $ map unsetMetaValue $ S.toList $ currentMetaDataValues f m
 modMeta m (SetMeta f v) = updateMetaData f v $
 	foldr (updateMetaData f) emptyMetaData $
 		map unsetMetaValue $ S.toList $ currentMetaDataValues f m
diff --git a/Utility/DiskFree.hs b/Utility/DiskFree.hs
--- a/Utility/DiskFree.hs
+++ b/Utility/DiskFree.hs
@@ -1,63 +1,32 @@
-{- disk free space checking 
+{- disk free space checking shim
  -
- - Copyright 2012, 2014 Joey Hess <id@joeyh.name>
+ - Copyright 2016 Joey Hess <id@joeyh.name>
  -
  - License: BSD-2-clause
  -}
 
-{-# LANGUAGE ForeignFunctionInterface, CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+{-# LANGUAGE CPP #-}
 
 module Utility.DiskFree (
 	getDiskFree,
 	getDiskSize
 ) where
 
-#ifdef WITH_CLIBS
-
-import Common
-
-import Foreign.C.Types
-import Foreign.C.String
-import Foreign.C.Error
-
-foreign import ccall safe "libdiskfree.h diskfree" c_diskfree
-	:: CString -> IO CULLong
-
-foreign import ccall safe "libdiskfree.h disksize" c_disksize
-	:: CString -> IO CULLong
+#ifndef __ANDROID__
 
-getVal :: (CString -> IO CULLong) -> FilePath -> IO (Maybe Integer)
-getVal getter path = withFilePath path $ \c_path -> do
-	free <- getter c_path
-	ifM (safeErrno <$> getErrno)
-		( return $ Just $ toInteger free
-		, return Nothing
-		)
-  where
-	safeErrno (Errno v) = v == 0
+import System.DiskSpace
+import Utility.Applicative
+import Utility.Exception
 
 getDiskFree :: FilePath -> IO (Maybe Integer)
-getDiskFree = getVal c_diskfree
+getDiskFree = catchMaybeIO . getAvailSpace
 
 getDiskSize :: FilePath -> IO (Maybe Integer)
-getDiskSize = getVal c_disksize
+getDiskSize = fmap diskTotal <$$> catchMaybeIO . getDiskUsage
 
 #else
-#ifdef mingw32_HOST_OS
 
-import Common
-
-import System.Win32.File
-
-getDiskFree :: FilePath -> IO (Maybe Integer)
-getDiskFree path = catchMaybeIO $ do
-	(sectors, bytes, nfree, _ntotal) <- getDiskFreeSpace (Just path)
-	return $ toInteger sectors * toInteger bytes * toInteger nfree
-
-getDiskSize :: FilePath -> IO (Maybe Integer)
-getDiskSize _ = return Nothing
-#else
-
 #warning Building without disk free space checking support
 
 getDiskFree :: FilePath -> IO (Maybe Integer)
@@ -66,5 +35,4 @@
 getDiskSize :: FilePath -> IO (Maybe Integer)
 getDiskSize _ = return Nothing
 
-#endif
 #endif
diff --git a/Utility/LockFile/PidLock.hs b/Utility/LockFile/PidLock.hs
--- a/Utility/LockFile/PidLock.hs
+++ b/Utility/LockFile/PidLock.hs
@@ -201,7 +201,7 @@
 --
 -- Uses a 1 second wait-loop.
 --
--- May wait untie timeout if the lock file is stale and is on a network file
+-- May wait until timeout if the lock file is stale and is on a network file
 -- system, or on a system where the side lock cannot be taken.
 waitLock :: Seconds -> LockFile -> IO LockHandle
 waitLock (Seconds timeout) lockfile = go timeout
diff --git a/Utility/LockPool.hs b/Utility/LockPool.hs
--- a/Utility/LockPool.hs
+++ b/Utility/LockPool.hs
@@ -7,15 +7,13 @@
  - the lock will be released, despite the first thread still having the
  - lockfile open.
  -
- - Or, if a process is already holding an exclusive lock on a file, an
+ - Or, if a process is already holding an exclusive lock on a file, and
  - re-opens it and tries to take another exclusive lock, it won't block
  - on the first lock.
  -
  - To avoid these problems, this implements a lock pool. This keeps track
- - of which lock files are being used by the process, and avoids
- - re-opening them. Instead, if a lockfile is in use by the current
- - process, STM is used to handle further concurrent uses of that lock
- - file.
+ - of which lock files are being used by the process, using STM to handle
+ - inter-process locking.
  -
  - Note that, like Utility.LockFile, this does *not* attempt to be a
  - portability shim; the native locking of the OS is used.
diff --git a/Utility/LockPool/LockHandle.hs b/Utility/LockPool/LockHandle.hs
--- a/Utility/LockPool/LockHandle.hs
+++ b/Utility/LockPool/LockHandle.hs
@@ -7,20 +7,26 @@
 
 {-# LANGUAGE CPP #-}
 
-module Utility.LockPool.LockHandle where
+module Utility.LockPool.LockHandle (
+	LockHandle,
+	FileLockOps(..),
+	dropLock,
+#ifndef mingw32_HOST_OS
+	checkSaneLock,
+#endif
+	makeLockHandle,
+	tryMakeLockHandle,
+) where
 
 import qualified Utility.LockPool.STM as P
-#ifndef mingw32_HOST_OS
 import Utility.LockPool.STM (LockFile)
-#endif
 
 import Control.Concurrent.STM
 import Control.Exception
+import Control.Applicative
+import Prelude
 
-data LockHandle = LockHandle
-	{ poolHandle :: P.LockHandle
-	, fileLockOps :: FileLockOps
-	}
+data LockHandle = LockHandle P.LockHandle FileLockOps
 
 data FileLockOps = FileLockOps
 	{ fDropLock :: IO ()
@@ -30,7 +36,7 @@
 	}
 
 dropLock :: LockHandle -> IO ()
-dropLock h = P.releaseLock (poolHandle h) (fDropLock (fileLockOps h))
+dropLock (LockHandle ph _) = P.releaseLock ph
 
 #ifndef mingw32_HOST_OS
 checkSaneLock :: LockFile -> LockHandle -> IO Bool
@@ -40,26 +46,30 @@
 -- Take a lock, by first updating the lock pool, and then taking the file
 -- lock. If taking the file lock fails for any reason, take care to
 -- release the lock in the lock pool.
-makeLockHandle :: STM P.LockHandle -> IO FileLockOps -> IO LockHandle
-makeLockHandle pa fa = bracketOnError setup cleanup go
+makeLockHandle :: P.LockPool -> LockFile -> (P.LockPool -> LockFile -> STM P.LockHandle) -> (LockFile -> IO FileLockOps) -> IO LockHandle
+makeLockHandle pool file pa fa = bracketOnError setup cleanup go
   where
-	setup = atomically pa
-	cleanup ph = P.releaseLock ph (return ())
-	go ph = do
-		fo <- fa
-		return $ LockHandle ph fo
+	setup = atomically (pa pool file)
+	cleanup ph = P.releaseLock ph
+	go ph = mkLockHandle pool file ph =<< fa file
 
-tryMakeLockHandle :: STM (Maybe P.LockHandle) -> IO (Maybe FileLockOps) -> IO (Maybe LockHandle)
-tryMakeLockHandle pa fa = bracketOnError setup cleanup go
+tryMakeLockHandle :: P.LockPool -> LockFile -> (P.LockPool -> LockFile -> STM (Maybe P.LockHandle)) -> (LockFile -> IO (Maybe FileLockOps)) -> IO (Maybe LockHandle)
+tryMakeLockHandle pool file pa fa = bracketOnError setup cleanup go
   where
-	setup = atomically pa
+	setup = atomically (pa pool file)
 	cleanup Nothing = return ()
-	cleanup (Just ph) = P.releaseLock ph (return ())
+	cleanup (Just ph) = P.releaseLock ph
 	go Nothing = return Nothing
 	go (Just ph) = do
-		mfo <- fa
+		mfo <- fa file
 		case mfo of
 			Nothing -> do
 				cleanup (Just ph)
 				return Nothing
-			Just fo -> return $ Just $ LockHandle ph fo
+			Just fo -> Just <$> mkLockHandle pool file ph fo
+
+mkLockHandle :: P.LockPool -> LockFile -> P.LockHandle -> FileLockOps -> IO LockHandle
+mkLockHandle pool file ph fo = do
+	atomically $ P.registerCloseLockFile pool file (fDropLock fo)
+	return $ LockHandle ph fo
+	
diff --git a/Utility/LockPool/PidLock.hs b/Utility/LockPool/PidLock.hs
--- a/Utility/LockPool/PidLock.hs
+++ b/Utility/LockPool/PidLock.hs
@@ -32,15 +32,17 @@
 
 -- Takes a pid lock, blocking until the lock is available or the timeout.
 waitLock :: Seconds -> LockFile -> IO LockHandle
-waitLock timeout file = makeLockHandle
-	(P.waitTakeLock P.lockPool file LockExclusive)
-	(mk <$> F.waitLock timeout file)
+waitLock timeout file = makeLockHandle P.lockPool file
+	-- LockShared for STM lock, because a pid lock can be the top-level
+	-- lock with various other STM level locks gated behind it.
+	(\p f -> P.waitTakeLock p f LockShared)
+	(\f -> mk <$> F.waitLock timeout f)
 
 -- Tries to take a pid lock, but does not block.
 tryLock :: LockFile -> IO (Maybe LockHandle)
-tryLock file = tryMakeLockHandle
-	(P.tryTakeLock P.lockPool file LockShared)
-	(fmap mk <$> F.tryLock file)
+tryLock file = tryMakeLockHandle P.lockPool file
+	(\p f -> P.tryTakeLock p f LockShared)
+	(\f -> fmap mk <$> F.tryLock f)
 
 checkLocked :: LockFile -> IO (Maybe Bool)
 checkLocked file = P.getLockStatus P.lockPool file
diff --git a/Utility/LockPool/Posix.hs b/Utility/LockPool/Posix.hs
--- a/Utility/LockPool/Posix.hs
+++ b/Utility/LockPool/Posix.hs
@@ -33,27 +33,27 @@
 
 -- Takes a shared lock, blocking until the lock is available.
 lockShared :: Maybe FileMode -> LockFile -> IO LockHandle
-lockShared mode file = makeLockHandle
-	(P.waitTakeLock P.lockPool file LockShared)
-	(mk <$> F.lockShared mode file)
+lockShared mode file = makeLockHandle P.lockPool file
+	(\p f -> P.waitTakeLock p f LockShared)
+	(\f -> mk <$> F.lockShared mode f)
 
 -- Takes an exclusive lock, blocking until the lock is available.
 lockExclusive :: Maybe FileMode -> LockFile -> IO LockHandle
-lockExclusive mode file = makeLockHandle
-	(P.waitTakeLock P.lockPool file LockExclusive)
-	(mk <$> F.lockExclusive mode file)
+lockExclusive mode file = makeLockHandle P.lockPool file
+	(\p f -> P.waitTakeLock p f LockExclusive)
+	(\f -> mk <$> F.lockExclusive mode f)
 
 -- Tries to take a shared lock, but does not block.
 tryLockShared :: Maybe FileMode -> LockFile -> IO (Maybe LockHandle)
-tryLockShared mode file = tryMakeLockHandle
-	(P.tryTakeLock P.lockPool file LockShared)
-	(fmap mk <$> F.tryLockShared mode file)
+tryLockShared mode file = tryMakeLockHandle P.lockPool file
+	(\p f -> P.tryTakeLock p f LockShared)
+	(\f -> fmap mk <$> F.tryLockShared mode f)
 
 -- Tries to take an exclusive lock, but does not block.
 tryLockExclusive :: Maybe FileMode -> LockFile -> IO (Maybe LockHandle)
-tryLockExclusive mode file = tryMakeLockHandle
-	(P.tryTakeLock P.lockPool file LockExclusive)
-	(fmap mk <$> F.tryLockExclusive mode file)
+tryLockExclusive mode file = tryMakeLockHandle P.lockPool file
+	(\p f -> P.tryTakeLock p f LockExclusive)
+	(\f -> fmap mk <$> F.tryLockExclusive mode f)
 
 -- Returns Nothing when the file doesn't exist, for cases where
 -- that is different from it not being locked.
diff --git a/Utility/LockPool/STM.hs b/Utility/LockPool/STM.hs
--- a/Utility/LockPool/STM.hs
+++ b/Utility/LockPool/STM.hs
@@ -15,8 +15,12 @@
 	tryTakeLock,
 	getLockStatus,
 	releaseLock,
+	CloseLockFile,
+	registerCloseLockFile,
 ) where
 
+import Utility.Monad
+
 import System.IO.Unsafe (unsafePerformIO)
 import qualified Data.Map.Strict as M
 import Control.Concurrent.STM
@@ -36,8 +40,10 @@
 
 type LockCount = Integer
 
-data LockStatus = LockStatus LockMode LockCount
+data LockStatus = LockStatus LockMode LockCount CloseLockFile
 
+type CloseLockFile = IO ()
+
 -- This TMVar is normally kept full.
 type LockPool = TMVar (M.Map LockFile LockStatus)
 
@@ -59,11 +65,11 @@
 waitTakeLock pool file mode = do
 	m <- takeTMVar pool
 	v <- case M.lookup file m of
-		Just (LockStatus mode' n)
+		Just (LockStatus mode' n closelockfile)
 			| mode == LockShared && mode' == LockShared ->
-				return $ LockStatus mode (succ n)
+				return $ LockStatus mode (succ n) closelockfile
 			| n > 0 -> retry -- wait for lock
-		_ -> return $ LockStatus mode 1
+		_ -> return $ LockStatus mode 1 noop
 	putTMVar pool (M.insert file v m)
 	newTMVar (pool, file)
 
@@ -74,6 +80,16 @@
 		`orElse`
 	return Nothing
 
+-- Call after waitTakeLock or tryTakeLock, to register a CloseLockFile
+-- action to run when releasing the lock.
+registerCloseLockFile :: LockPool -> LockFile -> CloseLockFile -> STM ()
+registerCloseLockFile pool file closelockfile = do
+	m <- takeTMVar pool
+	putTMVar pool (M.update go file m)
+  where
+	go (LockStatus mode n closelockfile') = Just $
+		LockStatus mode n (closelockfile' >> closelockfile)
+
 -- Checks if a lock is being held. If it's held by the current process,
 -- runs the getdefault action; otherwise runs the checker action.
 --
@@ -87,7 +103,7 @@
 	v <- atomically $ do
 		m <- takeTMVar pool
 		let threadlocked = case M.lookup file m of
-			Just (LockStatus _ n) | n > 0 -> True
+			Just (LockStatus _ n _) | n > 0 -> True
 			_ -> False
 		if threadlocked
 			then do
@@ -99,25 +115,24 @@
 		Just restore -> bracket_ (return ()) restore checker
 
 -- Only runs action to close underlying lock file when this is the last
--- user of the lock, and when the handle has not already been closed.
+-- user of the lock, and when the lock has not already been closed.
 --
--- Note that the lock pool is left empty while the closelockfile action
+-- Note that the lock pool is left empty while the CloseLockFile action
 -- is run, to avoid race with another thread trying to open the same lock
 -- file.
-releaseLock :: LockHandle -> IO () -> IO ()
-releaseLock h closelockfile = go =<< atomically (tryTakeTMVar h)
+releaseLock :: LockHandle -> IO ()
+releaseLock h = go =<< atomically (tryTakeTMVar h)
   where
 	go (Just (pool, file)) = do
-		(m, unused) <- atomically $ do
+		(m, closelockfile) <- atomically $ do
 			m <- takeTMVar pool
 			return $ case M.lookup file m of
-				Just (LockStatus mode n)
-					| n == 1 -> (M.delete file m, True)
+				Just (LockStatus mode n closelockfile)
+					| n == 1 -> (M.delete file m, closelockfile)
 					| otherwise ->
-						(M.insert file (LockStatus mode (pred n)) m, False)
-				Nothing -> (m, True)
-		when unused
-			closelockfile
+						(M.insert file (LockStatus mode (pred n) closelockfile) m, noop)
+				Nothing -> (m, noop)
+		closelockfile
 		atomically $ putTMVar pool m
 	-- The LockHandle was already closed.
 	go Nothing = return ()
diff --git a/Utility/LockPool/Windows.hs b/Utility/LockPool/Windows.hs
--- a/Utility/LockPool/Windows.hs
+++ b/Utility/LockPool/Windows.hs
@@ -22,9 +22,9 @@
 {- Tries to lock a file with a shared lock, which allows other processes to
  - also lock it shared. Fails if the file is exclusively locked. -}
 lockShared :: LockFile -> IO (Maybe LockHandle)
-lockShared file = tryMakeLockHandle
-	(P.tryTakeLock P.lockPool file LockShared)
-	(fmap mk <$> F.lockShared file)
+lockShared file = tryMakeLockHandle P.lockPool file
+	(\p f -> P.tryTakeLock p f LockShared)
+	(\f -> fmap mk <$> F.lockShared f)
 
 {- Tries to take an exclusive lock on a file. Fails if another process has
  - a shared or exclusive lock.
@@ -33,9 +33,9 @@
  - read or write by any other process. So for advisory locking of a file's
  - content, a separate LockFile should be used. -}
 lockExclusive :: LockFile -> IO (Maybe LockHandle)
-lockExclusive file = tryMakeLockHandle
-	(P.tryTakeLock P.lockPool file LockExclusive)
-	(fmap mk <$> F.lockExclusive file)
+lockExclusive file = tryMakeLockHandle P.lockPool file
+	(\p f -> P.tryTakeLock p f LockExclusive)
+	(\f -> fmap mk <$> F.lockExclusive f)
 
 {- If the initial lock fails, this is a BUSY wait, and does not
  - guarentee FIFO order of waiters. In other news, Windows is a POS. -}
diff --git a/Utility/Mounts.hs b/Utility/Mounts.hs
new file mode 100644
--- /dev/null
+++ b/Utility/Mounts.hs
@@ -0,0 +1,21 @@
+{- portability shim for System.MountPoints
+ -
+ - Copyright 2016 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+
+module Utility.Mounts (getMounts, Mntent(..)) where
+
+import qualified System.MountPoints
+import System.MountPoints (Mntent(..))
+
+getMounts :: IO [Mntent] 
+#ifndef __ANDROID__
+getMounts = System.MountPoints.getMounts
+#else
+getMounts = System.MountPoints.getProcMounts
+#endif
diff --git a/Utility/Mounts.hsc b/Utility/Mounts.hsc
deleted file mode 100644
--- a/Utility/Mounts.hsc
+++ /dev/null
@@ -1,97 +0,0 @@
-{- Interface to mtab (and fstab)
- - 
- - Deprecated; moving to mountpoints library on hackage.
- - 
- - Derived from hsshellscript, originally written by
- - Volker Wysk <hsss@volker-wysk.de>
- - 
- - Modified to support BSD, Mac OS X, and Android by
- - Joey Hess <id@joeyh.name>
- -
- - Licensed under the GNU LGPL version 2.1 or higher.
- -
- -}
-
-{-# LANGUAGE ForeignFunctionInterface #-}
-
-module Utility.Mounts (
-	Mntent(..),
-	getMounts
-) where
-
-#ifndef __ANDROID__
-import Control.Monad
-import Foreign
-import Foreign.C
-#include "libmounts.h"
-#else
-import Utility.Exception
-import Data.Maybe
-import Control.Applicative
-#endif
-import Prelude
-
-{- This is a stripped down mntent, containing only
- - fields available everywhere. -}
-data Mntent = Mntent
-	{ mnt_fsname :: String
-	, mnt_dir :: FilePath
-	, mnt_type :: String
-	} deriving (Show, Eq, Ord)
-
-#ifndef __ANDROID__
-
-getMounts :: IO [Mntent]
-getMounts = do
-	h <- c_mounts_start
-	when (h == nullPtr) $
-		throwErrno "getMounts"
-	mntent <- getmntent h []
-	_ <- c_mounts_end h
-	return mntent
-
-  where
-	getmntent h c = do
-		ptr <- c_mounts_next h
-		if (ptr == nullPtr)
-			then return $ reverse c
-			else do
-				mnt_fsname_str <- #{peek struct mntent, mnt_fsname} ptr >>= peekCString
-				mnt_dir_str <- #{peek struct mntent, mnt_dir} ptr >>= peekCString
-				mnt_type_str <- #{peek struct mntent, mnt_type} ptr >>= peekCString
-				let ent = Mntent
-					{ mnt_fsname = mnt_fsname_str
-					, mnt_dir = mnt_dir_str
-					, mnt_type = mnt_type_str
-					}
-				getmntent h (ent:c)
-
-{- Using unsafe imports because the C functions are belived to never block.
- - Note that getmntinfo is called with MNT_NOWAIT to avoid possibly blocking;
- - while getmntent only accesses a file in /etc (or /proc) that should not
- - block. -}
-foreign import ccall unsafe "libmounts.h mounts_start" c_mounts_start
-        :: IO (Ptr ())
-foreign import ccall unsafe "libmounts.h mounts_next" c_mounts_next
-        :: Ptr () -> IO (Ptr ())
-foreign import ccall unsafe "libmounts.h mounts_end" c_mounts_end
-        :: Ptr () -> IO CInt
-
-#else
-
-{- Android does not support getmntent (well, it's a no-op stub in Bionic).
- - 
- - But, the linux kernel's /proc/mounts is available to be parsed.
- -}
-getMounts :: IO [Mntent]
-getMounts = catchDefaultIO [] $
-	mapMaybe (parse . words) . lines <$> readFile "/proc/mounts"
-  where
-  	parse (device:mountpoint:fstype:_rest) = Just $ Mntent
-		{ mnt_fsname = device
-		, mnt_dir = mountpoint
-		, mnt_type = fstype
-		}
-	parse _ = Nothing
-
-#endif
diff --git a/Utility/Process.hs b/Utility/Process.hs
--- a/Utility/Process.hs
+++ b/Utility/Process.hs
@@ -18,6 +18,7 @@
 	readProcessEnv,
 	writeReadProcessEnv,
 	forceSuccessProcess,
+	forceSuccessProcess',
 	checkSuccessProcess,
 	ignoreFailureProcess,
 	createProcessSuccess,
@@ -129,12 +130,12 @@
 -- | Waits for a ProcessHandle, and throws an IOError if the process
 -- did not exit successfully.
 forceSuccessProcess :: CreateProcess -> ProcessHandle -> IO ()
-forceSuccessProcess p pid = do
-	code <- waitForProcess pid
-	case code of
-		ExitSuccess -> return ()
-		ExitFailure n -> ioError $ userError $
-			showCmd p ++ " exited " ++ show n
+forceSuccessProcess p pid = waitForProcess pid >>= forceSuccessProcess' p
+
+forceSuccessProcess' :: CreateProcess -> ExitCode -> IO ()
+forceSuccessProcess' _ ExitSuccess = return ()
+forceSuccessProcess' p (ExitFailure n) = fail $
+	showCmd p ++ " exited " ++ show n
 
 -- | Waits for a ProcessHandle and returns True if it exited successfully.
 -- Note that using this with createProcessChecked will throw away
diff --git a/Utility/Touch.hs b/Utility/Touch.hs
new file mode 100644
--- /dev/null
+++ b/Utility/Touch.hs
@@ -0,0 +1,52 @@
+{- More control over touching a file.
+ -
+ - Copyright 2011 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE CPP #-}
+
+module Utility.Touch (
+	TimeSpec(..),
+	touchBoth,
+	touch
+) where
+
+#if ! defined(mingw32_HOST_OS) && ! defined(__ANDROID__)
+
+#if MIN_VERSION_unix(2,7,0)
+
+import System.Posix.Files
+import System.Posix.Types
+
+newtype TimeSpec = TimeSpec EpochTime
+
+{- Changes the access and modification times of an existing file.
+   Can follow symlinks, or not. Throws IO error on failure. -}
+touchBoth :: FilePath -> TimeSpec -> TimeSpec -> Bool -> IO ()
+touchBoth file (TimeSpec atime) (TimeSpec mtime) follow
+	| follow = setFileTimes file atime mtime
+	| otherwise = setSymbolicLinkTimesHiRes file (realToFrac atime) (realToFrac mtime)
+
+touch :: FilePath -> TimeSpec -> Bool -> IO ()
+touch file mtime = touchBoth file mtime mtime
+
+#else
+import Utility.Touch.Old
+#endif
+
+#else
+
+import System.PosixCompat
+
+newtype TimeSpec = TimeSpec EpochTime
+
+{- Noop for Windows -}
+touchBoth :: FilePath -> TimeSpec -> TimeSpec -> Bool -> IO ()
+touchBoth _ _ _ _ = return ()
+
+touch :: FilePath -> TimeSpec -> Bool -> IO ()
+touch _ _ _ = return ()
+
+#endif
diff --git a/Utility/Touch.hsc b/Utility/Touch.hsc
deleted file mode 100644
--- a/Utility/Touch.hsc
+++ /dev/null
@@ -1,145 +0,0 @@
-{- More control over touching a file.
- -
- - Copyright 2011 Joey Hess <id@joeyh.name>
- -
- - License: BSD-2-clause
- -}
-
-{-# LANGUAGE ForeignFunctionInterface, CPP #-}
-
-module Utility.Touch (
-	TimeSpec(..),
-	touchBoth,
-	touch
-) where
-
-#if MIN_VERSION_unix(2,7,0)
-
-import System.Posix.Files
-import System.Posix.Types
-
-newtype TimeSpec = TimeSpec EpochTime
-
-{- Changes the access and modification times of an existing file.
-   Can follow symlinks, or not. Throws IO error on failure. -}
-touchBoth :: FilePath -> TimeSpec -> TimeSpec -> Bool -> IO ()
-touchBoth file (TimeSpec atime) (TimeSpec mtime) follow
-	| follow = setFileTimes file atime mtime
-	| otherwise = setSymbolicLinkTimesHiRes file (realToFrac atime) (realToFrac mtime)
-
-touch :: FilePath -> TimeSpec -> Bool -> IO ()
-touch file mtime = touchBoth file mtime mtime
-
-#else
-{- Compatability interface for old version of unix, to be removed eventally. -}
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/time.h>
-
-#ifndef _BSD_SOURCE
-#define _BSD_SOURCE
-#endif
-
-#if (defined UTIME_OMIT && defined UTIME_NOW && defined AT_FDCWD && defined AT_SYMLINK_NOFOLLOW)
-#define use_utimensat 1
-
-import Utility.FileSystemEncoding
-
-import Control.Monad (when)
-import Foreign
-#endif
-
-import Foreign.C
-
-newtype TimeSpec = TimeSpec CTime
-
-touchBoth :: FilePath -> TimeSpec -> TimeSpec -> Bool -> IO ()
-
-touch :: FilePath -> TimeSpec -> Bool -> IO ()
-touch file mtime = touchBoth file mtime mtime
-
-#ifdef use_utimensat
-
-at_fdcwd :: CInt
-at_fdcwd = #const AT_FDCWD
-
-at_symlink_nofollow :: CInt
-at_symlink_nofollow = #const AT_SYMLINK_NOFOLLOW
-
-instance Storable TimeSpec where
-	-- use the larger alignment of the two types in the struct
-	alignment _ = max sec_alignment nsec_alignment
-	  where
-		sec_alignment = alignment (1::CTime)
-		nsec_alignment = alignment (1::CLong)
-	sizeOf _ = #{size struct timespec}
-	peek ptr = do
-		sec <- #{peek struct timespec, tv_sec} ptr
-		return $ TimeSpec sec
-	poke ptr (TimeSpec sec) = do
-		#{poke struct timespec, tv_sec} ptr sec
-		#{poke struct timespec, tv_nsec} ptr (0 :: CLong)
-
-{- While its interface is beastly, utimensat is in recent
-   POSIX standards, unlike lutimes. -}
-foreign import ccall "utimensat" 
-	c_utimensat :: CInt -> CString -> Ptr TimeSpec -> CInt -> IO CInt
-
-touchBoth file atime mtime follow = 
-	allocaArray 2 $ \ptr ->
-	withFilePath file $ \f -> do
-		pokeArray ptr [atime, mtime]
-		r <- c_utimensat at_fdcwd f ptr flags
-		when (r /= 0) $ throwErrno "touchBoth"
-  where
-	flags
-       		| follow = 0
-		| otherwise = at_symlink_nofollow 
-
-#else
-#if 0
-{- Using lutimes is needed for BSD.
- - 
- - TODO: test if lutimes is available. May have to do it in configure.
- - TODO: TimeSpec uses a CTime, while tv_sec is a CLong. It is implementation
- - dependent whether these are the same; need to find a cast that works.
- - (Without the cast it works on linux i386, but
- - maybe not elsewhere.)
- -}
-
-instance Storable TimeSpec where
-	alignment _ = alignment (1::CLong)
-	sizeOf _ = #{size struct timeval}
-	peek ptr = do
-		sec <- #{peek struct timeval, tv_sec} ptr
-		return $ TimeSpec sec
-	poke ptr (TimeSpec sec) = do
-		#{poke struct timeval, tv_sec} ptr sec
-		#{poke struct timeval, tv_usec} ptr (0 :: CLong) 
-
-foreign import ccall "utimes" 
-	c_utimes :: CString -> Ptr TimeSpec -> IO CInt
-foreign import ccall "lutimes" 
-	c_lutimes :: CString -> Ptr TimeSpec -> IO CInt
-
-touchBoth file atime mtime follow = 
-	allocaArray 2 $ \ptr ->
-	withFilePath file $ \f -> do
-		pokeArray ptr [atime, mtime]
-		r <- syscall f ptr
-		when (r /= 0) $
-			throwErrno "touchBoth"
-  where
-	syscall
-       		| follow = c_lutimes
-		| otherwise = c_utimes
-
-#else
-#warning "utimensat and lutimes not available; building without symlink timestamp preservation support"
-touchBoth _ _ _ _ = return ()
-#endif
-#endif
-
-#endif
diff --git a/Utility/Touch/Old.hsc b/Utility/Touch/Old.hsc
new file mode 100644
--- /dev/null
+++ b/Utility/Touch/Old.hsc
@@ -0,0 +1,123 @@
+{- Compatability interface for old version of unix, to be removed eventally.
+ -
+ - Copyright 2011 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE ForeignFunctionInterface, CPP #-}
+
+module Utility.Touch.Old (
+	TimeSpec(..),
+	touchBoth,
+	touch
+) where
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/time.h>
+
+#ifndef _BSD_SOURCE
+#define _BSD_SOURCE
+#endif
+
+#if (defined UTIME_OMIT && defined UTIME_NOW && defined AT_FDCWD && defined AT_SYMLINK_NOFOLLOW)
+#define use_utimensat 1
+
+import Utility.FileSystemEncoding
+
+import Control.Monad (when)
+import Foreign
+#endif
+
+import Foreign.C
+
+newtype TimeSpec = TimeSpec CTime
+
+touchBoth :: FilePath -> TimeSpec -> TimeSpec -> Bool -> IO ()
+
+touch :: FilePath -> TimeSpec -> Bool -> IO ()
+touch file mtime = touchBoth file mtime mtime
+
+#ifdef use_utimensat
+
+at_fdcwd :: CInt
+at_fdcwd = #const AT_FDCWD
+
+at_symlink_nofollow :: CInt
+at_symlink_nofollow = #const AT_SYMLINK_NOFOLLOW
+
+instance Storable TimeSpec where
+	-- use the larger alignment of the two types in the struct
+	alignment _ = max sec_alignment nsec_alignment
+	  where
+		sec_alignment = alignment (1::CTime)
+		nsec_alignment = alignment (1::CLong)
+	sizeOf _ = #{size struct timespec}
+	peek ptr = do
+		sec <- #{peek struct timespec, tv_sec} ptr
+		return $ TimeSpec sec
+	poke ptr (TimeSpec sec) = do
+		#{poke struct timespec, tv_sec} ptr sec
+		#{poke struct timespec, tv_nsec} ptr (0 :: CLong)
+
+{- While its interface is beastly, utimensat is in recent
+   POSIX standards, unlike lutimes. -}
+foreign import ccall "utimensat" 
+	c_utimensat :: CInt -> CString -> Ptr TimeSpec -> CInt -> IO CInt
+
+touchBoth file atime mtime follow = 
+	allocaArray 2 $ \ptr ->
+	withFilePath file $ \f -> do
+		pokeArray ptr [atime, mtime]
+		r <- c_utimensat at_fdcwd f ptr flags
+		when (r /= 0) $ throwErrno "touchBoth"
+  where
+	flags
+       		| follow = 0
+		| otherwise = at_symlink_nofollow 
+
+#else
+#if 0
+{- Using lutimes is needed for BSD.
+ - 
+ - TODO: test if lutimes is available. May have to do it in configure.
+ - TODO: TimeSpec uses a CTime, while tv_sec is a CLong. It is implementation
+ - dependent whether these are the same; need to find a cast that works.
+ - (Without the cast it works on linux i386, but
+ - maybe not elsewhere.)
+ -}
+
+instance Storable TimeSpec where
+	alignment _ = alignment (1::CLong)
+	sizeOf _ = #{size struct timeval}
+	peek ptr = do
+		sec <- #{peek struct timeval, tv_sec} ptr
+		return $ TimeSpec sec
+	poke ptr (TimeSpec sec) = do
+		#{poke struct timeval, tv_sec} ptr sec
+		#{poke struct timeval, tv_usec} ptr (0 :: CLong) 
+
+foreign import ccall "utimes" 
+	c_utimes :: CString -> Ptr TimeSpec -> IO CInt
+foreign import ccall "lutimes" 
+	c_lutimes :: CString -> Ptr TimeSpec -> IO CInt
+
+touchBoth file atime mtime follow = 
+	allocaArray 2 $ \ptr ->
+	withFilePath file $ \f -> do
+		pokeArray ptr [atime, mtime]
+		r <- syscall f ptr
+		when (r /= 0) $
+			throwErrno "touchBoth"
+  where
+	syscall
+       		| follow = c_lutimes
+		| otherwise = c_utimes
+
+#else
+#warning "utimensat and lutimes not available; building without symlink timestamp preservation support"
+touchBoth _ _ _ _ = return ()
+#endif
+#endif
diff --git a/Utility/libdiskfree.c b/Utility/libdiskfree.c
deleted file mode 100644
--- a/Utility/libdiskfree.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* disk free space checking, C mini-library
- *
- * Copyright 2012, 2014 Joey Hess <id@joeyh.name>
- *
- * License: BSD-2-clause
- */
-
-/* Include appropriate headers for the OS, and define what will be used to
- * check the free space. */
-#if defined (__FreeBSD__)
-# include <sys/param.h>
-# include <sys/mount.h>
-# define STATCALL statfs /* statfs64 not yet tested on a real FreeBSD machine */
-# define STATSTRUCT statfs
-# define BSIZE f_bsize
-#else
-#if defined __ANDROID__
-# warning free space checking code not available for Android
-# define UNKNOWN
-#else
-#if defined (__linux__) || defined (__APPLE__) || defined (__FreeBSD_kernel__) || (defined (__SVR4) && defined (__sun))
-/* Linux or OSX or Debian kFreeBSD or Solaris */
-/* This is a POSIX standard, so might also work elsewhere too. */
-# include <sys/statvfs.h>
-# define STATCALL statvfs
-# define STATSTRUCT statvfs
-# define BSIZE f_frsize
-#else
-# warning free space checking code not available for this OS
-# define UNKNOWN
-#endif
-#endif
-#endif
-
-#include <errno.h>
-#include <stdio.h>
-
-unsigned long long int get(const char *path, int req) {
-#ifdef UNKNOWN
-	errno = 1;
-	return 0;
-#else
-	unsigned long long int v, blocksize;
-	struct STATSTRUCT buf;
-
-	if (STATCALL(path, &buf) != 0)
-		return 0; /* errno is set */
-	else
-		errno = 0;
-
-	switch (req) {
-		case 0:
-			v = buf.f_blocks;
-			break;
-		case 1:
-			v = buf.f_bavail;
-			break;
-		default:
-			v = 0;
-	}
-
-	blocksize = buf.BSIZE;
-	return v * blocksize;
-#endif
-}
-
-/* Checks the amount of disk that is available to regular (non-root) users.
- * (If there's an error, or this is not supported,
- * returns 0 and sets errno to nonzero.)
- */
-unsigned long long int diskfree(const char *path) {
-	return get(path, 1);
-}
-
-/* Gets the total size of the disk. */
-unsigned long long int disksize(const char *path) {
-	return get(path, 0);
-}
-
-/*
-main () {
-	printf("%lli\n", diskfree("."));
-}
-*/
diff --git a/Utility/libdiskfree.h b/Utility/libdiskfree.h
deleted file mode 100644
--- a/Utility/libdiskfree.h
+++ /dev/null
@@ -1,1 +0,0 @@
-unsigned long long int diskfree(const char *path);
diff --git a/Utility/libmounts.c b/Utility/libmounts.c
deleted file mode 100644
--- a/Utility/libmounts.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* mounted filesystems, C mini-library
- *
- * Copyright (c) 1980, 1989, 1993, 1994
- *      The Regents of the University of California.  All rights reserved.
- * Copyright (c) 2001
- *      David Rufino <daverufino@btinternet.com>
- * Copyright 2012
- *      Joey Hess <id@joeyh.name>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "libmounts.h"
-
-#ifdef GETMNTENT
-/* direct passthrough the getmntent */
-FILE *mounts_start (void) {
-	return setmntent("/etc/mtab", "r");
-}
-int mounts_end (FILE *fp) {
-	return endmntent(fp);
-}
-struct mntent *mounts_next (FILE *fp) {
-	return getmntent(fp);
-}
-#endif
-
-#ifdef GETMNTINFO
-/* getmntent emulation using getmntinfo */
-FILE *mounts_start (void) {
-	return ((FILE *)0x1); /* dummy non-NULL FILE pointer, not used */
-}
-int mounts_end (FILE *fp) {
-	return 1;
-}
-
-static struct mntent _mntent;
-
-static struct mntent *statfs_to_mntent (struct statfs *mntbuf) {
-	_mntent.mnt_fsname = mntbuf->f_mntfromname;
-	_mntent.mnt_dir = mntbuf->f_mntonname;
-	_mntent.mnt_type = mntbuf->f_fstypename;
-
-	_mntent.mnt_opts = NULL;
-	_mntent.mnt_freq = 0;
-	_mntent.mnt_passno = 0;
-
-	return (&_mntent);
-}
-
-static int pos = -1;
-static int mntsize = -1;
-struct statfs *mntbuf = NULL;
-
-struct mntent *mounts_next (FILE *fp) {
-
-	if (pos == -1 || mntsize == -1)
-		mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
-	++pos;
-	if (pos == mntsize) {
-		pos = mntsize = -1;
-		mntbuf = NULL;
-		return NULL;
-	}
-
-	return (statfs_to_mntent(&mntbuf[pos]));
-}
-#endif
-
-#ifdef UNKNOWN
-/* dummy, do-nothing version */
-FILE *mounts_start (void) {
-	return ((FILE *)0x1);
-}
-int mounts_end (FILE *fp) {
-	return 1;
-}
-struct mntent *mounts_next (FILE *fp) {
-	return NULL;
-}
-#endif
diff --git a/Utility/libmounts.h b/Utility/libmounts.h
deleted file mode 100644
--- a/Utility/libmounts.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Include appropriate headers for the OS, and define what will be used. */
-#if defined (__FreeBSD__) || defined (__APPLE__)
-# include <sys/param.h>
-# include <sys/ucred.h>
-# include <sys/mount.h>
-# define GETMNTINFO
-#else
-#if defined __ANDROID__
-/* Android is handled by the Haskell code, not here. */
-# define UNKNOWN
-#else
-#if defined (__linux__) || defined (__FreeBSD_kernel__)
-/* Linux or Debian kFreeBSD */
-#include <mntent.h>
-# define GETMNTENT
-#else
-# warning mounts listing code not available for this OS
-# define UNKNOWN
-#endif
-#endif
-#endif
-
-#include <stdio.h>
-
-#ifndef GETMNTENT
-struct mntent {
-	char *mnt_fsname;
-	char *mnt_dir;
-	char *mnt_type;
-	char *mnt_opts; /* not filled in */
-	int mnt_freq; /* not filled in */
-	int mnt_passno; /* not filled in */
-};
-#endif
-
-FILE *mounts_start (void);
-int mounts_end (FILE *fp);
-struct mntent *mounts_next (FILE *fp);
diff --git a/debian/changelog b/debian/changelog
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,24 @@
+git-annex (6.20160318) unstable; urgency=medium
+
+  * metadata: Added -r to remove all current values of a field.
+  * Fix data loss that can occur when annex.pidlock is set in a repository.
+  * Fix bug preventing moving files to/from a repository with annex.pidlock set.
+  * Fix shared lock file FD leak.
+  * Fix metadata hook behavior when multiple files are added at once.
+    Thanks, Klaus Ethgen.
+  * Added dependencies on haskell mountpoints and disk-free-space
+    libraries, removing FFI code from git-annex.
+  * dropkey: Add --batch and --json.
+  * Fix OSX dmg to include libraries needed by bundled gpg,
+    lost in last release.
+  * Always try to thaw content, even when annex.crippledfilesystem is set.
+  * Correct git-annex info to include unlocked files in v6 repository.
+  * Sped up git-annex add in direct mode and v6 by using
+    git hash-object --stdin-paths.
+  * Sped up git-annex merge by using git hash-object --stdin-paths.
+
+ -- Joey Hess <id@joeyh.name>  Fri, 18 Mar 2016 11:30:36 -0400
+
 git-annex (6.20160229) unstable; urgency=medium
 
   * Update perlmagick build dependency. Closes: #789225
diff --git a/debian/control b/debian/control
--- a/debian/control
+++ b/debian/control
@@ -31,18 +31,18 @@
 	libghc-stm-dev (>= 2.3),
 	libghc-dbus-dev (>= 0.10.7) [linux-any],
 	libghc-fdo-notify-dev (>= 0.3) [linux-any],
-	libghc-yesod-dev (>= 1.2.6.1)       [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mipsel powerpc ppc64el s390x],
-	libghc-yesod-core-dev (>= 1.2.19)   [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mipsel powerpc ppc64el s390x],
-	libghc-yesod-form-dev (>= 1.3.15)   [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mipsel powerpc ppc64el s390x],
-	libghc-yesod-static-dev (>= 1.2.4)  [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mipsel powerpc ppc64el s390x],
-	libghc-yesod-default-dev (>= 1.2.0) [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mipsel powerpc ppc64el s390x],
-	libghc-shakespeare-dev (>= 2.0.0)   [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mipsel powerpc ppc64el s390x],
-	libghc-clientsession-dev            [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mipsel powerpc ppc64el s390x],
-	libghc-warp-dev (>= 3.0.0.5)        [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mipsel powerpc ppc64el s390x],
-	libghc-warp-tls-dev                 [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mipsel powerpc ppc64el s390x],
-	libghc-wai-dev                      [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mipsel powerpc ppc64el s390x],
-	libghc-wai-extra-dev                [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mipsel powerpc ppc64el s390x],
-	libghc-dav-dev (>= 1.0)             [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mips64el mipsel powerpc ppc64el s390x sparc64 hppa alpha hurd-i386],
+	libghc-yesod-dev (>= 1.2.6.1)       [i386 amd64 arm64 armhf kfreebsd-amd64 kfreebsd-i386 mips mips64el mipsel powerpc ppc64el s390x]
+	libghc-yesod-core-dev (>= 1.2.19)   [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mips64el mipsel powerpc ppc64el s390x],
+	libghc-yesod-form-dev (>= 1.3.15)   [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mips64el mipsel powerpc ppc64el s390x],
+	libghc-yesod-static-dev (>= 1.2.4)  [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mips64el mipsel powerpc ppc64el s390x],
+	libghc-yesod-default-dev (>= 1.2.0) [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mips64el mipsel powerpc ppc64el s390x],
+	libghc-shakespeare-dev (>= 2.0.0)   [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mips64el mipsel powerpc ppc64el s390x],
+	libghc-clientsession-dev            [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mips64el mipsel powerpc ppc64el s390x],
+	libghc-warp-dev (>= 3.0.0.5)        [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mips64el mipsel powerpc ppc64el s390x],
+	libghc-warp-tls-dev                 [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mips64el mipsel powerpc ppc64el s390x],
+	libghc-wai-dev                      [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mips64el mipsel powerpc ppc64el s390x],
+	libghc-wai-extra-dev                [i386 amd64 arm64 armhf kfreebsd-i386 kfreebsd-amd64 mips mips64el mipsel powerpc ppc64el s390x],
+	libghc-dav-dev (>= 1.0)
 	libghc-persistent-dev,
 	libghc-persistent-template-dev,
 	libghc-persistent-sqlite-dev,
@@ -72,6 +72,8 @@
 	libghc-optparse-applicative-dev (>= 0.11.0),
 	libghc-torrent-dev,
 	libghc-concurrent-output-dev,
+	libghc-disk-free-space-dev,
+	libghc-mountpoints-dev,
 	libghc-magic-dev,
 	lsof [linux-any],
 	ikiwiki,
@@ -83,7 +85,7 @@
 	openssh-client,
 	git-remote-gcrypt (>= 0.20130908-6),
 Maintainer: Richard Hartmann <richih@debian.org>
-Standards-Version: 3.9.6
+Standards-Version: 3.9.7
 Vcs-Git: git://git.kitenet.net/git-annex
 Homepage: http://git-annex.branchable.com/
 XS-Testsuite: autopkgtest
diff --git a/debian/copyright b/debian/copyright
--- a/debian/copyright
+++ b/debian/copyright
@@ -35,10 +35,6 @@
 License: other
   Free to modify and redistribute with due credit, and obviously free to use.
 
-Files: Utility/Mounts.hsc
-Copyright: Volker Wysk <hsss@volker-wysk.de>
-License: LGPL-2.1+
-
 Files: Annex/DirHashes.hs
 Copyright: 2001 Ian Lynagh
            2010-2015 Joey Hess <id@joeyh.name>
@@ -49,42 +45,6 @@
            2016 Klaus Ethgen <Klaus@Ethgen.ch>
 License: GPL-3+
 
-Files: Utility/libmounts.c
-Copyright: 1980, 1989, 1993, 1994 The Regents of the University of California
-           2001 David Rufino <daverufino@btinternet.com>
-           2012 Joey Hess <id@joeyh.name>
-License: BSD-3-clause
- * Copyright (c) 1980, 1989, 1993, 1994
- *      The Regents of the University of California.  All rights reserved.
- * Copyright (c) 2001
- *      David Rufino <daverufino@btinternet.com>
- * Copyright 2012
- *      Joey Hess <id@joeyh.name>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
-
 Files: static/jquery*
 Copyright: © 2005-2011 by John Resig, Branden Aaron & Jörn Zaefferer
            © 2011 The Dojo Foundation
@@ -139,11 +99,6 @@
  The full text of version 3 of the GPL is distributed as doc/license/GPL in
  this package's source, or in /usr/share/common-licenses/GPL-3 on
  Debian systems.
-
-License: LGPL-2.1+
- The full text of version 2.1 of the LGPL is distributed as doc/license/LGPL
- in this package's source, or in /usr/share/common-licenses/LGPL-2.1
- on Debian systems.
 
 License: BSD-2-clause
  Redistribution and use in source and binary forms, with or without
diff --git a/doc/bugs/Android__58___500___47__etc__47__resolv.conf_does_not_exist.mdwn b/doc/bugs/Android__58___500___47__etc__47__resolv.conf_does_not_exist.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Android__58___500___47__etc__47__resolv.conf_does_not_exist.mdwn
@@ -0,0 +1,26 @@
+### Please describe the problem.
+
+When entering Jabber account data, the assistant responds with:
+
+    Internal Server Error: /etc/resolv.conf does not exist (No such file or directory).
+
+### What steps will reproduce the problem?
+
+Get a jabber account at http://jit.si. Enter your jabber name and password on Android assistant, and click "Use This Account". The dark overlay and progress message appears. After about 30 seconds the browser forwards to the "Internal Server Error: /etc/resolv.conf does not exist (No such file or directory)" page.
+
+### What version of git-annex are you using? On what operating system?
+
+Android 4.2 on Lenovo 780p. This model is only for sale in China and India and has been rooted, but the original ROM is still on. Often this makes no difference but you might want to confirm with another device.
+
+git-annex version 5.20131127-g736ce5e
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+# End of transcript or log.
+"""]]
+
+> [[fixed|done]] --[[Joey]] 
diff --git a/doc/bugs/Android__58___Several_error_messages___47___warnings.mdwn b/doc/bugs/Android__58___Several_error_messages___47___warnings.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Android__58___Several_error_messages___47___warnings.mdwn
@@ -0,0 +1,38 @@
+### Please describe the problem.
+
+When I start Git Annex then there are several warnings. The app renders my phone basically unusable (two time my phone rebooted and several time I had to remove the battery because the phone didn't respond).
+
+It seems Git Annex uses all the available memory (one warning is that git-annex has text relocations and that this wastes memory.
+
+I've attached a screen shot of the error messages.
+
+
+### What steps will reproduce the problem?
+
+Starting Git Annex on my phone
+
+
+### What version of git-annex are you using? On what operating system?
+
+Git Annex: 5.20150927-gb506fb2
+Android: 5.0.2
+
+
+### Please provide any additional information below.
+
+My phone is low-end (it has only ~512MB memory for example) - but normally everything works more or less okay.
+
+If I use Chrome as the browser and start the webapp then Git Annex gets (it seems) killed quite often. It seems because there is not enough memory.
+
+If I use a browser with a small memory footprint then the webapp works only barely better - very unresponsive (but at least Git Annex isn't killed).
+
+
+### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
+
+Sorry, no, I'm just starting out with Git Annex :)
+
+But Git Annex looks amazing - exactly what I need! ;)
+
+Can I somehow help to find the problem?
+
+I'd really love to use Git Annex on my phone.
diff --git a/doc/bugs/Building_fails__58___Not_in_scope__58_____96__myHomeDir__39___.mdwn b/doc/bugs/Building_fails__58___Not_in_scope__58_____96__myHomeDir__39___.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Building_fails__58___Not_in_scope__58_____96__myHomeDir__39___.mdwn
@@ -0,0 +1,56 @@
+What steps will reproduce the problem?
+
+Building of the current github HEAD fails with a strange error message regarding OSX. I'm not using OSX but Ubuntu 12.10, why is cabal trying to build these files?
+
+<pre>
+dominik@Atlantis:/var/tmp$ git clone git://github.com/joeyh/git-annex.git
+Cloning into 'git-annex'...
+remote: Counting objects: 40243, done.
+remote: Compressing objects: 100% (10568/10568), done.
+remote: Total 40243 (delta 29647), reused 40044 (delta 29449)
+Receiving objects: 100% (40243/40243), 9.12 MiB | 184 KiB/s, done.
+Resolving deltas: 100% (29647/29647), done.
+dominik@Atlantis:/var/tmp$ cd git-annex/
+dominik@Atlantis:/var/tmp/git-annex$ cabal update
+Downloading the latest package list from hackage.haskell.org
+dominik@Atlantis:/var/tmp/git-annex$ cabal install --only-dependencies
+Resolving dependencies...
+All the requested packages are already installed:
+Use --reinstall if you want to reinstall anyway.
+dominik@Atlantis:/var/tmp/git-annex$ cabal configure
+Resolving dependencies...
+[ 1 of 21] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/setup/Utility/FileSystemEncoding.o )
+[ 2 of 21] Compiling Utility.Applicative ( Utility/Applicative.hs, dist/setup/Utility/Applicative.o )
+[ 3 of 21] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/setup/Utility/PartialPrelude.o )
+[ 4 of 21] Compiling Utility.UserInfo ( Utility/UserInfo.hs, dist/setup/Utility/UserInfo.o )
+[ 5 of 21] Compiling Utility.Monad    ( Utility/Monad.hs, dist/setup/Utility/Monad.o )
+[ 6 of 21] Compiling Utility.Path     ( Utility/Path.hs, dist/setup/Utility/Path.o )
+[ 7 of 21] Compiling Utility.OSX      ( Utility/OSX.hs, dist/setup/Utility/OSX.o )
+
+Utility/OSX.hs:22:17: Not in scope: `myHomeDir'
+</pre>
+
+What is the expected output? What do you see instead?
+
+I expect cabal to build git-annex. 
+
+What version of git-annex are you using? On what operating system?
+
+github HEAD on Ubuntu 12.10
+
+Please provide any additional information below.
+
+<pre>
+$ cabal --version
+cabal-install version 0.14.0
+using version 1.14.0 of the Cabal library 
+
+$ ghc --version
+The Glorious Glasgow Haskell Compilation System, version 7.4.2
+
+$ uname -a
+Linux Atlantis 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
+
+</pre>
+
+> [[fixed|done]] --[[Joey]] 
diff --git a/doc/bugs/FAT__58___Date_resolution_for_mtime_2s--__62___implications.mdwn b/doc/bugs/FAT__58___Date_resolution_for_mtime_2s--__62___implications.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/FAT__58___Date_resolution_for_mtime_2s--__62___implications.mdwn
@@ -0,0 +1,138 @@
+The Date resolution of the FAT filesystem is only 2 seconds for the "last modified time."
+This leads to the strange behaviour, that after umount and remount of an usb drive (direct mode) git-annex thinks that suddenly approx. 50% of
+the files are modified.  (after remount the "seconds" appears to be rounded to even values - the inode cache before unmount had 1 second resolution) So git-annex is not real "guilty" but it would be fine to create a "workaround" for this problem...
+
+Possible the best solution for this is to set even values for the seconds in the filesystem and in annex internal tables direct after the `git annex get`. 
+Other solution would be to treat differences up to 1s in modification time as unmodified or create an new parameter like rsync's "modify-window" for this. To do an `git annex sync` or `git annex add` is in my opinion not a good option, because one could add so Bad file content by accident...
+
+Here's an konsole session to show this behaviour:
+
+    $ mount /mnt/transfer/
+    $ git clone source/ /mnt/transfer/transfer-repo
+
+    Klone nach '/mnt/transfer/transfer-repo'...
+    Fertig.
+
+    $ cd /mnt/transfer/transfer-repo/
+    $ git annex init "test"
+
+    init test 
+      Detected a filesystem without fifo support.
+
+      Disabling ssh connection caching.
+
+      Detected a crippled filesystem.
+
+      Enabling direct mode.
+    ok
+    (Recording state in git...)
+
+    $ git annex group here transfer
+
+    group here (merging origin/git-annex into git-annex...)
+    (Recording state in git...)
+    ok
+    (Recording state in git...)
+
+    $ git annex wanted here standard
+
+    wanted here ok
+    (Recording state in git...)
+
+    $ git annex get --auto
+
+    get n01.mp3 (from origin...) 
+    SHA256E-s1159018--5674452792970dc03e9ba47d3a8af5ad7c8da6b3ca19e8e64b9a4cf462d4a92d.mp3
+         1159018 100%   82.62MB/s    0:00:00 (xfer#1, to-check=0/1)
+
+    sent 1159308 bytes  received 31 bytes  2318678.00 bytes/sec
+    total size is 1159018  speedup is 1.00
+    ok
+
+    get n02.mp3 (from origin...) 
+    SHA256E-s1622113--03998dc10c4839d5ab9aeaceaa63f0363c9d728aaaca2a2707f025c7b9e920a3.mp3
+     1622113 100%   34.45MB/s    0:00:00 (xfer#1, to-check=0/1)
+
+    sent 1622459 bytes  received 31 bytes  3244980.00 bytes/sec
+    total size is 1622113  speedup is 1.00
+    ok
+
+    ...
+    ...
+
+    –--> All 29 files (n01.mp3 to n29.mp3) successfully got
+
+    (Recording state in git...)
+
+    $ git annex status
+    $ stat * >../stat-before-umount
+    $ cd /
+    $ umount /mnt/transfer 
+    $ mount /mnt/transfer 
+    $ cd /mnt/transfer/transfer-repo
+    $ stat * >../stat-after-remount
+    $ git annex status
+    M n05.mp3
+    M n10.mp3
+    M n11.mp3
+    M n13.mp3
+    M n16.mp3
+    M n17.mp3
+    M n20.mp3
+    M n22.mp3
+    M n23.mp3
+    M n24.mp3
+    M n26.mp3
+    M n27.mp3
+    $ diff -u ../stat-before-umount ../stat-after-remount | grep -B8 "+Modifiziert" | grep -E "Datei:|Modifi"
+
+       Datei: „n05.mp3“
+    -Modifiziert: 2014-05-03 19:42:39.000000000 +0200
+    +Modifiziert: 2014-05-03 19:42:38.000000000 +0200
+
+       Datei: „n10.mp3“
+    -Modifiziert: 2014-05-03 19:43:05.000000000 +0200
+    +Modifiziert: 2014-05-03 19:43:04.000000000 +0200
+
+       Datei: „n11.mp3“
+    -Modifiziert: 2014-05-03 19:43:07.000000000 +0200
+    +Modifiziert: 2014-05-03 19:43:06.000000000 +0200
+
+      Datei: „n13.mp3“
+    -Modifiziert: 2014-05-03 19:43:15.000000000 +0200
+    +Modifiziert: 2014-05-03 19:43:14.000000000 +0200
+
+       Datei: „n16.mp3“
+    -Modifiziert: 2014-05-03 19:43:21.000000000 +0200
+    +Modifiziert: 2014-05-03 19:43:20.000000000 +0200
+
+       Datei: „n17.mp3“
+    -Modifiziert: 2014-05-03 19:43:29.000000000 +0200
+    +Modifiziert: 2014-05-03 19:43:28.000000000 +0200
+
+       Datei: „n20.mp3“
+    -Modifiziert: 2014-05-03 19:43:53.000000000 +0200
+    +Modifiziert: 2014-05-03 19:43:52.000000000 +0200
+
+       Datei: „n22.mp3“
+    -Modifiziert: 2014-05-03 19:44:13.000000000 +0200
+    +Modifiziert: 2014-05-03 19:44:12.000000000 +0200
+
+       Datei: „n23.mp3“
+    -Modifiziert: 2014-05-03 19:44:23.000000000 +0200
+    +Modifiziert: 2014-05-03 19:44:22.000000000 +0200
+
+       Datei: „n24.mp3“
+    -Modifiziert: 2014-05-03 19:44:31.000000000 +0200
+    +Modifiziert: 2014-05-03 19:44:30.000000000 +0200
+
+       Datei: „n26.mp3“
+    -Modifiziert: 2014-05-03 19:44:35.000000000 +0200
+    +Modifiziert: 2014-05-03 19:44:34.000000000 +0200
+
+       Datei: „n27.mp3“
+    -Modifiziert: 2014-05-03 19:44:39.000000000 +0200
+    +Modifiziert: 2014-05-03 19:44:38.000000000 +0200
+
+
+> fixed [[done]] --[[Joey]]
diff --git a/doc/bugs/Git_copy_fails_with_absolute_path_on_mavericks.mdwn b/doc/bugs/Git_copy_fails_with_absolute_path_on_mavericks.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Git_copy_fails_with_absolute_path_on_mavericks.mdwn
@@ -0,0 +1,12 @@
+### Please describe the problem.
+
+git-annex version: 6.20160126
+
+Problem happens on Mavericks, not on Yosemite with same version.
+
+Can do a relative or absolute path on a git annex add.
+
+But on the git annex copy to an S3 remote, if I use an absolute path for the file descriptor (e.g. /Users/name/git_directory/test.txt) it will not report an error, but will also not print the "copied..." string. A subsequent call with a relative path (e.g. test.txt) will work, show the copied message and indeed show up on S3.
+
+
+Good news: It's working great on Yosemite!
diff --git a/doc/bugs/Internal_Server_Error__58___Unknown_UUID.mdwn b/doc/bugs/Internal_Server_Error__58___Unknown_UUID.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Internal_Server_Error__58___Unknown_UUID.mdwn
@@ -0,0 +1,37 @@
+### Please describe the problem.
+
+One of my repositories has no name:
+http://screencast.com/t/3OjxFzpz
+
+And when I try to disable it I get this error:
+
+    Internal Server Error
+    Unknown UUID
+
+When I try to delete it I get this error:
+
+    Internal Server Error
+    unknown UUID; cannot modify
+
+I think this was the result of adding a Local Computer Repo, and then that computer signed off.  Maybe.
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version 4.20130601-g2b6c3f2
+Mac OS 10.7.5
+
+### Please provide any additional information below.
+
+Maybe it's a glitch that only will happen this once, the problem is I can't get rid of it!  Are there anyways of manually getting rid of a repo with uid?
+
+> Also reported here:
+> [[Missing_repo_uuid_after_local_pairing_with_older_annex]] and
+> [[Internal_Server_Error_unknown_UUID;_cannot_modify]]
+> and [[Local_network___40__ssh__41___fails_to_pair__47__sync]]
+> and [[Internal_Server_Error:_Unknown_UUID]]
+> --[[Joey]] 
+
+[[!meta title="local pairing leads to unknown UUID"]]
+
+> This bug is [[fixed|done]]. The webapp will detect the problem and
+> provides an interface to correct it. --[[Joey]]
diff --git a/doc/bugs/Local_pairing_fails__58___PairListener_crashed.mdwn b/doc/bugs/Local_pairing_fails__58___PairListener_crashed.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Local_pairing_fails__58___PairListener_crashed.mdwn
@@ -0,0 +1,18 @@
+What steps will reproduce the problem?
+
+Attempting to pair between a local repository and a repository on a remote computer on my LAN. Pairing is initiated from my local machine and I'm interacting with the webapp on the remote machine via firefox running over an ssh -X connection. Pairing appears to work up to a point: I enter the secret at one end, the pairing request shows up at the other end. I then enter the secret at that end.
+
+What is the expected output? What do you see instead?
+
+Pairing should complete successfully. Instead I get the error message "PairListener crashed: bad comment in public key", followed by the public key. The pairing process then does not move beyond the 'awaiting pairing' pages.
+
+What version of git-annex are you using? On what operating system?
+
+Local Machine: 3.20121127, Debian Wheezy/Sid (the only package from unstable is git-annex).
+Remote Machine: 3.20121113, Arch Linux (I installed the version from: https://aur.archlinux.org/packages/git-annex-bin/, which is supposedly the same as above, but reports the version specified here).
+
+Please provide any additional information below.
+
+None as yet. Let me know if there are any log files, etc. that I can post.
+
+> So it was the period in the hostname! [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/MacOSX__58___archive_folders_not_working_as_expected.mdwn b/doc/bugs/MacOSX__58___archive_folders_not_working_as_expected.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/MacOSX__58___archive_folders_not_working_as_expected.mdwn
@@ -0,0 +1,123 @@
+### Please describe the problem.
+
+I've added a backup USB Drive and a small archive USB drive and created a archive folder in the root of my ~/annex folder.
+
+If I move a file into the ~/annex folder and then move the same file into the ~/annex/archive folder the file gets uploaded to the small archive USB drive, but not dropped from my ~/annex/archive folder.
+
+[[!format sh """
+[2015-08-14 19:03:47 CEST] Committer: Adding git-annex..iving.ogv
+ok
+(recording state in git...)
+(recording state in git...)
+(recording state in git...)
+add /Users/markus/annex/git-annex-assistant-archiving.ogv [2015-08-14 19:03:47 CEST] Committer: Committing changes to git
+[2015-08-14 19:03:47 CEST] Pusher: Syncing with annexbackup, annexarchive
+
+git-annex-assistant-archiving.ogv
+To /Volumes/annex-archive/annex-archive0
+   6ef9226..6c87a7d  git-annex -> synced/git-annex
+   b8855cc..bc20ee2  annex/direct/master -> synced/master
+To /Volumes/annex-backup/annex-backup
+   6ef9226..6c87a7d  git-annex -> synced/git-annex
+   b8855cc..bc20ee2  annex/direct/master -> synced/master
+    15428954 100%   20.71MB/s    0:00:00 (xfer#1, to-check=0/1)
+
+sent 15430948 bytes  received 42 bytes  10287326.67 bytes/sec
+total size is 15428954  speedup is 1.00
+[2015-08-14 19:03:48 CEST] Transferrer: Uploaded git-annex..iving.ogv
+[2015-08-14 19:03:49 CEST] Pusher: Syncing with annexbackup, annexarchive
+To /Volumes/annex-backup/annex-backup
+   6c87a7d..d24edd5  git-annex -> synced/git-annex
+To /Volumes/annex-archive/annex-archive
+   6c87a7d..d24edd5  git-annex -> synced/git-annex
+[2015-08-14 19:04:23 CEST] Committer: Adding git-annex..iving.ogv
+ok
+(recording state in git...)
+(recording state in git...)
+(recording state in git...)
+add /Users/markus/annex/archive/git-annex-assistant-archiving.ogv [2015-08-14 19:04:23 CEST] Committer: Committing changes to git
+[2015-08-14 19:04:23 CEST] Pusher: Syncing with annexbackup, annexarchive
+
+git-annex-assistant-archiving.ogv
+To /Volumes/annex-backup/annex-backup:00
+   d24edd5..507be0c  git-annex -> synced/git-annex
+   bc20ee2..8fea81a  annex/direct/master -> synced/master
+To /Volumes/annex-archive/annex-archive
+   d24edd5..507be0c  git-annex -> synced/git-annex
+   bc20ee2..8fea81a  annex/direct/master -> synced/master
+    15428954 100%   30.72MB/s    0:00:00 (xfer#1, to-check=0/1)
+
+sent 15430948 bytes  received 42 bytes  30861980.00 bytes/sec
+total size is 15428954  speedup is 1.00
+[2015-08-14 19:04:23 CEST] Transferrer: Uploaded git-annex..iving.ogv
+[2015-08-14 19:04:25 CEST] Pusher: Syncing with annexbackup, annexarchive
+To /Volumes/annex-archive/annex-archive
+   507be0c..ba58f77  git-annex -> synced/git-annex
+To /Volumes/annex-backup/annex-backup
+   507be0c..ba58f77  git-annex -> synced/git-annex
+"""]]
+
+If I directly move a file e.g. from ~/Downloads to ~/annex/archive the file gets uploaded to the small archive USB drive and then dropped from my drive (as expected).
+
+[[!format sh """
+[2015-08-14 19:04:25 CEST] Pusher: Syncing with annexbackup, annexarchive
+To /Volumes/annex-archive/annex-archive
+   507be0c..ba58f77  git-annex -> synced/git-annex
+To /Volumes/annex-backup/annex-backup
+   507be0c..ba58f77  git-annex -> synced/git-annex
+[2015-08-14 19:09:44 CEST] Committer: Adding Oracle_VM..x-extpack
+ok
+(recording state in git...)
+(recording state in git...)
+(recording state in git...)
+add /Users/markus/annex/archive/Oracle_VM_VirtualBox_Extension_Pack-5.0.0-101573.vbox-extpack [2015-08-14 19:09:44 CEST] Committer: Committing changes to git
+[2015-08-14 19:09:44 CEST] Pusher: Syncing with annexbackup, annexarchive
+
+Oracle_VM_VirtualBox_Extension_Pack-5.0.0-101573.vbox-extpack
+To /Volumes/annex-backup/annex-backup:00
+   ba58f77..73eed9e  git-annex -> synced/git-annex
+   8fea81a..68526f7  annex/direct/master -> synced/master
+To /Volumes/annex-archive/annex-archive
+   ba58f77..73eed9e  git-annex -> synced/git-annex
+   8fea81a..68526f7  annex/direct/master -> synced/master
+    18028050 100%   25.65MB/s    0:00:00 (xfer#1, to-check=0/1)
+
+sent 18030392 bytes  received 42 bytes  12020289.33 bytes/sec
+total size is 18028050  speedup is 1.00
+[2015-08-14 19:09:45 CEST] Transferrer: Uploaded Oracle_VM..x-extpack
+ok
+(recording state in git...)
+(recording state in git...)
+drop /Users/markus/annex/archive/Oracle_VM_VirtualBox_Extension_Pack-5.0.0-101573.vbox-extpack [2015-08-14 19:09:47 CEST] Pusher: Syncing with annexbackup, annexarchive
+To /Volumes/annex-backup/annex-backup
+   73eed9e..93dc4a3  git-annex -> synced/git-annex
+To /Volumes/annex-archive/annex-archive
+   73eed9e..93dc4a3  git-annex -> synced/git-annex
+"""]]
+
+But if I move the file-link from ~/annex/archive to ~/annex the file stays a link and don't get transferred back to my drive.
+
+[[!format sh """
+[2015-08-14 19:12:39 CEST] Committer: Committing changes to git
+[2015-08-14 19:12:39 CEST] Pusher: Syncing with annexbackup, annexarchive
+To /Volumes/annex-backup/annex-backup
+   68526f7..082e0d8  annex/direct/master -> synced/master
+To /Volumes/annex-archive/annex-archive
+   68526f7..082e0d8  annex/direct/master -> synced/master
+"""]] 
+
+
+### What version of git-annex are you using? On what operating system?
+
+Im using MacOSX 10.11 Beta (15A243d) with the most resend MacOSX App.
+ 
+[[!format sh """
+$ /Applications/git-annex.app/Contents/MacOS/git-annex version
+git-annex version: 5.20150812-ga6f7b36
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA TorrentParser Database
+key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384 SKEIN256E SKEIN256 SKEIN512E SKEIN512 SHA1E SHA1 MD5E MD5 WORM URL
+remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external
+local repository version: 5
+supported repository version: 5
+upgrade supported from repository versions: 0 1 2 4
+"""]]
diff --git a/doc/bugs/OSX__58___Assistant_leaves_repo_in_inconsistent_state.mdwn b/doc/bugs/OSX__58___Assistant_leaves_repo_in_inconsistent_state.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/OSX__58___Assistant_leaves_repo_in_inconsistent_state.mdwn
@@ -0,0 +1,151 @@
+### Please describe the problem.
+Shortly after starting the assistant the local client repository is in an inconsistent state. Just using the cli works fine without destroying the repository.
+
+### What steps will reproduce the problem?
+- Working git annex repository
+
+- Start the Git-Annex Assistant
+> git annex assistant
+
+- Wait a short time and then check the repository state:
+> ➜  annex git:(master) ✗ gst
+> On branch master
+> error: Could not read ea63b58d1252e3432280cdce1282eb02035c926e
+> error: Could not read ea63b58d1252e3432280cdce1282eb02035c926e
+> fatal: Failed to traverse parents of commit 108fa97a989aeabff16738558e1aa636c836598b
+
+- refs/heads/synced/git-annex links to an unknown commit
+> ➜  .git git:(master) cat refs/heads/synced/git-annex
+> be8e6023fbb172b12cec8fdbaa8654194f71c4f5% 
+
+> git show be8e6023fbb172b12cec8fdbaa8654194f71c4f5
+> fatal: unable to read source tree (d2959525362dcadd4dbec96a8f18d80cc689a851)
+
+### What version of git-annex are you using? On what operating system?
+- git-annex version: 5.20150508-gf71c23f
+- Mac OSX 10.10.2
+
+### Please provide any additional information below.
+
+[[!format sh """
+
+[2015-05-15 07:06:32 CEST] main: starting assistant version 5.20150508-gf71c23f
+[2015-05-15 07:06:32 CEST] Cronner: Consistency check in progress
+fsck 2015-05-01 07.56.02.jpg (checksum…)
+ok
+fsck 2015-05-01 09.55.58.jpg (checksum…)
+ok
+fsck 2015-05-14 12.38.24.jpg (checksum…)
+ok
+fsck 2015-05-14 12.39.30.jpg (checksum…)
+ok
+fsck 2015-05-14 12.40.49.jpg (checksum…)
+ok
+fsck 2015-05-14 12.40.53.jpg (checksum…)
+ok
+fsck 2015-05-14 12.43.42.jpg (checksum…)
+ok
+fsck 2015-05-14 12.44.16.jpg (checksum…)
+ok
+fsck 2015-05-14 12.45.11.jpg (checksum…)
+ok
+(recording state in git…)
+[2015-05-15 07:06:39 CEST] TransferScanner: Syncing with nas 
+(scanning…) [2015-05-15 07:06:39 CEST] Watcher: Performing startup scan
+gpg: Unterschrift vom Fr  8 Mai 22:10:28 2015 CEST mittels DSA-Schlüssel ID 89C809CB
+gpg: Unterschrift kann nicht geprüft werden: Öffentlicher Schlüssel nicht gefunden
+(started…) 
+[2015-05-15 07:06:41 CEST] Committer: Committing changes to git
+(recording state in git…)
+[2015-05-15 07:06:41 CEST] Pusher: Syncing with nas 
+
+
+0%            0.0 B/s 0s
+2%          32.0KB/s 47s
+...
+90%         467.6KB/s 0s
+                        
+[2015-05-15 07:06:47 CEST] Transferrer: Uploaded 2015-05-1..38.24.jpg
+
+
+0%            0.0 B/s 0s
+1%          32.0KB/s 54s
+...
+91%         534.5KB/s 0s
+                        
+[2015-05-15 07:06:54 CEST] Transferrer: Uploaded 2015-05-1..45.11.jpg
+
+
+0%            0.0 B/s 0s
+2%        16.0KB/s 1m30s
+…
+90%         440.4KB/s 0s
+                        
+[2015-05-15 07:07:01 CEST] Transferrer: Uploaded 2015-05-1..44.16.jpg
+
+
+0%            0.0 B/s 0s
+1%        16.0KB/s 1m42s
+...
+91%         508.2KB/s 0s
+                        
+[2015-05-15 07:07:07 CEST] Transferrer: Uploaded 2015-05-1..43.42.jpg
+
+
+0%            0.0 B/s 0s
+1%        16.0KB/s 1m40s
+...
+91%         371.6KB/s 0s
+                        
+[2015-05-15 07:07:13 CEST] Transferrer: Uploaded 2015-05-1..40.53.jpg
+
+
+0%            0.0 B/s 0s
+1%          32.0KB/s 50s
+...
+91%         495.1KB/s 0s
+                        
+[2015-05-15 07:07:19 CEST] Transferrer: Uploaded 2015-05-1..40.49.jpg
+
+
+0%            0.0 B/s 0s
+1%          32.0KB/s 53s
+...
+92%         528.2KB/s 0s
+                        
+[2015-05-15 07:07:25 CEST] Transferrer: Uploaded 2015-05-1..39.30.jpg
+ssh: connect to host 1.2.3.43 port 22: Operation timed out
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+fatal: ‚/Volumes/WD1500GB/annex‘ does not appear to be a git repository
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+ssh: connect to host 1.2.3.43 port 22: Operation timed out
+s(recording state in git…)
+fatal: ‚/Volumes/WD1500GB/annex‘ does not appear to be a git repository
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+ssh: connect to host 1.2.3.43 port 22: Operation timed out
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2015-05-15 07:08:16 CEST] Cronner: Attempting to repair aether [here]
+Unpacking all pack files.
+ssh: connect to host 1.2.3.43 port 22: Operation timed out
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+ssh: connect to host 1.2.3.36 port 22:sssssh: connect to host 1.2.3.43 port 22: Operation timed out
+fatal: early EOF
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/Problem_with_windows_version__58___1.9.5.msysgit.0_wrong_path.mdwn b/doc/bugs/Problem_with_windows_version__58___1.9.5.msysgit.0_wrong_path.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Problem_with_windows_version__58___1.9.5.msysgit.0_wrong_path.mdwn
@@ -0,0 +1,82 @@
+### Please describe the problem.
+1. git annex  - command not found - found a workaround
+2. git assistant broken
+
+### What steps will reproduce the problem?
+1. fresh download of 19.5.msysgit.0
+2. fresh download of recent git-annex
+### What version of git-annex are you using? On what operating system?
+1. Window 7.
+2. git version 1.9.5.msysgit.0
+2. git-annex version 5.20150205-g0f63eb0
+
+### Please provide any additional information below.
+After copying
+   cp cmd/git-annex bin
+in the  git install directory it was working.
+
+Adding a fresh "removeable Storage" repository delivered
+git [Param "config",Param "core.fsyncobjectfiles",Param "true"] failed
+
+calling the command (locally) manually:
+   git config core.fsyncobjectfiles true
+works fine, but i found no way to call it on the remote directory.
+The "annex" directory on H: was created and looks like a bare git depot.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+[2015-02-07 17:09:04 Mitteleuropõische Zeit] main: starting assistant version 5.20150205-g0f63eb0
+[2015-02-07 17:09:04 Mitteleuropõische Zeit] Cronner: You should enable consistency checking to protect your data. 
+(scanning...) [2015-02-07 17:09:05 Mitteleuropõische Zeit] Watcher: Performing startup scan
+(started...) [2015-02-07 17:09:42 Mitteleuropõische Zeit] main: starting assistant version 5.20150205-g0f63eb0
+[2015-02-07 17:09:42 Mitteleuropõische Zeit] Cronner: You should enable consistency checking to protect your data. 
+recv: failed (No error)
+(scanning...) [2015-02-07 17:09:42 Mitteleuropõische Zeit] Watcher: Performing startup scan
+(started...) [2015-02-07 17:09:51 Mitteleuropõische Zeit] main: starting assistant version 5.20150205-g0f63eb0
+[2015-02-07 17:09:52 Mitteleuropõische Zeit] Cronner: You should enable consistency checking to protect your data. 
+(scanning...) [2015-02-07 17:09:52 Mitteleuropõische Zeit] Watcher: Performing startup scan
+(started...) [2015-02-07 17:10:18 Mitteleuropõische Zeit] Committer: Adding DSC07173.JPG DSC07174.JPG DSC07175.JPG
+
+add 2014-08-01-Waal\DSC07173.JPG Committer crashed: sha256sum parse error
+[2015-02-07 17:10:18 Mitteleuropõische Zeit] Committer: warning Committer crashed: sha256sum parse error
+recv: failed (No error)
+[2015-02-07 17:10:27 Mitteleuropõische Zeit] Committer: Adding DSC07175.JPG DSC07176.JPG DSC07177.JPG DSC07178.JPG
+add 2014-08-01-Waal\DSC07175.JPG Committer crashed: sha256sum parse error
+[2015-02-07 17:10:27 Mitteleuropõische Zeit] Committer: warning Committer crashed: sha256sum parse error
+[2015-02-07 17:10:37 Mitteleuropõische Zeit] main: starting assistant version 5.20150205-g0f63eb0
+[2015-02-07 17:10:37 Mitteleuropõische Zeit] Cronner: You should enable consistency checking to protect your data. 
+recv: failed (No error)
+recv: failed (No error)
+DaemonStatus crashed: MoveFileEx ".git\\annex\\daemon.status6720.tmp" ".git\\annex\\daemon.status": permission denied (Zugriff verweigert)
+[2015-02-07 17:10:37 Mitteleuropõische Zeit] DaemonStatus: warning DaemonStatus crashed: MoveFileEx ".git\\annex\\daemon.status6720.tmp" ".git\\annex\\daemon.status": permission denied (Zugriff verweigert)
+(scanning...) [2015-02-07 17:10:37 Mitteleuropõische Zeit] Watcher: Performing startup scan
+(started...) [2015-02-07 17:10:38 Mitteleuropõische Zeit] Committer: Adding DSC07178.JPG DSC07177.JPG DSC07176.JPG DSC07175.JPG DSC07174.JPG DSC07173.JPG
+
+add .\2014-08-01-Waal\DSC07178.JPG Committer crashed: sha256sum parse error
+[2015-02-07 17:10:38 Mitteleuropõische Zeit] Committer: warning Committer crashed: sha256sum parse error
+[2015-02-07 17:10:40 Mitteleuropõische Zeit] main: starting assistant version 5.20150205-g0f63eb0
+WebApp crashed: MoveFileEx ".git\\annex\\webapp.html5592.tmp" ".git\\annex\\webapp.html": permission denied (Zugriff verweigert)
+[2015-02-07 17:10:40 Mitteleuropõische Zeit] WebApp: warning WebApp crashed: MoveFileEx ".git\\annex\\webapp.html5592.tmp" ".git\\annex\\webapp.html": permission denied (Zugriff verweigert)
+[2015-02-07 17:10:40 Mitteleuropõische Zeit] Cronner: You should enable consistency checking to protect your data. 
+(scanning...) [2015-02-07 17:10:41 Mitteleuropõische Zeit] Watcher: Performing startup scan
+(started...) [2015-02-07 17:10:41 Mitteleuropõische Zeit] Committer: Adding DSC07178.JPG DSC07177.JPG DSC07176.JPG DSC07175.JPG DSC07174.JPG DSC07173.JPG
+
+add .\2014-08-01-Waal\DSC07178.JPG Committer crashed: sha256sum parse error
+[2015-02-07 17:10:42 Mitteleuropõische Zeit] Committer: warning Committer crashed: sha256sum parse error
+rerrrcereevcecc:vcvv :v::f :  af ffiafaaliaiielilldelee dedd( d  N( ((oN(NN oNooe o  re eerrerrorrrrroroo)rorr
+)r))
+)
+
+
+recv: failed (No error)
+recv: failed (No error)
+fatal: unable to access '..\..\..\..\H:\annex/config': Invalid argument
+07/Feb/2015:17:11:40 +0100 [Error#yesod-core] git [Param "config",Param "core.fsyncobjectfiles",Param "true"] failed @(yesod-core-1.2.19:Yesod.Core.Class.Yesod .\Yesod\Core\Class\Yesod.hs:503:5)
+
+
+
+# End of transcript or log.
+"""]]
+
+> User error; [[closing|done]] --[[Joey]]
diff --git a/doc/bugs/R__47__O_permissions_are_stalking_me_somehow.mdwn b/doc/bugs/R__47__O_permissions_are_stalking_me_somehow.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/R__47__O_permissions_are_stalking_me_somehow.mdwn
@@ -0,0 +1,55 @@
+### Please describe the problem.
+
+I have got data which I was trying to add to an existing annex.  Unfortunately I have missed first that some files were not having write permissions so initial 'annex add' failed with similar to below messages, so I have pruned misctmp, adjusted permissions and have tried to add again -- but the same error keeps coming back
+
+[[!format sh """
+% chmod +w -R S1/DDA-Freeviewing/surf2anat
+
+% ls -l S1/DDA-Freeviewing/surf2anat/S1_run1_lh*
+-rw-r----- 2 yoh retino 241147956 Feb 28 21:46 S1/DDA-Freeviewing/surf2anat/S1_run1_lh_process_surf.nii.gz
+
+% rm -rf .git/annex/misctmp/*
+zsh: sure you want to delete all the files in /mnt/datasets/mikemp/data-annex/.git/annex/misctmp [yn]? y
+
+% git annex add S1/DDA-Freeviewing/surf2anat/S1_run1_lh_process_surf.nii.gz
+add S1/DDA-Freeviewing/surf2anat/S1_run1_lh_process_surf.nii.gz
+git-annex: .git/annex/misctmp/S1_run1_lh1804289383846930886: rename: permission denied (Permission denied)
+failed
+git-annex: add: 1 failed
+
+% ls -l S1/DDA-Freeviewing/surf2anat/S1_run1_lh*
+-r--r----- 2 yoh retino 241147956 Feb 28 21:46 S1/DDA-Freeviewing/surf2anat/S1_run1_lh_process_surf.nii.gz
+
+% git annex version
+git-annex version: 6.20160307+gitgb095561-1~ndall+1
+build flags: Assistant Webapp Pairing Testsuite S3(multipartupload)(storageclasses) WebDAV Inotify DBus DesktopNotify XMPP ConcurrentOutput TorrentParser MagicMime Feeds Quvi
+key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384 SHA3_256E SHA3_256 SHA3_512E SHA3_512 SHA3_224E SHA3_224 SHA3_384E SHA3_384 SKEIN256E SKEIN256 SKEIN512E SKEIN512 SHA1E SHA1 MD5E MD5 WORM URL
+remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external
+local repository version: 5
+supported repository versions: 5 6
+upgrade supported from repository versions: 0 1 2 4 5
+
+
+% rm -rf .git/annex/misctmp/*
+zsh: sure you want to delete all the files in /mnt/datasets/mikemp/data-annex/.git/annex/misctmp [yn]? y
+
+% chmod +w -R S1/DDA-Freeviewing/surf2anat
+
+% git annex add --debug S1/DDA-Freeviewing/surf2anat/S1_run1_lh_process_surf.nii.gz
+[2016-03-10 10:15:22.578786] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","ls-files","--others","--exclude-standard","-z","--","S1/DDA-Freeviewing/surf2anat/S1_run1_lh_process_surf.nii.gz"]
+[2016-03-10 10:15:22.583854] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","check-attr","-z","--stdin","annex.backend","annex.numcopies","annex.largefiles","--"]
+[2016-03-10 10:15:22.584443] read: git ["--version"]
+[2016-03-10 10:15:22.588703] process done ExitSuccess
+add S1/DDA-Freeviewing/surf2anat/S1_run1_lh_process_surf.nii.gz [2016-03-10 10:15:23.186056] read: sha256sum [".git/annex/misctmp/S1_run1_lh1804289383846930886"]
+[2016-03-10 10:15:24.611133] process done ExitSuccess
+
+git-annex: .git/annex/misctmp/S1_run1_lh1804289383846930886: rename: permission denied (Permission denied)
+failed
+[2016-03-10 10:15:24.648808] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","diff","--name-only","--diff-filter=T","-z","--","S1/DDA-Freeviewing/surf2anat/S1_run1_lh_process_surf.nii.gz"]
+git-annex: add: 1 failed
+% ls -l .git/annex/misctmp/S1_run1_lh1804289383846930886
+-r--r----- 2 yoh retino 241147956 Feb 28 21:46 .git/annex/misctmp/S1_run1_lh1804289383846930886
+
+"""]]
+
+[[!meta author=yoh]]
diff --git a/doc/bugs/Utility__47__libdiskfree.c_more_BSD_friendly.mdwn b/doc/bugs/Utility__47__libdiskfree.c_more_BSD_friendly.mdwn
--- a/doc/bugs/Utility__47__libdiskfree.c_more_BSD_friendly.mdwn
+++ b/doc/bugs/Utility__47__libdiskfree.c_more_BSD_friendly.mdwn
@@ -79,3 +79,6 @@
 
 Not tested this "feature" yet, I got another issue which blocks me for now.
 
+> Well, this code has been removing from git-annex, and it's now using
+> <http://hackage.haskell.org/package/disk-free-space>. I think that
+> library is somewhat more portable. [[done]]
diff --git a/doc/bugs/Windows__58___Annex_can_not_get_files.mdwn b/doc/bugs/Windows__58___Annex_can_not_get_files.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Windows__58___Annex_can_not_get_files.mdwn
@@ -0,0 +1,162 @@
+### Please describe the problem.
+git annex on windows does not seem to be able to get files from one (local) repository to another (also local) if the remote contains a drive letter (or generally a : in the path)
+
+### What steps will reproduce the problem?
+0. c:\> git init annex1
+0. c:\> cd annex1
+0. c:\annex1\> git annex init dir1
+0. c:\annex1\> echo "This is a git annex repository" > README.txt
+0. c:\annex1\> git annex add README.txt
+0. c:\annex1\> git annex sync
+0. c:\annex1\> cd \
+1. c:\> git init annex2
+1. c:\> cd annex2
+1. c:\annex2\> git annex init dir2
+1. c:\annex2\> git remote add dir1 c:\annex1
+1. c:\annex2\> git annex sync dir1
+2. c:\annex2\> git annex get README.txt
+
+### What version of git-annex are you using? On what operating system?
+C:\annex2>git version
+git version 1.9.4.msysgit.0
+
+C:\annex2>git annex version
+git-annex version: 5.20150113-gcf247cf
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feed
+s Quvi TDFA CryptoHash TorrentParser
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SH
+A256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL
+remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glac
+ier ddar hook external
+local repository version: 5
+supported repository version: 5
+upgrade supported from repository versions: 2 3 4
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+C:\>git init annex1
+Initialized empty Git repository in C:/annex1/.git/
+
+C:\>cd annex1
+
+C:\annex1>git annex init dir1
+init dir1
+  Detected a filesystem without fifo support.
+
+  Disabling ssh connection caching.
+
+  Detected a crippled filesystem.
+
+  Enabling direct mode.
+ok
+(Recording state in git...)
+
+C:\annex1>echo "This is a git annex repository" > README.txt
+
+C:\annex1>git annex add README.txt
+add README.txt ok
+(Recording state in git...)
+
+C:\annex1>git annex sync
+commit  ok
+
+C:\annex1>cd \
+
+C:\>git init annex2
+Initialized empty Git repository in C:/annex2/.git/
+
+C:\>cd annex2
+
+C:\annex2>git annex init dir2
+init dir2
+  Detected a filesystem without fifo support.
+
+  Disabling ssh connection caching.
+
+  Detected a crippled filesystem.
+
+  Enabling direct mode.
+ok
+(Recording state in git...)
+
+C:\annex2>git remote add dir1 c:\annex1
+
+C:\annex2>git annex sync dir1
+commit  ok
+pull dir1
+warning: no common commits
+remote: Counting objects: 13, done.
+remote: Compressing objects: 100% (9/9), done.
+remote: Total 13 (delta 1), reused 0 (delta 0)
+Unpacking objects: 100% (13/13), done.
+From c:\annex1
+ * [new branch]      annex/direct/master -> dir1/annex/direct/master
+ * [new branch]      git-annex  -> dir1/git-annex
+ * [new branch]      master     -> dir1/master
+ * [new branch]      synced/master -> dir1/synced/master
+
+Merge made by the 'recursive' strategy.
+ README.txt | 1 +
+ 1 file changed, 1 insertion(+)
+ create mode 120000 README.txt
+
+Already up-to-date.
+ok
+(merging dir1/git-annex into git-annex...)
+(Recording state in git...)
+push dir1
+Counting objects: 15, done.
+Delta compression using up to 4 threads.
+Compressing objects: 100% (10/10), done.
+Writing objects: 100% (12/12), 1.18 KiB | 0 bytes/s, done.
+Total 12 (delta 4), reused 0 (delta 0)
+To c:\annex1
+   a7d2b83..0e86493  annex/direct/master -> synced/master
+ * [new branch]      git-annex -> synced/git-annex
+ok
+
+C:\annex2>git annex get README.txt
+get README.txt (not available)
+  Try making some of these repositories available:
+        f005c222-3e80-46a3-81a2-72c6cae18035 -- dir1              <<<---- WTF: It's c:\annex1
+failed
+git-annex: get: 1 failed
+
+C:\annex2>git annex list
+here
+|dir1
+||web
+|||bittorrent
+||||
+____ README.txt                                                   <<<----- WTF2: Why doesn't annex2 know that annex1 has a copy?
+
+C:\annex2>git annex whereis README.txt
+whereis README.txt (1 copy)
+        f005c222-3e80-46a3-81a2-72c6cae18035 -- dir1
+ok
+
+C:\annex2>cd \annex1
+
+C:\annex1>git annex list
+(merging synced/git-annex into git-annex...)
+here
+|web
+||bittorrent
+|||
+X__ README.txt                                                    <<<--- But annex1 knows where it is.
+
+C:\annex1>git annex sync
+commit  ok
+merge synced/master
+Updating a7d2b83..0e86493
+Fast-forward
+error: duplicate parent 0e86493f9431d6df13ef49831e00b22be93e509c ignored              <<<---- Could this be the problem?
+ok
+
+C:\annex1>cd \annex2
+
+"""]]
+
+> [[fixed|done]]; a simple path calculation bug. --[[Joey]]
diff --git a/doc/bugs/Windows__58___can__39__t_clone_repository.mdwn b/doc/bugs/Windows__58___can__39__t_clone_repository.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Windows__58___can__39__t_clone_repository.mdwn
@@ -0,0 +1,56 @@
+### Please describe the problem.
+
+Can't clone repository on Windows 7 64bit
+
+### What steps will reproduce the problem?
+git clone git://git-annex.branchable.com/ gitannex
+
+...
+
+error: Invalid path 'doc/walkthrough/fsck:_verifying_your_data.mdwn'
+
+error: Invalid path 'doc/walkthrough/fsck:_when_things_go_wrong.mdwn'
+
+error: Invalid path 'doc/walkthrough/quiet_please:_When_git-annex_seems_to_skip_files.mdwn'
+
+error: Invalid path 'doc/walkthrough/removing_files:_When_things_go_wrong.mdwn'
+
+error: Invalid path 'doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn'
+
+Checking out files: 100% (7235/7235), done.
+
+git status shows many deleted
+
+git reset --hard shows same error as clone
+
+### What version of git-annex are you using? On what operating system?
+git annex version
+
+git-annex version: 5.20150219-g3fc8d83
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA TorrentParser
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E MD5E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 MD5 WORM
+ URL
+remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external
+local repository version: unknown
+supported repository version: 5
+upgrade supported from repository versions: 2 3 4
+
+git --version
+
+git version 1.9.5.msysgit.0
+
+Windows 7 64bit
+
+
+> Here's a nickle kid, go buy yourself a real OS that supports
+> colon in filenames.  
+> 
+> Windows has all kinds of stupid limitations that are enough fun
+> making git-annex support, without trying to make its source/website
+> repo also avoid them. 
+> 
+> The solution is cygwin; git-annex's windows autobuilder uses cygwin's
+> version of git to check out its git repository, and that should work for you.
+> [[done]]
+> 
+> --[[Joey]] 
diff --git a/doc/bugs/__34__fatal__58___bad_config_file__34__.mdwn b/doc/bugs/__34__fatal__58___bad_config_file__34__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/__34__fatal__58___bad_config_file__34__.mdwn
@@ -0,0 +1,14 @@
+### Please describe the problem.
+
+When running a command like `git annex copy --not --in bucket --to bucket`, I got:
+
+`fatal: bad config file line 1 in /home/jim/tmp/git-annex14898.tmp`
+
+I caught `git-annex14898.tmp` before it was deleted and it contained an HTML error page.
+I have a remote `https://git.example.com/jim/annex.git`, and it appears that git-annex
+is requesting `https://git.example.com/jim/annex.git/config`.  My server returns a 401 
+Forbidden and an error page for that URL, but git-annex tries to use the response as a config file anyway.
+
+Jim
+
+> [[fixed|done]] --[[Joey]] 
diff --git a/doc/bugs/__34__git-annex__58___direct__58___1_failed__34___on_Windows.mdwn b/doc/bugs/__34__git-annex__58___direct__58___1_failed__34___on_Windows.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/__34__git-annex__58___direct__58___1_failed__34___on_Windows.mdwn
@@ -0,0 +1,109 @@
+### Please describe the problem.
+
+When attempting to clone and use a git repository in a subdirectory several levels deep on Windows, I observe symptoms very similar to those described at http://git-annex.branchable.com/direct_mode/#comment-8feee726df4e287dd3751bc77fd1441f.  By contrast, when I attempt the same operation in a subdirectory higher up, the operation is successful.  Logs of both sessions are given below.
+
+My suspicion is that this has to do with exceeding the maximum path length limitation (MAX_PATH) of 260 characters on Windows, as described here: http://msdn.microsoft.com/en-us/library/aa365247.aspx. 
+
+
+### What steps will reproduce the problem?
+
+See above.
+
+
+### What version of git-annex are you using? On what operating system?
+
+>git annex version
+git-annex version: 5.20140517-gee56d21
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV 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 webdav tahoe glacier ddar hook external
+local repository version: 5
+supported repository version: 5
+upgrade supported from repository versions: 2 3 4
+
+>git version
+git version 1.9.0.msysgit.0
+
+Operating system: Windows 7 Professional (64-bit), Service Pack 1
+
+
+### Please provide any additional information below.
+
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+C:\Users\areeves\Documents\Work\MyDirectoryHere\git>git clone ssh://areeves@myserver:/home/work/git/sbv
+Cloning into 'sbv'...
+remote: Counting objects: 65, done.
+remote: Compressing objects: 100% (57/57), done.
+remote: Total 65 (delta 26), reused 0 (delta 0)
+Receiving objects: 100% (65/65), 9.25 KiB | 0 bytes/s, done.
+Resolving deltas: 100% (26/26), done.
+Checking connectivity... done.
+
+
+C:\Users\areeves\Documents\Work\MyDirectoryHere\git>cd sbv
+C:\Users\areeves\Documents\Work\MyDirectoryHere\git\sbv>git annex get
+
+  Detected a filesystem without fifo support.
+
+  Disabling ssh connection caching.
+
+  Detected a crippled filesystem.
+
+  Enabling direct mode.
+git-annex: C:\Users\areeves\Documents\Work\MyDirectoryHere\git\sbv\.git\annex\objects\3de\5f4\SHA256-s765223180--c9e2eebd915b4ade9429b00a7a893df928389b3fb4ab759ea9f00b0e05e18de6\: openTempFile: does not exist (No such file or directory)
+
+
+C:\Users\areeves\Documents\Work\MyDirectoryHere\git\sbv>git annex direct
+commit
+On branch master
+Your branch is up-to-date with 'origin/master'.
+
+nothing to commit, working directory clean
+ok
+
+git-annex: C:\Users\areeves\Documents\Work\MyDirectoryHere\git\sbv\.git\annex\objects\3de\5f4\SHA256-s765223180--c9e2eebd915b4ade9429b00a7a893df928389b3fb4ab759ea9f00b0e05e18de6\: openTempFile: does not exist (No such file or directory)
+failed
+git-annex: direct: 1 failed
+
+
+C:\Users\areeves\Documents\Work\MyDirectoryHere\git\sbv>cd c:\temp
+c:\temp>git clone ssh://areeves@myserver:/home/work/git/sbv
+Cloning into 'sbv'...
+remote: Counting objects: 65, done.
+remote: Compressing objects: 100% (57/57), done.
+remote: Total 65 (delta 26), reused 0 (delta 0)
+Receiving objects: 100% (65/65), 9.25 KiB | 0 bytes/s, done.
+Resolving deltas: 100% (26/26), done.
+Checking connectivity... done.
+
+c:\temp>cd sbv
+c:\temp\sbv>git annex direct
+
+  Detected a filesystem without fifo support.
+
+  Disabling ssh connection caching.
+
+  Detected a crippled filesystem.
+
+  Enabling direct mode.
+(Recording state in git...)
+
+
+c:\temp\sbv>git annex get
+get BigBinaryFile_Data_Package_2012-03-31.tar.bz2.gpg (merging origin/git-annex into git-annex...)
+(Recording state in git...)
+sent 30 bytes  received 765316741 bytes  11011752.10 bytes/sec
+total size is 765223180  speedup is 1.00
+ok
+(Recording state in git...)
+
+
+c:\temp\sbv>
+
+# End of transcript or log.
+"""]]
+
+[[!meta title="window's tiny mind is confused by some long paths used by git-annex"]]
diff --git a/doc/bugs/fatal__58___Cannot_handle_files_this_big.mdwn b/doc/bugs/fatal__58___Cannot_handle_files_this_big.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/fatal__58___Cannot_handle_files_this_big.mdwn
@@ -0,0 +1,96 @@
+### Please describe the problem.
+
+Syncing a 20GB video file causes this error. I have no problems with 8GB files. 
+
+### What steps will reproduce the problem?
+
+See additional info
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 5.20140920-gb0c4300
+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV 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 webdav tahoe glacier ddar hook external
+local repository version: 5
+supported repository version: 5
+upgrade supported from repository versions: 2 3 4
+
+git version 1.9.4.msysgit.2
+
+Windows 7 64bit 
+
+### Please provide any additional information below.
+
+[[!format sh """
+
+Z:\>git clone L:\repositories\bigFilesTest.git-annex
+Cloning into 'bigFilesTest.git-annex'...
+done.
+
+Z:\>cd bigFilesTest.git-annex
+
+Z:\bigFilesTest.git-annex>git annex init "cloned"
+init cloned
+  Detected a filesystem without fifo support.
+
+  Disabling ssh connection caching.
+
+  Detected a crippled filesystem.
+
+  Enabling direct mode.
+ok
+(Recording state in git...)
+
+Z:\bigFilesTest.git-annex>git annex add test20GBVideo.mkv
+add test20GBVideo.mkv ok
+(Recording state in git...)
+
+Z:\bigFilesTest.git-annex>git annex sync --debug
+[2014-10-18 15:39:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","git-annex"]
+[2014-10-18 15:39:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","--hash","refs/heads/git-annex"]
+[2014-10-18 15:39:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","log","refs/heads/git-annex..54de336a3423f7f8f72f897effd29f952534c24e","-n1","--pretty=%H"]
+[2014-10-18 15:39:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","log","refs/heads/git-annex..53cfcf38b40247b3992b6007336b2c915a945ad4","-n1","--pretty=%H"]
+[2014-10-18 15:39:02 Mitteleurop├ñische Sommerzeit] chat: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","cat-file","--batch"]
+[2014-10-18 15:39:02 Mitteleurop├ñische Sommerzeit] read: git ["config","--null","--list"]
+commit  [2014-10-18 15:39:02 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","ls-files","--stage","-z","--others","--exclude-standard","--","Z:\\bigFilesTest.git-annex"]
+[2014-10-18 15:39:02 Mitteleurop├ñische Sommerzeit] chat: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","cat-file","--batch"]
+(Recording state in git...)
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","add","-f","test20GBVideo.mkv"]
+fatal: Cannot handle files this big
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","--head"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","diff-index","-z","--raw","--no-renames","-l0","--cached","HEAD"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","symbolic-ref","HEAD"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","--hash","refs/heads/annex/direct/master"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","write-tree"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","rev-parse","b12e8477242df97be13c1395db143f860ce8e895:"]
+ok
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","symbolic-ref","HEAD"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","refs/heads/annex/direct/master"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","--verify","-q","refs/heads/synced/master"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","log","refs/heads/annex/direct/master..refs/heads/synced/master","-n1","--pretty=%H"]
+pull origin
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","fetch","origin"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","--verify","-q","refs/remotes/origin/annex/direct/master"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","--verify","-q","refs/remotes/origin/synced/master"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","log","refs/heads/synced/master..refs/remotes/origin/synced/master","-n1","--pretty=%H"]
+ok
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","git-annex"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","--hash","refs/heads/git-annex"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","log","refs/heads/git-annex..54de336a3423f7f8f72f897effd29f952534c24e","-n1","--pretty=%H"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","log","refs/heads/git-annex..53cfcf38b40247b3992b6007336b2c915a945ad4","-n1","--pretty=%H"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","branch","-f","synced/master"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","branch","-f","master"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","--verify","-q","refs/remotes/origin/synced/master"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","log","refs/remotes/origin/synced/master..refs/heads/synced/master","-n1","--pretty=%H"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","show-ref","--verify","-q","refs/remotes/origin/git-annex"]
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","log","refs/remotes/origin/git-annex..git-annex","-n1","--pretty=%H"]
+push origin
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] call: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","push","origin","+git-annex:synced/git-annex","annex/direct/master:synced/master"]
+Everything up-to-date
+[2014-10-18 15:39:03 Mitteleurop├ñische Sommerzeit] read: git ["--git-dir=Z:\\bigFilesTest.git-annex\\.git","--work-tree=Z:\\bigFilesTest.git-annex","-c","core.bare=false","push","origin","master"]
+ok
+
+
+
+"""]]
diff --git a/doc/bugs/fatal__58___git-write-tree__58___error_building_trees.mdwn b/doc/bugs/fatal__58___git-write-tree__58___error_building_trees.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/fatal__58___git-write-tree__58___error_building_trees.mdwn
@@ -0,0 +1,103 @@
+### Please describe the problem.
+Not able to successfully git-annex sync with a remote due to a git fatal. Caused by masters diverging?
+
+### What steps will reproduce the problem?
+git-annex sync, or, letting the assistant try.
+
+### What version of git-annex are you using? On what operating system?
+git-annex version: 5.20131221+b1 on my laptop
+git-annex version: 5.20131224-g6ca5271 on the remote server
+
+### Please provide any additional information below.
+
+Output of a manual git-annex sync in the directory:
+
+[[!format sh """
+greg@x200s:~/Documents$ git-annex sync
+commit  (Recording state in git...)
+Copyright Office/Orphan Works/ARROW/170409_ARROW_Leaflet.pdf: unmerged (783afced6bc43138373fda43edfda0c33be36525)
+Copyright Office/Orphan Works/ARROW/ARROWproject_results1.pdf: unmerged (b536e5f3d93e7905e05510f26db1f743e9eae16e)
+Copyright Office/Orphan Works/ARROW/ARROWproject_results1.ppt: unmerged (5543049b8940cc5702d37aff18b03c67d9c8374d)
+Copyright Office/Orphan Works/ARROW/ARROWstandardPresent2010.pdf: unmerged (54d751bc98cb5da29d3d568856b74675e842072e)
+Copyright Office/Orphan Works/ARROW/ARROWstandardPresent2010.ppt: unmerged (efe0e94b51eccb9a6a0c352f4a210bd5a6105050)
+Copyright Office/Orphan Works/ARROW/ARROWtrifoldMAR2011.pdf: unmerged (b52ff16178e29261fe00a518c23610a3b0826482)
+Copyright Office/Orphan Works/Documentation/20110531/Documentation.doc.odt: unmerged (1348d5f42f7e34706407f7936f4fb0438e4b8ffa)
+Copyright Office/Orphan Works/Documentation/AAPpublishers.pdf: unmerged (3f448a03d31a38adb095e3031e4ee13771d22d70)
+Copyright Office/Orphan Works/Documentation/Documentation.doc: unmerged (265fdff7787f560e3ba20789a12e15ffb165ec7f)
+Copyright Office/Orphan Works/Documentation/Documentation.pdf: unmerged (7a9ff92663ed42b42b9baaefaf4721499d18d82d)
+...
+fatal: git-write-tree: error building trees
+git-annex: failed to read sha from git write-tree
+"""]]
+
+See also:
+
+1. the [partial daemon log](http://paste.debian.net/73176/) from the assistant running in that directory on the laptop and 
+2. the output of [git fsck](http://paste.debian.net/73175/) on the remote.
+
+git-annex repair on the laptop and the server:
+[[!format sh """
+greg@x200s:~/Documents$ git-annex repair
+Running git fsck ...
+No problems found.
+ok
+"""]]
+
+
+### How I ended up fixing it:
+[[!format sh """
+greg@x200s:~/Documents$ killall git-annex
+greg@x200s:~/Documents$ git-annex indirect
+blah...............
+indirect  ok
+ok
+greg@x200s:~/Documents$ git status
+On branch master
+Your branch and 'rose/master' have diverged,
+and have 294 and 1 different commit each, respectively.
+  (use "git pull" to merge the remote branch into yours)
+
+Untracked files:
+  (use "git add <file>..." to include in what will be committed)
+
+	.gitrefs/
+
+nothing added to commit but untracked files present (use "git add" to track)
+greg@x200s:~/Documents$ git pull
+Merge made by the 'recursive' strategy.
+ Copyright Office/Orphan Works/staging/reporting/process_report.txt.2 | 1 +
+ Copyright Office/Orphan Works/staging/reporting/with-title.xls       | 1 +
+ Copyright Office/Orphan Works/staging/with-title.xls                 | 1 +
+ Copyright Office/Orphan Works/worker_emails.txt                      | 1 +
+ git.fsck.log                                                         | 1 +
+ 5 files changed, 5 insertions(+)
+ create mode 120000 Copyright Office/Orphan Works/staging/reporting/process_report.txt.2
+ create mode 120000 Copyright Office/Orphan Works/staging/reporting/with-title.xls
+ create mode 120000 Copyright Office/Orphan Works/staging/with-title.xls
+ create mode 120000 Copyright Office/Orphan Works/worker_emails.txt
+ create mode 120000 git.fsck.log
+greg@x200s:~/Documents$ git-annex sync
+commit  ok
+pull rose 
+
+Already up-to-date.
+ok
+push rose 
+Counting objects: 1658, done.
+Delta compression using up to 2 threads.
+Compressing objects: 100% (904/904), done.
+Writing objects: 100% (1604/1604), 138.97 KiB | 0 bytes/s, done.
+Total 1604 (delta 892), reused 1298 (delta 688)
+To greg@rose.makesad.us:/home/greg/Documents/
+   f1d206e..e836b9b  master -> synced/master
+ok
+greg@x200s:~/Documents$
+"""]]
+
+I restarted the assistant and the daemon.log looks good.
+
+After sync'ing on the server, it appears that this has been the case for quite some time (based off of what symlinks were created).
+
+Lastly: Joey, this is probably what caused that weird behavior in the webapp where it showed the bad transfer each day after the fsck at noon. I never diagnosed that more but I bet I won't see it tomorrow.
+
+[[!tag moreinfo]]
diff --git a/doc/bugs/fatal__58___unable_to_access___39__..__47__..__47__..__47.mdwn b/doc/bugs/fatal__58___unable_to_access___39__..__47__..__47__..__47.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/fatal__58___unable_to_access___39__..__47__..__47__..__47.mdwn
@@ -0,0 +1,63 @@
+### What steps will reproduce the problem?
+[[!format sh """
+C:\Users\Bruno>mkdir annex
+
+C:\Users\Bruno>cd annex
+
+C:\Users\Bruno\annex>git init
+Initialized empty Git repository in C:/Users/Bruno/annex/.git/
+
+C:\Users\Bruno\annex>git annex init
+init
+  Detected a crippled filesystem.
+
+  Enabling direct mode.
+
+  Detected a filesystem without fifo support.
+
+  Disabling ssh connection caching.
+ok
+(Recording state in git...)
+
+C:\Users\Bruno\annex>echo test > test
+
+C:\Users\Bruno\annex>git annex add .
+add test (checksum...) ok
+(Recording state in git...)
+
+C:\Users\Bruno\annex>git commit -a -m added
+[master (root-commit) 2eea610] added
+ 1 file changed, 1 insertion(+)
+ create mode 120000 test
+
+C:\Users\Bruno\annex>git annex sync
+(Recording state in git...)
+fatal: unable to access '../../../../C:\Users\Bruno\annex\.git/config': Invalid argument
+
+git-annex: user error (xargs ["-0","git","--git-dir=C:\\Users\\Bruno\\annex\\.git","--work-tree=C:\\Users\\Bruno\\annex","add","-f"] exited 123)
+failed
+git-annex: sync: 1 failed
+"""]]
+
+### What version of git-annex are you using? On what operating system?
+Windows 8 (64 bits)
+
+git version 1.8.4.msysgit.0
+
+[[!format sh """
+git-annex version: 4.20131008-ge115441
+build flags: Pairing Testsuite S3 WebDAV 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 webdav glacier hook
+local repository version: 4
+default repository version: 3
+supported repository versions: 3 4
+upgrade supported from repository versions: 2
+"""]]
+
+### Please provide any additional information below.
+C:\Users\Bruno\annex\.git\config exists
+
+> xargs was one problem; also msysgit seems to just not
+> accept DOS style paths anymore in --git-dir or --git-work-tree.
+> megaweird. [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/git-annex-shell__58___gcryptsetup_permission_denied.mdwn b/doc/bugs/git-annex-shell__58___gcryptsetup_permission_denied.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git-annex-shell__58___gcryptsetup_permission_denied.mdwn
@@ -0,0 +1,48 @@
+### Please describe the problem.
+I followed the tip on [fully encrypted git repositories with gcrypt](http://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/) to create encrypted git-annex repository on a ssh server. When I try to checkout the repository, things break as follows:
+
+`git clone gcrypt::ssh://my.server/home/me/encryptedrepo myrepo` 
+
+works as expected but when in the myrepo directory, 
+
+`git annex enableremote encryptedrepo gitrepo=ssh://my.server/home/me/encryptedrepo`
+
+issues the following text (among normal messages):
+
+`git-annex-shell: gcryptsetup permission denied`
+
+Then while the links are there, 
+
+`git annex get --from encryptedrepo`
+
+does nothing (in the sense that the content is not retrieved). 
+
+This seems to have everything to do with git-annex-shell as the exact same manipulations but with a local repository work perfectly. Unfortunately, I don't know haskell so [this code](https://github.com/joeyh/git-annex/blob/master/Command/GCryptSetup.hs) is cryptic to me. I can guess there is a problem getting the uuid of the repository, but as far as I can tell the bare distant repo looks fine. 
+
+### What steps will reproduce the problem?
+
+Create a standard git annex local repository and then follow the [fully encrypted git repositories with gcrypt tip](http://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/) to create an encrypted git-annex repository on a ssh server. Then follow the instructions in the same tip to clone the remote repository. 
+
+### What version of git-annex are you using? On what operating system?
+Both computers run ubuntu 12.04 with all updates and the latest git annex from the ppa, that is:
+
+git-annex version: 4.20131024
+
+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA
+
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL
+
+remote types: git gcrypt S3 bup directory rsync web webdav glacier hook
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/git-annex__58___failed_to_lock_content.mdwn b/doc/bugs/git-annex__58___failed_to_lock_content.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git-annex__58___failed_to_lock_content.mdwn
@@ -0,0 +1,107 @@
+### Please describe the problem.
+
+Cannot drop unused files on a USB drive, failing with the error message "git-annex: failed to lock content".
+
+### What steps will reproduce the problem?
+
+1. Installed stand-alone verison of git-annex on Ubuntu sometime last month
+2. Created a repository on my main HD, upgraded to v6
+3. Added files to it
+4. Created a USB (vfat) repo using the webapp without encryption; stopped the webapp, and ran `git annex get` on the USB repo.
+5. Saw that I had added some files to the repo by mistake, and used `git annex unannex $FILES` on the main HD, then `git annex unused`, then `git annex dropunused 1-101`
+6. Re-synced both repos
+7. In the USB repo, `git annex unused` showed the same list as on the HD.
+8. `git annex dropunused 1-101` then fails
+9. Installed the latest stand-alone version (6.20160229-gbe4820c)
+10. tried dropping again, didn't work; reboot the computer; tried dropping again, didn't work.
+11. ran `git annex upgrade` on USB repo, tried dropping agian, no success
+
+### What version of git-annex are you using? On what operating system?
+
+* git annex version 6.20160229-gbe4820c
+* Ubuntu 15.10
+
+### Please provide any additional information below.
+
+[[!format sh """
+/media/ellis/USB04/repo/taiji-lib
+% cat annex/unused
+2 SHA256E-s562039928--04903c0b7d4e16062b3dc0bf17a84ce7943545d9437b80947ff98a3d3483e66e.AVI 1457129072.853555s
+101 SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav 1457129072.853555s
+...
+44 SHA256E-s561941624--fdf6f89d9403464d4c494eac67fc1525aa6b9b0adc96be99f7d42e7f5472e44c.avi 1457129072.853555s
+
+/media/ellis/USB04/repo/taiji-lib
+% git annex dropunused 101 --debug                                                                                                                                                                                                                                13:09:28
+[2016-03-05 13:09:28.675403] read: git ["--git-dir=.","--literal-pathspecs","show-ref","git-annex"]
+[2016-03-05 13:09:28.677635] process done ExitSuccess
+[2016-03-05 13:09:28.67773] read: git ["--git-dir=.","--literal-pathspecs","show-ref","--hash","refs/heads/git-annex"]
+[2016-03-05 13:09:28.679775] process done ExitSuccess
+[2016-03-05 13:09:28.680234] read: git ["--git-dir=.","--literal-pathspecs","log","refs/heads/git-annex..aee0b39b5232c369721c08eb782a7143ba2f8901","-n1","--pretty=%H"]
+[2016-03-05 13:09:28.685879] process done ExitSuccess
+[2016-03-05 13:09:28.686006] read: git ["--git-dir=.","--literal-pathspecs","log","refs/heads/git-annex..2b2b2747a6533f115867cc7a70a426764fc90286","-n1","--pretty=%H"]
+[2016-03-05 13:09:28.688135] process done ExitSuccess
+[2016-03-05 13:09:28.688227] read: git ["--git-dir=.","--literal-pathspecs","log","refs/heads/git-annex..4f4acf1555539a7bcb520e4befbeab803f220f67","-n1","--pretty=%H"]
+[2016-03-05 13:09:28.690357] process done ExitSuccess
+[2016-03-05 13:09:28.691327] chat: git ["--git-dir=.","--literal-pathspecs","cat-file","--batch"]
+dropunused 101 git-annex: failed to lock content: ./annex/objects/97e/78c/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav: openFd: permission denied (Permission denied)
+
+/media/ellis/USB04/repo/taiji-lib
+% ls -l ./annex/objects/97e/78c/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav
+-r--r--r-- 1 ellis ellis 38464078 Mar  4 18:32 ./annex/objects/97e/78c/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav
+
+/media/ellis/USB04/repo/taiji-lib
+% strace -e file -f git annex dropunused 101 --debug
+...
+[pid  4646] openat(AT_FDCWD, "./objects/pack", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
+[pid  4646] access("./objects/pack/pack-80b045ea51312a9d40fdefd0c76ef54d494cd5c1.keep", F_OK) = -1 ENOENT (No such file or directory)
+[pid  4646] stat("./objects/pack/pack-80b045ea51312a9d40fdefd0c76ef54d494cd5c1.pack", {st_mode=S_IFREG|0644, st_size=828068, ...}) = 0
+[pid  4646] access("./objects/pack/pack-69caefc604cfbcb2f374ab0b4266f444fec4930f.keep", F_OK <unfinished ...>
+[pid  4636] --- SIGVTALRM {si_signo=SIGVTALRM, si_code=SI_TIMER, si_pid=0, si_uid=1, si_value=0} ---
+[pid  4646] <... access resumed> )      = -1 ENOENT (No such file or directory)
+[pid  4646] stat("./objects/pack/pack-69caefc604cfbcb2f374ab0b4266f444fec4930f.pack", {st_mode=S_IFREG|0644, st_size=55237, ...}) = 0
+[pid  4646] access("./objects/pack/pack-f6711fe647796d2143d12b6f915686d373f4e69b.keep", F_OK) = -1 ENOENT (No such file or directory)
+[pid  4646] stat("./objects/pack/pack-f6711fe647796d2143d12b6f915686d373f4e69b.pack", {st_mode=S_IFREG|0644, st_size=116702, ...}) = 0
+[pid  4646] access("./objects/pack/pack-31185be34b1a30abb4b6e427c1ec924cfee300af.keep", F_OK) = -1 ENOENT (No such file or directory)
+[pid  4646] stat("./objects/pack/pack-31185be34b1a30abb4b6e427c1ec924cfee300af.pack", {st_mode=S_IFREG|0644, st_size=116197, ...}) = 0
+[pid  4646] getcwd("/media/ellis/USB04/repo/taiji-lib", 129) = 34
+[pid  4646] open("./objects/info/alternates", O_RDONLY|O_NOATIME) = -1 ENOENT (No such file or directory)
+[pid  4646] open("./objects/pack/pack-f6711fe647796d2143d12b6f915686d373f4e69b.idx", O_RDONLY|O_NOATIME) = 3
+[pid  4646] open("./objects/pack/pack-31185be34b1a30abb4b6e427c1ec924cfee300af.idx", O_RDONLY|O_NOATIME) = 3
+[pid  4646] open("./objects/pack/pack-80b045ea51312a9d40fdefd0c76ef54d494cd5c1.idx", O_RDONLY|O_NOATIME) = 3
+[pid  4646] open("./objects/pack/pack-69caefc604cfbcb2f374ab0b4266f444fec4930f.idx", O_RDONLY|O_NOATIME) = 3
+[pid  4646] open("./objects/ae/e0b39b5232c369721c08eb782a7143ba2f8901", O_RDONLY|O_NOATIME) = 3
+[pid  4646] open("./objects/1d/ca126189c826e37b03897754fab7e8a8687683", O_RDONLY|O_NOATIME) = 3
+[pid  4636] stat("./annex/unused", {st_mode=S_IFREG|0644, st_size=11160, ...}) = 0
+[pid  4636] open("./annex/unused", O_RDONLY|O_NOCTTY|O_NONBLOCK) = 11
+[pid  4636] --- SIGVTALRM {si_signo=SIGVTALRM, si_code=SI_TIMER, si_pid=0, si_uid=0, si_value=0} ---
+[pid  4636] stat("./annex/badunused", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
+[pid  4636] open("./annex/badunused", O_RDONLY|O_NOCTTY|O_NONBLOCK) = 11
+[pid  4636] stat("./annex/tmpunused", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
+[pid  4636] open("./annex/tmpunused", O_RDONLY|O_NOCTTY|O_NONBLOCK) = 11
+dropunused 101 [pid  4636] stat("./annex/objects/97e/78c/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav", {st_mode=S_IFREG|0444, st_size=38464078, ...}) = 0
+[pid  4636] stat("./annex/objects/97e/78c/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav", {st_mode=S_IFREG|0444, st_size=38464078, ...}) = 0
+[pid  4636] stat("./annex", {st_mode=S_IFDIR|0755, st_size=32768, ...}) = 0
+[pid  4636] open("./annex/keys.lck", O_RDWR|O_CREAT, 0666) = 11
+[pid  4636] stat("./annex/keys/db", 0x7f2247d0ceb0) = -1 ENOENT (No such file or directory)
+[pid  4636] --- SIGVTALRM {si_signo=SIGVTALRM, si_code=SI_TIMER, si_pid=0, si_uid=9, si_value=0} ---
+[pid  4636] stat("./annex/objects/97e/78c/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav", {st_mode=S_IFREG|0444, st_size=38464078, ...}) = 0
+[pid  4636] open("./annex/objects/97e/78c/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav", O_RDWR) = -1 EACCES (Permission denied)
+git-annex: failed to lock content: ./annex/objects/97e/78c/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav/SHA256E-s38464078--0db38599ed526d248857015c7b8e1b177af646939f8e0c8004b17a931ce2e101.wav: openFd: permission denied (Permission denied)
+[pid  4638] +++ exited with 0 +++
+[pid  4639] +++ exited with 0 +++
+[pid  4637] +++ exited with 0 +++
+[pid  4636] +++ exited with 1 +++
+[pid  4623] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4636, si_status=1, si_utime=1, si_stime=4} ---
+[pid  4623] +++ exited with 1 +++
++++ exited with 0 +++
+
+"""]]
+
+Could the problem have something to do with the file having permission 0444 and trying to opening it O_RDWR?
+
+### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
+
+Been using it since your kickstarter campaign!
+
+> [[done]] --[[Joey]]
diff --git a/doc/bugs/git-annex__58___fd__58__14__58___hGetLine__58___end_of_file.mdwn b/doc/bugs/git-annex__58___fd__58__14__58___hGetLine__58___end_of_file.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git-annex__58___fd__58__14__58___hGetLine__58___end_of_file.mdwn
@@ -0,0 +1,51 @@
+[[!tag moreinfo]]
+
+### Please describe the problem.
+
+git-annex webapp won't run 
+
+### What steps will reproduce the problem?
+
+[[!format sh """
+arthur@machine:~/annex$ git-annex --debug webapp
+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","show-ref","git-annex"]
+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","show-ref","--hash","refs/heads/git-annex"]
+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..a2b8f10ef258dff1a91e0354b2e2a58241631c9a","--oneline","-n1"]
+error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty
+fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt
+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..8d4b8e04ccf0092d625f680b42e73d7bf15c6517","--oneline","-n1"]
+error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty
+fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt
+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..6b2665208c11c9ecf969294bf45baac31894d8a7","--oneline","-n1"]
+error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty
+fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt
+[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..9d8429668f2148ea43760fb430e5950fbf42751e","--oneline","-n1"]
+error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty
+fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt
+[2013-07-29 15:02:15 CEST] chat: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","cat-file","--batch"]
+
+git-annex: fd:14: hGetLine: end of file
+failed
+[2013-07-29 15:02:15 CEST] read: ssh ["-O","stop","-S","/home/arthur/annex/.git/annex/ssh/arthur@git-annex-hostname-arthur_annex","-o","ControlMaster=auto","-o","ControlPersist=yes","arthur@git-annex-hostname-arthur_annex"]
+git-annex: webapp: 1 failed
+"""]]
+
+
+### What version of git-annex are you using? On what operating system?
+
+
+$ git-annex version
+git-annex version: 4.20130516.1
+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP
+local repository version: 3
+default repository version: 3
+supported repository versions: 3 4
+upgrade supported from repository versions: 0 1 2
+
+$ git --version
+git version 1.7.9.5
+
+
+### Please provide any additional information below.
+
+
diff --git a/doc/bugs/git-annex_confuses_Git_with_nested_submodules.mdwn b/doc/bugs/git-annex_confuses_Git_with_nested_submodules.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git-annex_confuses_Git_with_nested_submodules.mdwn
@@ -0,0 +1,37 @@
+### Please describe the problem.
+The way git-annex deals with submodules (replacing the .git file in the submodule, with a link to the corresponding gitdir of the submodule) seems to confuse Git when creating another submodule in an annex-init'ed submodule.
+
+### What steps will reproduce the problem?
+    % mkdir some ; cd some; git init
+    Initialized empty Git repository in /tmp/some/.git/
+    % git submodule add /src/somegitrepo sub_lvl1
+    Cloning into 'sub_lvl1'...
+    done.
+    % cd sub_lvl1
+    % git annex init
+    init  (merging origin/git-annex into git-annex...)
+    (recording state in git...)
+    ok
+    (recording state in git...)
+    % git submodule add /src/somegitrepo sub_lvl2
+    Cloning into 'sub_lvl2'...
+    done.
+    fatal: Could not chdir to '../../../sub_lvl2': No such file or directory
+    Unable to checkout submodule 'sub_lvl2'
+
+### What version of git-annex are you using? On what operating system?
+    % apt-cache policy git-annex-standalone
+    git-annex-standalone:
+      Installed: 6.20160213+gitg9597a21-1~ndall+1
+
+Debian stretch, git-annex from NeuroDebian.
+
+### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
+
+Yes, lots! Using it for some of its original use cases for more than five years now -- I was actually surprised to learn, just now, that the oldest commit in my music repository is exactly 5 years and 6 days old. Thanks for longevity and reliability!
+
+More recently I aim exploring the use of git annex for managing datasets and their dependencies, i.e. going from raw to some processed state over multiple levels, where each level is a useful starting point for some analysis, and each previous level is a dependency (input) to the next. With just one level above "raw" this has massively improved collaboration workflows in student/teacher settings for me. Deeper nesting levels would allow for even more interesting applications, but see above ;-) I think Git seems needlessly confused, but I don't fully grasp what is happening yet. I'd appreciate any insight you may have. Although it is Git that shows the undesired behavior, it seems it is git-annex that ultimately confused it. Hence I came here first.
+
+BTW: What a nice idea to ask for something like this in a bug report.
+
+
diff --git a/doc/bugs/git_annex_direct_-__62___rename__58___does_not_exist.mdwn b/doc/bugs/git_annex_direct_-__62___rename__58___does_not_exist.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git_annex_direct_-__62___rename__58___does_not_exist.mdwn
@@ -0,0 +1,28 @@
+### Please describe the problem.
+
+git annex direct displays warnings(?)
+### What steps will reproduce the problem?
+    mkdir test
+    cd test
+    git init
+    git annex init
+    touch foobar.txt
+    git annex add
+    git annex direct
+
+
+### What version of git-annex are you using? On what operating system?
+5.20140717 (ubuntu 14.10)
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
+
+> [[done]]; cannot reproduce with current version of git-annex AFAICS.
+> --[[Joey]]
diff --git a/doc/bugs/git_annex_import__58___ignored_names_fatal.mdwn b/doc/bugs/git_annex_import__58___ignored_names_fatal.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git_annex_import__58___ignored_names_fatal.mdwn
@@ -0,0 +1,41 @@
+### Please describe the problem.
+
+When I import files that include ignored files, it seems to confuse git-annex (see below).
+
+This chunk repeats over and over, it looks like import gets stuck until I delete the ignored files. 
+
+Can't the ignored files just be ignored?
+
+### What steps will reproduce the problem?
+
+`git annex import ../some-tree-with-ignored-files`
+
+### What version of git-annex are you using? On what operating system?
+
+    $ git annex version
+    git-annex version: 5.20140412ubuntu1
+    build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP 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 webdav tahoe glacier hook external
+    local repository version: 5
+    supported repository version: 5
+    upgrade supported from repository versions: 0 1 2 4
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+
+    git-annex: user error (xargs ["-0","git","--git-dir=/media/jean/Elements/annex/.git","--work-tree=/media/jean/Elements/annex","add","--"] exited 123)
+    failed
+    (Recording state in git...)
+    The following paths are ignored by one of your .gitignore files:
+    work/performancemanagement/performancemanagement.zuml1156079052355.tmp
+    Use -f if you really want to add them.
+    fatal: no files added
+
+# End of transcript or log.
+"""]]
+
+> Made git-annex import check for gitignored files before 
+> moving them into the work tree. [[done]] --[[Joey]]
diff --git a/doc/bugs/git_security_fix.mdwn b/doc/bugs/git_security_fix.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git_security_fix.mdwn
@@ -0,0 +1,18 @@
+git had some remotely exploitable security holes announced recently
+(CVE-2016-2324, CVE-2016-2315)
+
+git-annex builds that bundle git need to be updated.
+
+status of autobuilds:
+
+* Linux is fixed (all builds)
+* OSX pending (host is moving)
+* Windows waiting on updated release of git for Windows
+* Android is fixed (git build is untested)
+
+status of released builds:
+
+* Linux is fixed (all builds)
+* OSX is vulnerable
+* Windows is vulnerable
+* Android is fixed (git build is untested)
diff --git a/doc/bugs/hash_changed.mdwn b/doc/bugs/hash_changed.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/hash_changed.mdwn
@@ -0,0 +1,32 @@
+### Please describe the problem.
+
+I ran `git annex fsck` on some files, and the fsck reported that hashes were incorrect and the files were moved.
+
+### What steps will reproduce the problem?
+
+I don't know.
+
+### What version of git-annex are you using? On what operating system?
+
+```
+git-annex version: 6.20160229
+build flags: Assistant Webapp Pairing Testsuite S3(multipartupload)(storageclasses) WebDAV Inotify DBus DesktopNotify XMPP ConcurrentOutput TorrentParser MagicMime Feeds Quvi
+key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384 SHA3_256E SHA3_256 SHA3_512E SHA3_512 SHA3_224E SHA3_224 SHA3_384E SHA3_384 SKEIN256E SKEIN256 SKEIN512E SKEIN512 SHA1E SHA1 MD5E MD5 WORM URL
+remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external
+```
+
+on NixOS linux 64 bit - unstable channel
+
+### Please provide any additional information below.
+
+The problem was on several disks, different manufacturer, different disk size, etc. The fsck always transformed hashA -> hashB, so the hashes were equal before and after the fsck run on all disks, though the link to the "old" file was not fixed to point to the "new" file.
+
+### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
+
+I use annex for years now, never had a problem with it. It is one of the most awesome pieces of software I've seen in the last 10 years, though I only use a really small part of it. Sometimes it bugs me a little that it consumes quite a lot of memory on large repositories, though most of the time this is not an issue for me.
+
+> I think this was not a bug in hashing, just a corrupted file that
+> spread to several repositories. More recent git-annex versions checksum
+> files after transfer so detect the problem. 
+> 
+> Since it was resolved to reporter's satisfaction, [[done]] --[[Joey]]
diff --git a/doc/bugs/hash_changed/comment_1_7ec190a665b50eefadff59949a576bbb._comment b/doc/bugs/hash_changed/comment_1_7ec190a665b50eefadff59949a576bbb._comment
new file mode 100644
--- /dev/null
+++ b/doc/bugs/hash_changed/comment_1_7ec190a665b50eefadff59949a576bbb._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="mail@f1d77c48f528d8c7b885900281887e045ad5114e"
+ nickname="mail"
+ subject="Solution"
+ date="2016-03-09T16:03:35Z"
+ content="""
+The solution proposed by \"joeyh\" on irc was to remove the symlink (`git rm` it) and then move the actual file from .git/annex/bad back to the file and `git annex add` it again.
+
+Worked beautifully.
+"""]]
diff --git a/doc/bugs/regression__58___behavior_when_files_to_add_do_not_exist.mdwn b/doc/bugs/regression__58___behavior_when_files_to_add_do_not_exist.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/regression__58___behavior_when_files_to_add_do_not_exist.mdwn
@@ -0,0 +1,103 @@
+### Please describe the problem.
+
+When adding a list of files, where some exist and some don't, annex claims to add some of the files until it encounters the first missing file. Then it bails out, leaving files hashed but not added.
+
+### What steps will reproduce the problem?
+
+Create a file, ask annex to add the file and a non-existant file
+
+Expected and historic behavior: annex adds the file
+
+Actual behavior: annex hashes but does not add the file
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 5.20150420-gb0ebb23
+standalone linux amd64
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+$ git annex version
+git-annex version: 5.20150420-gb0ebb23
+[ . . . ]
+
+$ git init asdf
+Initialized empty Git repository in /tmp/asdf/.git/
+
+$ cd asdf
+
+$ git annex init
+init  ok
+(recording state in git...)
+
+$ touch asdf
+
+$ git add asdf qwer
+fatal: pathspec 'qwer' did not match any files
+
+$ git annex add asdf qwer
+add asdf ok
+git-annex: qwer not found
+
+$ file * | sed -e 's/`.*//'
+asdf: symbolic link to 
+
+$ git status
+On branch master
+
+Initial commit
+
+Untracked files:
+  (use "git add <file>..." to include in what will be committed)
+
+	asdf
+
+nothing added to commit but untracked files present (use "git add" to track)
+
+
+# End of transcript or log.
+"""]]
+
+Older version of git-annex:
+
+[[!format sh """
+
+$ git annex version
+git-annex version: 5.20140412ubuntu1
+[ . . . ]
+
+$ git init asdf
+Initialized empty Git repository in /tmp/asdf/.git/
+
+$ cd asdf
+
+$ git annex init asdf
+init asdf ok
+(Recording state in git...)
+
+$ touch asdf
+
+$ git annex add asdf qwer
+add asdf ok
+git-annex: qwer not found
+(Recording state in git...)
+
+$ file * | sed -e 's/`.*//'
+asdf: symbolic link to 
+
+$ git status
+On branch master
+
+Initial commit
+
+Changes to be committed:
+  (use "git rm --cached <file>..." to unstage)
+
+	new file:   asdf
+"""]]
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/rsync__58___protocol_version_mismatch.mdwn b/doc/bugs/rsync__58___protocol_version_mismatch.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/rsync__58___protocol_version_mismatch.mdwn
@@ -0,0 +1,38 @@
+### Please describe the problem.
+This is a weird one. I'm getting rsync `protocol version mismatch -- is your shell clean?` on a particular file.
+
+I have tried to reproduce it but not been able.
+
+ * First time it happened, I went to the problem repo and did a `get`, which worked, destroying the evidence. "Luckily", this happened again a few days later.
+ * I thought maybe it was because there was a partial transfer in `.git/annex/tmp` with some specific characteristics. Nope, if I remove the file in `tmp` the problem remains.
+ * I made another clone think it was the problem repo, transferred the file to that repo, no problem. Dropped it, pointed everything back to the original bad repo. Still bad.
+ * Both sides are running `rsync  version 3.1.0  protocol version 31`.
+
+
+### What steps will reproduce the problem?
+
+Working on it. But I want to put the preliminaries here, in case someone else has seen this.
+
+### What version of git-annex are you using? On what operating system?
+
+Both sides are running `git-annex version: 5.20150508-g883d57f`, on Ubuntu 14.04.2 LTS.
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+$ git annex copy --to acozed claes/colt/20150511_174818.jpg 
+copy claes/colt/20150511_174818.jpg (checking acozed...) (to acozed...) 
+protocol version mismatch -- is your shell clean?
+(see the rsync man page for an explanation)
+rsync error: protocol incompatibility (code 2) at compat.c(176) [sender=3.1.1]
+
+  rsync failed -- run git annex again to resume file transfer
+failed
+git-annex: copy: 1 failed
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/rsync_fails_with_sync_error__58___syntax_or_usage_error_.mdwn b/doc/bugs/rsync_fails_with_sync_error__58___syntax_or_usage_error_.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/rsync_fails_with_sync_error__58___syntax_or_usage_error_.mdwn
@@ -0,0 +1,85 @@
+### Please describe the problem.
+
+i tried to sync my home music annex to a server. Half the files worked nicely, but on the rest it fails with rsync errors.
+
+### What steps will reproduce the problem?
+
+git annex -d sync --content
+
+### What version of git-annex are you using? On what operating system?
+
+Client:
+
+ubuntu trusty
+Version: 5.20140517.4
+
+Server:
+
+ubuntu trusty
+Version: 5.20140412ubuntu1
+
+
+### Please provide any additional information below.
+
+[[!format sh """
+dirus-dom:/music$ git annex -d sync --content
+[2014-10-28 19:18:28 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","show-ref","git-annex"]
+[2014-10-28 19:18:28 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","show-ref","--hash","refs/heads/git-annex"]
+[2014-10-28 19:18:29 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","log","refs/heads/git-annex..1599d29eba7a0ec50217c2b4a3f4cc1ecc8b2116","--oneline","-n1"]
+[2014-10-28 19:18:29 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","log","refs/heads/git-annex..27b47301dcb5007705d1dcd5a414df964b840467","--oneline","-n1"]
+[2014-10-28 19:18:29 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","log","refs/heads/git-annex..a95ca0282fefcd774ec8a00b6f33c11f08f789d8","--oneline","-n1"]
+[2014-10-28 19:18:29 CET] chat: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","cat-file","--batch"]
+commit  [2014-10-28 19:18:29 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","commit","-a","-m","git-annex automatic sync"]
+ok
+[2014-10-28 19:18:31 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","symbolic-ref","HEAD"]
+[2014-10-28 19:18:31 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","show-ref","refs/heads/master"]
+[2014-10-28 19:18:31 CET] call: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","show-ref","--verify","-q","refs/heads/synced/master"]
+[2014-10-28 19:18:31 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","log","refs/heads/master..refs/heads/synced/master","--oneline","-n1"]
+pull sync.poelzi.org__music
+[2014-10-28 19:18:31 CET] read: ssh ["-O","stop","-S","poelzigit@sync.poelzi.org","-o","ControlMaster=auto","-o","ControlPersist=yes","localhost"]
+[2014-10-28 19:18:31 CET] call: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","fetch","sync.poelzi.org__music"]
+[2014-10-28 19:18:33 CET] call: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","show-ref","--verify","-q","refs/remotes/sync.poelzi.org__music/master"]
+[2014-10-28 19:18:33 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","log","refs/heads/master..refs/remotes/sync.poelzi.org__music/master","--oneline","-n1"]
+[2014-10-28 19:18:33 CET] call: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","show-ref","--verify","-q","refs/remotes/sync.poelzi.org__music/synced/master"]
+[2014-10-28 19:18:33 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","log","refs/heads/synced/master..refs/remotes/sync.poelzi.org__music/synced/master","--oneline","-n1"]
+ok
+[2014-10-28 19:18:33 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","show-ref","git-annex"]
+[2014-10-28 19:18:33 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","show-ref","--hash","refs/heads/git-annex"]
+[2014-10-28 19:18:33 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","log","refs/heads/git-annex..1599d29eba7a0ec50217c2b4a3f4cc1ecc8b2116","--oneline","-n1"]
+[2014-10-28 19:18:33 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","log","refs/heads/git-annex..27b47301dcb5007705d1dcd5a414df964b840467","--oneline","-n1"]
+[2014-10-28 19:18:33 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","log","refs/heads/git-annex..a95ca0282fefcd774ec8a00b6f33c11f08f789d8","--oneline","-n1"]
+[2014-10-28 19:18:33 CET] read: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","ls-files","--cached","-z","--"]
+[2014-10-28 19:18:33 CET] chat: git ["--git-dir=/exports/music/.git","--work-tree=/exports/music","check-attr","-z","--stdin","annex.backend","annex.numcopies","--"]
+copy Alan Parsons Project/Eye In The Sky/.07 - Psychobabble.mood copy Alan Parsons Project/Eye In The Sky/.07 - Psychobabble.mood (checking sync.poelzi.org__music...) [2014-10-28 19:18:43 CET] call: ssh ["-S",".git/annex/ssh/poelzigit@sync.poelzi.org","-o","ControlMaster=auto","-o","ControlPersist=yes","-T","poelzigit@sync.poelzi.org","git-annex-shell 'inannex' '/music/' 'SHA256E-s3000--da8a3336a484a171a438c99660260cc35cbd37c339dd2c18447cd025064bc00b.mood' --uuid 35a89672-4ff5-4d9a-9bf2-cedb272bb7cb"]
+(to sync.poelzi.org__music...)
+[2014-10-28 19:18:43 CET] read: rsync ["--progress","--inplace","--perms","-e","'ssh' '-S' '.git/annex/ssh/poelzigit@sync.poelzi.org' '-o' 'ControlMaster=auto' '-o' 'ControlPersist=yes' '-T' 'poelzigit@sync.poelzi.org' 'git-annex-shell ''recvkey'' ''/music/'' ''SHA256E-s3000--da8a3336a484a171a438c99660260cc35cbd37c339dd2c18447cd025064bc00b.mood'' --uuid 35a89672-4ff5-4d9a-9bf2-cedb272bb7cb ''--'' ''remoteuuid=97a3cd71-ee6c-4437-8740-253cde0d32ae'' ''direct='' ''associatedfile=Alan Parsons Project/Eye In The Sky/.07 - Psychobabble.mood'' ''--'''","--","/exports/music/.git/annex/objects/20/Z4/SHA256E-s3000--da8a3336a484a171a438c99660260cc35cbd37c339dd2c18447cd025064bc00b.mood/SHA256E-s3000--da8a3336a484a171a438c99660260cc35cbd37c339dd2c18447cd025064bc00b.mood","dummy:"]
+rsync error: syntax or usage error (code 1) at main.c(1183) [sender=3.1.1]
+
+  rsync failed -- run git annex again to resume file transfer
+failed
+copy Alessandro Scarlatti/Motets - Gérard Lesne, Veronique Gens (1993) [300]/06 - Infirmata, Vulnerata - VI Semper Gratus.ogg copy Alessandro Scarlatti/Motets - Gérard Lesne, Veronique Gens (1993) [300]/06 - Infirmata, Vulnerata - VI Semper Gratus.ogg (checking sync.poelzi.org__music...) [2014-10-28 19:18:48 CET] call: ssh ["-S",".git/annex/ssh/poelzigit@sync.poelzi.org","-o","ControlMaster=auto","-o","ControlPersist=yes","-T","poelzigit@sync.poelzi.org","git-annex-shell 'inannex' '/music/' 'SHA256E-s3847396--05c5498f08c727645ba84270cb8d82da69a3c9bede35520aa3128b938d003a3d.ogg' --uuid 35a89672-4ff5-4d9a-9bf2-cedb272bb7cb"]
+(to sync.poelzi.org__music...)
+[2014-10-28 19:18:48 CET] read: rsync ["--progress","--inplace","--perms","-e","'ssh' '-S' '.git/annex/ssh/poelzigit@sync.poelzi.org' '-o' 'ControlMaster=auto' '-o' 'ControlPersist=yes' '-T' 'poelzigit@sync.poelzi.org' 'git-annex-shell ''recvkey'' ''/music/'' ''SHA256E-s3847396--05c5498f08c727645ba84270cb8d82da69a3c9bede35520aa3128b938d003a3d.ogg'' --uuid 35a89672-4ff5-4d9a-9bf2-cedb272bb7cb ''--'' ''remoteuuid=97a3cd71-ee6c-4437-8740-253cde0d32ae'' ''direct='' ''associatedfile=Alessandro Scarlatti/Motets - G\233rard Lesne, Veronique Gens (1993) [300]/06 - Infirmata, Vulnerata - VI Semper Gratus.ogg'' ''--'''","--","/exports/music/.git/annex/objects/XJ/f9/SHA256E-s3847396--05c5498f08c727645ba84270cb8d82da69a3c9bede35520aa3128b938d003a3d.ogg/SHA256E-s3847396--05c5498f08c727645ba84270cb8d82da69a3c9bede35520aa3128b938d003a3d.ogg","dummy:"]
+rsync error: syntax or usage error (code 1) at main.c(1183) [sender=3.1.1]
+
+  rsync failed -- run git annex again to resume file transfer
+failed
+^C
+
+
+Calling this through python gives:
+
+In [5]: subprocess.call(["rsync", "--debug=all", "--progress","--inplace","--perms","-e","'ssh' '-S' '.git/annex/ssh/poelzigit@sync.poelzi.org' '-o' 'ControlMaster=auto' '-o' 'ControlPersist=yes' '-T' 'poelzigit@sync.poelzi.org' 'git-annex-shell ''recvkey'' ''/music/'' ''SHA256E-s3000--da8a3336a484a171a438c99660260cc35cbd37c339dd2c18447cd025064bc00b.mood'' --uuid 35a89672-4ff5-4d9a-9bf2-cedb272bb7cb ''--'' ''remoteuuid=97a3cd71-ee6c-4437-8740-253cde0d32ae'' ''direct='' ''associatedfile=Alan Parsons Project/Eye In The Sky/.07 - Psychobabble.mood'' ''--'''","--","/exports/music/.git/annex/objects/20/Z4/SHA256E-s3000--da8a3336a484a171a438c99660260cc35cbd37c339dd2c18447cd025064bc00b.mood/SHA256E-s3000--da8a3336a484a171a438c99660260cc35cbd37c339dd2c18447cd025064bc00b.mood","dummy:"])
+opening connection using: ssh -S .git/annex/ssh/poelzigit@sync.poelzi.org -o ControlMaster=auto -o ControlPersist=yes -T poelzigit@sync.poelzi.org "git-annex-shell 'recvkey' '/music/' 'SHA256E-s3000--da8a3336a484a171a438c99660260cc35cbd37c339dd2c18447cd025064bc00b.mood' --uuid 35a89672-4ff5-4d9a-9bf2-cedb272bb7cb '--' 'remoteuuid=97a3cd71-ee6c-4437-8740-253cde0d32ae' 'direct=' 'associatedfile=Alan Parsons Project/Eye In The Sky/.07 - Psychobabble.mood' '--'" dummy rsync --server -pe.Lsfx --log-format=X --debug=ALL --inplace . .  (19 args)
+(Client) Protocol versions: remote=31, negotiated=31
+[sender] change_dir(/exports/music/.git/annex/objects/20/Z4/SHA256E-s3000--da8a3336a484a171a438c99660260cc35cbd37c339dd2c18447cd025064bc00b.mood)
+send_files starting
+send_files phase=1
+send_files phase=2
+send files finished
+total: matches=0  hash_hits=0  false_alarms=0 data=0
+rsync error: syntax or usage error (code 1) at main.c(1183) [sender=3.1.1]
+[sender] _exit_cleanup(code=1, file=main.c, line=1183): about to call exit(1)
+
+
+"""]]
diff --git a/doc/bugs/rsync_transport__58___username_not_respected.mdwn b/doc/bugs/rsync_transport__58___username_not_respected.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/rsync_transport__58___username_not_respected.mdwn
@@ -0,0 +1,43 @@
+### Please describe the problem.
+
+I created an encrypted rsync remote with a username (user@host). The rsync command issued by git-annex doesn't contain the username. I solved the problem using .ssh/config.
+
+### What steps will reproduce the problem?
+
+
+[[!format sh """
+# Add remote like that
+git-annex initremote encrsync type=rsync rsyncurl=user@xxx.rsync.net:rsync/X keyid=0xXXX
+# Sync it
+git-annex sync --content
+
+
+# You'll see
+$> ps ax | grep rsync
+30652 pts/3    S+     0:00 /home/ganwell/bin/git-annex.linux//lib64/ld-linux-x86-64.so.2 --library-path /home/ganwell/bin/git-annex.linux//etc/ld.so.conf.d:/home/ganwell/bin/git-annex.linux//usr/lib/x86_64-linux-gnu/gconv:/home/ganwell/bin/git-annex.linux//usr/lib/x86_64-linux-gnu/libc:/home/ganwell/bin/git-annex.linux//usr/lib:/home/ganwell/bin/git-annex.linux//usr/lib/x86_64-linux-gnu:/home/ganwell/bin/git-annex.linux//lib64:/home/ganwell/bin/git-annex.linux//lib/x86_64-linux-gnu: /home/ganwell/bin/git-annex.linux/shimmed/rsync/rsync xxx.rsync.net:rsync/X/9fa/634/'GPGHMACSHA1--X/GPGHMACSHA1--X
+"""]]
+
+
+
+### What version of git-annex are you using? On what operating system?
+
+OS: Linux
+
+Ver: git-annex version: 5.20140210-g1e0a3ad
+
+Type: prebuilt
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
+
+> Argh! How did that break? I know it used to work.
+> I have fixed it, unfortunately the fix was too late for today's release,
+> but it will be available in autobuilds shortly.
+> [[fixed|done]] --[[Joey]] 
diff --git a/doc/bugs/some_tests_fail_while_running_under_NFS.mdwn b/doc/bugs/some_tests_fail_while_running_under_NFS.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/some_tests_fail_while_running_under_NFS.mdwn
@@ -0,0 +1,54 @@
+### Please describe the problem.
+
+4 out of 269 tests failed (4468.00s)
+
+hard to assess how critical they are... 
+
+### What steps will reproduce the problem?
+
+run git annex test
+
+### What version of git-annex are you using? On what operating system?
+
+6.20160307+gitgb095561-1~ndall+1
+
+### Please provide any additional information below.
+
+[Full log](http://www.onerussian.com/tmp/git-annex-tests-6.20160307+gitgb095561-1~ndall+1.log)
+
+[[!format sh """
+smaug:/mnt/nfs/scrap/datalad/test_annex
+$> grep -B5 FAIL git-annex-tests-6.20160307+gitgb095561-1~ndall+1.log
+    crypto:                                               OK (50.57s)
+    preferred content:                                    OK (20.36s)
+    add subdirs:                                          OK (8.97s)
+    addurl:                                               .t/tmprepo73/.git/annex/keys: removeDirectoryRecursive: unsatisfied constraints (Directory not empty)
+sleeping 10 seconds and will retry directory cleanup
+FAIL
+--
+   293ed4c..c16b350  git-annex -> synced/git-annex
+   dd272eb..ffe1721  master -> synced/master
+OK (11.64s)
+    addurl:                                               .t/tmprepo73/.git/annex/keys/.nfs0000000009a305870000020e: removeDirectoryRecursive: resource busy (Device or resource busy)
+sleeping 10 seconds and will retry directory cleanup
+FAIL
+--
+   0993b09..c09ddc4  git-annex -> synced/git-annex
+   a823824..520f58c  master -> synced/master
+OK (13.67s)
+    addurl:                                               .t/tmprepo73/.git/annex/keys/.nfs0000000009a305870000020e: removeDirectoryRecursive: resource busy (Device or resource busy)
+sleeping 10 seconds and will retry directory cleanup
+FAIL
+--
+OK (14.59s)
+    addurl:                                               On branch master
+nothing to commit, working directory clean
+.t/tmprepo73/.git/annex/keys/.nfs0000000009a305870000020e: removeDirectoryRecursive: resource busy (Device or resource busy)
+sleeping 10 seconds and will retry directory cleanup
+FAIL
+
+
+# End of transcript or log.
+"""]]
+
+[[!meta author=yoh]]
diff --git a/doc/bugs/ssh__58___unprotected_private_key_file.mdwn b/doc/bugs/ssh__58___unprotected_private_key_file.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/ssh__58___unprotected_private_key_file.mdwn
@@ -0,0 +1,62 @@
+### Please describe the problem.
+
+When pairing two machines with git-annex assistant, the assistant kept asking for the ssh password.  Checking the git-annex daemon logs, I saw that ssh was refusing to use the key the assistant had created because it was group readable (see below for the log extract).
+
+### What steps will reproduce the problem?
+
+The assistant was installed from the ubuntu precise ppa backport on an up-to-date copy of ubuntu precise.
+It was started using "git-annex webapp --listen=XYZ".
+This was done on two machines on the same network.
+Created a repository using the web-app, the same on both machines.
+Did a pair request.  This initially worked fine, until it got to the point of using ssh, when it started asking for the password many many  times.
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 5.20140306
+build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP 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 webdav tahoe glacier hook external
+local repository version: 5
+supported repository version: 5
+upgrade supported from repository versions: 0 1 2 4
+
+Ubuntu 12.04.4 LTS
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+(started...) Generating public/private rsa key pair.
+Your identification has been saved in /tmp/git-annex-keygen.0/key.
+Your public key has been saved in /tmp/git-annex-keygen.0/key.pub.
+The key fingerprint is:
+2b:f4:28:35:72:2c:9e:5b:d3:1d:d1:a1:b7:c7:a5:34 ABC@XYZ
+The key's randomart image is:
++--[ RSA 2048]----+
+|            .    |
+|           o .   |
+|          o o E .|
+|     .     o + + |
+|    o * S . . +  |
+|   . B = o . .   |
+|    + = + .      |
+|     + o         |
+|    .            |
++-----------------+
+[2014-03-14 13:35:45 GMT] main: Pairing in progress
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+Permissions 0620 for 'ABC/.ssh/git-annex/key.git-annex-XYZ_annex' are too open.
+It is required that your private key files are NOT accessible by others.
+This private key will be ignored.
+bad permissions: ignore key: ABC/.ssh/git-annex/key.git-annex-XYZ_annex
+(merging XYZ_annex/git-annex into git-annex...)
+
+# End of transcript or log.
+"""]]
+
+> [[Fixed|done]]; the code made sure the file did not have any group or
+> world read bits, but did not clear write bits. --[[Joey]]
diff --git a/doc/bugs/stack_build_Setup.hs_dependencies.mdwn b/doc/bugs/stack_build_Setup.hs_dependencies.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/stack_build_Setup.hs_dependencies.mdwn
@@ -0,0 +1,71 @@
+### Please describe the problem.
+
+`stack build` on a fresh clone of git-annex at e029eb8b fails with
+
+    git-annex-6.20160229: configure
+
+    Utility/FileSystemEncoding.hs:30:18:
+        Could not find module ‘Data.Hash.MD5’
+        Use -v to see a list of the files searched for.
+
+    Utility/FileSystemEncoding.hs:32:8:
+        Could not find module ‘Data.Bits.Utils’
+        Perhaps you meant
+          Data.BitUtil
+          Data.Bits.Lens (from lens-4.13@lens_IUJoiaRWYAQ6ieqgqTJZ5D)
+        Use -v to see a list of the files searched for.
+
+    Utility/FileSystemEncoding.hs:34:8:
+        Could not find module ‘Data.List.Utils’
+        Perhaps you meant
+          Data.BitUtil
+          Data.List.Lens (from lens-4.13@lens_IUJoiaRWYAQ6ieqgqTJZ5D)
+          Data.List.Split (from split-0.2.3@split_CDzOynTh4l8Ahg1HaWUL4Z)
+        Use -v to see a list of the files searched for.
+
+    Utility/Process.hs:53:8:
+        Could not find module ‘System.Log.Logger’
+        Perhaps you meant
+          System.Log.FastLogger (from fast-logger-2.4.1@fastl_1adi3bwIxvVE3Gyx2Jy1k0)
+        Use -v to see a list of the files searched for.
+
+    Utility/SafeCommand.hs:14:8:
+        Could not find module ‘Data.String.Utils’
+        Perhaps you meant
+          Data.String.UTF8 (from utf8-string-1.0.1.1@utf8s_L8eKHa7Iv9q7FVKUYW6u4b)
+        Use -v to see a list of the files searched for.
+
+### What steps will reproduce the problem?
+
+`stack build`
+
+### What version of git-annex are you using? On what operating system?
+
+e029eb8b, OS X 10.10.5.
+
+### Please provide any additional information below.
+
+These are apparently dependencies of `Setup.hs`. Adding
+
+    explicit-setup-deps:
+      "*": true
+
+to `stack.yaml` [(as described here)](https://github.com/commercialhaskell/stack/blob/a59997d5db963bba403119843340688ee25e2c6f/doc/yaml_configuration.md#explicit-setup-deps)
+fixes the error and builds git-annex successfully.
+
+### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
+
+> I tried enabling this, and it broke build on my i386ancient autobuilder,
+> which uses stack 1.0.4.2. Strange build failure
+> both building git-annex and also its dependencies (eg, process):
+
+	/usr/bin/ld: cannot find -ltinfo
+
+> Which seems to be libtinfo, part of the ncurses library. Which is weird,
+> AFAIK git-annex does not use ncurses at all.
+> 
+> I tried weakening the setting from `*` to  `git-annex: true`, which
+> lets the build deps get built, but building git-annex still fails with
+> above error.
+> 
+> --[[Joey]]
diff --git a/doc/bugs/webapp__58___difficult_to_abort_adding_a_repository.mdwn b/doc/bugs/webapp__58___difficult_to_abort_adding_a_repository.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/webapp__58___difficult_to_abort_adding_a_repository.mdwn
@@ -0,0 +1,24 @@
+### Please describe the problem.
+I could not find a way to abort the addition of a new remote repository.
+
+### What steps will reproduce the problem?
+- start adding a remote repository (unencrypted, with git-annex installed);
+- forget to create the folder on the remote host;
+- navigate away from the repository page;
+- the dashboard says the repository is partially set-up, and the only thing one can do is look at the log (which says the folder is missing).
+
+I was able to solve it by creating another repository with the exact same data.
+
+### What version of git-annex are you using? On what operating system?
+
+Version: 4.20131002-gf25991c on OS X 10.8.5
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/webdav_fails___40__server__58___radicale_0.9-1__41__.mdwn b/doc/bugs/webdav_fails___40__server__58___radicale_0.9-1__41__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/webdav_fails___40__server__58___radicale_0.9-1__41__.mdwn
@@ -0,0 +1,45 @@
+The current command fails (git-annex 5.20141125, debian sid, DAV server: radicale 0.9-1):
+
+    $ WEBDAV_USERNAME=user WEBDAV_PASSWORD=password git annex --debug initremote dav.example.com type=webdav url=https://dav.example.com encryption=none
+    [2014-11-28 16:53:29 CET] read: git ["--git-dir=/home/user/test-annex/.git","--work-tree=/home/user/test-annex","show-ref","git-annex"]
+    [2014-11-28 16:53:29 CET] read: git ["--git-dir=/home/user/test-annex/.git","--work-tree=/home/user/test-annex","show-ref","--hash","refs/heads/git-annex"]
+    [2014-11-28 16:53:29 CET] read: git ["--git-dir=/home/user/test-annex/.git","--work-tree=/home/user/test-annex","log","refs/heads/git-annex..f60365a0d5333e1aefe80a3fe747e2cb3d5c8162","-n1","--pretty=%H"]
+    [2014-11-28 16:53:29 CET] chat: git ["--git-dir=/home/user/test-annex/.git","--work-tree=/home/user/test-annex","cat-file","--batch"]
+    initremote dav.example.com (testing WebDAV server...)
+
+    git-annex: WebDAV test failed: StatusCodeException (Status {statusCode = 500, statusMessage = "Internal Server Error"}) [("Server","nginx/1.2.1"),("Date","Fri, 28 Nov 2014 15:53:37 GMT"),("Content-Type","text/plain"),("Content-Length","59"),("Connection","keep-alive"),("Keep-Alive","timeout=75"),("X-Response-Body-Start","A server error occurred. Please contact the administrator."),("X-Request-URL","MKCOL https://dav.example.com:443/tmp")] (CJ {expose = []}): user error
+    failed
+    git-annex: initremote: 1 failed
+
+server log:
+
+    ::ffff:192.168.1.6 - user [28/Nov/2014:16:53:17 +0100] "MKCOL / HTTP/1.1" 500 59 "-" "hDav-using application"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:16:53:18 +0100] "PROPFIND /tmp HTTP/1.1" 500 59 "-" "hDav-using application"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:16:53:21 +0100] "MKCOL /tmp HTTP/1.1" 500 59 "-" "hDav-using application"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:16:53:32 +0100] "MKCOL / HTTP/1.1" 500 59 "-" "hDav-using application"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:16:53:34 +0100] "PROPFIND /tmp HTTP/1.1" 500 59 "-" "hDav-using application"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:16:53:37 +0100] "MKCOL /tmp HTTP/1.1" 500 59 "-" "hDav-using application"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:16:58:31 +0100] "PROPFIND / HTTP/1.1" 207 1035 "-" "cadaver/0.23.3 neon/0.30.1"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:16:59:19 +0100] "MKCOL / HTTP/1.1" 500 59 "-" "hDav-using application"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:16:59:21 +0100] "PROPFIND /tmp HTTP/1.1" 500 59 "-" "hDav-using application"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:16:59:23 +0100] "MKCOL /tmp HTTP/1.1" 500 59 "-" "hDav-using application"
+
+
+cadaver works:
+
+    $ cadaver https://dav.example.com
+    Authentication required for Radicale - Password Required on server `dav.example.com':
+    Username: user
+    Password: 
+    dav:/> ls
+    Listing collection `/': succeeded.
+    Coll:   user                                  0  Jan  1  1970
+
+server log:
+
+    ::ffff:192.168.1.6 - - [28/Nov/2014:17:01:31 +0100] "OPTIONS / HTTP/1.1" 200 0 "-" "cadaver/0.23.3 neon/0.30.1"
+    ::ffff:192.168.1.6 - - [28/Nov/2014:17:01:31 +0100] "PROPFIND / HTTP/1.1" 401 0 "-" "cadaver/0.23.3 neon/0.30.1"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:17:01:42 +0100] "PROPFIND / HTTP/1.1" 207 579 "-" "cadaver/0.23.3 neon/0.30.1"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:17:01:42 +0100] "PROPFIND / HTTP/1.1" 207 579 "-" "cadaver/0.23.3 neon/0.30.1"
+    ::ffff:192.168.1.6 - user [28/Nov/2014:17:02:01 +0100] "PROPFIND / HTTP/1.1" 207 1035 "-" "cadaver/0.23.3 neon/0.30.1"
+
diff --git a/doc/design/adjusted_branches.mdwn b/doc/design/adjusted_branches.mdwn
--- a/doc/design/adjusted_branches.mdwn
+++ b/doc/design/adjusted_branches.mdwn
@@ -209,6 +209,12 @@
 So, a reverse filter may need some state that was collected when running
 the filter forwards, in order to decide what to do.
 
+Alternatively, instead of reverse filtering the whole adjusted tree,
+look at just the new commit that's being propigated back from the
+adjusted to master branch. Get the diff from it to the previous
+commit; the changes that were made. Then de-adjust those changes,
+and apply the changes to the master branch.
+
 ## push
 
 The new master branch can then be pushed out to remotes. The
diff --git a/doc/design/assistant/blog/day_150__12__58__12.mdwn b/doc/design/assistant/blog/day_150__12__58__12.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/design/assistant/blog/day_150__12__58__12.mdwn
@@ -0,0 +1,53 @@
+Yesterday I cut another release. However, getting an OSX build took until
+12:12 pm today because of a confusion about the location of lsof on OSX. The
+OSX build is now available, and I'm looking forward to hearing if it's working!
+
+----
+
+Today I've been working on making `git annex sync` commit in direct mode.
+
+For this I needed to find all new, modified, and deleted files, and I also
+need the git SHA from the index for all non-new files. There's not really
+an ideal git command to use to query this. For now I'm using
+`git ls-files --others --stage`, which works but lists more files than I
+really need to look at. It might be worth using one of the Haskell libraries
+that can directly read git's index.. but for now I'll stick with `ls-files`.
+
+It has to check all direct mode files whose content is present, which means
+one stat per file (on top of the stat that git already does), as well as one
+retrieval of the key per file (using the single `git cat-file` process that
+git-annex talks to).
+
+This is about as efficient as I can make it, except that unmodified
+annexed files whose content is not present are listed due to --stage,
+and so it has to stat those too, and currently also feeds them into `git add`.
+
+The assistant will be able to avoid all this work, except once at startup.
+
+Anyway, direct mode committing is working!
+
+For now, `git annex sync` in direct mode also adds new files. This because
+`git annex add` doesn't work yet in direct mode.
+
+It's possible for a direct mode file to be changed during a commit,
+which would be a problem since committing involves things like calculating
+the key and caching the mtime/etc, that would be screwed up. I took
+care to handle that case; it checks the mtime/etc cache before and after
+generating a key for the file, and if it detects the file has changed,
+avoids committing anything. It could retry, but if the file is a VM disk
+image or something else that's constantly modified, commit retrying forever
+would not be good.
+
+----
+
+For `git annex sync` to be usable in direct mode, it still needs
+to handle merging. It looks like I may be able to just enhance the automatic
+conflict resolution code to know about typechanged direct mode files.
+
+The other missing piece before this can really be used is that currently
+the key to file mapping is only maintained for files added locally, or
+that come in via `git annex sync`. Something needs to set up that mapping
+for files present when the repo is initally cloned. Maybe the thing
+to do is to have a `git annex directmode` command that enables/disables
+direct mode and can setup the the mapping, as well as any necessary unlocks
+and setting the trust level to untrusted.
diff --git a/doc/devblog/day_368__leap.mdwn b/doc/devblog/day_368__leap.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_368__leap.mdwn
@@ -0,0 +1,9 @@
+Pushed out a release today, could not resist the leap day in the version
+number, and also there were enough bug fixes accumulated to make it worth
+doing.
+
+I now have `git-annex sync` working inside adjusted branches, so pulls
+get adjusted appropriately before being merged into the adjusted branch.
+Seems to mostly work well, I did just find one bug in it though. Only
+propigating adjusted commits remains to be done to finish my adjusted
+branches prototype.
diff --git a/doc/devblog/day_369-370__paddling_furiously.mdwn b/doc/devblog/day_369-370__paddling_furiously.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_369-370__paddling_furiously.mdwn
@@ -0,0 +1,72 @@
+Tuesday was spent dealing with lock files. Turned out there were some bugs
+in the `annex.pidlock` configuration that prevented it from working, and
+could even lead to data loss.
+
+And then more lock files today, since I needed to lock git's index file the
+same way git does. This involved finding out how to emulate `O_EXCL` under
+Windows. Urgh.
+
+Finally got back to working on [[design/adjusted_branches]] today. And, I've just
+gotten syncing of commits from adjusted branches back to the orginal branch
+working! Time for short demo of what I've been building for the past couple
+weeks:
+
+	joey@darkstar:~/tmp/demo>ls -l
+	total 4
+	lrwxrwxrwx 1 joey joey 190 Mar  3 17:09 bigfile -> .git/annex/objects/zx/X8/SHA256E-s1048576--44ee9fdd91d4bc567355f8b2becd5fe137b9e3aafdfe804341ce2bcc73b8013f/SHA256E-s1048576--44ee9fdd91d4bc567355f8b2becd5fe137b9e3aafdfe804341ce2bcc73b8013f
+	joey@darkstar:~/tmp/demo>git annex adjust
+	Switched to branch 'adjusted/master(unlocked)'
+	ok
+	joey@darkstar:~/tmp/demo#master(unlocked)>ls -l
+	total 4
+	-rw-r--r-- 1 joey joey 1048576 Mar  3 17:09 bigfile
+
+Entering the adjusted branch unlocked all the files.
+
+	joey@darkstar:~/tmp/demo#master(unlocked)>git mv bigfile newname
+	joey@darkstar:~/tmp/demo#master(unlocked)>git commit -m rename
+	[adjusted/master(unlocked) 29e1bc8] rename
+	 1 file changed, 0 insertions(+), 0 deletions(-)
+	  rename bigfile => newname (100%)
+	joey@darkstar:~/tmp/demo#master(unlocked)>git log --pretty=oneline
+	29e1bc835080298bbeeaa4a9faf42858c050cad5 rename
+	a195537dc5beeee73fc026246bd102bae9770389 git-annex adjusted branch
+	5dc1d94d40af4bf4a88b52805e2a3ae855122958 add
+	joey@darkstar:~/tmp/demo#master(unlocked)>git log --pretty=oneline master
+	5dc1d94d40af4bf4a88b52805e2a3ae855122958 add
+
+The commit was made on top of the commit that generated the adjusted branch.
+It's not yet reached the master branch.
+
+	joey@darkstar:~/tmp/demo#master(unlocked)>git annex sync
+	commit  ok
+	joey@darkstar:~/tmp/demo#master(unlocked)>git log --pretty=oneline
+	b60c5d6dfe55107431b80382596f14f4dcd259c9 git-annex adjusted branch
+	9c36848f078a2bb7a304010e962a2b7318c0877c rename
+	5dc1d94d40af4bf4a88b52805e2a3ae855122958 add
+	joey@darkstar:~/tmp/demo#master(unlocked)>git log --pretty=oneline master
+	9c36848f078a2bb7a304010e962a2b7318c0877c rename
+	5dc1d94d40af4bf4a88b52805e2a3ae855122958 add
+
+Now the commit has reached master. Notice how the history of the adjusted
+branch was rebased on top of the updated master branch as well.
+
+	joey@darkstar:~/tmp/demo#master(unlocked)>ls -l
+	total 1024
+	-rw-r--r-- 1 joey joey 1048576 Mar  3 17:09 newname
+	joey@darkstar:~/tmp/demo#master(unlocked)>git checkout master
+	Switched to branch 'master'
+	joey@darkstar:~/tmp/demo>ls -l
+	total 4
+	lrwxrwxrwx 1 joey joey 190 Mar  3 17:12 newname -> .git/annex/objects/zx/X8/SHA256E-s1048576--44ee9fdd91d4bc567355f8b2becd5fe137b9e3aafdfe804341ce2bcc73b8013f/SHA256E-s1048576--44ee9fdd91d4bc567355f8b2becd5fe137b9e3aafdfe804341ce2bcc73b8013f
+
+Just as we'd want, the file is locked in master, and unlocked in 
+the adjusted branch.
+
+(Not shown: git annex sync will also merge in and adjust changes from remotes.)
+
+So, that all looks great! But, it's cheating a bit, because it locks
+all files when updating the master branch. I need to make it remember,
+somehow, when files were originally unlocked, and keep them unlocked. Also
+want to implement other adjustments, like hiding files whose content is not
+present.
diff --git a/doc/devblog/day_371__catching_up.mdwn b/doc/devblog/day_371__catching_up.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_371__catching_up.mdwn
@@ -0,0 +1,21 @@
+Over the weekend, I converted the linux "ancient" autobuilder to use stack.
+This makes it easier to get all the recent versions of all the haskell
+dependencies installed there.
+
+Also, merged my no-ffi branch, removing some library code from git-annex
+and adding new dependencies. It's good to remove code.
+
+Today, fixed the OSX dmg file -- its bundled gpg was broken. I pushed out a
+new version of the OSX dmg file with the fix.
+
+With the recent incident in mind of malware inserted into the Transmission
+dmg, I've added a virus scan step to the release process
+for all the git-annex images. This way, we'll notice if an autobuilder
+gets a virus.
+
+Also caught up on some backlog, although the remaining backlog is a little
+larger than I'd like at 135 messages.
+
+Hope to work some more on adjusted branches this week. A few mornings ago,
+I had what may be a key insight about how to reverse adjustments when
+propigating changes back from the adjusted branch.
diff --git a/doc/devblog/day_372__adjusted_branches_improved.mdwn b/doc/devblog/day_372__adjusted_branches_improved.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_372__adjusted_branches_improved.mdwn
@@ -0,0 +1,18 @@
+After a real brain-bender of a day, I have commit propagation from the
+adjusted branch back to the original branch working, without needing to
+reverse adjust the whole tree. This is faster, but the really nice thing
+is that it makes individual adjustments simpler to write.
+
+In fact, it's so simple that I took 10 minutes just now to implement a second
+adjustment!
+
+[[!format haskell """
+adjustTreeItem HideMissingAdjustment h ti@(TreeItem _ _ s) = do
+         mk <- catKey s
+         case mk of
+                 Just k -> ifM (inAnnex k)
+                         ( return (Just ti)
+      	                 , return Nothing
+                         )
+                 Nothing -> return (Just ti)
+"""]]
diff --git a/doc/devblog/day_373__away.mdwn b/doc/devblog/day_373__away.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/devblog/day_373__away.mdwn
@@ -0,0 +1,6 @@
+Caught up with a few last things today, before I leave for 
+[a week in Boston](http://joeyh.name/trips/2016/boston/).
+
+Converted several places that ran git hash-object repeatedly to feed data
+to a running process. This sped up git-annex add in direct mode and with
+v6 unlocked files, by up to 2x.
diff --git a/doc/forum/Advice_needed__58___git-annex_slows_down_my_macbook.mdwn b/doc/forum/Advice_needed__58___git-annex_slows_down_my_macbook.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Advice_needed__58___git-annex_slows_down_my_macbook.mdwn
@@ -0,0 +1,21 @@
+I need some advice from more experienced users. 
+
+I've created four repositories on my macbook and paired them with repos on my ubuntu desktop. They are all created with the webapp so they might have some configurations that are not optimal for me.
+
+In fact, when I start my macbook it is unusual for more than an hour because git-annex is reading and writing to and from the disk in the background. 
+
+I don't change much in three of the four repos, only one repo contains my daily work. 
+
+What configuration would enhance my situation?
+
+The four repos are called:
+
+- movies
+- pictures
+- music
+- documents (many changes each day)
+
+I have also problems to switch to the documents repo in the webapp.
+
+TIA
+juh
diff --git a/doc/forum/Android__58___Encrypted_Remotes__63__.mdwn b/doc/forum/Android__58___Encrypted_Remotes__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Android__58___Encrypted_Remotes__63__.mdwn
@@ -0,0 +1,3 @@
+Hi,
+
+Does the Android app support encryption at all? The assistant allows me to create encrypted repositories but it just keeps telling me to install git-remote-gcrypt, which did not work.
diff --git a/doc/forum/Android__58___is_constant_high_cpu_usage_to_be_expected__63__.mdwn b/doc/forum/Android__58___is_constant_high_cpu_usage_to_be_expected__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Android__58___is_constant_high_cpu_usage_to_be_expected__63__.mdwn
@@ -0,0 +1,3 @@
+While running the Git Annex App on Android, the app causes a constant cpu usage of about 50% when idling. I've seen this behavior on two devices (phone and tablet) with a CM 10.1 nightly build. The app causes this high cpu usage even when it is in the background, not performing any synchronization and managing only one repository containing just one file. Unfortunately I couldn't figure out what causes the cpu usage. The daemon.log file remains unchanged and I couldn't find any other log files.
+
+Is this expected behavior or unusual high cpu usage?
diff --git a/doc/forum/Assistant__58___configure_auto-sync.mdwn b/doc/forum/Assistant__58___configure_auto-sync.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Assistant__58___configure_auto-sync.mdwn
@@ -0,0 +1,11 @@
+I have large central repositories of data. Therefore, on each client I want to save part data(to save space of disk). In command line I do 
+
+	[...]
+	git-annex webapp
+	git-annex drop [DeleteContentDirectory]
+	[...]
+
+After this command Assistant performs automatic synchronization getting content of files from this directory(DeleteContentDirectory), but I don't want. I want it's was only symlink of file in this directory.
+
+How can I configure Assistant which files have to get content on the client?  It's possible?
+ 
diff --git a/doc/forum/Autostart_the_assistant.mdwn b/doc/forum/Autostart_the_assistant.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Autostart_the_assistant.mdwn
@@ -0,0 +1,9 @@
+Hello,
+
+I'm using the Arch git-annex package: https://www.archlinux.org/packages/community/x86_64/git-annex/
+
+Checking the autostart checkbox in the assistant's web interface has no effect. There is no git-annex desktop file in ~/.config/autostart/ or alike. Neither is one contained in the package, however in the tarball I haven't found either.
+
+How does autostarting the assistant works?
+
+Best Thanks!
diff --git a/doc/forum/Cabal__58___Could_not_resolve_dependencies___40__yesod__41__.mdwn b/doc/forum/Cabal__58___Could_not_resolve_dependencies___40__yesod__41__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Cabal__58___Could_not_resolve_dependencies___40__yesod__41__.mdwn
@@ -0,0 +1,19 @@
+Hi,
+
+I try to install git-annex master with cabal, so I cloned the git repo and run "cabal install --only-dependencies". This gives me the following error:
+
+    Resolving dependencies...
+    cabal: Could not resolve dependencies:
+    trying: git-annex-3.20120826 (user goal)
+    trying: git-annex-3.20120826:+oldyesod
+    trying: git-annex-3.20120826:+currentyesod
+    next goal: yesod-default (dependency of git-annex-3.20120826:+oldyesod)
+    rejecting: yesod-default-1.1.0 (conflict: git-annex-3.20120826:oldyesod =>
+    yesod-default(<=1.0.1.1))
+    rejecting: yesod-default-1.0.1.1, 1.0.1, 1.0.0, 0.6.1, 0.5.0, 0.4.1, 0.4.0,
+    0.3.1 (conflict: git-annex-3.20120826:currentyesod => yesod-default(>=1.1.0))
+
+Any idea how to fix this? (PS: I'm running Kubuntu 12.04)
+
+Cheers,
+Tobias
diff --git a/doc/forum/Can__39__t_install__58___Mac_OS_10.8.2.mdwn b/doc/forum/Can__39__t_install__58___Mac_OS_10.8.2.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Can__39__t_install__58___Mac_OS_10.8.2.mdwn
@@ -0,0 +1,36 @@
+###Tried to install git-annex.app
+
+- App hangs up
+- Cpu "git" load is 100
+- Had to force quite git-annex
+
+###Install thru command line: using Brew
+
+- Installed haskell
+- updated cabal
+- But when I do:
+
+`
+cabal install git-annex --bindir=$HOME/bin
+`
+
+**I get this**
+
+    Resolving dependencies...
+    Configuring gnuidn-0.2...
+    cabal: The program c2hs is required but it could not be found.
+    Configuring libxml-sax-0.7.3...
+    cabal: The pkg-config package libxml-2.0 is required but it could not be found.
+    cabal: Error: some packages failed to install:
+    git-annex-3.20121127.1 depends on libxml-sax-0.7.3 which failed to install.
+    gnuidn-0.2 failed during the configure step. The exception was:
+    ExitFailure 1
+    libxml-sax-0.7.3 failed during the configure step. The exception was:
+    ExitFailure 1
+    network-protocol-xmpp-0.4.4 depends on libxml-sax-0.7.3 which failed to install.
+
+Any help would be greatly appreciated. 
+
+Thanks,
+
+Carlito
diff --git a/doc/forum/Crippled_FS__58___remove_read_perms_from_dropped_files__63___.mdwn b/doc/forum/Crippled_FS__58___remove_read_perms_from_dropped_files__63___.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Crippled_FS__58___remove_read_perms_from_dropped_files__63___.mdwn
@@ -0,0 +1,3 @@
+While experimenting with direct mode on Windows, I've got confused (and feeling momentary dread about apparent loss of data) many times when opening a file, and finding out that it in fact only contained the checksum; that is, was in the "dropped" state. As an **idea to prevent this confusion**, would it perhaps be possible to make the dropped files non-readable (permission denied) to the user somehow?
+
+(Background: I'm trying to build a version controlled development environment for a bunch of artists collaborating on large binaries, and making the process as fool-proof as possible is a priority.)
diff --git a/doc/forum/Disadvantages_of_WORM__58___long_filename__63__.mdwn b/doc/forum/Disadvantages_of_WORM__58___long_filename__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Disadvantages_of_WORM__58___long_filename__63__.mdwn
@@ -0,0 +1,13 @@
+Hello,
+
+first, I felt very comfortable with git-annex, but now I run into problems more often, and I think they are related to the WORM backend. I use this backend for my photos, since they are big (25MB) and never modified (camera raws, I don't touch them). So I edited my `.gitattributes` to use `WORM`.
+
+The problems usually are as follows: I perform an operation, and git (I think it is git which has the problems), and the process exits with exit code 1 and tells me "cannot open binary file: File name too long". The same happens from time to time when I have filenames containing special characters such as ', which can happen when I tag my music collection. I suspect the WORM backend to cause the problems, since the file names in `.git/annex` are indeed very long and ugly beccause of all the escaping done here.
+
+I am sorry that I cannot give a recipe how to reproduce this behaviour, and sometimes it helps to enter a subdirectory and perform the operation from there, for example:
+
+`$ git annex copy --to dest Pictures` fails, but `$ cd Pictures/dir_with_problematic_file; git annex copy --to dest .` works.
+
+Is there some advice or did anyone here observe similar behaviour?
+
+Best regards, Philipp
diff --git a/doc/forum/Feature_Request__58___add_filename_to_hash_objects.mdwn b/doc/forum/Feature_Request__58___add_filename_to_hash_objects.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Feature_Request__58___add_filename_to_hash_objects.mdwn
@@ -0,0 +1,6 @@
+hi,  
+i just did git annex unused in 2 repos, one with WORM and one with SHA1.   
+with WORM i instantly could see which file it was, with SHA1 not.  
+
+so would it be possible to just add the first seen filename to the hashes identifier? the name could just be ignored but it would help with unused to see which file i am searching for.  
+thanks!
diff --git a/doc/forum/Feature_request__58___Multiple_concurrent_transfers.mdwn b/doc/forum/Feature_request__58___Multiple_concurrent_transfers.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Feature_request__58___Multiple_concurrent_transfers.mdwn
@@ -0,0 +1,19 @@
+I'm sitting on a pretty fast connection, and often git-annex isn't using my entire upstream to fill the remotes.
+
+Lets say i have an annex with 10 x 100mb files. and my git-annex has 5 special remotes that needs to be filled.
+
+I would like to have git-annex do 5 concurrent uploads(one to each remote). Currently git-annex only uploads to one special-remote at a time (meaning the 4 remaining servers are just waiting).
+
+It would also be nice to have a per remote number of threads. Especially if adding a directory with 1000 small files in it(say 100bytes each), having 5 transfer threads to each remote would make the sync complete much faster.
+
+
+For now i've made a shell script that i call:
+
+    # for j in `seq -w 0 10`; do echo DOING $j; for i in `curl "http://127.0.0.1:$1/?auth=$2" | grep "continue" | gawk -F\"  ' { print $8 } '`; do curl "http://127.0.0.1:$1$i"; sleep 0; done; done
+
+But it is very rough, and basically just starts all transfers on the page. Which means i currently have 315 active transfers running. whoops.
+
+I could improve the shell script. But it really would be quite a bit niftier to have it as settings in git-annex.
+
+Sincerely
+Tobias
diff --git a/doc/forum/Git_Annex_Assistant__58___How_to_add_a_remote__63__.mdwn b/doc/forum/Git_Annex_Assistant__58___How_to_add_a_remote__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Git_Annex_Assistant__58___How_to_add_a_remote__63__.mdwn
@@ -0,0 +1,11 @@
+Hi,
+
+I am trying to use Git Annex Assistant on my Fedora Linux computer. I currently have a local repository that assistant monitors, but now I want to use my personal server as a git remote for the repository. I click on Configuration > Remote server and it prompts me for my server login credentials and then click the "Check this server" button. After this I am shown a screen that assistant is "Ready to add remote server" and then states:
+> The server <MY IP ADDRESS HERE> can be used as is, but installing git-annex on it would make it work better, and provide more options below.
+>
+> If you're able to install software on the server, do so and click Retry
+
+The information shown below this message is regarding encrypting the data (if I have git-annex installed on the server, which I don't). So my question is, what do I do now? There is no button to just add the remote from within git annex assistant? I created a bare repository on my server and added a remote manually inside the repository on my local machine, but git annex assistant doesn't notice it. I'm clueless on what git annex assistant is expecting from me at this point. I would think what I'm trying to do is one of the most common use cases for git annex, but I can't find any documentation or materials on the correct procedure for this. Any help is appreciated.
+
+Regards,
+Blake
diff --git a/doc/forum/How_to_shrink_transfer_repo__63__.mdwn b/doc/forum/How_to_shrink_transfer_repo__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/How_to_shrink_transfer_repo__63__.mdwn
@@ -0,0 +1,27 @@
+Hello,
+
+I have two repositories (Asaru and Horus) that are both ```group=client``` and ```wanted=standard```. The other one, Astarte is ```group=transfer``` and ```wanted=standard```. Pretty standard I think.
+
+```
+repository mode: direct
+trusted repositories: 0
+semitrusted repositories: 5
+        00000000-0000-0000-0000-000000000001 -- web
+        00000000-0000-0000-0000-000000000002 -- bittorrent
+        58001764-966d-4076-ae99-4ef6de25df39 -- Asaru [here]
+        8165bdf1-907e-4bbe-9c35-22fbf6f8cb00 -- Astarte [astarte]
+        cca0c3c8-593a-4395-936c-1093f0f762e8 -- Horus
+untrusted repositories: 0
+```
+
+I always sync on the two client repos like that ```git annex add . && git annex sync --content```. The transfer repo is growing larger and larger. ```git annex dropunused N``` says, that it ```could only verify the existence of 0 out of 1 necessary copies```.
+
+What is the best way to clean up the transfer repo?
+
+1. Make the two client repos trusted? The three repos have been created manually, not through the assistant. Is that what the assistant does, too?
+2. Try to get the two client repos into touch with each other and try to use ```dropunsed --from=astarte```?
+
+What is the recommended way for that?
+
+Thanks,
+Florian
diff --git a/doc/forum/Question__58___git-annex-only_repo___63__.mdwn b/doc/forum/Question__58___git-annex-only_repo___63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Question__58___git-annex-only_repo___63__.mdwn
@@ -0,0 +1,3 @@
+Is there a way to declare (init) a git-annex-only repository?
+
+I mean if the repository will only contain large (or maybe binary) files without any source-code... In that case all files added to the repo should be managed by git-annex automatically. Is this currently possible?
diff --git a/doc/forum/Somehow_have_lots_of_directories_in_root__58___000...ffff.mdwn b/doc/forum/Somehow_have_lots_of_directories_in_root__58___000...ffff.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Somehow_have_lots_of_directories_in_root__58___000...ffff.mdwn
@@ -0,0 +1,22 @@
+I'm using git-annex to manage my photos on my laptop, and have my NAS (which is just a debian linux system with lots of disks) as one of my remotes. I use my NAS as a backup, and to free up space on my laptop.
+
+But somehow I now have lots of directories in my main root directory of the photos directory. it looks like [0-9a-f][0-9a-f][0-9a-f], so I have 000, ... a00, ... ddd, ..., all the way to fff. Thousands of them. Each one has a few directories that also match [0-9a-f][0-9a-f][0-9a-f], and each one has a file with names of the git annex object filename.
+
+e.g.:
+
+    $ cat e1d/760/SHA256-s4061375--7909e266f340ff8bc692e073e776ceda267042adf790275a2d851f2c7eb1ca83.log 
+    1338931894.759394s 1 1adfa84c-af51-11e1-b075-0b1206d553bc
+    1338992164.202818s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05
+    1339862991.346546s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05
+    1339946933.224915s 1 224d85b4-b86f-11e1-b11e-3333ce526126
+    1339964057.205993s 1 224d85b4-b86f-11e1-b11e-3333ce526126
+    1343495865.083951s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05
+    1344788941.403528s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05
+    1351802706.679542s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05
+    1362423729.820711s 1 721d82ae-afbb-11e1-b78f-f396ebf52c05
+
+My remote (NAS) has these files & directories as well as my laptop. The regular photo directory hierarchy is there as well, the files work, can be copied etc. "git status" say nothing has changed. Those files are tracked by git (they have lot messages). Everything just works, it's just that there's loads of these directories? Can I remove them? How can I clear it up? I can't remember when these directories/files were added, I only noticed it today.
+
+I don't know if I had my remote (NAS) as a bare git repo and used it as that, then somehow used it as a non-bare one, would that cause this?
+
+Can I remove them? Where did they come from? What's going on?
diff --git a/doc/forum/Stupid_mistake__58___recoverable__63__.mdwn b/doc/forum/Stupid_mistake__58___recoverable__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Stupid_mistake__58___recoverable__63__.mdwn
@@ -0,0 +1,31 @@
+Hi,
+
+I was a bit hasty the other day and did something stupid.  I
+added a new folder to git annex.  Something like
+
+    git annex add my-important folder
+
+my-important folder contains a lot of files and it took a couple
+of minutes to add.  When I then tried to do
+
+    git commit -am 'added files'
+
+per the walkthrough I got an error (9, as I recall).  I thought
+I'd added too many files or something so I wanted to start over
+and perhaps I didn't fully understand the mechanisms of annex I
+did the following
+
+    git reset --hard .
+
+Unfortunately, did replaced my files with a bunch of symlinks,
+rather than making git annex forget and go back to the previous
+stage as I had hoped.
+
+I have managed to recover most of my files from backup, but some
+of them I still can't recover.  Is there any way back?  It seems
+I still have the files in my git folder.
+
+Thanks,
+Rasmus
+
+PS: Sorry, I shouldn't have made this text rather than Markdown.
diff --git a/doc/forum/Suggestion__58___Put_ssh_server_back_into_android_version.mdwn b/doc/forum/Suggestion__58___Put_ssh_server_back_into_android_version.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Suggestion__58___Put_ssh_server_back_into_android_version.mdwn
@@ -0,0 +1,9 @@
+Hi!
+
+Just tried various android ssh servers which do work, but have no access to the command line tools shipped with git annex.
+
+From what I gather from the planning docs, sshd was stripped from the android tools to save space. If this were the case, it (naively) seems to me it would have to be simple to re-enable.
+
+Rationale: It would make it super convenient to use command line git annex on my phone alongside the assistant, through letting me type on my desktop. Not to mention that the command line tools shipped with git annex are by far the best around for android work.
+
+Carlo
diff --git a/doc/forum/Undo_git_merge_git-annex.mdwn b/doc/forum/Undo_git_merge_git-annex.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Undo_git_merge_git-annex.mdwn
@@ -0,0 +1,3 @@
+After accidentally typing git merge git-annex, I am now wondering how to clean up the resulting chaos...
+
+Any tips?
diff --git a/doc/forum/WARNING__58___linker__58__git-annex_has_text_relocations.mdwn b/doc/forum/WARNING__58___linker__58__git-annex_has_text_relocations.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/WARNING__58___linker__58__git-annex_has_text_relocations.mdwn
@@ -0,0 +1,7 @@
+I have configured git-annex on my Nexus 5. Even though it works fantastic, it shows some warning messages.
+
+1: 'git-annex sync' :  WARNING: linker: git-annex has text relocations. This is wasting memory and is a security risk. Please fix.
+
+2: 'git log': error: cannot run less. No such file or directory.
+
+Both the commands will work has expected with these warnings. What could be the issue here.
diff --git a/doc/forum/Wishlist__58___Bittorrent-like_transfers.mdwn b/doc/forum/Wishlist__58___Bittorrent-like_transfers.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Wishlist__58___Bittorrent-like_transfers.mdwn
@@ -0,0 +1,5 @@
+**EDIT: Mistakenly posted this thread in the forum.  I created a new post in [[todo|todo/Bittorrent-like_features]]
+
+Do you think it would be possible to have bittorrent-like transfers between remotes, so that no one remote gets pegged too hard with transfers? It would be great if you distribute your files between multiple bandwidth-capped remotes, and want fast down speed.  Obviously, this isn't a simple task, but the protocol is already there, it just needs to be adapted for the purpose (and re-written in Haskell...).  Maybe some day in the future after the more important stuff gets taken care of?  It could be an enticing stretch goal.
+
+PS: still working on getting BTC, will be donating soon!
diff --git a/doc/forum/Wishlist__58___Don__39__t_make_files_readonly.mdwn b/doc/forum/Wishlist__58___Don__39__t_make_files_readonly.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Wishlist__58___Don__39__t_make_files_readonly.mdwn
@@ -0,0 +1,3 @@
+Maybe this explained somewhere else, but what is the purpose of marking files readonly. To me this is an annoyance that doesn't make sense. I want to be able to change my files, having to go through an unlock step, to do that seems like unnecessary work. Interestingly, Microsoft's Team Foundation Server source control does the same thing and I don't like it there either.
+
+In addition why replace files with symlinks? Why not just leave the real files in place, or do the reverse and put the symlink to the file in the repository.
diff --git a/doc/forum/Wishlist__58___automatic_reinject.mdwn b/doc/forum/Wishlist__58___automatic_reinject.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Wishlist__58___automatic_reinject.mdwn
@@ -0,0 +1,14 @@
+I think it would be useful to supplement the `reinject` command with an automatic
+mode which calculates the checksum of the source file and injects the file if it
+is known to the repository (without the need to provide a destination filename).
+In addition, this could be done recursively if the user provides a directory to
+inject. All this can probably be done already with some plumbing, but a simple
+`reinject --auto` (or `scour`, or `scavenge`, if you like) would be a nice addition.
+Of course this would only work for the checksum backends.
+
+Example use cases would be:
+
+* Recovering data from lost+found easily
+* Making use of old (pre-git-annex) archival volumes with useful files
+  scattered among non-useful files
+* Sneaker-netting files between disconnected git-annex repositories
diff --git a/doc/forum/Wishlist__58___getting_the_disk_used_by_a_subtree_of_files.mdwn b/doc/forum/Wishlist__58___getting_the_disk_used_by_a_subtree_of_files.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Wishlist__58___getting_the_disk_used_by_a_subtree_of_files.mdwn
@@ -0,0 +1,10 @@
+I'm not sure if this _feature_ exists already wrapped or provided as a recipe for users or not yet. But it would be nice to be able to do a
+
+    git annex du [PATH]
+
+Such that the output that git annex would return is the total disk used locally in the PATH and the theoretical disk used by the PATH if it was fully populated locally. e.g.
+
+    $ git annex du FSL0001_ANALYSIS
+    $ Local: 1000kb, Annex: 2000kb
+
+or something along the lines of that?
diff --git a/doc/forum/Wishlist__58___mark_remotes_offline.mdwn b/doc/forum/Wishlist__58___mark_remotes_offline.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Wishlist__58___mark_remotes_offline.mdwn
@@ -0,0 +1,12 @@
+I have several remotes which are not always accessible. For example they can
+be on hosts only accessible by LAN or on a portable hard drive which is not
+plugged in. When running sync these remotes are checked as well, leading to
+unnecessary error messages and possibly git-annex waiting for a few minutes
+on each remote for a timeout.
+
+In this situation it would be useful to mark some remotes as offline
+(`git annex offline <remotename>`), so that git-annex would not even attempt
+to contact them. Then, I could configure my system to automatically, for example,
+mark a portable hard disk remote online when plugging it in, and offline when
+unplugging it, and similarly marking remotes offline and online depending on
+whether I have an internet connection or a connection to a specific network.
diff --git a/doc/forum/Wishlist__58___options_for_syncing_meta-data_and_data.mdwn b/doc/forum/Wishlist__58___options_for_syncing_meta-data_and_data.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Wishlist__58___options_for_syncing_meta-data_and_data.mdwn
@@ -0,0 +1,13 @@
+Since _transfer queueing_  and syncing of data works now in the assistant branch (been playing with it), there are times when I really don't want to sync the data, I would like to just sync meta-data and manually do a _get_ on files that I would want or selectively sync data in a subtree.
+
+It would be nice to have the syncing/watch feature to have the option of syncing only *meta-data* or *meta-data and data*, I think this sort of option was already planned? It would also be nice to be able to automatically sync data for only a subtree.
+
+My use case is, I have a big stash of files somewhere at home or work, and I want to keep what I am actually using on my laptop and be able to selectively just take a subtree or a set of subtree's of files. I would not always want to suck down all the data but still have the functionally to add files and push them upstream and sync meta-data.
+
+that is...
+
+> * Site A: big master annex in a server room with lots of disk (or machines), watches a directory and syncs both data and meta-data, it should always try and pull data from all it's child repos. That way I will always have a master copy of my data somewhere, it would be even nicer if I could have clones of the annex, where each annex is on a different machine which is configured to only sync a subtree of files so I can distribute my annex across different systems and disks.
+>   * Site A: machine A: syncs Folder A
+>   * Site A: machine B: syncs Folder B
+>   * and so on with selectively syncing sites and directories
+> * Laptop: has a clone of the annex, and watches a directory, syncs meta-data as usual and only uploads files to a remote (all or a designated one) but it never downloads files automatically or it should only occur inside a selected subtree.
diff --git a/doc/forum/_illegal_control_characters_in_pairing_message__59___ignoring.mdwn b/doc/forum/_illegal_control_characters_in_pairing_message__59___ignoring.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/_illegal_control_characters_in_pairing_message__59___ignoring.mdwn
@@ -0,0 +1,40 @@
+Currently I am trying to synchronize two folders between my NAS and my main computer. On both machines I can access the web app. However, once I try to pair these machines with a secret phrase I get the following error:
+ 
+illegal control characters in pairing message; ignoring
+
+The log on one machine is:
+
+[2016-03-18 14:25:16.861132] main: Pairing in progress
+Generating public/private rsa key pair.
+Your identification has been saved in /var/folders/_v/hkf9zbqs0bgd2vcnmr_qnlgm0000gn/T/git-annex-keygenN92651/key.
+Your public key has been saved in /var/folders/_v/hkf9zbqs0bgd2vcnmr_qnlgm0000gn/T/git-annex-keygenN92651/key.pub.
+The key fingerprint is:
+SHA256:beyV1f5MKFGaaH9p1CRMPmaVcYAmOyc/lhp7HCw668M username@iMac.home
+The key's randomart image is:
++---[RSA 2048]----+
+|             +=o*|
+|          ..o=.B.|
+|          o++ B o|
+|         ++..B = |
+|        S +*=.= o|
+|         oo.B+ o.|
+|       . ..B o  o|
+|        E o o    |
+|       .o+ .     |
++----[SHA256]-----+
+[2016-03-18 14:25:26.442301] main: Pairing in progress
+ 
+  illegal control characters in pairing message; ignoring
+ 
+  illegal control characters in pairing message; ignoring
+ 
+  illegal control characters in pairing message; ignoring
+ 
+  illegal control characters in pairing message; ignoring
+
+While on the other machine I get:
+
+[2016-03-18 14:25:35 CET] main: Pairing with username@iMac.home:~/Desktop/annex in progress
+
+
+
diff --git a/doc/forum/_preferred_content__58___lastpresent.mdwn b/doc/forum/_preferred_content__58___lastpresent.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/_preferred_content__58___lastpresent.mdwn
@@ -0,0 +1,1 @@
+Is there any kind of "lastpresent" in the preferred-content expression? If set, git-annex would see if "git log --follow $path -n 1" (or some configurable -n) was present.
diff --git a/doc/forum/annex.largefiles__58___two_quesitons.mdwn b/doc/forum/annex.largefiles__58___two_quesitons.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/annex.largefiles__58___two_quesitons.mdwn
@@ -0,0 +1,9 @@
+Hi,
+
+I have two questions related to `annex.largefiles`, for which I was unable to find the answers.
+
+1. Is there a way to transfer my `annex.largefiles` from one repo to the other?  I noticed that the property was not adopted when cloning a repo.
+2. On one repo I noticed that I had not set a good `annex.largefiles`.  Can I tell `git annex` to *reevaluate* whether a file should be controlled as a "normal" file or a "largefile" give the updated `annex.largefiles`?
+
+Thanks,
+Rasmus
diff --git a/doc/forum/bainstorming__58___git_annex_push___38___pull.mdwn b/doc/forum/bainstorming__58___git_annex_push___38___pull.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/bainstorming__58___git_annex_push___38___pull.mdwn
@@ -0,0 +1,28 @@
+Wouldn't it make sense to offer
+
+    git annex pull
+
+which would basically do
+
+    git pull
+    git annex get
+
+and
+
+    git annex push
+
+which would do
+
+    git annex commit .
+    git annex put # (the proposed "send to default annex" command)
+    git commit -a -m "$HOST $(date +%F-%H-%M-%S)" # or similar
+    git push
+
+Resulting in commands that are totally analogous to git push & pull: Sync all data from/to a remote.
+
+> Update:
+
+This is useful:
+
+    git config [--global] alias.annex-push '!git pull && git annex add . && git annex copy . --to $REMOTE --fast --quiet && git commit -a -m "$HOST $(date +%F--%H-%M-%S-%Z)" && git push'
+
diff --git a/doc/forum/converting_a_v5_repo_to_an_always_unlocked_v6_repo.mdwn b/doc/forum/converting_a_v5_repo_to_an_always_unlocked_v6_repo.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/converting_a_v5_repo_to_an_always_unlocked_v6_repo.mdwn
@@ -0,0 +1,34 @@
+Hi,
+I'm trying to convert a v5 classic, symlink repository into a v6 always unloked repository.
+
+
+I'm trying to follow along with: <http://git-annex.branchable.com/tips/unlocked_files>
+but something goes wrong in the process, so I'm sure I'm missing something.
+The repository is about 600G to start with on a ext4 filesystem, and I don't have another 600G of free space on disk, so I'm going with thin mode:
+
+1.       git annex upgrade 
+2.       git config annex.thin true 
+3.       git annex fix 
+4.       git annex unlock
+
+It's all good to this point. Everything gets unlocked and is fine. 
+Then I try to commit the changes with:
+
+     git annex sync
+
+The process seems to take 
+and incredibly long time (several hours) and then ends up running out of space. I check the repository with "du -sh"
+and it's almost double the size. Is there a reason for this? Is there a way to avoid this duplication of data. Shouldn't annex.thin do the trick?
+
+This is also strange: with "git annex info" I get
+
+     local annex keys: 3572
+     local annex size: 933.19 gigabytes
+     annexed files in working tree: 0
+     size of annexed files in working tree: 0 bytes
+
+the annex size should be about 540G and why are there no annexed files in the working tree?
+
+Is there a correct and faster way to migrate my repo to an always unlocked one which won't require hours of time and take all that disk space?
+
+thanks a lot, daniel
diff --git a/doc/forum/git-annex__58___map__58___1_failed.mdwn b/doc/forum/git-annex__58___map__58___1_failed.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/git-annex__58___map__58___1_failed.mdwn
@@ -0,0 +1,12 @@
+What exactly does that mean?
+I got that while exploring the git annex command:
+
+shiny-2:git-annex ovi$ pwd
+/Users/ovi/Sharing/git-annex
+shiny-2:git-annex ovi$ git annex map
+map /Users/ovi/Sharing/git-annex ok
+
+  running: dot -Tx11 /Users/ovi/Sharing/git-annex/.git/annex/map.dot
+
+failed
+git-annex: map: 1 failed
diff --git a/doc/forum/git_annex_info__58___local_annex_keys__63__.mdwn b/doc/forum/git_annex_info__58___local_annex_keys__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/git_annex_info__58___local_annex_keys__63__.mdwn
@@ -0,0 +1,27 @@
+When I run `git annex info`, it stops to ask me for "local annex keys":
+
+    $ git annex info
+    repository mode: indirect
+    trusted repositories: 0
+    semitrusted repositories: 3
+            00000000-0000-0000-0000-000000000001 -- web
+            1xxxxxx7-6xx1-4xx1-8xx8-5xxxxxxxxxx1 -- here (usbdisk)
+            bxxxxxx6-bxxe-4xx2-bxxe-fxxxxxxxxxxf -- origin (local)
+    untrusted repositories: 0
+    transfers in progress: none
+    available local disk space: 36.25 gigabytes (+1 megabyte reserved)
+    local annex keys: 
+
+What are these "local annex keys"? 
+
+*Edit*: Ah! it wasn't asking me anything, just echoing my keystrokes. It was counting keys stored in the annex, and taking a while. Sorry for the noise!
+
+    [...]
+    local annex keys: 19586
+    local annex size: 33.96 gigabytes
+    annexed files in working tree: 19814
+    size of annexed files in working tree: 35.12 gigabytes
+    bloom filter size: 16 mebibytes (3.9% full)
+    backend usage: 
+            SHA256E: 39400
+
diff --git a/doc/forum/git_annex_sync__58___only_git-annex.mdwn b/doc/forum/git_annex_sync__58___only_git-annex.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/git_annex_sync__58___only_git-annex.mdwn
@@ -0,0 +1,3 @@
+Hi,
+
+i have an already existing git repository with a branch (*master*) and i added git annex to it (*git annex init*). Now i want to synchronise the file tracking information with annex through *git annex sync*, but keep the master branch unsynchronised (i want push/pull it manually as there are not only annexed files but also code). What is the best approach for my setup?
diff --git a/doc/forum/importfeed__58___comments_in_file_with_feed_urls.mdwn b/doc/forum/importfeed__58___comments_in_file_with_feed_urls.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/importfeed__58___comments_in_file_with_feed_urls.mdwn
@@ -0,0 +1,5 @@
+Hi,
+
+how can I use comments in the file containing the feed urls.
+
+The hash symbol # causes a bad feed exception.
diff --git a/doc/forum/lost_in_walkthrough....mdwn b/doc/forum/lost_in_walkthrough....mdwn
deleted file mode 100644
--- a/doc/forum/lost_in_walkthrough....mdwn
+++ /dev/null
@@ -1,78 +0,0 @@
-I'm trying to follow the steps of the "walkthrough" but I'm experiencing the following issue: when
-I sync one repository and do "git annex get ." I don't get the files from the other repository.
-Here is the transcript of the steps I followed - I've put them in a script (ga.sh) so I can replay
-them and show them on the shell while executing.
-Basically I have two repositories, "/tmp/a/annex" and "/tmp/b/annex", the second cloned from
-the first. All the other steps are the same as in the walkthrough.
------------------------------------
-> bash -x ga.sh 
-+ cd /tmp
-+ mkdir a
-+ mkdir b
-+ cd a
-+ mkdir annex
-+ cd annex
-+ git init
-Initialized empty Git repository in /tmp/a/annex/.git/
-+ git annex init a
-init a ok
-(Recording state in git...)
-+ cd /tmp/b
-+ git clone /tmp/a/annex
-Cloning into 'annex'...
-done.
-warning: remote HEAD refers to nonexistent ref, unable to checkout.
-
-+ cd annex
-+ git annex init b
-init b ok
-(Recording state in git...)
-+ git remote add a /tmp/a/annex
-+ cd /tmp/a/annex
-+ git remote add b /tmp/b/annex
-+ dd if=/dev/urandom of=first bs=1024 count=1
-1+0 records in
-1+0 records out
-1024 bytes (1.0 kB) copied, 9.9167e-05 s, 10.3 MB/s
-+ dd if=/dev/urandom of=second bs=1024 count=1
-1+0 records in
-1+0 records out
-1024 bytes (1.0 kB) copied, 0.000241635 s, 4.2 MB/s
-+ git annex add .
-add first (checksum...) ok
-add second (checksum...) ok
-(Recording state in git...)
-+ git commit -am added
-[master (root-commit) 5078564] added
- 2 files changed, 2 insertions(+)
- create mode 120000 first
- create mode 120000 second
-+ git mv first e
-+ mkdir x
-+ git mv second x
-+ git commit -m moved
-fix x/second ok
-(Recording state in git...)
-[master 422492d] moved
- 3 files changed, 1 insertion(+), 1 deletion(-)
- rename first => e (100%)
- delete mode 120000 second
- create mode 120000 x/second
-+ cd /tmp/b/annex
-+ git annex sync a
-(merging origin/git-annex into git-annex...)
-(Recording state in git...)
-commit  
-ok
-git-annex: no branch is checked out
-+ git annex get .
--------------------
-
-The last "git annex get ." does not retrieve the files in /tmp/a/annex ... why?
-I guess the issue starts when cloning /tmp/a/annex where no commit was done.
-
-Emanuele
-
-PS: I'm using git v1.7.9.5 (ubuntu 12.04) and the latest git-annex static binary
-downloaded a few minutes ago from the git-annex website.
-
diff --git a/doc/forum/lost_in_walkthrough.mdwn b/doc/forum/lost_in_walkthrough.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/lost_in_walkthrough.mdwn
@@ -0,0 +1,78 @@
+I'm trying to follow the steps of the "walkthrough" but I'm experiencing the following issue: when
+I sync one repository and do "git annex get ." I don't get the files from the other repository.
+Here is the transcript of the steps I followed - I've put them in a script (ga.sh) so I can replay
+them and show them on the shell while executing.
+Basically I have two repositories, "/tmp/a/annex" and "/tmp/b/annex", the second cloned from
+the first. All the other steps are the same as in the walkthrough.
+-----------------------------------
+> bash -x ga.sh 
++ cd /tmp
++ mkdir a
++ mkdir b
++ cd a
++ mkdir annex
++ cd annex
++ git init
+Initialized empty Git repository in /tmp/a/annex/.git/
++ git annex init a
+init a ok
+(Recording state in git...)
++ cd /tmp/b
++ git clone /tmp/a/annex
+Cloning into 'annex'...
+done.
+warning: remote HEAD refers to nonexistent ref, unable to checkout.
+
++ cd annex
++ git annex init b
+init b ok
+(Recording state in git...)
++ git remote add a /tmp/a/annex
++ cd /tmp/a/annex
++ git remote add b /tmp/b/annex
++ dd if=/dev/urandom of=first bs=1024 count=1
+1+0 records in
+1+0 records out
+1024 bytes (1.0 kB) copied, 9.9167e-05 s, 10.3 MB/s
++ dd if=/dev/urandom of=second bs=1024 count=1
+1+0 records in
+1+0 records out
+1024 bytes (1.0 kB) copied, 0.000241635 s, 4.2 MB/s
++ git annex add .
+add first (checksum...) ok
+add second (checksum...) ok
+(Recording state in git...)
++ git commit -am added
+[master (root-commit) 5078564] added
+ 2 files changed, 2 insertions(+)
+ create mode 120000 first
+ create mode 120000 second
++ git mv first e
++ mkdir x
++ git mv second x
++ git commit -m moved
+fix x/second ok
+(Recording state in git...)
+[master 422492d] moved
+ 3 files changed, 1 insertion(+), 1 deletion(-)
+ rename first => e (100%)
+ delete mode 120000 second
+ create mode 120000 x/second
++ cd /tmp/b/annex
++ git annex sync a
+(merging origin/git-annex into git-annex...)
+(Recording state in git...)
+commit  
+ok
+git-annex: no branch is checked out
++ git annex get .
+-------------------
+
+The last "git annex get ." does not retrieve the files in /tmp/a/annex ... why?
+I guess the issue starts when cloning /tmp/a/annex where no commit was done.
+
+Emanuele
+
+PS: I'm using git v1.7.9.5 (ubuntu 12.04) and the latest git-annex static binary
+downloaded a few minutes ago from the git-annex website.
+
diff --git a/doc/forum/messed_up_annex_by_using_git_checkout.mdwn b/doc/forum/messed_up_annex_by_using_git_checkout.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/messed_up_annex_by_using_git_checkout.mdwn
@@ -0,0 +1,40 @@
+Hello. Linux experienced user here, but with no development or git experience ever. This directly leads me to my biggest trouble with git-annex because I constantly suffer from misunderstanding each and everything. That being said, my problem is the following: I had the terrible idea to have my .thunderbird directory synchronized over several machines, leading the thunderbird profile to total corruption because after a few weeks I finally managed to have multiple machines accessing it. As I started trying to recover, things got worse and this is my last seek for help before starting over by creating the repositories from scratch.
+
+What I did:
+
+1. I did some research on how to recover an old state of the repo, which should not have been a problem because there is a "full backup" repo. I came across this [1] page and the pain started with me looking for my wanted commit to roll-back in "git log" and then did some tries in the way something like, "git checkout -b old-state4 012345678".
+
+2. Of course this recovered the whole repo and not only thunderbird, so I used a file synchronizer to put everything else back into place after the action.
+
+3. Unfortunately, the "branches" seem to have been messed up and the repos are no longer in sync.
+
+This is what the machine says that I have used to create the mess:
+
+    [2016-03-08 19:15:26.915116] Pusher: Syncing with host123
+    (recording state in git...)
+    To ssh://user@10.0.0.1/mnt/foo/bar
+       d35c699..fed0636  git-annex -> synced/git-annex
+       a44bfb2..818b7b5  annex/direct/old_state4 -> synced/old_state4
+
+This is what another machine says:
+
+    [2016-03-08 21:17:48.649949] Pusher: Syncing with host123
+    (recording state in git...)
+    To ssh://user@10.0.0.1/mnt/foo/bar
+    
+       423f50f..4c8fad8  annex/direct/master -> q/annex/direct/master
+       2a67458..fed0636  git-annex  -> host123/git-annex
+       6a1076b..4c8fad8  master     -> host123/master
+       7f55414..818b7b5  old_state4 -> host123/old_state4
+
+Long story, short...
+
+I apologize for being a total git noob while at the same time performing git magic leading into a total desaster.
+However, I hope someone can give me a hint what to do to have the "old_state4" solved?
+
+Also, I really would like to get used to the git internals but since git is quite powerful, I always get overwhelmed because the tutorials out there are either developer-focused (which I'm not in the correct target group) or they simply cover each and everything (which is of no use because I don't want to administrate a GitHub repo but a private git-annex for my files and documents). 
+
+Thank you so much!
+
+
+[1] http://stackoverflow.com/questions/4114095/revert-git-repo-to-a-previous-commit
diff --git a/doc/forum/rsync_protocol_mismatch_due_to_encfs_folder.mdwn b/doc/forum/rsync_protocol_mismatch_due_to_encfs_folder.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/rsync_protocol_mismatch_due_to_encfs_folder.mdwn
@@ -0,0 +1,24 @@
+One of my repositories worked just fine for months, until I have decided to put an encfs folder within it. Encfs is encrypting folders and files, resulting in weird file and folder names. However, rsync just seems to fail.
+
+
+This has already been a topic here a few times, for example [1] and [2].
+
+Unfortunately, I have not been lucky enough to recover the situation by the hints given.
+
+
+What I did to investigate is that I have re-run one of the shell commands stuck client-side and appended --debug to gain a deeper look. This is the output:
+
+    $ /opt/git-annex/2016-01-14/exe/ssh --library-path /opt/git-annex/2016-01-14//etc/ld.so.conf.d:/opt/git-annex/2016-01-14//usr/lib/x86_64-linux-gnu/gconv:/opt/git-annex/2016-01-14//usr/lib/x86_64-linux-gnu/audit:/opt/git-annex/2016-01-14//usr/lib:/opt/git-annex/2016-01-14//usr/lib/x86_64-linux-gnu:/opt/git-annex/2016-01-14//lib64:/opt/git-annex/2016-01-14//lib/x86_64-linux-gnu: /opt/git-annex/2016-01-14/shimmed/ssh/ssh -S .git/annex/ssh/user@10.0.0.1 -o ControlMaster=auto -o ControlPersist=yes -T user@10.0.0.1 git-annex-shell 'recvkey' '/mnt/path/to/share/' 'SHA256E-s262670--e004c6e3f87ad2b5d74d206de85de5449c9f263d83e6ef1c87ffb03be8b7e725' --debug --uuid e34522e4-1dab-459c-b295-1fe41e7692e4 '--' 'remoteuuid=07820aec-e2a3-4c60-bd57-b39b7213e056' 'unlocked=1' 'direct=1' 'associatedfile=.encfs_folder/CMG23xCwkemocE-Gq9WHpO-n/1vqfTkJChNm5CgjBsZ--,9r,ZOcSBTxE-Ogz5ytA8R23st52LWf4d9MjRref56VhbEB/4ezakoEn8dqOT8s,K4X,ueSs' '--' dummy rsync --server -pe.Lsfx --log-format=X --inplace . .
+    [2016-03-16 22:52:18.922914] transfer start
+    [2016-03-16 22:52:18.949417] call: rsync ["--server","-t","--inplace","-e.Lsf",".","../../mnt/path/to/share/.git/annex/tmp/SHA256E-s262670--e004c6e3f87ad2b5d74d206de85de5449c9f263d83e6ef1c87ffb03be8b7e725"]
+    protocol version mismatch -- is your shell clean?
+    (see the rsync man page for an explanation)
+    rsync error: protocol incompatibility (code 2) at compat.c(176) [Receiver=3.1.1]
+    [2016-03-16 22:59:05.890987] process done ExitFailure 2
+    [2016-03-16 22:59:05.899506] transfer done
+
+What can I do other than to just move the encfs outside my repository, which is of course the least favorable option for me to do?
+
+[1] <http://git-annex.branchable.com/bugs/protocol_mismatch_after_interrupt/>
+
+[2] <http://git-annex.branchable.com/bugs/rsync__58___protocol_version_mismatch/>
diff --git a/doc/forum/tips__58___special__95__remotes__47__hook_with_tahoe-lafs.mdwn b/doc/forum/tips__58___special__95__remotes__47__hook_with_tahoe-lafs.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/tips__58___special__95__remotes__47__hook_with_tahoe-lafs.mdwn
@@ -0,0 +1,22 @@
+This is work in progress, since there is now a [[special_remotes/hook]] for users to plug in whatever they want as a remote, here's my recipe for using tahoe-lafs as a remote, this is a copy and paste the relavent section from my .git/config file
+
+        tahoe-store-hook = tahoe put $ANNEX_FILE tahoe:$ANNEX_KEY
+        tahoe-retrieve-hook = tahoe get tahoe:$ANNEX_KEY $ANNEX_FILE
+        tahoe-remove-hook = tahoe rm tahoe:$ANNEX_KEY
+        tahoe-checkpresent-hook = tahoe ls tahoe:$ANNEX_KEY 2>&1 || echo FAIL
+
+Where `tahoe:` is a tahoe-lafs alias, ideally you should create a new alias (DIR-CAP or whatever the terminolgy is) to store your files, I just used the default `tahoe:` alias for testing.
+
+The only quirk I've noticed is this...
+
+<pre>
+$ git annex whereis .
+whereis frink.jar (2 copies) 
+  	084603a8-7243-11e0-b1f5-83102bcd7953  -- here (testtest)
+   	1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a
+ok
+</pre>
+
+1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a is my [[!google tahoe-lafs]] remote, but there is no label/description on it. The checkpresent-hook was a little confusing when I was setting it up, I'm currently unsure if I am doing the right thing or not with my hook. My get and put commands are a little verbose for now, i might redirect it to /dev/null once I am happier with the overall performance/behaviour my setup.
+
+Other than the quirks above, I am able to put and get files from my tahoe-lafs remote. The only thing that I have not figured out is how to "remove a file" on the remote to free up space on the remote.
diff --git a/doc/forum/trusted_repositories__58___fatal__58___not_a_git_repo.mdwn b/doc/forum/trusted_repositories__58___fatal__58___not_a_git_repo.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/trusted_repositories__58___fatal__58___not_a_git_repo.mdwn
@@ -0,0 +1,32 @@
+When issuing a `git annex info`, I get:
+
+~~~
+$ git-annex info
+repository mode: indirect
+trusted repositories: fatal: Not a git repository: '/home/micas/Music/.git' fatal: Not a git repository: '/home/micas/Music/.git' 0
+semitrusted repositories: 3
+	00000000-0000-0000-0000-000000000001 -- web
+ 	85f8a5ea-6278-11e2-9978-ebb59e8f37a2 -- here (Music annex backup)
+ 	9aff38f2-6447-11e2-8c89-ef50e6c0ea6c -- backupone (Music annex backupone)
+untrusted repositories: 0
+transfers in progress: none
+available local disk space: 174.28 gigabytes (+1 megabyte reserved)
+local annex keys: 5348
+local annex size: 25.62 gigabytes
+annexed files in working tree: 5374
+size of annexed files in working tree: 25.68 gigabytes
+bloom filter size: 16 mebibytes (1.1% full)
+backend usage: 
+	SHA256: 10692
+	SHA256E: 30
+~~~
+
+The troubling part (I think) is `trusted repositories: fatal: Not a git repository: '/home/micas/Music/.git' fatal: Not a git repository: '/home/micas/Music/.git' 0`
+
+Is there a command I can use to show all the uuid of known remotes? I thought I had marked all remotes pointing to /home/micas/Music/.git as `dead`
+
+Is there another reason for the output? How can I get trusted repos back to 0?
+
+**EDIT:**
+
+I removed the folder (was not a git repo at the time of the error) `/home/micas/Music` and the error went away.
diff --git a/doc/forum/usability__58___creating_an_archive_on_a_new_external_drive.mdwn b/doc/forum/usability__58___creating_an_archive_on_a_new_external_drive.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/usability__58___creating_an_archive_on_a_new_external_drive.mdwn
@@ -0,0 +1,13 @@
+story: i got a new drive from the store. plug it in. it's recognized by XFCE and mounted automatically. turns out it's NTFS, but Debian doesn't seem to mind.
+
+go in the assistant, add it as an "External drive", make it a "full backup" and let it sync.
+
+expected result: i see files
+
+actual result: i see a bare git repository.
+
+if i first `git init` the directory so it's not bare, at least i get a better handle on it: i can sync with the assistant, then `git merge synced/master` to see the files.
+
+really confusing to me, sorry if it's a dupe... 
+
+workaround: use the commandline: `git clone <repo>` and `git annex get`. --[[anarcat]]
diff --git a/doc/forum/usability__58___what_are_those_arrow_things__63__.mdwn b/doc/forum/usability__58___what_are_those_arrow_things__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/usability__58___what_are_those_arrow_things__63__.mdwn
@@ -0,0 +1,29 @@
+# Introduction
+
+i want to relate a usability story that happens fairly regularly when I show git-annex to people. the story goes like this.
+
+# The story
+
+Antoine sat down at his computer saying, "i have this great movie collection I want to share with you, my friend, because the fair use provisions allow for that, and I use this great git-annex tool that allows me to sync my movie collection between different places". His friend Charlie, a Linux user only vaguely familiar with the internals of how his operating system or legal system actually works, reads this as "yay free movies" and wholeheartedly agrees to lend himself to the experiment.
+
+Antoine creates a user account for Charlie on his home computer, because he doesn't want to have to do everything himself. "That way you can choose which movies you want, because you probably don't want my complete movie collection!" Charlie emphatically responds: "right, I only have my laptop and this USB key here, so I don't think I can get it all".
+
+Charlie logs into Antoine's computer, named `marcos`. Antoine shows Charlie where the movies are located (`/srv/video`) through the file browser (Thunar, for the record). Charlie inserts his USB key into `marcos` and a new icon for the USB key shows up. Then Charlie finds a video he likes, copies and pastes it into the USB key. But instead of a familiar progress bar, Charlie is prompted with a dialog that says "Le système de fichiers ne gère pas les liens symboliques." (Antoine is french, so excuse him, this weird message says that the filesystem doesn't support symbolic links.) Puzzled, Charlie tries to copy the file to his home directory instead. This works better, but the file has a little arrow on it, which seems odd to Charlie. He then asks Antoine for advice.
+
+Antoine then has no solution but to convert the git-annex repository into direct mode, something which takes a significant amount of time and is actually [[designated as "untrusted"|direct_mode]] in the documentation. In fact, so much so that he actually did [[screw up his repository magnificently|bugs/direct_command_leaves_repository_inconsistent_if_interrupted]] because he freaked out when `git-annex direct` started and interrupted it because he tought it would take too long.
+
+# Technical analysis
+
+Now I understand it is not necessarily `git-annex`'s responsability if Thunar (or Nautilus, for that matter), doesn't know how to properly deal with symlinks (hint: just dereference the damn thing already). Maybe I should file a bug about this against thunar? I also understand that symlinks are useful to ensure the security of the data hosted in `git-annex`, and that I could have used direct mode in the first place. But I like to track changes in git to those files, and direct mode makes that really difficult.
+
+I didn't file this as a bug because I want to start the conversation, but maybe it should qualify as a usability bug. As things stand, this is one of the biggest hurdle in teaching people about git annex.
+
+(The other being "how do i actually use git annex to sync those files instead of just copying them by hand", but that's for another story!)
+
+-- [[anarcat]]
+
+# Followup
+
+Here is a bug report filed against Thunar, with a patch to fix this behavior: https://bugzilla.xfce.org/show_bug.cgi?id=11065
+
+Similar bugs would need to be filed against Nautilus, at the very least, but probably other file managers, which makes this task a little daunting, to say the least. -- [[anarcat]]
diff --git a/doc/forum/webapp__58___disabling_a_paired_repository.mdwn b/doc/forum/webapp__58___disabling_a_paired_repository.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/webapp__58___disabling_a_paired_repository.mdwn
@@ -0,0 +1,12 @@
+I had two repositories, on different machines, created with the assistant, so they were both direct mode.
+
+After pairing each with the other, so that files were merrily flowing back and forth, I happened to do the following:
+ * on machine A, in the dashboard
+ * click on the 'actions' emnu for the repository on machine B
+ * select 'disable'
+
+Result: all references to the repo on machine B have disappeared from the assistant in machine A.
+
+On machine B, I still have the pairing with machine A, and selecting the 'sync now' action seems to be working.
+
+The thing I am curious about is the behaviour on machine A - why is it that I cannot find any reference to it any more in the assistant, so that I can re-enable it?
diff --git a/doc/forum/wishlist__58___get__47__drop_via_webapp_file_explorer.mdwn b/doc/forum/wishlist__58___get__47__drop_via_webapp_file_explorer.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/wishlist__58___get__47__drop_via_webapp_file_explorer.mdwn
@@ -0,0 +1,1 @@
+Know what'd be a sweet feature?  A file explorer in the webapp that lets you get and drop files (for a Manual local repository).  Especially when the webapp becomes available on Android.  I'd love to be able to select what is and isn't present on a small device by some means other than moving files around.
diff --git a/doc/forum/wishlist__58___make_copy_stop_on_exhausted_disk_space.mdwn b/doc/forum/wishlist__58___make_copy_stop_on_exhausted_disk_space.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/wishlist__58___make_copy_stop_on_exhausted_disk_space.mdwn
@@ -0,0 +1,4 @@
+I'm trying to distribute a large annex to a number of smaller archive drives.
+
+While copying to a directory special remote, the current behaviour is to continue trying copying files into a remote, even as diskspace there has been exhausted.
+It would make sense for git-annex copy to actually stop instead.
diff --git a/doc/git-annex-dropkey.mdwn b/doc/git-annex-dropkey.mdwn
--- a/doc/git-annex-dropkey.mdwn
+++ b/doc/git-annex-dropkey.mdwn
@@ -17,6 +17,18 @@
 Warning: This command does not check that enough other copies of the content
 exist; using it can easily result in data loss.
 
+# OPTIONS
+
+* `--batch`
+
+  Enables batch mode, in which lines containing keys to drop are read from
+  stdin.
+
+* `--json`
+
+  Enable JSON output. This is intended to be parsed by programs that use
+  git-annex. Each line of output is a JSON object.
+
 # SEE ALSO
 
 [[git-annex]](1)
diff --git a/doc/git-annex-metadata.mdwn b/doc/git-annex-metadata.mdwn
--- a/doc/git-annex-metadata.mdwn
+++ b/doc/git-annex-metadata.mdwn
@@ -19,34 +19,39 @@
 
 # OPTIONS
 
-* `-g field`
+* `-g field` / `--get field`
 
   Get the value(s) of a single field.
 
   The values will be output one per line, with no other output, so
   this is suitable for use in a script.
 
-* `-s field=value`
+* `-s field=value` / `--set field=value`
 
   Set a field's value, removing any old values.
 
-* `-s field+=value`
+* `-s field+=value` / `--set field+=value`
 
   Add an additional value, preserving any old values.
 
-* `-s field-=value`
+* `-s field?=value` / `--set field?=value`
 
-  Remove a value.
+  Set a value, but only if the field does not already have a value set.
 
-* `-s field?=value`
+* `-s field-=value` / `--set field-=value`
 
-  Set a value, but only if the field does not already have a value set.
-  
-* `-t tag`
+  Remove a value from a field, leaving any other values that the field has
+  set.
 
+* `-r field` / `--remove field`
+
+  Remove all current values of the field.
+
+* `-t tag` / `--tag tag`
+
   Set a tag. Note that a tag is just a value of the "tag" field.
 
-* `-u tag`
+* `-u tag` / `--unset tag`
 
   Unset a tag.
 
diff --git a/doc/install/Linux_standalone.mdwn b/doc/install/Linux_standalone.mdwn
--- a/doc/install/Linux_standalone.mdwn
+++ b/doc/install/Linux_standalone.mdwn
@@ -26,8 +26,7 @@
 * [[forum_thread|forum/new_linux_arm_tarball_build]]
 
 The build for ancient kernels is for use with Linux kernel versions
-such as 2.6.32. It is missing some features, like SHA3 support and
-the webapp. It will work on both 32 and 64 bit systems.
+such as 2.6.32. It will work on both 32 and 64 bit systems.
 
 ## autobuilds
 
diff --git a/doc/install/Windows.mdwn b/doc/install/Windows.mdwn
--- a/doc/install/Windows.mdwn
+++ b/doc/install/Windows.mdwn
@@ -35,8 +35,5 @@
 	cd gitannex
 	build
 
-Note that git from Cygwin is able to clone git-annex's git repository;
-Regular git for Windows cannot due to some characters in filenames.
-
 (To build the git-annex installer, you also need to install the NullSoft
 installer system.)
diff --git a/doc/install/fromsource.mdwn b/doc/install/fromsource.mdwn
--- a/doc/install/fromsource.mdwn
+++ b/doc/install/fromsource.mdwn
@@ -73,8 +73,8 @@
 
 Inside the source tree, run:
 
-	cabal install -j -f"-assistant -webapp -webdav -pairing -xmpp -dns" --only-dependencies
-	cabal configure -f"-assistant -webapp -webdav -pairing -xmpp -dns"
+	cabal install -j -f"-assistant -webapp -webdav -pairing -xmpp -dns -dbus -magicmime" --only-dependencies
+	cabal configure -f"-assistant -webapp -webdav -pairing -xmpp -dns -dbus -magicmime"
 	cabal build -j
 	PATH=$HOME/bin:$PATH
 	cabal install --bindir=$HOME/bin
@@ -98,4 +98,5 @@
 
 When building with cabal, you can optionally enable the 
 [[EKG monitoring interface|ekg]]. This is great for debugging resource
-usage problems. Just pass `-f+EKG` to `cabal configure`
+usage problems, but not for general-purpose builds.
+Just pass `-f+EKG` to `cabal configure`
diff --git a/doc/license.mdwn b/doc/license.mdwn
--- a/doc/license.mdwn
+++ b/doc/license.mdwn
@@ -9,6 +9,6 @@
 not include this code, so remains GPLed.
 
 git-annex contains a variety of other code, artwork, etc copyright by
-others, under a variety of licences, including the [[LGPL]], BSD,
+others, under a variety of licences, including the BSD,
 MIT, and Apache 2.0 licenses. For details, see
 [this file](http://source.git-annex.branchable.com/?p=source.git;a=blob_plain;f=debian/copyright;hb=HEAD).
diff --git a/doc/license/LGPL b/doc/license/LGPL
deleted file mode 100644
--- a/doc/license/LGPL
+++ /dev/null
@@ -1,502 +0,0 @@
-                  GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-                  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-                            NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
diff --git a/doc/news/version_6.20160114.mdwn b/doc/news/version_6.20160114.mdwn
deleted file mode 100644
--- a/doc/news/version_6.20160114.mdwn
+++ /dev/null
@@ -1,59 +0,0 @@
-git-annex 6.20160114 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-"hexapodia as the key insight"
-
-* Added v6 repository mode, but v5 is still the default for now.
-* unlock, lock: In v6 mode, unlocking a file changes it from a symlink to a
-  pointer file, and this change can be committed to the git repository.
-  For details, see http://git-annex.branchable.com/tips/unlocked\_files/
-* The upgrade to version 6 is not done fully automatically yet, because
-  upgrading a direct mode repository to version 6 will prevent old
-  versions of git-annex from working in other clones of that repository.
-  For details, see http://git-annex.branchable.com/upgrades/
-* init: --version parameter added to control which supported repository
-  version to use.
-* init, upgrade: Configure .git/info/attributes to use git-annex
-  as a smudge filter. In v6 repository mode, this makes git add
-  add files to the annex in unlocked mode, unless overridden by
-  annex.largefiles configuration.
-* assistant: In v6 mode, adds files in unlocked mode, so they can
-  continue to be modified.
-* Added annex.thin setting, which makes unlocked files in v6 repositories
-  be hard linked to their content, instead of a copy. This saves disk
-  space but means any modification of an unlocked file will lose the local
-  (and possibly only) copy of the old version.
-* Enable annex.thin by default on upgrade from direct mode to v6, since
-  direct mode made the same tradeoff.
-* fix: Adjusts unlocked files as configured by annex.thin.
-* persistent-sqlite is now a hard build dependency, since v6 repository
-  mode needs it.
-* status: On crippled filesystems, was displaying M for all annexed files
-  that were present. Probably caused by a change to what git status
-  displays in this situation. Fixed by treating files git thinks are
-  modified the same as typechanged files.
-* addurl: Added --batch and --with-files options.
-* addurl: Support --json, particularly useful in --batch mode.
-* addurl: Refuse to overwrite any existing, non-annexed file.
-* Debian: Adjust build dependencies for webapp, DAV. Now available on
-  mips, mipsel, but temporarily removed armel since build is failing
-  there.
-* info: Fix "backend usage" numbers, which were counting present keys
-  twice.
-* info --json: Improve json for "backend usage", using a nested object
-  with fields for each backend instead of the previous weird nested lists.
-  This may break existing parsers of this json output, if there were any.
-* whereis --json: Make url list be included in machine-parseable form.
-* test: Added --keep-failures option.
-* unused: Bug fix when a new file was added to the annex, and then
-  removed (but not git rmed). git still has the add staged in this case,
-  so the content should not be unused and was wrongly treated as such.
-* migrate: Copy over metadata to new key.
-* rekey: No longer copies over urls from the old to the new key.
-  It makes sense for migrate to do that, but not for this low-level
-  (and little used) plumbing command to.
-* view: Fix crash in non-unicode capable locale when entering a view
-  of metadata containing a slash or backslash.
-* When annex.http-headers is used to set the User-Agent header, avoid
-  sending User-Agent: git-annex
-* Windows: Fix rsync cross-drive hack to work with msys2 rsync.
-  Thanks, Pieter Kitslaar."""]]
diff --git a/doc/news/version_6.20160318.mdwn b/doc/news/version_6.20160318.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/news/version_6.20160318.mdwn
@@ -0,0 +1,18 @@
+git-annex 6.20160318 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * metadata: Added -r to remove all current values of a field.
+   * Fix data loss that can occur when annex.pidlock is set in a repository.
+   * Fix bug preventing moving files to/from a repository with annex.pidlock set.
+   * Fix shared lock file FD leak.
+   * Fix metadata hook behavior when multiple files are added at once.
+     Thanks, Klaus Ethgen.
+   * Added dependencies on haskell mountpoints and disk-free-space
+     libraries, removing FFI code from git-annex.
+   * dropkey: Add --batch and --json.
+   * Fix OSX dmg to include libraries needed by bundled gpg,
+     lost in last release.
+   * Always try to thaw content, even when annex.crippledfilesystem is set.
+   * Correct git-annex info to include unlocked files in v6 repository.
+   * Sped up git-annex add in direct mode and v6 by using
+     git hash-object --stdin-paths.
+   * Sped up git-annex merge by using git hash-object --stdin-paths."""]]
diff --git a/doc/tips/automatically_adding_metadata/pre-commit-annex b/doc/tips/automatically_adding_metadata/pre-commit-annex
--- a/doc/tips/automatically_adding_metadata/pre-commit-annex
+++ b/doc/tips/automatically_adding_metadata/pre-commit-annex
@@ -1,4 +1,4 @@
-#! /bin/sh
+#!/bin/sh
 #
 # Copyright (C) 2014 Joey Hess <id@joeyh.name>
 # Copyright (C) 2016 Klaus Ethgen <Klaus@Ethgen.ch>
@@ -112,7 +112,7 @@
 		process "$f"
 	done
 else
-	for f in "$(git diff-index --name-only --cached $against)"; do
+	git diff-index --name-only --cached $against | while read f; do
 		process "$f"
 	done
 fi
diff --git a/doc/tips/centralised_repository__58___starting_from_nothing.mdwn b/doc/tips/centralised_repository__58___starting_from_nothing.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/tips/centralised_repository__58___starting_from_nothing.mdwn
@@ -0,0 +1,71 @@
+If you are starting from nothing (no existing `git` or `git-annex` repository) and want to use a server as a centralised repository, try the following steps.
+
+On the server where you'll hold the "master" repository:
+
+	server$ cd /one/git
+	server$ mkdir m
+	server$ cd m
+	server$ git init --bare
+	Initialized empty Git repository in /one/git/m/
+	server$ git annex init origin
+	init origin ok
+	server$ 
+
+Clone that to the laptop:
+
+	laptop$ cd /other
+	laptop$ git clone ssh://server//one/git/m
+	Cloning into 'm'...
+	remote: Counting objects: 5, done.        
+	remote: Compressing objects: 100% (3/3), done.        
+	remote: Total 5 (delta 0), reused 0 (delta 0)        
+	Receiving objects: 100% (5/5), done.
+	warning: remote HEAD refers to nonexistent ref, unable to checkout.
+
+	laptop$ cd m
+	laptop$ git annex init laptop
+	init laptop ok
+        laptop$ 
+
+Add some content:
+
+	laptop$ git annex addurl http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg
+	addurl kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg (downloading http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg ...) --2011-12-15 08:13:10--  http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg
+	Resolving kitenet.net (kitenet.net)... 2001:41c8:125:49::10, 80.68.85.49
+	Connecting to kitenet.net (kitenet.net)|2001:41c8:125:49::10|:80... connected.
+	HTTP request sent, awaiting response... 200 OK
+	Length: 39362757 (38M) [audio/ogg]
+	Saving to: `/other/m/.git/annex/tmp/URL--http&c%%kitenet.net%~joey%screencasts%git-annex_coding_in_haskell.ogg'
+
+	100%[======================================>] 39,362,757  2.31M/s   in 17s     
+
+	2011-12-15 08:13:27 (2.21 MB/s) - `/other/m/.git/annex/tmp/URL--http&c%%kitenet.net%~joey%screencasts%git-annex_coding_in_haskell.ogg' saved [39362757/39362757]
+
+	(checksum...) ok
+	(Recording state in git...)
+
+Don't forget to commit it:
+
+	laptop$ git commit -m 'See Joey play.'
+	[master (root-commit) 106e923] See Joey play.
+	 1 files changed, 1 insertions(+), 0 deletions(-)
+	  create mode 120000 kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg
+	laptop$ 
+
+All fine, now push it back to the centralised master:
+
+	laptop$ git push origin master
+	Counting objects: 20, done.
+	Delta compression using up to 4 threads.
+	Compressing objects: 100% (11/11), done.
+	Writing objects: 100% (18/18), 1.50 KiB, done.
+	Total 18 (delta 1), reused 1 (delta 0)
+	To ssh://server//one/git/m
+	   3ba1386..ad3bc9e  git-annex -> git-annex
+	laptop$ 
+
+You'll probably want to use `git annex copy --to origin` to copy the
+annexed file contents to the server. See the [[walkthrough]] for details.
+
+You can add more "client" repositories by following the `laptop`
+sequence of operations.
diff --git a/doc/tips/largefiles/comment_1_b84e5cb8316c30fc7b355234384a5899._comment b/doc/tips/largefiles/comment_1_b84e5cb8316c30fc7b355234384a5899._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/largefiles/comment_1_b84e5cb8316c30fc7b355234384a5899._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="acbg@8d58f794ce92f6be28b5dbd402059bc30262eb92"
+ nickname="acbg"
+ subject="Since which version does this apply?"
+ date="2016-03-03T16:16:28Z"
+ content="""
+I use version 5.20140412, and I've tried the annex.largefiles in .gitattributes, but doesn't work.   Every file is added to .git/annex/objects, including the ones that are excluded in .gitattributes.
+
+I've just started using git-annex so maybe I'm doing something wrong...
+"""]]
diff --git a/doc/tips/largefiles/comment_2_825b72391117f88062a585684cf62eeb._comment b/doc/tips/largefiles/comment_2_825b72391117f88062a585684cf62eeb._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/largefiles/comment_2_825b72391117f88062a585684cf62eeb._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="workspace"
+ subject="same problem"
+ date="2016-03-04T20:44:26Z"
+ content="""
+I have the same problem:
+the annex.largefiles is ignored by \"git add\" when set in .gitattributes
+allthouch git check-attr does list it.
+
+but it works when set with git config annex.largefiles
+
+git annex version 6.20160126
+"""]]
diff --git a/doc/tips/largefiles/comment_3_f4df42fe943011cc8feb2921a59616e9._comment b/doc/tips/largefiles/comment_3_f4df42fe943011cc8feb2921a59616e9._comment
new file mode 100644
--- /dev/null
+++ b/doc/tips/largefiles/comment_3_f4df42fe943011cc8feb2921a59616e9._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 3"""
+ date="2016-03-07T17:23:19Z"
+ content="""
+The first version to support largefiles in .gitattributes was 6.20160211,
+so both the above commenters just have too old a version.
+"""]]
diff --git a/doc/todo/Wishlist__58___additional_environment_variables_for_hooks.mdwn b/doc/todo/Wishlist__58___additional_environment_variables_for_hooks.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/Wishlist__58___additional_environment_variables_for_hooks.mdwn
@@ -0,0 +1,14 @@
+It would be nice if a couple of additional environment variables to be set for hook uses.
+
+In particular:
+
+    GIT_ANNEX_DIRECT=`git config annex.direct`
+
+and
+
+    GIT_TOP_LEVEL=`git rev-parse --show-toplevel`
+
+
+I've made some changes to flickrannex to allow the sub-directories above the uploaded image to be added as tags.  This change has been merged into trunk: [[https://github.com/TobiasTheViking/flickrannex]]
+
+What I needed was both the environment variables mentioned above.  One is set as part of the annex-hook and the other I guestimate from the file path.  If it was set in git-annex it would be much cleaner (and accurate).  So...I think this info would be useful for other hook.
diff --git a/doc/todo/Wishlist__58___disable_auto-repair_for_the_assistant.mdwn b/doc/todo/Wishlist__58___disable_auto-repair_for_the_assistant.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/Wishlist__58___disable_auto-repair_for_the_assistant.mdwn
@@ -0,0 +1,3 @@
+Auto-repair takes up a lot of computing power, greatly slowing down the machine. It also still happens very often here, several times a month on different hardware, leading it to become an annoyance (and it would be easier and faster to perform manual repairs if that should be required).
+
+Therefore I'd like a setting that makes the assistant not attempt to repair on its own. Either not do anything at all, or display a message about it instead.
diff --git a/doc/todo/add_ancient_armel_build.mdwn b/doc/todo/add_ancient_armel_build.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/add_ancient_armel_build.mdwn
@@ -0,0 +1,10 @@
+Add an armel build like the i386ancient build.
+
+The current arm autobuilder doesn't have enough free space for the chroot
+this would need. I need to upgrade its microsd card first, adding
+approximately 5 gb. (A 16 gb card would suffice.)
+
+Now, it would be possible to switch it to only do an ancient build,
+instead of the current modern build. The downside of that is the ancient
+build environment uses debian stable, so it has old versions of git,
+libraries etc, that go into the build. --[[Joey]]
diff --git a/doc/todo/add_magicmime_support_to_OSX_dmg.mdwn b/doc/todo/add_magicmime_support_to_OSX_dmg.mdwn
--- a/doc/todo/add_magicmime_support_to_OSX_dmg.mdwn
+++ b/doc/todo/add_magicmime_support_to_OSX_dmg.mdwn
@@ -1,3 +1,5 @@
 The OSX .dmg is built without the MagicMime build flag. Turning it on will
 take some work to ship a copy of the magic database inside the dmg.
+
+> [[done]]
 --[[Joey]]
diff --git a/doc/todo/add_sftp_backend.mdwn b/doc/todo/add_sftp_backend.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/add_sftp_backend.mdwn
@@ -0,0 +1,3 @@
+A sftp backend would be nice because gpg operations could be pipelined to the network transfer, not requiring the creation of a full file to disk with gpg before the network transmission, as it happens with rsync.
+
+There should be some libraries that can handle the sftp connections and transfers. I read that even curl has support for that.
diff --git a/doc/todo/feature_request__58___pubkey-only_encryption_mode.mdwn b/doc/todo/feature_request__58___pubkey-only_encryption_mode.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/feature_request__58___pubkey-only_encryption_mode.mdwn
@@ -0,0 +1,14 @@
+### Feature request
+
+It is not possible to put encrypted content in place on remotes with just a
+public GPG key. You always need the private key, even for encryption. I
+guess this is because how the cipher HMAC is used for replacing file names
+with their hashes. However, if that requirement (having secret file names)
+was dropped, I assume a pubkey-only mode could be implemented?
+
+My specific use case is backup archiving. I have my backups packed in
+archive files and want to use git-annex to copy the archives to offsite
+remotes (S3). In that case, I don't care much about hiding file names, but
+would appreciate the increased security of not having the secret key on the
+backup server. It would only be needed if I wanted to verify or restore
+backups.
diff --git a/doc/todo/immediate_stream-to-sync.mdwn b/doc/todo/immediate_stream-to-sync.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/immediate_stream-to-sync.mdwn
@@ -0,0 +1,9 @@
+git-annex is really great for secure distributed archival, but it's missing a piece of the reliability portion: when data is generated and saved a system may crash before finishing, and some data may be lost, before the add is initiated.
+
+If there were a way to add a file at the same time as writing it -- and then at the same time stream that live data to a remote -- it would increase the utility of git-add for such uses as storing live recording and logfiles.
+
+I imagine e.g.
+
+$ cat /proc/kmsg | git annex addstreamsync livelogs/kernel-log-$(date)
+
+and kmsg would be streamed to enough remotes to meet numcopies, and hashed live .  If possible, if the system then crashed and even the entire source repo was lost, the remote would have some incomplete file and be able to complete the add properly at next sync.  Hashing the data at the same time as generating it would also speed adding any new file.
diff --git a/doc/todo/optimise_git-annex_merge.mdwn b/doc/todo/optimise_git-annex_merge.mdwn
--- a/doc/todo/optimise_git-annex_merge.mdwn
+++ b/doc/todo/optimise_git-annex_merge.mdwn
@@ -8,6 +8,9 @@
 Sometime, should look at either extending git-hash-object to support that,
 or possibly look at using git-fast-import instead.
 
+> Well, I went with git hash-object --stdin-paths despite it needing to read from
+> temp files. --[[Joey]]
+
 --- 
 
 `git-annex merge` also runs `git show` once per file that needs to be
@@ -21,3 +24,5 @@
 Merging used to use memory proportional to the size of the diff. It now
 streams data, running in constant space. This probably sped it up a lot,
 as there's much less allocation and GC action. --[[Joey]] 
+
+[[done]] 
diff --git a/doc/todo/webapp__58___show_times_of_events.mdwn b/doc/todo/webapp__58___show_times_of_events.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/webapp__58___show_times_of_events.mdwn
@@ -0,0 +1,5 @@
+In the webapp 'dashboard' page there is a column of 'message boxes' on the right hand side that appear as events occur.
+
+I would find it helpful to be able to hover over a message box and have a timestamp appear so that I know whether the event is a recent one that I might need to go look in the log for more detail about, or that I can click on the 'X' to dismiss the message.
+
+A further improvement that occurred to me is adding a link within the message box (link text something like "view log entry") that takes you to the corresponding part of the 'view log' page.
diff --git a/doc/todo/whishlist__58___temporary_relinking_to_remotes.mdwn b/doc/todo/whishlist__58___temporary_relinking_to_remotes.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/whishlist__58___temporary_relinking_to_remotes.mdwn
@@ -0,0 +1,30 @@
+Imagine the following situation:  
+You have a directory structure like this:
+
+`./`  
+`+--dir1`  
+`|+--file1 (local)`  
+`|+--file2 (remote1)`  
+`|+--file3 (remote2)`
+
+Now when these files are quite big and you need them in one directory temporarily you would need to use `git annex get dir1` to copy them all over to local. This can take some time.
+
+I whish we had a command like this:  
+`git annex getlinks dir1`  
+where git annex would try to not link to the missing local objects but to the remote ones. So there is no need to copy the data around just to use it for a short time. After you are done you could use `git annex resetlinks dir1` to reset the links to the local objects.
+
+I know that many specialremotes will not support this without much hassle, but it would be cool to be able to get atleast the links from external drives and maybe ssh remotes via sshfs.
+To keep the data consistent there can be a constraint that every action (add, sync, commit or others) first issue a `resetlinks`.
+
+What do you think of that?
+
+> Already implemented via the `annex.hardlink` configuration.
+> 
+> I don't think that separate commands/options to control whether or not
+> to hard link makes sense, because a repository containing hardlinks
+> needs to be set as untrusted to avoid breaking numcopies counting.
+> Which is done automatically by git-annex when it detects the repository
+> was cloned with `git clone --shared`.
+> 
+> [[done]]
+> --[[Joey]]
diff --git a/doc/todo/wishlist__58___--all_option_for_sync.mdwn b/doc/todo/wishlist__58___--all_option_for_sync.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___--all_option_for_sync.mdwn
@@ -0,0 +1,22 @@
+I wish to preserve all history on the backup drives using standard groups and the `sync` command. Namely, if I do the following
+
+    touch test-of-annex-backup.txt
+    git annex add test-of-annex-backup.txt
+    git commit --message='test: Create empty test-of-annex-backup.txt file'
+    git annex edit test-of-annex-backup.txt
+    echo "This line creates version 2 of this file" > test-of-annex-backup.txt
+    git annex add test-of-annex-backup.txt
+    git commit --message='test: Create version 2 of test-of-annex-backup.txt'
+    git annex sync --content --all
+
+I expect to see 2 copies of `test-of-annex-backup.txt` be copied to each accessible annex repository in the `backup` [standard group](http://git-annex.branchable.com/preferred_content/standard_groups/)
+
+At present, the `backup` standard group prefers unused files, but the `sync` command cannot act on this configuration, since it lacks an `--all` option.  This is surprising to me as a user, and appears to contradict the intent of the preferred content, as evinced by the awkward explanation of why it is there in [preferred content](http://git-annex.branchable.com/preferred_content/)
+
+Please add an `--all` option to the `sync` command
+
+Thanks
+
+Andrew
+
+> Implemented; [[done]]. --[[Joey]]
diff --git a/doc/todo/wishlist__58___--dry-run_option_for_all_commands.mdwn b/doc/todo/wishlist__58___--dry-run_option_for_all_commands.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___--dry-run_option_for_all_commands.mdwn
@@ -0,0 +1,3 @@
+Could a --dry-run option be added to the git annex commands? Or, at least, to the most common ones like `git annex add`.
+
+Given that there is no undo command, it would be nice to have the ability to simulate what git annex will do.
diff --git a/doc/todo/wishlist__58___--maxdepth_option_for_git_annex_find.mdwn b/doc/todo/wishlist__58___--maxdepth_option_for_git_annex_find.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___--maxdepth_option_for_git_annex_find.mdwn
@@ -0,0 +1,22 @@
+`git annex find` currently makes for a great way to find which files are already local, and don't need to get `git annex get` gotten; obviously `ls` just shows me all the files in a given directory, disregarding git-annex (and without recursing to subdirectories). I think that adding a '--maxdepth' option to `git annex find` would make it much easier to use at directories high up in the directory structure, since currently `git annex find` recurses all subdirectories necessarily, when I really just want to see whether or not there are git-annex files present from a given directory.
+
+Obviously, since directories themselves are not git-annex objects, there is no way to say whether or not they are "present", but perhaps the most intuitive would be to say whether or not any git-annex files under a given directory are present.
+
+For example, if I have:  
+./  
++-- subdir0/  
+|  +-- file0 (present in local git-annex repo)  
+|  +-- file1 (present in local git-annex repo)  
++-- subdir1/  
+|  +-- file0 (not present in local git-annex repo)  
+|  +-- file1 (not present in local git-annex repo)  
++-- file2 (present in local git-annex repo)  
+
+and I type `git annex find --maxdepth 1 .`, the output might look something like:  
+subdir0/  
+file2  
+
+rather than:  
+subdir0/file0  
+subdir0/file1  
+file2  
diff --git a/doc/todo/wishlist__58___Add_--byte-limit_option.mdwn b/doc/todo/wishlist__58___Add_--byte-limit_option.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___Add_--byte-limit_option.mdwn
@@ -0,0 +1,14 @@
+This option is related to `--time-limit`, but stops after processing X 
+bytes. For example, I often need to free up a certain amount of space on 
+a disk and want `git-annex move` to stop after it has copied a specified 
+amount of data:
+
+    git annex move --to otherdisk --byte-limit 3G
+    git annex drop --auto --byte-limit 500m
+    git annex get --byte-limit 500m
+
+I've been using some `annex.diskreserve` trickery now and then to 
+accomplish this, but it's a bit cumbersome and also not a very precise 
+way to specify the amount I want to copy/move/get. The last example 
+would also be a useful command to limit the traffic when I'm connecting 
+via mobile – get as much as possible, but don't blow the mobile quota.
diff --git a/doc/todo/wishlist__58___Advanced_settings_for_xmpp_and_webdav.mdwn b/doc/todo/wishlist__58___Advanced_settings_for_xmpp_and_webdav.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___Advanced_settings_for_xmpp_and_webdav.mdwn
@@ -0,0 +1,7 @@
+It would be very nice with an "advanced settings" for jabber and webdav support.
+
+Currently XMPP fails if you use a google apps account. Since the domain provided in the email is not the same as the XMPP server.
+
+Same goes for webdav support. If i have my own webdav server somewhere on the internet there is no way to set it up in the assistant.
+
+[[!tag /design/assistant]]
diff --git a/doc/todo/wishlist__58___Freeing_X_space_on_remote_Y.mdwn b/doc/todo/wishlist__58___Freeing_X_space_on_remote_Y.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___Freeing_X_space_on_remote_Y.mdwn
@@ -0,0 +1,1 @@
+As suggested during the first Gitify BoF during DebConf13: Adding a way to have on-demand dropping of content in a given remote would allow a user to quickly free up disk space on demand while still heeding numcopies etc.
diff --git a/doc/todo/wishlist__58___Option_to_specify_max_transfer_rate.mdwn b/doc/todo/wishlist__58___Option_to_specify_max_transfer_rate.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___Option_to_specify_max_transfer_rate.mdwn
@@ -0,0 +1,3 @@
+A big part of my online use is done via a low-speed connection over my mobile phone, this is limited to 16KB/sec because I always use up my 500MB quota the very first day of the month. `;-/` So when I need to download big files, I first download them to my online server, then transfer the files to my laptop with git-annex. If I'm connected via GSM, this occupies all the bandwidth and everything else moves like a heavily sedated slug. So if I want to work via VNC or SSH, I have to terminate ongoing transfers with Ctrl-C and then hopefully remember to restart it when I work locally. I know git-annex is robust enough to handle this gracefully, but it would be really nice to have a continuous connection going on in the background, limited to a value I choose.
+
+rsync(1) has a `--bwlimit` (bandwidth limit) where you can specify max download/upload speed in kilobytes/sec. It would be great if a similar option was integrated into git-annex. Thanks in advance.
diff --git a/doc/todo/wishlist__58___Parity_files_for_encrypted_remotes.mdwn b/doc/todo/wishlist__58___Parity_files_for_encrypted_remotes.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___Parity_files_for_encrypted_remotes.mdwn
@@ -0,0 +1,7 @@
+I have data that has accompanying parity files.  This is supposed to add some
+security to file integrity; however, it only works as long as the files are
+available unencrypted.  In case of encrypted special remotes the existing parity files
+won't be of any use if the encrypted versions of files get corrupted in the remote location.
+
+Would it be worthwhile for git-annex to generate its own
+parity files for the encrypted data in encrypted special remotes?
diff --git a/doc/todo/wishlist__58___Restore_s3_files_moved_to_Glacier.mdwn b/doc/todo/wishlist__58___Restore_s3_files_moved_to_Glacier.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___Restore_s3_files_moved_to_Glacier.mdwn
@@ -0,0 +1,7 @@
+I would like to use the automated AWS lifecycle rules to move the git annex files store on S3 to Glacier after a bit of time. Git annex need must support this kind of S3 files explicitly in order for it to work.
+
+This is different from the adding a Glacier remote to git annex because of the reasons explained in <http://aws.typepad.com/aws/2012/11/archive-s3-to-glacier.html>.
+
+Basically, the files moved by AWS from S3 to Glacier are not available under the normal Glacier API. In fact, the moved S3 files are listed as available but under the `GLACIER` storage class and need a RESTORE request before they can be GET like other S3 files. Trying to GET an S3 file that has been moved to Glacier will not restore it from Glacier and will result in an 403 error.
+
+I suppose DELETE needs special care as well.
diff --git a/doc/todo/wishlist__58_____39__get__39___queue_and_schedule..mdwn b/doc/todo/wishlist__58_____39__get__39___queue_and_schedule..mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58_____39__get__39___queue_and_schedule..mdwn
@@ -0,0 +1,32 @@
+During the campaign adding a chunking feature to obscure filesize for encrypted files was added to the roadmap.  But there is still one potentially valuable set* of data that git-annex can help obscure: when you access your remotes.
+
+This data can be used to determine when a user is actively using a remote, but if a remote is always accessed at the same time that data becomes less useful.  Somebody could still monitor total traffic over a long period and figure out that a remote was more active in a given week or month, but scheduling reduces the resolution of your access times and their data.  Maybe this isn't the most important feature to add, but it would be nice to have, and could possibly be built on top of the existing git-annex scheduler.  It could work by queuing inter-remote transactions ('get', 'copy', 'sync', etc.), so that jobs start at the same time every day, or even the same time and day every week.
+
+Possible syntax examples:
+###Setting up the schedule:
+git annex queue schedule Monday:1730 (starts every monday at 5:30PM)
+
+git annex queue schedule 1400 (starts every day at 2PM)
+
+###Queuing git-annex commands:
+git annex queue prepend sync (pretends 'sync' to the very front of the queue)
+
+git annex queue append get file.ISO (appends to queue file.ISO for retrieval from a repo)
+
+###Viewing/editing queue:
+git annex queue view (view the current queue, jobs displayed with corresponding numbers)
+
+git annex queue rm 20 (removes job 20 from queue)
+
+
+\*The four I can think of are:
+
+* File contents (solved by crypto)
+
+* File size (solved on the remote by chunking, but total traffic usage can't be helped)
+
+* User IP/Remote IP (solved by VPN - outside scope of git-annex, unless someone writes a plugin)
+
+* Access times (obscured by a queue and scheduling)
+
+Note, there is a [[git-annex-schedule]] command now, but it only does `fsck`.
diff --git a/doc/todo/wishlist__58_____39__whereis__39___support_in_the_webapp.mdwn b/doc/todo/wishlist__58_____39__whereis__39___support_in_the_webapp.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58_____39__whereis__39___support_in_the_webapp.mdwn
@@ -0,0 +1,4 @@
+I've looked for this feature in the webapp but can't find it...
+
+I mainly use the webapp and have been wondering 'how many copies of file X are there' and 'where are the copies of file Y'?
+This is available in the commandline interface but it would be nice to have this in the webapp too.
diff --git a/doc/todo/wishlist__58_____96__git_annex_drop_--relaxed__96__.mdwn b/doc/todo/wishlist__58_____96__git_annex_drop_--relaxed__96__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58_____96__git_annex_drop_--relaxed__96__.mdwn
@@ -0,0 +1,5 @@
+Also suggested during the first Gitify BoF during DebConf13:
+
+`git annex drop` deletes immediately. In some situations a mechanism to tell git-annex "I would like to hold onto this data if possible, but if you need the space, please delete it" could be nice.
+
+An obvious question would be how to do cleanups. With the assistant, that's easy. On CLI, at the very least `git annex fsck` should list, and optionally delete, that data.
diff --git a/doc/todo/wishlist__58_____96__git_annex_optimize__96__.mdwn b/doc/todo/wishlist__58_____96__git_annex_optimize__96__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58_____96__git_annex_optimize__96__.mdwn
@@ -0,0 +1,6 @@
+Given [this tip](https://git-annex.branchable.com/forum/__34__git_annex_sync__34___synced_after_8_hours/#comment-890ca1381d800ac833ccbb8c5db175ea), [this comment](https://git-annex.branchable.com/todo/wishlist:_rsync_efficiency/#comment-870ae805efd35343edefdbed792dac04) and possibly others, it would be nice if git-annex could look at any given repo and make suggestions for improvements. As a second step, it could look at remotes as well. And as a third, maybe even change repo settings and not just make suggestions.
+
+Having a few old repos with terabytes of data on various disks, I would just toss this stanza into my mr templates to eventually optimize all my repos to current best practices.
+
+
+-- Richard
diff --git a/doc/todo/wishlist__58_____96__git_annex_sync_-m__96__.mdwn b/doc/todo/wishlist__58_____96__git_annex_sync_-m__96__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58_____96__git_annex_sync_-m__96__.mdwn
@@ -0,0 +1,11 @@
+Similar to how
+
+    git commit -m 'foo'
+
+works, if I run 
+
+    git annex sync -m 'my hovercraft is full of eels'
+
+git annex should use that commit message instead of the default ones. That way, I could use [[sync]] directly and not be forced to commit prior to syncing just to make sure I have a useful commit message.
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/todo/wishlist__58_____96__git_annex_sync__96___without_auto-commit.mdwn b/doc/todo/wishlist__58_____96__git_annex_sync__96___without_auto-commit.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58_____96__git_annex_sync__96___without_auto-commit.mdwn
@@ -0,0 +1,8 @@
+I would like to have way, ideally a per-repo-cloud setting which syncs around automatically, to not have `git annex sync` autocommit staged additions.
+
+I often have quite complex additions with a mix of `git add` and `git annex add` in various stages of completion; running `git annex sync` regularly to see what state the other repos are in should not autocommit if possible.
+
+Richard
+
+> [[done]]; extended the annex.autocommit that previously only controlled the
+> assistant to also control `git annex sync`. --[[Joey]]
diff --git a/doc/todo/wishlist__58___add_--symlink_option_to_import.mdwn b/doc/todo/wishlist__58___add_--symlink_option_to_import.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___add_--symlink_option_to_import.mdwn
@@ -0,0 +1,3 @@
+Make 'git annex import' for each imported file leave a symlink behind. One may consider this a bit nasty as this introduces symlinks out of the annex. There are also some things careful to consider, link to the annexed symlinks or into the .git/annex/objects store? the first breaks views, the second relies on implementation details. Shall these be absolute (i'd say yes) or relative (won't harm) links etc. But after all it gives a easier migration and possibly even some new usage to manage files outside of the annex. A sister-command for 'export' comes in mind, drop a symlink anywhere. Anyways, when you feel this is a good idea, keep it, otherwise just delete this idea. Thanks ;)
+
+> Closing as I don't think this is a good idea. [[done]] --[[Joey]]
diff --git a/doc/todo/wishlist__58___add_repository_name_to_commit_messages.mdwn b/doc/todo/wishlist__58___add_repository_name_to_commit_messages.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___add_repository_name_to_commit_messages.mdwn
@@ -0,0 +1,3 @@
+The commit messages made by git-annex are quite spartan, especially in direct mode where one cannot enter its own commit messages. This means that all that the messages say is "branch created", "git-annex automatic sync", "update", "merging" or little more.
+
+It would be nice if git-annex could add at least the name of the repository/remote to the commit message. This would make the log a lot more clear, especially when dealing with problems or bugs.
diff --git a/doc/todo/wishlist__58___allow_custom_S3_url_in_webapp.mdwn b/doc/todo/wishlist__58___allow_custom_S3_url_in_webapp.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___allow_custom_S3_url_in_webapp.mdwn
@@ -0,0 +1,3 @@
+It is now relatively easy to build your own S3-compatible storage system with software such as Ceph radosgw or Openstack Swift.
+
+So a way for users to specify their own S3 url would come pretty handy in the webapp's "add S3 remote" page.
diff --git a/doc/todo/wishlist__58___allow_re-adding_without_generating_log_entry.mdwn b/doc/todo/wishlist__58___allow_re-adding_without_generating_log_entry.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___allow_re-adding_without_generating_log_entry.mdwn
@@ -0,0 +1,11 @@
+I keep a database file in git-annex so it stays synced across several machines. My wrapper when accessing it is basically
+
+    git annex sync --content
+    git annex unlock $database
+    [access database]
+    git annex add $database
+    git annex sync --content
+
+This works fine except it creates an entry in the log for the database file even if that stays unchanged. I would like an option that just returns to the state before `git annex unlock` if the file has not been changed. Maybe `git annex add --restore-unchanged`?
+
+> [[done]] --[[Joey]]
diff --git a/doc/todo/wishlist__58___annex.largefiles_support_for_mimetypes.mdwn b/doc/todo/wishlist__58___annex.largefiles_support_for_mimetypes.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___annex.largefiles_support_for_mimetypes.mdwn
@@ -0,0 +1,7 @@
+It would be nice to have mimetype support on the `annex.largefiles` configuration directive. F.e. `git config annex.largefiles "not mimetype=text/plain"`
+
+> [[done]]; Implemented support for mimetype=text/plain or even
+> mimetype=text/*
+> 
+> Decided not to add external command test support, at least not for now.
+> --[[Joey]]
diff --git a/doc/todo/wishlist__58___archive_from_remote_with_the_least_free_space.mdwn b/doc/todo/wishlist__58___archive_from_remote_with_the_least_free_space.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___archive_from_remote_with_the_least_free_space.mdwn
@@ -0,0 +1,1 @@
+An interesting feature, when an archived file cannot be removed from all clients because of the minimum number of copies required, would be to remove it from the repositories with the smallest amount of free space available.
diff --git a/doc/todo/wishlist__58___derived_content_support.mdwn b/doc/todo/wishlist__58___derived_content_support.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___derived_content_support.mdwn
@@ -0,0 +1,8 @@
+I handle some video and music files with git annex and it would be awesome if git annex supported tracking of relations between files.
+
+Example:
+I have music in flac on my htpc, but i think flac is way overkill to have on my Android device, so i transcode them to ogg/mp3 on my htpc and then sync them to my Android device.
+
+Transcoding is a good example for this type of feature, but there might be other uses too.
+
+The basic thing is to know a file is a "copy" of another file, but its a generated result, so the actual file is not important, but the source is.
diff --git a/doc/todo/wishlist__58___disable_automatic_commits.mdwn b/doc/todo/wishlist__58___disable_automatic_commits.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___disable_automatic_commits.mdwn
@@ -0,0 +1,36 @@
+When using the [[/assistant]] on some of my repositories, I would like to
+retain manual control over the granularity and contents of the commit
+history.  Some motivating reasons:
+
+* manually specified commit messages makes the history easier to follow
+* make a series of minor changes to a file over a period of a few hours would result in a single commit rather than capturing intermediate incomplete edits
+
+* manual choice of which files to annex (based on predicted usage) could be useful, e.g. a repo might contain a 4MB PDF which you want available in *every* remote even without `git annex get`, and also some 2MB images which are only required in some remotes
+
+> This particular case is now catered to by the ["manual" repository group](/preferred_content/standard_groups/)
+> in [[preferred content]] settings. --[[Joey]]
+
+Obviously this needs to be configurable at least per repository, and
+ideally perhaps even per remote, since usage habits can vary from machine
+to machine (e.g. I could choose to commit manually from my desktop machine
+which has a nice comfy keyboard and large screen, but this would be too
+much pain to do from my tiny netbook).
+
+In fact, this is vaguely related to [[design/assistant/partial_content]],
+since the usefulness of the commit history depends on the context of the
+data being manipulated, which in turn depends on which subdirectories are
+being touched.  So any mechanism for disabling sync per directory could
+potentially be reused for disabling auto-commit per directory.
+
+According to Joey, it should be easy to arrange for the watcher thread not
+to run, but would need some more work for the assistant to notice manual
+commits in order to sync them; however the assistant already does some
+crazy inotify watching of git refs, in order to detect incoming pushes, so
+detecting manual commits wouldn't be a stretch.
+
+[[!tag design/assistant]]
+
+> You can do this now by pausing committing via the webapp,
+> or setting `annex.autocommit=false`.
+> 
+> The assistant probably doesn't push such commits yet.
diff --git a/doc/todo/wishlist__58___display_status_of_remotes_in_the_webapp.mdwn b/doc/todo/wishlist__58___display_status_of_remotes_in_the_webapp.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___display_status_of_remotes_in_the_webapp.mdwn
@@ -0,0 +1,1 @@
+It would be nice to have an indication of the status of the remotes in the webapp, for example with a field showing "In Sync", "Syncing", or the date of the last successful synchronization for unreachable remotes.
diff --git a/doc/todo/wishlist__58___do_not_import_new_files.mdwn b/doc/todo/wishlist__58___do_not_import_new_files.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___do_not_import_new_files.mdwn
@@ -0,0 +1,7 @@
+[[!meta title="mass reinject of any known content from a directory"]]
+
+Right now `git annex import DIR/*` will import all the files in DIR, both those that are already known to git-annex and those that are new. Using the option `--skip-duplicates` one can import only new files that are in DIR but unknown to git-annex.
+
+It would be nice if there were an opposite `--only-duplicates` option that could be used to import only the files that are already known to git, ignoring the new files in DIR.
+
+PS: it would also be nice to have aliases like `--only-new-files` and `--skip-new-files` for `--skip-duplicates` and `--only-duplicates`.
diff --git a/doc/todo/wishlist__58___do_round_robin_downloading_of_data.mdwn b/doc/todo/wishlist__58___do_round_robin_downloading_of_data.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___do_round_robin_downloading_of_data.mdwn
@@ -0,0 +1,5 @@
+Given that git/config will have information on remotes and maybe costs, it might be a good idea to do a simple round robin selection of remotes to download files where the costs are the same.
+
+This of course assumes that we like the idea of "parallel" launching and running of curl/rsync processes...
+
+This wish item is probably only useful for the paranoid people who store more than 1 copy of their data.
diff --git a/doc/todo/wishlist__58___generic_annex.cost-command.mdwn b/doc/todo/wishlist__58___generic_annex.cost-command.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___generic_annex.cost-command.mdwn
@@ -0,0 +1,17 @@
+### Current setup
+
+ATM git-annex has
+
+remote.<name>.annex-cost
+remote.<name>.annex-cost-command  # command is not provided cmdline options by annex
+
+to set the cost for a given remote.  That requires setting up one of those variables per each host, and possibly hardcoding options for the annex-cost-command providing e.g. the remote name.
+
+### Suggestion
+
+wouldn't it be more general and thus more flexible to have a repository-wide
+
+annex.cost-command
+
+which could take options %remote, %file and assessed accordingly per each file upon '--get' request to allow maximal flexibility: e.g. some files might better be fetched from remotes supporting transfer compression, some from the web, etc.  Also it might be worth providing %remote_kind ("special" vs "git") to disambiguate %remote's?
+
diff --git a/doc/todo/wishlist__58___git_annex_diff.mdwn b/doc/todo/wishlist__58___git_annex_diff.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___git_annex_diff.mdwn
@@ -0,0 +1,13 @@
+git diff is not very helpful for annexed files.
+
+How about a git annex diff command that allows to compare two versions of an annexed file?
+
+Should be relatively simple, only there would have to be a way to deal with the situation where not both versions are present in the repository. Either abort with a message showing the command you need to run to get the missing version(s). Or even interactively volunteer to get it automatically, asking the user for confirmation.
+
+Of course you wouldn't want to diff two large files, but with git annex assistant, all files are annexed by default (right?), so this would be useful.
+
+There might already be a way to easily diff two versions of an annexed file which I'm missing -- in that case please point me to it! :)
+
+> [[done]]; rather than adding a `git annex diff`, I made git-annex be able to be used as a git diff driver command,
+> which in turn can run some third-party external diff driver that does
+> some smart handling of binary files.
diff --git a/doc/todo/wishlist__58___git_annex_info_._also_return_numcopies_setting.mdwn b/doc/todo/wishlist__58___git_annex_info_._also_return_numcopies_setting.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___git_annex_info_._also_return_numcopies_setting.mdwn
@@ -0,0 +1,44 @@
+The stats produced by `git annex info .` are nice but I often find myself separately looking up the actual numcopies set value.  Can this also be included in the report please?
+
+> There is not necessarily one single numcopies setting; gitattributes
+> can configure different numcopies for different files.
+> 
+> The numcopies stats in the report are reported as plus or
+> minus relative to the numcopies setting. Using a relative number like
+> that, it can eliminate the complexity of which files have which
+> numcompies setting.
+
+<pre>
+numcopies stats: 
+	numcopies +0: 27
+	numcopies +1: 43
+	numcopies +2: 1
+</pre>
+
+> What could be added is a summary of the absolute number of copies
+> that exist of files, without taking the numcopies configuration
+> into account.
+
+<pre>
+absolute number of copies:
+	1 copy: 47
+	2 copies: 23
+	3 copies: 1
+</pre>
+
+> It turns out you can already get this display though!
+> Just use `git annex info . --numcopies=0`.
+
+<pre>
+numcopies stats: 
+	numcopies +1: 47
+	numcopies +2: 23
+	numcopies +3: 1
+</pre>
+
+> So, in this mode, it's showing the number of copies that exist of files,
+> relative to numcopies, which is forced to be 0. So, there are 47 files
+> with 1 copy, 23 with 2 copies, and 1 with 3 copies.
+> 
+> I think I've convinced myself no changes need to be made! [[done]]
+> --[[Joey]]
diff --git a/doc/todo/wishlist__58___git_annex_info_UUID.mdwn b/doc/todo/wishlist__58___git_annex_info_UUID.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___git_annex_info_UUID.mdwn
@@ -0,0 +1,11 @@
+All repos contain some level of information about all other tracked repositories.
+It would be nice if I could see that info, preferably with a timestamp telling me when the last sync happened.
+
+`git annex info UUID/name` would be suggestion.
+
+
+Thanks,
+Richard
+
+> I left out the stuff that `vicfg` displays. But otherwise
+> everything mentioned on this page is [[done]]. --[[Joey]]
diff --git a/doc/todo/wishlist__58___git_annex_info_UUID/comment_2._comment b/doc/todo/wishlist__58___git_annex_info_UUID/comment_2._comment
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___git_annex_info_UUID/comment_2._comment
@@ -0,0 +1,8 @@
+One piece of information that's sometimes useful, but not always, is to get a count of keys present in another remote plus the size of the remote.
+
+Thus, I could verify that some repos are empty, archive repos have every single file, etc etc.
+
+I still think that info is best suited for `git annex info name/UUID` as it's more volatile than what `git annex vicfg` displays.
+
+
+Richard
diff --git a/doc/todo/wishlist__58___global_progress_status.mdwn b/doc/todo/wishlist__58___global_progress_status.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___global_progress_status.mdwn
@@ -0,0 +1,3 @@
+similar to [[do_not_bug_me_about_intermediate_files]] - i feel that massive `git annex get` operations should have better progress information than the current individual `rsync --progress` bits. i wonder if this couldn't be accomplished with `rsync --info=PROGRESS2`, which gives overall rsync progress, combined with copying multiple files at once with rsync (which would have the side-effect of speeding up `git annex get` for large number of small files).
+
+once this is done, it could be sent back to the webapp UI to give the user a global sense of the overall sync progress (as opposed to per-file progress). --[[anarcat]]
diff --git a/doc/todo/wishlist__58___history_of_operations.mdwn b/doc/todo/wishlist__58___history_of_operations.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___history_of_operations.mdwn
@@ -0,0 +1,8 @@
+Hi,
+
+I would love to have a page of "history" or "events" in the webapp. Similar to how Dropbox or Box show it.
+I've been using git-annex for my personal files for a few months now, and I feel like this is the only feature missing to start using it in a production multi-user environment.
+
+Thanks
+
+[[!tag design/assistant]]
diff --git a/doc/todo/wishlist__58___make_git_annex_reinject_work_in_direct_mode.mdwn b/doc/todo/wishlist__58___make_git_annex_reinject_work_in_direct_mode.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___make_git_annex_reinject_work_in_direct_mode.mdwn
@@ -0,0 +1,21 @@
+### Please describe the problem.
+
+`git annex reinject` refuses to work while in direct mode.
+
+When in direct mode git annex reinject could simply perform `rm $symlink; mv $file_copy .; git annex add $file`. I prefer having git annex doing that so I am sure I am not messing up (mistakenly adding new files for instance) and everything is properly managed.
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex 4.20130516.1
+
+~~~~
+$ lsb_release -a
+No LSB modules are available.
+Distributor ID:	Ubuntu
+Description:	Ubuntu 12.04.2 LTS
+Release:	12.04
+Codename:	precise
+~~~~
+
+> [[fixed|done]]. Why did I take so long to do this, it was a trivial 1
+> word change! --[[Joey]]
diff --git a/doc/todo/wishlist__58___make_partial_files_available_during_transfer.mdwn b/doc/todo/wishlist__58___make_partial_files_available_during_transfer.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___make_partial_files_available_during_transfer.mdwn
@@ -0,0 +1,18 @@
+Imagine this situation:
+You have a laptop and a NAS.
+On your laptop you want to consume a large media file located on the NAS.
+So you type:
+
+    git annex get --from nas mediafile
+
+But now you have to wait for the download to complete, unless either 
+
+* rsync is pointed directly to the file in the object storage ("--inplace")
+or
+* the symlink temporarily points to the partial file during a transfer
+
+which would allow you instantaneous consumption of your media.
+It might make sense to make this behavior configurable, because not everyone might agree with having partial content (that mismatches its key) around.
+
+
+So what do you say?
diff --git a/doc/todo/wishlist__58___matching_options_for_branches.mdwn b/doc/todo/wishlist__58___matching_options_for_branches.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___matching_options_for_branches.mdwn
@@ -0,0 +1,1 @@
+I have a repository layout where I have multiple unrelated branches in a single repository. Different branches have different policies regarding where their content should be replicated. It would be nice to be able to reflect this with git-annex's matching and preferred content options, but currently there seems to be no way to say "include/exclude files referred to in these branches".
diff --git a/doc/todo/wishlist__58___more_info_in_commit_messages_in_general.mdwn b/doc/todo/wishlist__58___more_info_in_commit_messages_in_general.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___more_info_in_commit_messages_in_general.mdwn
@@ -0,0 +1,8 @@
+This is probably an extension of [[wishlist: more info in the standard commit message of `sync`]]:
+
+It would also help debugging if the default commit messages listed, e.g., the name of all the files modified by that commit (or merge).
+
+> No, it would not help debugging to put redundant info in commit
+> messages. It will only make your repository take up more disk space.
+> git log --stat will already show you the files changes by
+> any commit.  [[wontfix|done]] --[[Joey]]
diff --git a/doc/todo/wishlist__58___pack_metadata_in_direct_mode.mdwn b/doc/todo/wishlist__58___pack_metadata_in_direct_mode.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___pack_metadata_in_direct_mode.mdwn
@@ -0,0 +1,5 @@
+The metadata storage for direct mode (V3) is this. In directory .git/annex/objects, there is one .map for all annexed file, and one .cache for all files in the working tree. Both are small files, containing only 1 line or a few lines. I have a repo with lots of photos, and this created lots of small files. I believe this will cause many performance issues. 
+
+It would be great if these files are packed, maybe also in the git pack files format.
+
+[[!meta tag=deprecateddirectmode]]
diff --git a/doc/todo/wishlist__58___perform_fsck_remotely.mdwn b/doc/todo/wishlist__58___perform_fsck_remotely.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___perform_fsck_remotely.mdwn
@@ -0,0 +1,39 @@
+Currently, when `fsck`'ing a remote, files are first downloaded to a temporary 
+file locally, decrypted if needed, and finally digested; the temporary file is
+then either thrown away, or quarantined, depending on the value of that digest.
+
+Whereas this approach works with any kind of remote, in the particular case 
+where the user is granted execution rights on the digest command, one could
+avoid cluttering the network and digest the file remotely. I propose the
+addition of a per-remote git option `annex-remote-fsck` to switch between the
+two behaviors.
+
+
+There is an issue with encrypted specialremotes, though. As hinted at 
+[[here|tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/#comment-70055f166f7eeca976021d24a736b471]],
+since the digest of a ciphertext can't be deduced from that of a plaintext in 
+general one would needs, before sending an encrypted file to such a remote, to
+digest it and store that digest somewhere (together with the cipher's size and
+perhaps other meta-information).
+
+The usual directory structure (`.../.../{backend}-s{size}--{digest}.log`) seems
+perfectly suitable to store these informations. Lines there would look like
+`{timestamp}s {numcopy} {UUID} {remote digest}`. Of course, it implies that
+remote digest commands are trustworthy (are doing the right thing), and that
+the digest output are not tampered by others who have access to the git repo.
+But that's outside the current threat model, I guess.
+
+Actually, since git-annex always includes a MDC in the ciphertexts, we could do
+something clever and even avoid running a digest algorithm. According to the
+[[OpenPGP standard|https://tools.ietf.org/html/rfc4880#section-5.14]] the MDC
+is essentially a SHA-1 hash of the plaintext. I'm still investigating if it's
+even possible, but in theory it would be enough (with non-chained ciphers at
+least) to download a few bytes from the encrypted remote, decrypt those bytes
+to retrieve the hash, and compare that hash with the known value. Of course
+there is a downside here, namely that files tampered anywhere but on the MDC
+packets would not be detected by `fsck` (but gpg will warn when decrypting the
+file).
+
+
+My 2 cents :-) Is there something I missed? I suppose there was a reason to 
+perform `fsck` locally at the first place...
diff --git a/doc/todo/wishlist__58___print_locations_for_files_in_rsync_remote.mdwn b/doc/todo/wishlist__58___print_locations_for_files_in_rsync_remote.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___print_locations_for_files_in_rsync_remote.mdwn
@@ -0,0 +1,6 @@
+Based on an irc conversation earlier today:
+
+19:50 < warp> joeyh: what is the best way to figure out the (remote) filename for a file stored in an rsync remote?
+
+20:43 < joeyh> warp: re your other question, probably the best thing would be to make the whereis command print out locations for each remote, as it always does for the web special remotes
+
diff --git a/doc/todo/wishlist__58___recursive_directory_remote_setup__47__addurl.mdwn b/doc/todo/wishlist__58___recursive_directory_remote_setup__47__addurl.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___recursive_directory_remote_setup__47__addurl.mdwn
@@ -0,0 +1,7 @@
+I think it would be interesting to have a way to recursively import a local directory without actually moving files around. And to be able to checksum these files as well (without moving them into the annex).
+
+This would work somewhat similar to looping over a directory and adding file:// remotes for each file.
+
+A use case is importing optical media (read-only), whilst keeping that media as a remote, and being able to calculate checksums directly without moving any files around.
+
+For single files, it would also be interesting if addurl had a "--localchecksum" option that would only work for file:// urls, and make it checksum files directly from their source location?)
diff --git a/doc/todo/wishlist__58___rsync_efficiency.mdwn b/doc/todo/wishlist__58___rsync_efficiency.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___rsync_efficiency.mdwn
@@ -0,0 +1,8 @@
+If you look at the transfer rates during a copy job to remotes, you see it going down to zero for a short time between files.
+
+While that's understandable from rsync's PoV, it's not as efficient as git-annex could be.
+
+Would parallelization be an option? Are there alternate improvements?
+
+
+-- Richard
diff --git a/doc/todo/wishlist__58___special_remote_Ubuntu_One.mdwn b/doc/todo/wishlist__58___special_remote_Ubuntu_One.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___special_remote_Ubuntu_One.mdwn
@@ -0,0 +1,1 @@
+Special remote support for [Ubuntu One](http://one.ubuntu.com) would be nice. They're [using propietary but open protocol](https://wiki.ubuntu.com/UbuntuOne/TechnicalDetails#ubuntuone-storageprotocol) based on [Google Protocol Buffers](http://code.google.com/p/protobuf/). There's [protobuf for Haskell](http://code.google.com/p/protobuf-haskell/) so it should be possible to compile [the protocol file](http://bazaar.launchpad.net/~ubuntuone-control-tower/ubuntuone-storage-protocol/trunk/view/head:/ubuntuone/storageprotocol/protocol.proto) to Haskell code and then use that to implement the native Ubuntu special remote.
diff --git a/doc/todo/wishlist__58___swift_backend.mdwn b/doc/todo/wishlist__58___swift_backend.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___swift_backend.mdwn
@@ -0,0 +1,5 @@
+[swift](http://swift.openstack.org/) is the object storage of Openstack. Think S3, but fully open source. As it's backed by rackspace.com, NASA, Dell and several other major players, adoption rates will explode.
+
+I can provide a test account soonish if need be, else rackspace.com if offering swift storage. Their API gateway lives at https://auth.api.rackspacecloud.com/v1.0
+
+Richard
diff --git a/doc/todo/wishlist__58___traffic_accounting_for_git-annex.mdwn b/doc/todo/wishlist__58___traffic_accounting_for_git-annex.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___traffic_accounting_for_git-annex.mdwn
@@ -0,0 +1,3 @@
+As git annex keeps logs about file transfers anyway, it should be relatively easy to add traffic accounting to a repo. That would allow me to monitor how much traffic a given repo generates. As I might end up hosting git-annex repos for a few personal friends, I need/want a way to track the heavy hitters. -- RichiH
+
+PS: If you ever plan to host git-annex similar branchable, this would probably be of interest to you, as well :)
diff --git a/doc/todo/wishlist__58___unify_directory_scheme_for_the_store.mdwn b/doc/todo/wishlist__58___unify_directory_scheme_for_the_store.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___unify_directory_scheme_for_the_store.mdwn
@@ -0,0 +1,20 @@
+In regular repos, objects are stored in files of the form: .git/annex/objects/xY/z1/SHA1-.../SHA1-.... (scheme 1)
+
+On (some) special remotes, the corresponding file is stored at: .../abc/def/SHA1-... (scheme 2)
+
+I'm not sure why the same scheme as in .git/objects isn't used, but it would be useful that the two-directory prefix were the same for all objects stores.
+
+My use case is: I synchronize a git repo, say containing photos, to a server on which I can't install git-annex. I want the server to store all annexed files. For the photos to be viewed online, the annex store must use the scheme 1 (because the symlinks point to files with scheme 1). So I need to rsync .git/annex/objects manually from my desktop, because a git-annex rsync remote uses scheme 2. On the other hand, the repo on this server is not known by git-annex (like it would if I used a rsync remote).
+
+At least it would be valuable (to get around above problem) to have a plumbing command giving the 2-directory prefix from a given key, for example:
+
+$ git annex prefix-dir SHA1-s2--3f786850e387550fdab836ed7e6dc881
+
+7w/88
+
+f18/122
+
+
+Even if the 2 schemes were unified, this prefix-dir command would still be useful when hacking around git-annex (for now I need to maintain a dictionary structure).
+
+Thanks a lot.
diff --git a/doc/todo/wishlist__58___use_hardlinks_for_local_clones.mdwn b/doc/todo/wishlist__58___use_hardlinks_for_local_clones.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58___use_hardlinks_for_local_clones.mdwn
@@ -0,0 +1,9 @@
+as far as I know, if you `git clone` locally a git-annex enabled repository, it will not have all the files available. you would need to use `git annex get` and all files would be copied over, wasting a significant amount of space.
+
+`git-clone` has this `--local` flags which hardlinks objects in `.git/objects`, but also, maybe more interestingly, has a `--shared` option to simply tell git to look in another repo for objects. it seems to me git-annex could leverage those functionalities to avoid file duplication when using local repositories.
+
+this would be especially useful for [ikiwiki](http://ikiwiki.info/forum/ikiwiki_and_big_files).
+
+This is a [[wishlist]], but I would also welcome implementation pointers to do this myself, thanks! --[[anarcat]]
+
+> [[dup|done]]
diff --git a/doc/todo/wishlist__58__alias_system.mdwn b/doc/todo/wishlist__58__alias_system.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/wishlist__58__alias_system.mdwn
@@ -0,0 +1,1 @@
+To implement things like my custom `git annex-push` without the dash, i.e. `git annex push`, an alias system for git-annex would be nice.
diff --git a/doc/users/datalad.mdwn b/doc/users/datalad.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/users/datalad.mdwn
@@ -0,0 +1,23 @@
+TODOs for DataLad
+=================
+
+[[!inline pages="todo/* and !todo/done and !link(todo/done) and
+(author(yoh) or author(mih))" sort=mtime feeds=no actions=yes archive=yes show=0]]
+
+Done
+----
+
+[[!inline pages="todo/* and !todo/done and link(todo/done) and
+(author(yoh) or author(mih))" feeds=no actions=yes archive=yes show=0]]
+
+My bugs
+=======
+
+[[!inline pages="bugs/* and !bugs/done and !link(bugs/done) and
+(author(yoh) or author(mih))" sort=mtime feeds=no actions=yes archive=yes show=0  template=buglist]]
+
+Fixed
+-----
+
+[[!inline pages="bugs/* and !bugs/done and link(bugs/done) and
+(author(yoh) or author(mih))" feeds=no actions=yes archive=yes show=0  template=buglist]]
diff --git a/doc/users/mih.mdwn b/doc/users/mih.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/users/mih.mdwn
@@ -0,0 +1,23 @@
+My todos
+========
+
+[[!inline pages="todo/* and !todo/done and !link(todo/done) and
+author(mih)" sort=mtime feeds=no actions=yes archive=yes show=0]]
+
+Done
+----
+
+[[!inline pages="todo/* and !todo/done and link(todo/done) and
+author(mih)" feeds=no actions=yes archive=yes show=0]]
+
+My bugs
+=======
+
+[[!inline pages="bugs/* and !bugs/done and !link(bugs/done) and
+author(mih)" sort=mtime feeds=no actions=yes archive=yes show=0  template=buglist]]
+
+Fixed
+-----
+
+[[!inline pages="bugs/* and !bugs/done and link(bugs/done) and
+author(mih)" feeds=no actions=yes archive=yes show=0  template=buglist]]
diff --git a/doc/walkthrough.mdwn b/doc/walkthrough.mdwn
--- a/doc/walkthrough.mdwn
+++ b/doc/walkthrough.mdwn
@@ -9,18 +9,18 @@
 	walkthrough/renaming_files
 	walkthrough/getting_file_content
 	walkthrough/syncing
-	walkthrough/transferring_files:_When_things_go_wrong
+	walkthrough/transferring_files__58___When_things_go_wrong
 	walkthrough/removing_files
-	walkthrough/removing_files:_When_things_go_wrong
+	walkthrough/removing_files__58___When_things_go_wrong
 	walkthrough/modifying_annexed_files
 	walkthrough/using_ssh_remotes
 	walkthrough/using_special_remotes
 	walkthrough/moving_file_content_between_repositories
-	walkthrough/quiet_please:_When_git-annex_seems_to_skip_files
+	walkthrough/quiet_please__58___When_git-annex_seems_to_skip_files
 	walkthrough/using_tags_and_branches
 	walkthrough/unused_data
-	walkthrough/fsck:_verifying_your_data
-	walkthrough/fsck:_when_things_go_wrong
+	walkthrough/fsck__58___verifying_your_data
+	walkthrough/fsck__58___when_things_go_wrong
 	walkthrough/backups
 	walkthrough/automatically_managing_content
 	walkthrough/more
diff --git a/doc/walkthrough/fsck__58___verifying_your_data.mdwn b/doc/walkthrough/fsck__58___verifying_your_data.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/walkthrough/fsck__58___verifying_your_data.mdwn
@@ -0,0 +1,36 @@
+You can use the fsck subcommand to check for problems in your data. What
+can be checked depends on the key-value [[backend|backends]] you've used
+for the data. For example, when you use the SHA1 backend, fsck will verify
+that the checksums of your files are good. Fsck also checks that the
+[[numcopies|copies]] setting is satisfied for all files.
+
+	# git annex fsck
+	fsck some_file (checksum...) ok
+	fsck my_cool_big_file (checksum...) ok
+	...
+
+You can also specify the files to check.  This is particularly useful if 
+you're using sha1 and don't want to spend a long time checksumming everything.
+
+	# git annex fsck my_cool_big_file
+	fsck my_cool_big_file (checksum...) ok
+
+If you have a large repo, you may want to check it in smaller steps. You may
+start and continue an aborted or time-limited check.
+
+	# git annex fsck -S <optional-directory> --time-limit=1m
+	fsck some_file (checksum...) ok
+	fsck my_cool_big_file (checksum...) ok
+	
+	  Time limit (1m) reached!
+
+	# git annex fsck -m <optional-directory>
+	fsck my_other_big_file (checksum...) ok
+	...
+
+Use `-S` or `--incremental` to start the incremental check. Use `-m` 
+or `--more` to continue the started check and continue where it left 
+off. Note that saving the progress of `fsck` is performed after every 
+1000 files or 5 minutes or when `--time-limit` occours. There may be 
+files that will be checked again when `git-annex` exists abnormally 
+eg. Ctrl+C and the check is restarted.
diff --git a/doc/walkthrough/fsck__58___when_things_go_wrong.mdwn b/doc/walkthrough/fsck__58___when_things_go_wrong.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/walkthrough/fsck__58___when_things_go_wrong.mdwn
@@ -0,0 +1,13 @@
+Fsck never deletes possibly bad data; instead it will be moved to
+`.git/annex/bad/` for you to recover. Here is a sample of what fsck
+might say about a badly messed up annex:
+
+	# git annex fsck
+	fsck my_cool_big_file (checksum...)
+	git-annex: Bad file content; moved to .git/annex/bad/SHA1:7da006579dd64330eb2456001fd01948430572f2
+	git-annex: ** No known copies exist of my_cool_big_file
+	failed
+	fsck important_file
+	git-annex: Only 1 of 2 copies exist. Run git annex get somewhere else to back it up.
+	failed
+	git-annex: 2 failed
diff --git a/doc/walkthrough/quiet_please__58___When_git-annex_seems_to_skip_files.mdwn b/doc/walkthrough/quiet_please__58___When_git-annex_seems_to_skip_files.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/walkthrough/quiet_please__58___When_git-annex_seems_to_skip_files.mdwn
@@ -0,0 +1,27 @@
+One behavior of git-annex is sometimes confusing at first, but it turns out
+to be useful once you get to know it.
+
+	# git annex drop *
+	# 
+
+Why didn't git-annex seem to do anything despite being asked to drop all the
+files? Because it checked them all, and none of them are present.
+
+Most git-annex commands will behave this way when they're able to quickly
+check that nothing needs to be done about a file.
+
+Running a git-annex command without specifying any file name will
+make git-annex look for files in the current directory and its
+subdirectories. So, we can add all new files to the annex easily:
+
+	# echo hi > subdir/subsubdir/newfile
+	# git annex add
+	add subdir/subsubdir/newfile ok
+
+When doing this kind of thing, having nothing shown for files
+that it doesn't need to act on is useful because it prevents swamping
+you with output. You only see the files it finds it does need to act on.
+
+So remember: If git-annex seems to not do anything when you tell it to, it's
+not being lazy -- It's checked that nothing needs to be done to get to the
+state you asked for!
diff --git a/doc/walkthrough/removing_files__58___When_things_go_wrong.mdwn b/doc/walkthrough/removing_files__58___When_things_go_wrong.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/walkthrough/removing_files__58___When_things_go_wrong.mdwn
@@ -0,0 +1,24 @@
+Before dropping a file, git-annex wants to be able to look at other
+remotes, and verify that they still have a file. After all, it could
+have been dropped from them too. If the remotes are not mounted/available,
+you'll see something like this.
+
+	# git annex drop important_file other.iso
+	drop important_file (unsafe)
+	  Could only verify the existence of 0 out of 1 necessary copies
+	  Unable to access these remotes: usbdrive
+	  Try making some of these repositories available:
+	   	58d84e8a-d9ae-11df-a1aa-ab9aa8c00826  -- portable USB drive
+	   	ca20064c-dbb5-11df-b2fe-002170d25c55  -- backup SATA drive
+	  (Use --force to override this check, or adjust numcopies.)
+	failed
+	drop other.iso (unsafe)
+	  Could only verify the existence of 0 out of 1 necessary copies
+          No other repository is known to contain the file.
+	  (Use --force to override this check, or adjust numcopies.)
+	failed
+
+Here you might --force it to drop `important_file` if you [[trust]] your backup.
+But `other.iso` looks to have never been copied to anywhere else, so if
+it's something you want to hold onto, you'd need to transfer it to
+some other repository before dropping it.
diff --git a/doc/walkthrough/transferring_files__58___When_things_go_wrong.mdwn b/doc/walkthrough/transferring_files__58___When_things_go_wrong.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/walkthrough/transferring_files__58___When_things_go_wrong.mdwn
@@ -0,0 +1,17 @@
+After a while, you'll have several annexes, with different file contents.
+You don't have to try to keep all that straight; git-annex does 
+[[location_tracking]] for you. If you ask it to get a file and the drive
+or file server is not accessible, it will let you know what it needs to get
+it:
+
+	# git annex get video/hackity_hack_and_kaxxt.mov
+	get video/hackity_hack_and_kaxxt.mov (not available)
+	  Unable to access these remotes: usbdrive, server
+	  Try making some of these repositories available:
+	  	5863d8c0-d9a9-11df-adb2-af51e6559a49  -- my home file server
+	   	58d84e8a-d9ae-11df-a1aa-ab9aa8c00826  -- portable USB drive
+	   	ca20064c-dbb5-11df-b2fe-002170d25c55  -- backup SATA drive
+	failed
+	# sudo mount /media/usb
+	# git annex get video/hackity_hack_and_kaxxt.mov
+	get video/hackity_hack_and_kaxxt.mov (from usbdrive...) ok
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: 6.20160229
+Version: 6.20160318
 Cabal-Version: >= 1.8
 License: GPL-3
 Maintainer: Joey Hess <id@joeyh.name>
@@ -143,11 +143,8 @@
       process (>= 1.3.0.0)
   else
     Build-Depends: unix
-    -- Need to list these because they're generated from .hsc files.
-    Other-Modules: Utility.Touch Utility.Mounts
-    Include-Dirs: Utility
-    C-Sources: Utility/libdiskfree.c Utility/libmounts.c
-    CPP-Options: -DWITH_CLIBS
+    if impl(ghc <= 7.6.3)
+      Other-Modules: Utility.Touch.Old
 
   if flag(TestSuite)
     Build-Depends: tasty (>= 0.7), tasty-hunit, tasty-quickcheck, tasty-rerun,
@@ -163,7 +160,7 @@
     CPP-Options: -DWITH_WEBDAV
 
   if flag(Assistant) && ! os(solaris)
-    Build-Depends: dns
+    Build-Depends: dns, mountpoints
     CPP-Options: -DWITH_ASSISTANT
 
   if flag(Assistant)
@@ -195,6 +192,9 @@
   if flag(Android)
     Build-Depends: data-endian
     CPP-Options: -D__ANDROID__ -DANDROID_SPLICES -D__NO_TH__
+  else
+    Build-Depends: disk-free-space
+
   if flag(AndroidSplice)
     CPP-Options: -DANDROID_SPLICES
 
diff --git a/git-union-merge.hs b/git-union-merge.hs
--- a/git-union-merge.hs
+++ b/git-union-merge.hs
@@ -44,5 +44,5 @@
 	_ <- Git.Index.override $ tmpIndex g
 	setup g
 	Git.UnionMerge.merge aref bref g
-	_ <- Git.Branch.commit "union merge" newref [aref, bref] g
+	_ <- Git.Branch.commit Git.Branch.ManualCommit False "union merge" newref [aref, bref] g
 	cleanup g
diff --git a/man/git-annex-dropkey.1 b/man/git-annex-dropkey.1
--- a/man/git-annex-dropkey.1
+++ b/man/git-annex-dropkey.1
@@ -16,6 +16,16 @@
 
 exist; using it can easily result in data loss.
 .PP
+.SH OPTIONS
+.IP "\fB\-\-batch\fP"
+.IP
+Enables batch mode, in which lines containing keys to drop are read from
+stdin.
+.IP
+.IP "\fB\-\-json\fP"
+Enable JSON output. This is intended to be parsed by programs that use
+git-annex. Each line of output is a JSON object.
+.IP
 .SH SEE ALSO
 git-annex(1)
 .PP
diff --git a/man/git-annex-metadata.1 b/man/git-annex-metadata.1
--- a/man/git-annex-metadata.1
+++ b/man/git-annex-metadata.1
@@ -16,29 +16,33 @@
 When run without any \-s or \-t parameters, displays the current metadata.
 .PP
 .SH OPTIONS
-.IP "\fB\-g field\fP"
+.IP "\fB\-g field\fP / \fB\-\-get field\fP"
 .IP
 Get the value(s) of a single field.
 .IP
 The values will be output one per line, with no other output, so
 this is suitable for use in a script.
 .IP
-.IP "\fB\-s field=value\fP"
+.IP "\fB\-s field=value\fP / \fB\-\-set field=value\fP"
 Set a field's value, removing any old values.
 .IP
-.IP "\fB\-s field+=value\fP"
+.IP "\fB\-s field+=value\fP / \fB\-\-set field+=value\fP"
 Add an additional value, preserving any old values.
 .IP
-.IP "\fB\-s field\-=value\fP"
-Remove a value.
-.IP
-.IP "\fB\-s field?=value\fP"
+.IP "\fB\-s field?=value\fP / \fB\-\-set field?=value\fP"
 Set a value, but only if the field does not already have a value set.
 .IP
-.IP "\fB\-t tag\fP"
+.IP "\fB\-s field\-=value\fP / \fB\-\-set field\-=value\fP"
+Remove a value from a field, leaving any other values that the field has
+set.
+.IP
+.IP "\fB\-r field\fP / \fB\-\-remove field\fP"
+Remove all current values of the field.
+.IP
+.IP "\fB\-t tag\fP / \fB\-\-tag tag\fP"
 Set a tag. Note that a tag is just a value of the "tag" field.
 .IP
-.IP "\fB\-u tag\fP"
+.IP "\fB\-u tag\fP / \fB\-\-unset tag\fP"
 Unset a tag.
 .IP
 .IP "\fB\-\-force\fP"
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -19,4 +19,8 @@
     ekg: false
 packages:
 - '.'
-resolver: lts-5.0
+resolver: lts-5.5
+extra-deps:
+- mountpoints-1.0.1
+- disk-free-space-0.1.0.1
+- process-1.3.0.0
diff --git a/standalone/android/Makefile b/standalone/android/Makefile
--- a/standalone/android/Makefile
+++ b/standalone/android/Makefile
@@ -49,8 +49,8 @@
 	
 $(GIT_ANNEX_ANDROID_SOURCETREE)/git/build-stamp: git.patch
 	# This is a known-good version that the patch works with.
-	cat git.patch | (cd $(GIT_ANNEX_ANDROID_SOURCETREE)/git && git reset --hard f9dc5d65ca31cb79893e1296efe37727bf58f3f3 && git am)
-	cd $(GIT_ANNEX_ANDROID_SOURCETREE)/git && $(MAKE) install NO_OPENSSL=1 NO_GETTEXT=1 NO_GECOS_IN_PWENT=1 NO_GETPASS=1 NO_NSEC=1 NO_MKDTEMP=1 NO_PTHREADS=1 NO_PERL=1 NO_CURL=1 NO_EXPAT=1 NO_TCLTK=1 NO_ICONV=1 HAVE_CLOCK_GETTIME= prefix= DESTDIR=installed-tree
+	cat git.patch | (cd $(GIT_ANNEX_ANDROID_SOURCETREE)/git && git reset --hard d9c691a759d62cef53a6cc11864a2ef4b0829244 && git am)
+	cd $(GIT_ANNEX_ANDROID_SOURCETREE)/git && $(MAKE) install NO_OPENSSL=1 NO_GETTEXT=1 NO_GECOS_IN_PWENT=1 NO_GETPASS=1 NO_NSEC=1 NO_MKDTEMP=1 NO_PTHREADS=1 NO_PERL=1 NO_CURL=1 NO_EXPAT=1 NO_TCLTK=1 NO_ICONV=1 HAVE_CLOCK_GETTIME= HAVE_GETDELIM= prefix= DESTDIR=installed-tree
 	touch $@
 
 $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync/build-stamp: rsync.patch
diff --git a/standalone/android/git.patch b/standalone/android/git.patch
--- a/standalone/android/git.patch
+++ b/standalone/android/git.patch
@@ -1,4 +1,4 @@
-From 6134cc328f513e32895462e884487513b28029ba Mon Sep 17 00:00:00 2001
+From e0fffe80a8815e64dbc1d690c79bf006651c7642 Mon Sep 17 00:00:00 2001
 From: Joey Hess <joey@kitenet.net>
 Date: Wed, 13 Aug 2014 13:50:56 -0400
 Subject: [PATCH] avoid using of chmod on android when changing config
@@ -10,17 +10,17 @@
  1 file changed, 4 insertions(+)
 
 diff --git a/config.c b/config.c
-index 058505c..16854b2 100644
+index 9ba40bc..a350638 100644
 --- a/config.c
 +++ b/config.c
-@@ -1634,12 +1634,14 @@ int git_config_set_multivar_in_file(const char *config_filename,
- 			MAP_PRIVATE, in_fd, 0);
+@@ -2124,12 +2124,14 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
  		close(in_fd);
+ 		in_fd = -1;
  
 +		/* not on android
- 		if (chmod(lock->filename, st.st_mode & 07777) < 0) {
+ 		if (chmod(get_lock_file_path(lock), st.st_mode & 07777) < 0) {
  			error("chmod on %s failed: %s",
- 				lock->filename, strerror(errno));
+ 			      get_lock_file_path(lock), strerror(errno));
  			ret = CONFIG_NO_WRITE;
  			goto out_free;
  		}
@@ -28,14 +28,14 @@
  
  		if (store.seen == 0)
  			store.seen = 1;
-@@ -1813,11 +1815,13 @@ int git_config_rename_section_in_file(const char *config_filename,
+@@ -2329,11 +2331,13 @@ int git_config_rename_section_in_file(const char *config_filename,
  
  	fstat(fileno(config_file), &st);
  
 +	/* not on android
- 	if (chmod(lock->filename, st.st_mode & 07777) < 0) {
+ 	if (chmod(get_lock_file_path(lock), st.st_mode & 07777) < 0) {
  		ret = error("chmod on %s failed: %s",
- 				lock->filename, strerror(errno));
+ 			    get_lock_file_path(lock), strerror(errno));
  		goto out;
  	}
 +	*/
@@ -43,5 +43,5 @@
  	while (fgets(buf, sizeof(buf), config_file)) {
  		int i;
 -- 
-2.1.0.rc1
+2.1.4
 
diff --git a/standalone/android/install-haskell-packages b/standalone/android/install-haskell-packages
--- a/standalone/android/install-haskell-packages
+++ b/standalone/android/install-haskell-packages
@@ -65,7 +65,7 @@
 installgitannexdeps () {
 	pushd ../..
 	ln -sf standalone/android/cabal.config
-	cabal install --only-dependencies --flags="-magicmime -concurrent-output" "$@" # --force-reinstalls --reinstall
+	cabal install --only-dependencies --flags="-magicmime -concurrentoutput" "$@" # --force-reinstalls --reinstall
 	rm -f cabal.config
 	popd
 }
diff --git a/standalone/licences.gz b/standalone/licences.gz
Binary files a/standalone/licences.gz and b/standalone/licences.gz differ
