diff --git a/Gale/Gale.hs b/Gale/Gale.hs
--- a/Gale/Gale.hs
+++ b/Gale/Gale.hs
@@ -21,7 +21,6 @@
 import Data.List
 import Data.Maybe
 import System.Time
-import System.Timeout (timeout)
 
 import Control.Concurrent
 import Control.Concurrent.Async (async, wait)
@@ -189,27 +188,29 @@
                 ct <- getClockTime
                 let ef = \xs -> ((fromString "_ginsu.timestamp",FragmentTime ct):(fromString "_ginsu.spumbuster", FragmentText (packString (bsToHex hash))):xs)
                 p' <- galeDecryptPuff gc Puff { signature = [], cats = cat, fragments = ef puff}
-                np <- case [(kh, k, data_, sig)
-                           | RequestingKey kh k data_ sig <- signature p'] of
-                      [] -> return p'
-                      (kh, k, data_, sig):_ -> do
-                        res <- timeout 4000000 $ wait kh
-                        let unver = p' { signature = [Unverifyable k] }
-                        case res of
-                          Just x -> case x of
-                            DestEncrypted (k':_) -> do
-                              mkey <- verifySignature k' data_ sig
-                              return $ p' { signature = [mkey] }
-                            _ -> return unver
-                          Nothing -> return unver
-                writeChan (channel gc) np
-                case getFragmentData np f_answerKey' of
-                    Just d -> putKey (keyCache gc) d
-                    Nothing -> return ()
-                case (cats np,getFragmentString np f_answerKeyError') of
-                    ([Category (n,d)],Just _) | "_gale.key." `isPrefixOf` n -> noKey (keyCache gc) (catShowNew $ Category (drop 10 n,d))
-                    (_,_) -> return ()
-                maybeReplyToKeyQuery gc np
+                case [(kh, k, data_, sig)
+                     | RequestingKey kh k data_ sig <- signature p'] of
+                  [] -> finishPuff p'
+                  (kh, k, data_, sig):_ -> void $ forkIO $ do
+                    let encs = [s | s@(Encrypted _) <- signature p']
+                        unver = p' { signature = Unverifyable k:encs }
+                    dest <- wait kh
+                    np <- case dest of
+                      DestEncrypted (k':_) -> do
+                        mkey <- verifySignature k' data_ sig
+                        return $ p' { signature = mkey:encs }
+                      _ -> return unver
+                    finishPuff np
+              where
+                finishPuff np = do
+                  writeChan (channel gc) np
+                  case getFragmentData np f_answerKey' of
+                      Just d -> putKey (keyCache gc) d
+                      Nothing -> return ()
+                  case (cats np,getFragmentString np f_answerKeyError') of
+                      ([Category (n,d)],Just _) | "_gale.key." `isPrefixOf` n -> noKey (keyCache gc) (catShowNew $ Category (drop 10 n,d))
+                      (_,_) -> return ()
+                  maybeReplyToKeyQuery gc np
 
 maybeReplyToKeyQuery :: GaleContext -> Puff -> IO ()
 maybeReplyToKeyQuery gc p | Just kn <- getFragmentString p f_questionKey = do
diff --git a/Gale/KeyCache.hs b/Gale/KeyCache.hs
--- a/Gale/KeyCache.hs
+++ b/Gale/KeyCache.hs
@@ -73,8 +73,7 @@
 numberKeys kc = fmap Map.size $ readMVar (kkeyCache kc)
 
 keyIsPubKey :: HasFragmentList a => a -> Bool
-keyIsPubKey k = not (hasFragment k f_rsaPrivateExponent)
-                && hasFragment k f_rsaExponent
+keyIsPubKey k = hasFragment k f_rsaExponent
 keyIsPrivKey :: HasFragmentList a => a -> Bool
 keyIsPrivKey k =  (hasFragment k f_rsaPrivateExponent)
 keyIsPublic :: HasFragmentList a => a -> Bool
@@ -88,7 +87,7 @@
 
 keyToRSAElems :: Monad m => Key -> m (RSAElems BS.ByteString)
 keyToRSAElems fl = do
-    if not (keyIsPrivKey fl) then fail "key does not have bits" else do
+    if not (keyIsPubKey fl) then fail "key does not have bits" else do
     n <- getFragmentData fl f_rsaModulus
     e <- getFragmentData fl f_rsaExponent
     if not (keyIsPrivKey fl) then
diff --git a/ginsu.cabal b/ginsu.cabal
--- a/ginsu.cabal
+++ b/ginsu.cabal
@@ -1,6 +1,6 @@
 -- vim:et
 Name:		ginsu
-Version:	0.8.2
+Version:	0.8.2.1
 Copyright:	2002-2009 John Meacham <john@repetae.net>
                 2011-2012 Dylan Simon <dylan@dylex.net>
 Author:		John Meacham <john@foo.net>
