diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,10 @@
+git-annex (3.20121017) unstable; urgency=low
+
+  * Fix zombie cleanup reversion introduced in 3.20121009.
+  * Additional fix to support git submodules.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 16 Oct 2012 21:10:14 -0400
+
 git-annex (3.20121016) unstable; urgency=low
 
   * vicfg: New file format, avoids ambiguity with repos that have the same
diff --git a/CmdLine.hs b/CmdLine.hs
--- a/CmdLine.hs
+++ b/CmdLine.hs
@@ -21,7 +21,6 @@
 import qualified Annex
 import qualified Annex.Queue
 import qualified Git
-import qualified Git.Command
 import qualified Git.AutoCorrect
 import Annex.Content
 import Annex.Ssh
@@ -118,6 +117,5 @@
 shutdown nocommit = do
 	saveState nocommit
 	sequence_ =<< M.elems <$> Annex.getState Annex.cleanup
-	liftIO Git.Command.reap -- zombies from long-running git processes
 	sshCleanup -- ssh connection caching
 	return True
diff --git a/Command.hs b/Command.hs
--- a/Command.hs
+++ b/Command.hs
@@ -39,6 +39,7 @@
 import Logs.Trust
 import Config
 import Annex.CheckAttr
+import qualified Git.Command
 
 {- Generates a normal command -}
 command :: String -> String -> [CommandSeek] -> String -> Command
@@ -83,11 +84,14 @@
 	where
 		start   = stage $ maybe skip perform
 		perform = stage $ maybe failure cleanup
-		cleanup = stage $ status
+		cleanup = stage $ end
 		stage = (=<<)
 		skip = return True
 		failure = showEndFail >> return False
-		status r = showEndResult r >> return r
+		end r = do
+			-- zombies from long-running git processes
+			liftIO Git.Command.reap
+			showEndResult r >> return r
 
 {- Modifies an action to only act on files that are already annexed,
  - and passes the key and backend on to it. -}
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -157,7 +157,7 @@
 	zcat standalone/licences.gz > $(LINUXSTANDALONE_DEST)/LICENSE
 
 	for bin in $(THIRDPARTY_BINS); do \
-		cp "$$(which "$$bin")" "$(LINUXSTANDALONE_DEST)/bin/" || echo "$$bin not available; skipping"; \
+		cp "$$(which "$$bin")" "$(LINUXSTANDALONE_DEST)/bin/"; \
 	done
 	
 	install -d "$(LINUXSTANDALONE_DEST)/git-core"
@@ -197,7 +197,7 @@
 	cp $(OSXAPP_BASE)/LICENSE $(GIT_ANNEX_TMP_BUILD_DIR)/build-dmg/LICENSE.txt
 
 	for bin in $(THIRDPARTY_BINS); do \
-		cp "$$(which "$$bin")" "$(OSXAPP_BASE)/bin/" || echo "$$bin not available; skipping"; \
+		cp "$$(which "$$bin")" "$(OSXAPP_BASE)/bin/"; \
 	done
 
 	install -d "$(OSXAPP_BASE)/git-core"
diff --git a/Utility/Directory.hs b/Utility/Directory.hs
--- a/Utility/Directory.hs
+++ b/Utility/Directory.hs
@@ -15,14 +15,12 @@
 import Control.Monad.IfElse
 import System.FilePath
 import Control.Applicative
-import System.Posix.Directory
 import System.IO.Unsafe (unsafeInterleaveIO)
 
 import Utility.SafeCommand
 import Utility.TempFile
 import Utility.Exception
 import Utility.Monad
-import Utility.Path
 
 dirCruft :: FilePath -> Bool
 dirCruft "." = True
diff --git a/debian/changelog b/debian/changelog
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+git-annex (3.20121017) unstable; urgency=low
+
+  * Fix zombie cleanup reversion introduced in 3.20121009.
+  * Additional fix to support git submodules.
+
+ -- Joey Hess <joeyh@debian.org>  Tue, 16 Oct 2012 21:10:14 -0400
+
 git-annex (3.20121016) unstable; urgency=low
 
   * vicfg: New file format, avoids ambiguity with repos that have the same
diff --git a/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code.mdwn b/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code.mdwn
@@ -0,0 +1,24 @@
+What steps will reproduce the problem?
+
+I have an Annex with about 18k files in it.  If I clone it and then run `git annex get .`, it gets a few thousand files and then starts reporting:
+
+    get 2004-2012/Originals/110414_0362.jpg (from titan...) 
+    rsync: fork: Resource temporarily unavailable (35)
+    rsync error: error in IPC code (code 14) at pipe.c(63) [Receiver=3.0.9]
+
+I have to abort and re-run `git annex get .` several times to finally get all of the files.
+
+What is the expected output? What do you see instead?
+
+I didn't expect what I saw!  I think there's a resource not being released in the `get` code.
+
+What version of git-annex are you using? On what operating system?
+
+master branch, d430fb1.
+
+Please provide any additional information below.
+
+OS X 10.8.2.  The machine has tons of RAM and tons of process handles free.  It's really not doing anything else but this git-annex at the time of my tests.
+
+> [[done]], this is a bug introduced in 3.20121009, and I've reverted the
+> buggy change. --[[Joey]]
diff --git a/doc/design/assistant/blog/.day_107__memory_leak.mdwn.swp b/doc/design/assistant/blog/.day_107__memory_leak.mdwn.swp
deleted file mode 100644
Binary files a/doc/design/assistant/blog/.day_107__memory_leak.mdwn.swp and /dev/null differ
diff --git a/doc/news/version_3.20120924.mdwn b/doc/news/version_3.20120924.mdwn
deleted file mode 100644
--- a/doc/news/version_3.20120924.mdwn
+++ /dev/null
@@ -1,30 +0,0 @@
-git-annex 3.20120924 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * assistant: New command, a daemon which does everything watch does,
-     as well as automatically syncing file contents between repositories.
-     See [[assistant]] for details and [[assistant/errata]] for known
-     issues in this beta feature.
-   * webapp: An interface for managing and configuring the assistant.
-   * The default backend used when adding files to the annex is changed
-     from SHA256 to SHA256E, to simplify interoperability with OSX, media
-     players, and various programs that needlessly look at symlink targets.
-     To get old behavior, add a .gitattributes containing: * annex.backend=SHA256
-   * init: If no description is provided for a new repository, one will
-     automatically be generated, like "joey@gnu:~/foo"
-   * test: Set a lot of git environment variables so testing works in strange
-     environments that normally need git config to set names, etc.
-     Closes: #[682351](http://bugs.debian.org/682351) Thanks, gregor herrmann
-   * Disable ssh connection caching if the path to the control socket would be
-     too long (and use relative path to minimise path to the control socket).
-   * migrate: Check content before generating the new key, to avoid generating
-     a key for corrupt data.
-   * Support repositories created with --separate-git-dir. Closes: #[684405](http://bugs.debian.org/684405)
-   * reinject: When the provided file doesn't match, leave it where it is,
-     rather than moving to .git/annex/bad/
-   * Avoid crashing on encoding errors in filenames when writing transfer info
-     files and reading from checksum commands.
-   * sync: Pushes the git-annex branch to remote/synced/git-annex, rather
-     than directly to remote/git-annex.
-   * Now supports matchig files that are present on a number of remotes
-     with a specified trust level. Example: --copies=trusted:2
-     Thanks, Nicolas Pouillard"""]]
diff --git a/doc/news/version_3.20121017.mdwn b/doc/news/version_3.20121017.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/news/version_3.20121017.mdwn
@@ -0,0 +1,4 @@
+git-annex 3.20121017 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * Fix zombie cleanup reversion introduced in 3.20121009.
+   * Additional fix to support git submodules."""]]
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: 3.20121016
+Version: 3.20121017
 Cabal-Version: >= 1.8
 License: GPL
 Maintainer: Joey Hess <joey@kitenet.net>
