diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 # Revision history for glirc2
 
+## 2.20.4
+
+* Add `/query` alias for `/channel`
+* Add `/names` alias for `/users`
+* Update to build on GHC 8.2.1-rc1 with Cabal-2.0.0.0
+
 ## 2.20.3
 
 * Nicer `/help` system, commands are grouped
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,3 +1,4 @@
+{-# Language CPP #-}
 {-|
 Module      : Main
 Description : Custom setup script
@@ -21,15 +22,20 @@
 import qualified Distribution.ModuleName as ModuleName
 import           Distribution.PackageDescription hiding (license)
 import           Distribution.Simple
-import           Distribution.Simple.BuildPaths (autogenModulesDir)
-import           Distribution.Simple.LocalBuildInfo (LocalBuildInfo, installedPkgs)
+import           Distribution.Simple.LocalBuildInfo (LocalBuildInfo, installedPkgs, withLibLBI)
 import           Distribution.Simple.PackageIndex (allPackages)
 import           Distribution.Simple.Setup (configVerbosity, fromFlag)
 import           Distribution.Simple.Utils (createDirectoryIfMissingVerbose, rewriteFile)
 import           Distribution.Verbosity (Verbosity)
 import           System.FilePath ((</>), (<.>))
 
+#if MIN_VERSION_Cabal(2,0,0)
+import           Distribution.Simple.BuildPaths (autogenComponentModulesDir)
+#else
+import           Distribution.Simple.BuildPaths (autogenModulesDir)
+#endif
 
+
 -- | Default Setup main extended to generate a Build module and to validate
 -- the licenses of transitive dependencies.
 main :: IO ()
@@ -99,8 +105,13 @@
   [InstalledPackageInfo] {- ^ transitive package dependencies -} ->
   IO ()
 generateBuildModule verbosity pkg lbi pkgs =
-  do let modname = buildModuleName pkg
-         dir     = autogenModulesDir lbi
+#if MIN_VERSION_Cabal(2,0,0)
+  withLibLBI pkg lbi $ \_lib clbi ->
+  do let dir = autogenComponentModulesDir lbi clbi
+#else
+  do let dir = autogenModulesDir lbi
+#endif
+         modname = buildModuleName pkg
          file    = dir </> modname <.> "hs"
      createDirectoryIfMissingVerbose verbosity True dir
      rewriteFile file
@@ -126,6 +137,10 @@
        | p <- sourcePackageId <$> pkgs
        ]
 
+#if MIN_VERSION_Cabal(2,0,0)
+versionBranch :: Version -> [Int]
+versionBranch = versionNumbers
+#endif
 
 -- | Check that all transitive dependencies are available under an acceptable
 -- license. Raises a user-error on failure.
diff --git a/glirc.cabal b/glirc.cabal
--- a/glirc.cabal
+++ b/glirc.cabal
@@ -1,5 +1,5 @@
 name:                glirc
-version:             2.20.3
+version:             2.20.4
 synopsis:            Console IRC client
 description:         Console IRC client
                      .
@@ -23,9 +23,9 @@
 tested-with:         GHC==8.0.1
 
 custom-setup
-  setup-depends: base  >=4.9  && <4.10,
+  setup-depends: base  >=4.9  && <4.11,
                  filepath >1.4 && <1.5,
-                 Cabal >=1.24 && <1.25
+                 Cabal >=1.24 && <3
 
 source-repository head
   type: git
@@ -119,7 +119,7 @@
                        Paths_glirc
                        Build_glirc
 
-  build-depends:       base                 >=4.9    && <4.10,
+  build-depends:       base                 >=4.9    && <4.11,
                        async                >=2.1    && <2.2,
                        attoparsec           >=0.13   && <0.14,
                        bytestring           >=0.10.8 && <0.11,
@@ -135,13 +135,13 @@
                        lens                 >=4.14   && <4.16,
                        kan-extensions       >=5.0    && <5.1,
                        network              >=2.6.2  && <2.7,
-                       process              >=1.4.2  && <1.5,
+                       process              >=1.4.2  && <1.7,
                        regex-tdfa           >=1.2    && <1.3,
                        socks                >=0.5.5  && <0.6,
                        split                >=0.2    && <0.3,
                        stm                  >=2.4    && <2.5,
                        text                 >=1.2.2  && <1.3,
-                       time                 >=1.6    && <1.7,
+                       time                 >=1.6    && <1.9,
                        transformers         >=0.5.2  && <0.6,
                        unix                 >=2.7    && <2.8,
                        unordered-containers >=0.2.7  && <0.3,
diff --git a/src/Client/Commands.hs b/src/Client/Commands.hs
--- a/src/Client/Commands.hs
+++ b/src/Client/Commands.hs
@@ -413,27 +413,26 @@
 
   [ Command
       (pure "focus")
-      (ReqTokenArg "network" (OptTokenArg "channel" NoArg))
+      (ReqTokenArg "network" (OptTokenArg "target" NoArg))
       "Change the focused window.\n\
       \\n\
       \When only \^Bnetwork\^B is specified this switches to the network status window.\n\
-      \When \^Bnetwork\^B and \^Bchannel\^B are specified this switches to that chat window.\n\
+      \When \^Bnetwork\^B and \^Btarget\^B are specified this switches to that chat window.\n\
       \\n\
-      \Nicknames can be specified in the \^Bchannel\^B parameter to switch to private chat.\n\
-      \See also: /channel (aliased /c) to switch to a channel on the current network.\n"
+      \Nickname and channels can be specified in the \^Btarget\^B parameter.\n\
+      \See also: /query (aliased /c /channel) to switch to a target on the current network.\n"
     $ ClientCommand cmdFocus tabFocus
 
   , Command
-      ("channel" :| ["c"])
-      (ReqTokenArg "channel" NoArg)
+      ("query" :| ["c", "channel"])
+      (ReqTokenArg "target" NoArg)
       "Change the focused window.\n\
       \\n\
-      \Changes the focus to the \^Bchannel\^B chat window on the current network.\n\
+      \Changes the focus to the \^Btarget\^B chat window on the current network.\n\
       \\n\
-      \Nicknames can be specified in the \^Bchannel\^B parameter to switch to private chat.\n\
-      \See also: /focus to switch to a channel on a different network.\n\
-      \See also: /focus to switch to a channel on a different network.\n"
-    $ NetworkCommand cmdChannel tabChannel
+      \Nicknames and channels can be specified in the \^Btarget\^B parameter.\n\
+      \See also: /focus to switch to a target on a different network.\n"
+    $ NetworkCommand cmdQuery tabQuery
 
   , Command
       (pure "clear")
@@ -610,7 +609,7 @@
     $ NetworkCommand cmdAway simpleNetworkTab
 
   , Command
-      (pure "users")
+      ("users" :| ["names"])
       NoArg
       "Show the user list for the current channel.\n\
       \\n\
@@ -1349,18 +1348,18 @@
         $ changeFocus (ChannelFocus network channelId) st
 
 
--- | @/channel@ command. Takes the name of a channel and switches
--- focus to that channel on the current network.
-cmdChannel :: NetworkCommand (String, ())
-cmdChannel cs st (channel, _) =
+-- | @/query@ command. Takes a channel or nickname and switches
+-- focus to that target on the current network.
+cmdQuery :: NetworkCommand (String, ())
+cmdQuery cs st (channel, _) =
   commandSuccess
     $ changeFocus (ChannelFocus (view csNetwork cs) (mkId (Text.pack channel))) st
 
--- | Tab completion for @/channel@
-tabChannel ::
+-- | Tab completion for @/query@
+tabQuery ::
   Bool {- ^ reversed order -} ->
   NetworkCommand String
-tabChannel isReversed cs st _ =
+tabQuery isReversed cs st _ =
   simpleTabCompletion plainWordCompleteMode [] completions isReversed st
   where
     completions = channelWindowsOnNetwork (view csNetwork cs) st
