diff --git a/Codec/Encryption/OpenPGP/Serialize.hs b/Codec/Encryption/OpenPGP/Serialize.hs
--- a/Codec/Encryption/OpenPGP/Serialize.hs
+++ b/Codec/Encryption/OpenPGP/Serialize.hs
@@ -6,10 +6,11 @@
 module Codec.Encryption.OpenPGP.Serialize (
    putSKAddendum
  , getSecretKey
+ , putTK'
 ) where
 
 import Control.Applicative ((<$>),(<*>))
-import Control.Lens ((^.))
+import Control.Lens ((^.), _1)
 import Control.Monad (guard, liftM, mplus, replicateM, replicateM_)
 import qualified Crypto.PubKey.RSA as R
 import qualified Crypto.PubKey.DSA as D
@@ -158,6 +159,10 @@
     get = getSignaturePayload
     put = putSignaturePayload
 
+-- instance Serialize TK where
+--     get = undefined
+--     put = putTK
+
 getSigSubPacket :: Get SigSubPacket
 getSigSubPacket = do
     l <- fmap fromIntegral getSubPacketLength
@@ -1214,6 +1219,19 @@
 putSignaturePayload (SigVOther pv bs) = do
     putWord8 pv
     putByteString bs
+
+putTK' key = runPut $ putTK key
+
+putTK key = do
+    put (PublicKey (key^.tkKey._1))
+    mapM_ (put . Signature) (_tkRevs key)
+    mapM_ putUid' (_tkUIDs key)
+    mapM_ putUat' (_tkUAts key)
+    mapM_ putSub' (_tkSubs key)
+    where
+        putUid' (u, sps) = put (UserId u) >> mapM_ (put . Signature) sps
+        putUat' (us, sps) = put (UserAttribute us) >> mapM_ (put . Signature) sps
+        putSub' (p, sps) = put p >> mapM_ (put . Signature) sps
 
 -- Stolen from Axman6
 many :: Get a -> Get [a]
diff --git a/Codec/Encryption/OpenPGP/Types.hs b/Codec/Encryption/OpenPGP/Types.hs
--- a/Codec/Encryption/OpenPGP/Types.hs
+++ b/Codec/Encryption/OpenPGP/Types.hs
@@ -676,6 +676,9 @@
 
 instance Hashable Pkt
 
+instance Ord Pkt where
+    compare = comparing pktTag <> comparing hash -- FIXME: is there something saner?
+
 pktTag :: Pkt -> Word8
 pktTag (PKESKPkt {}) = 1
 pktTag (SignaturePkt _) = 2
diff --git a/Data/Conduit/OpenPGP/Keyring/Instances.hs b/Data/Conduit/OpenPGP/Keyring/Instances.hs
--- a/Data/Conduit/OpenPGP/Keyring/Instances.hs
+++ b/Data/Conduit/OpenPGP/Keyring/Instances.hs
@@ -46,7 +46,11 @@
     compare (SigVOther {}) (SigV4 {}) = GT
 
 instance Semigroup TK where
-    (<>) a b = TK (_tkKey a) (nub . sort $ _tkRevs a ++ _tkRevs b) ((kvmerge `on` _tkUIDs) a b) ((kvmerge `on` _tkUAts) a b) ((ukvmerge `on` _tkSubs) a b)
+    (<>) a b = TK (_tkKey a)
+                  (nub . sort $ _tkRevs a ++ _tkRevs b)
+                  ((kvmerge `on` _tkUIDs) a b)
+                  ((kvmerge `on` _tkUAts) a b)
+                  ((ukvmerge `on` _tkSubs) a b)
       where
         kvmerge x y = Map.toList (Map.unionWith nsa (Map.fromList x) (Map.fromList y))
         ukvmerge x y = HashMap.toList (HashMap.unionWith nsa (HashMap.fromList x) (HashMap.fromList y))
diff --git a/hOpenPGP.cabal b/hOpenPGP.cabal
--- a/hOpenPGP.cabal
+++ b/hOpenPGP.cabal
@@ -1,5 +1,5 @@
 Name:                hOpenPGP
-Version:             1.4
+Version:             1.5
 Synopsis:            native Haskell implementation of OpenPGP (RFC4880)
 Description:         native Haskell implementation of OpenPGP (RFC4880)
 Homepage:            http://floss.scru.org/hOpenPGP/
@@ -255,4 +255,4 @@
 source-repository this
   type:     git
   location: git://git.debian.org/users/clint/hOpenPGP.git
-  tag:      v1.4
+  tag:      v1.5
