diff --git a/HOpenPGP/Tools/ExpressionParsing.hs b/HOpenPGP/Tools/ExpressionParsing.hs
--- a/HOpenPGP/Tools/ExpressionParsing.hs
+++ b/HOpenPGP/Tools/ExpressionParsing.hs
@@ -64,7 +64,7 @@
                 <|> (A.asciiCI "dsa" *> pure (PKPPKA DSA))
                 <|> (A.asciiCI "elgamal" *> pure (PKPPKA ElgamalEncryptOnly))
                 <|> (A.asciiCI "ecdsa" *> pure (PKPPKA ECDSA))
-                <|> (A.asciiCI "ec" *> pure (PKPPKA EC))
+                <|> (A.asciiCI "ecdh" *> pure (PKPPKA ECDH))
                 <|> (A.asciiCI "dh" *> pure (PKPPKA DH))
                 <|> (PKPInt <$> hexordec)
 
diff --git a/hkt.hs b/hkt.hs
--- a/hkt.hs
+++ b/hkt.hs
@@ -59,7 +59,7 @@
 import Data.Tuple (swap)
 import System.Directory (getHomeDirectory)
 
-import Options.Applicative.Builder (argument, command, footer, header, help, info, long, metavar, option, prefs, progDesc, showDefault, showHelpOnError, str, strOption, subparser, switch, value)
+import Options.Applicative.Builder (argument, auto, command, footer, header, help, info, long, metavar, option, prefs, progDesc, showDefault, showHelpOnError, str, strOption, subparser, switch, value)
 import Options.Applicative.Extra (customExecParser, helper)
 import Options.Applicative.Types (Parser)
 
@@ -117,7 +117,7 @@
         ( long "keyring"
        <> metavar "FILE"
        <> help "file containing keyring" )))
-    <*> option
+    <*> option auto
         ( long "output-format"
        <> metavar "FORMAT"
        <> value GraphViz
@@ -134,7 +134,7 @@
         ( long "keyring"
        <> metavar "FILE"
        <> help "file containing keyring" )))
-    <*> option
+    <*> option auto
         ( long "output-format"
        <> metavar "FORMAT"
        <> value GraphViz
@@ -159,10 +159,11 @@
 
 cmd :: String -> Parser Command
 cmd homedir = subparser
-    ( command "list" (info ( CmdList <$> listO homedir) ( progDesc "list matching keys" ))
-   <> command "export-pubkeys" (info ( CmdExportPubkeys <$> listO homedir) ( progDesc "export matching keys to stdout" ))
+    ( command "export-pubkeys" (info ( CmdExportPubkeys <$> listO homedir) ( progDesc "export matching keys to stdout" ))
+   <> command "findpaths" (info ( CmdFindPaths <$> findPathsO homedir) ( progDesc "find short paths between keys" ))
    <> command "graph" (info ( CmdGraph <$> graphO homedir) ( progDesc "graph certifications" ))
-   <> command "findpaths" (info ( CmdFindPaths <$> findPathsO homedir) ( progDesc "find short paths between keys" )))
+   <> command "list" (info ( CmdList <$> listO homedir) ( progDesc "list matching keys" ))
+   )
 
 banner' :: Handle -> IO ()
 banner' h = hPutStrLn h (banner "hkt" ++ "\n" ++ warranty "hkt")
diff --git a/hokey.hs b/hokey.hs
--- a/hokey.hs
+++ b/hokey.hs
@@ -42,7 +42,7 @@
 import Data.Conduit.Cereal (conduitGet, conduitPut)
 import qualified Data.Conduit.List as CL
 import Data.Conduit.OpenPGP.Keyring (conduitToTKsDropping)
-import Data.List (unfoldr, elemIndex, findIndex, sort, sortBy, intercalate)
+import Data.List (unfoldr, elemIndex, findIndex, nub, sort, sortBy, intercalate)
 import qualified Data.Map as Map
 import Data.Maybe (fromMaybe, mapMaybe, listToMaybe)
 import Data.Monoid ((<>), mconcat, Monoid(..))
@@ -53,7 +53,7 @@
 import qualified Data.Yaml as Y
 import GHC.Generics
 
-import Options.Applicative.Builder (command, footer, header, help, info, long, metavar, prefs, progDesc, showDefault, showHelpOnError, option, subparser, value)
+import Options.Applicative.Builder (auto, command, footer, header, help, info, long, metavar, prefs, progDesc, showDefault, showHelpOnError, option, subparser, value)
 import Options.Applicative.Extra (customExecParser, helper)
 import Options.Applicative.Types (Parser)
 
@@ -234,7 +234,7 @@
 
 lintO :: Parser LintOptions
 lintO = LintOptions
-    <$> option
+    <$> option auto
         ( long "output-format"
        <> metavar "FORMAT"
        <> value Pretty
@@ -252,8 +252,8 @@
 
 cmd :: Parser Command
 cmd = subparser
-    ( command "lint" (info ( CmdLint <$> lintO) ( progDesc "check key(s) for 'best practices'" ))
-   <> command "canonicalize" (info ( pure CmdCanonicalize) ( progDesc "arrange key components in a canonical ordering" ))
+    ( command "canonicalize" (info ( pure CmdCanonicalize) ( progDesc "arrange key components in a canonical ordering" ))
+   <> command "lint" (info ( CmdLint <$> lintO) ( progDesc "check key(s) for 'best practices'" ))
     )
 
 doLint :: LintOptions -> IO ()
@@ -278,7 +278,7 @@
                                            (indepthsort ua)
                                            (indepthsort s)
         indepthsort :: (Ord a, Ord b) => [(a,[b])] -> [(a,[b])]
-        indepthsort = sort . over (mapped._2) sort
+        indepthsort = nub . sort . over (mapped._2) sort
 
 banner' :: Handle -> IO ()
 banner' h = hPutStrLn h (banner "hokey" ++ "\n" ++ warranty "hokey")
diff --git a/hopenpgp-tools.cabal b/hopenpgp-tools.cabal
--- a/hopenpgp-tools.cabal
+++ b/hopenpgp-tools.cabal
@@ -1,5 +1,5 @@
 name:                hopenpgp-tools
-version:             0.9
+version:             0.9.1
 synopsis:            hOpenPGP-based command-line tools
 description:         command-line tools for performing some OpenPGP-related operations
 homepage:            http://floss.scru.org/hopenpgp-tools
@@ -24,10 +24,11 @@
                ,       cereal-conduit
                ,       conduit                >= 1.1
                ,       conduit-extra          >= 1.1
-               ,       hOpenPGP               >= 1.0.1
+               ,       errors
+               ,       hOpenPGP               >= 1.5.2
                ,       lens
                ,       openpgp-asciiarmor     >= 0.1
-               ,       optparse-applicative   >= 0.7
+               ,       optparse-applicative   >= 0.10.0
                ,       resourcet
                ,       text
                ,       transformers
@@ -55,7 +56,7 @@
                ,       ixset
                ,       lens
                ,       old-locale
-               ,       optparse-applicative   >= 0.5.0
+               ,       optparse-applicative   >= 0.10.0
                ,       resourcet
                ,       text
                ,       time
@@ -83,7 +84,7 @@
                ,       hOpenPGP               >= 1.4
                ,       ixset
                ,       lens
-               ,       optparse-applicative   >= 0.5.0
+               ,       optparse-applicative   >= 0.10.0
                ,       resourcet
                ,       text
                ,       time
@@ -98,4 +99,4 @@
 source-repository this
   type:     git
   location: git://git.debian.org/users/clint/hopenpgp-tools.git
-  tag:      hopenpgp-tools/0.9
+  tag:      hopenpgp-tools/0.9.1
diff --git a/hot.hs b/hot.hs
--- a/hot.hs
+++ b/hot.hs
@@ -26,6 +26,7 @@
 import Codec.Encryption.OpenPGP.Serialize ()
 import Codec.Encryption.OpenPGP.Types
 import Control.Applicative ((<$>), (<*>), (*>), (<|>), optional, pure)
+import Control.Error.Util (note)
 import Control.Monad.IO.Class (MonadIO, liftIO)
 import Control.Monad.Trans.Resource (runResourceT)
 import qualified Data.Attoparsec.Text as A
@@ -44,9 +45,9 @@
 
 import System.IO (stdin, stderr, stdout, Handle, hFlush, hPutStrLn, hSetBuffering, BufferMode(..))
 
-import Options.Applicative.Builder (command, footer, header, help, info, long, metavar, nullOption, reader, prefs, progDesc, showHelpOnError, strOption, subparser, ParseError(..))
+import Options.Applicative.Builder (command, footer, header, help, info, long, metavar, option, eitherReader, prefs, progDesc, showHelpOnError, strOption, subparser)
 import Options.Applicative.Extra (customExecParser, helper)
-import Options.Applicative.Types (Parser, ReadM(..))
+import Options.Applicative.Types (Parser)
 
 data Command = DumpC | DeArmorC | ArmorC ArmoringOptions | FilterC FilteringOptions
 
@@ -81,22 +82,26 @@
     let a = Armor armortype (("Version", "hot " ++ showVersion version):maybe [] (\x -> [("Comment", x)]) comment ) (BL.fromChunks m)
     BL.putStr $ AA.encodeLazy [a]
 
-armorTypeReader :: String -> ReadM ArmorType
-armorTypeReader = ReadM . armorTypeReader'
-    where
-        armorTypeReader' "message" = Right ArmorMessage  
-        armorTypeReader' "pubkeyblock" = Right ArmorPublicKeyBlock       
-        armorTypeReader' "privkeyblock" = Right ArmorPrivateKeyBlock     
-        armorTypeReader' "signature" = Right ArmorSignature
-        armorTypeReader' _ = Left (ErrorMsg "unknown armor type")
+armorTypes :: [(String, ArmorType)]
+armorTypes = [
+    ("message", ArmorMessage)
+  , ("pubkeyblock", ArmorPublicKeyBlock)
+  , ("privkeyblock", ArmorPrivateKeyBlock)
+  , ("signature", ArmorSignature)
+  ]
 
+armorTypeReader :: String -> Either String ArmorType
+armorTypeReader = note "unknown armor type" . flip lookup armorTypes
+
 doFilter :: FilteringOptions -> IO ()
 doFilter fo = runResourceT $ CB.sourceHandle stdin $= conduitGet (get :: Get Pkt) $= conduitFilter (parseExpressions fo) $= conduitPut put $$ CB.sinkHandle stdout
 
 aoP :: Parser ArmoringOptions
 aoP = ArmoringOptions
     <$> optional (strOption (long "comment" <> metavar "COMMENT" <> help "ASCII armor Comment field"))
-    <*> nullOption (long "armor-type" <> reader armorTypeReader <> metavar "ARMORTYPE" <> help "ASCII armor type")
+    <*> option (eitherReader armorTypeReader) (long "armor-type" <> metavar "ARMORTYPE" <> armortypeHelp)
+    where
+        armortypeHelp = help $ "ASCII armor type " ++ show (map fst armorTypes)
 
 foP :: Parser FilteringOptions
 foP = FilteringOptions
@@ -119,9 +124,9 @@
 
 cmd :: Parser Command
 cmd = subparser
-  ( command "dump" (info ( pure DumpC ) ( progDesc "Dump OpenPGP packets from stdin" ))
+  ( command "armor" (info ( ArmorC <$> aoP ) ( progDesc "Armor stdin to stdout" ))
  <> command "dearmor" (info ( pure DeArmorC ) ( progDesc "Dearmor stdin to stdout" ))
- <> command "armor" (info ( ArmorC <$> aoP ) ( progDesc "Armor stdin to stdout" ))
+ <> command "dump" (info ( pure DumpC ) ( progDesc "Dump OpenPGP packets from stdin" ))
  <> command "filter" (info ( FilterC <$> foP ) ( progDesc "Filter some packets from stdin to stdout" ))
   )
 
@@ -182,7 +187,7 @@
                 <|> (A.asciiCI "dsa" *> pure (SPPKA DSA))
                 <|> (A.asciiCI "elgamal" *> pure (SPPKA ElgamalEncryptOnly))
                 <|> (A.asciiCI "ecdsa" *> pure (SPPKA ECDSA))
-                <|> (A.asciiCI "ec" *> pure (SPPKA EC))
+                <|> (A.asciiCI "ecdh" *> pure (SPPKA ECDH))
                 <|> (A.asciiCI "dh" *> pure (SPPKA DH))
                 <|> (A.asciiCI "binary" *> pure (SPSigType BinarySig))
                 <|> (A.asciiCI "canonicaltext" *> pure (SPSigType CanonicalTextSig))
