diff --git a/antiope-athena.cabal b/antiope-athena.cabal
--- a/antiope-athena.cabal
+++ b/antiope-athena.cabal
@@ -1,23 +1,22 @@
--- This file has been generated from package.yaml by hpack version 0.20.0.
+-- This file has been generated from package.yaml by hpack version 0.28.2.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 1f2e25e53eece55bff870faefa1ede3bdaa0f8637db39b08513199c3a928573c
+-- hash: 588dd34471160f3891b4a4702d5ed76a07d0c8b8cd4a23ced576a9c88e11f5f6
 
 name:           antiope-athena
-version:        1.0.0
+version:        3.1.0
 description:    Please see the README on Github at <https://github.com/arbor/antiope#readme>
 category:       Services
 homepage:       https://github.com/arbor/antiope#readme
 bug-reports:    https://github.com/arbor/antiope/issues
-author:         Tyler Durden
+author:         Arbor Networks
 maintainer:     mayhem@arbor.net
 copyright:      Arbor Networks
 license:        MIT
 license-file:   LICENSE
 build-type:     Simple
 cabal-version:  >= 1.10
-
 extra-source-files:
     ChangeLog.md
     README.md
@@ -39,8 +38,10 @@
     , lens
     , resourcet
     , text
+    , unliftio-core
   exposed-modules:
       Antiope.Athena
+      Antiope.Athena.Classy
   other-modules:
       Paths_antiope_athena
   default-language: Haskell2010
@@ -61,6 +62,7 @@
     , lens
     , resourcet
     , text
+    , unliftio-core
   other-modules:
       Paths_antiope_athena
   default-language: Haskell2010
diff --git a/src/Antiope/Athena.hs b/src/Antiope/Athena.hs
--- a/src/Antiope/Athena.hs
+++ b/src/Antiope/Athena.hs
@@ -2,40 +2,41 @@
   ( query
   , queryExecutionSucceed
   , module Network.AWS.Athena
-  )where
+  ) where
 
 import Control.Lens
-import Control.Monad.Trans.AWS      hiding (await, send)
-import Control.Monad.Trans.Resource
-import Data.Text                    (Text)
-import Network.AWS                  (MonadAWS, await, send)
+import Control.Monad.IO.Unlift (MonadUnliftIO)
+import Data.Text               (Text)
+import Network.AWS             (HasEnv, Rs)
 import Network.AWS.Athena
-import Network.AWS.Waiter           hiding (accept)
+import Network.AWS.Waiter      hiding (accept)
 
-query :: (MonadResource m, MonadAWS m)
-            => ResultConfiguration
-            -> QueryExecutionContext
-            -> Text
-            -> Text
-            -> m [Row]
-query config context qstring clientRequestToken = do
-  resp <- send $ startQueryExecution qstring config
-                    & sqeQueryExecutionContext ?~ context
-                    & sqeClientRequestToken ?~ clientRequestToken
+import qualified Network.AWS as AWS
+
+query :: (HasEnv e, MonadUnliftIO m)
+  => e
+  -> ResultConfiguration
+  -> QueryExecutionContext
+  -> Text
+  -> Text
+  -> m [Row]
+query e config context qstring clientRequestToken = AWS.runResourceT $ AWS.runAWS e $ do
+  resp <- AWS.send $ startQueryExecution qstring config
+    & sqeQueryExecutionContext  ?~ context
+    & sqeClientRequestToken     ?~ clientRequestToken
   case resp ^. sqersQueryExecutionId of
     Just qeid -> go qeid
     Nothing   -> return []
-  where
-    go qeid = do
-      accept <- await queryExecutionFinished (getQueryExecution qeid)
-      case accept of
-        AcceptSuccess -> do
-          results <- send $ getQueryResults qeid
-          case view gqrrsResultSet results of
-            Just rs -> return $ view rsRows rs
-            Nothing -> return []
-        AcceptRetry   -> go qeid
-        _             -> return []
+  where go qeid = do
+          accept <- AWS.await queryExecutionFinished (getQueryExecution qeid)
+          case accept of
+            AcceptSuccess -> do
+              results <- AWS.send $ getQueryResults qeid
+              case view gqrrsResultSet results of
+                Just rs -> return $ view rsRows rs
+                Nothing -> return []
+            AcceptRetry   -> go qeid
+            _             -> return []
 
 queryExecutionFinished :: Wait GetQueryExecution
 queryExecutionFinished = Wait
@@ -50,15 +51,15 @@
       , matchAll Running   AcceptRetry   status
       ]
     }
-    where
-      status :: Fold (Rs GetQueryExecution) QueryExecutionState
-      status = gqersQueryExecution . _Just . qeStatus . _Just . qesState . _Just
+    where status :: Fold (Rs GetQueryExecution) QueryExecutionState
+          status = gqersQueryExecution . _Just . qeStatus . _Just . qesState . _Just
 
-queryExecutionSucceed :: (MonadResource m, MonadAWS m)
-                        => Text
-                        -> m Bool
-queryExecutionSucceed qeid = do
-  eq <- view gqersQueryExecution <$> send (getQueryExecution qeid)
+queryExecutionSucceed :: (MonadUnliftIO m, HasEnv e)
+  => e
+  -> Text
+  -> m Bool
+queryExecutionSucceed e qeid = AWS.runResourceT $ AWS.runAWS e $ do
+  eq <- view gqersQueryExecution <$> AWS.send (getQueryExecution qeid)
   case view qesState =<< (view qeStatus =<< eq) of
     Just Succeeded -> return True
     Just _         -> return False
diff --git a/src/Antiope/Athena/Classy.hs b/src/Antiope/Athena/Classy.hs
new file mode 100644
--- /dev/null
+++ b/src/Antiope/Athena/Classy.hs
@@ -0,0 +1,63 @@
+module Antiope.Athena.Classy
+  ( query
+  , queryExecutionSucceed
+  , module Network.AWS.Athena
+  ) where
+
+import Control.Lens
+import Data.Text          (Text)
+import Network.AWS        (MonadAWS, Rs)
+import Network.AWS.Athena
+import Network.AWS.Waiter hiding (accept)
+
+import qualified Network.AWS as AWS
+
+query :: MonadAWS m
+  => ResultConfiguration
+  -> QueryExecutionContext
+  -> Text
+  -> Text
+  -> m [Row]
+query config context qstring clientRequestToken = do
+  resp <- AWS.send $ startQueryExecution qstring config
+    & sqeQueryExecutionContext  ?~ context
+    & sqeClientRequestToken     ?~ clientRequestToken
+  case resp ^. sqersQueryExecutionId of
+    Just qeid -> go qeid
+    Nothing   -> return []
+  where go qeid = do
+          accept <- AWS.await queryExecutionFinished (getQueryExecution qeid)
+          case accept of
+            AcceptSuccess -> do
+              results <- AWS.send $ getQueryResults qeid
+              case view gqrrsResultSet results of
+                Just rs -> return $ view rsRows rs
+                Nothing -> return []
+            AcceptRetry   -> go qeid
+            _             -> return []
+
+queryExecutionFinished :: Wait GetQueryExecution
+queryExecutionFinished = Wait
+    { _waitName = "QueryFinished"
+    , _waitAttempts = 100
+    , _waitDelay = 1
+    , _waitAcceptors =
+      [ matchAll Succeeded AcceptSuccess status
+      , matchAll Failed    AcceptFailure status
+      , matchAll Cancelled AcceptFailure status
+      , matchAll Queued    AcceptRetry   status
+      , matchAll Running   AcceptRetry   status
+      ]
+    }
+    where status :: Fold (Rs GetQueryExecution) QueryExecutionState
+          status = gqersQueryExecution . _Just . qeStatus . _Just . qesState . _Just
+
+queryExecutionSucceed :: MonadAWS m
+  => Text
+  -> m Bool
+queryExecutionSucceed qeid = do
+  eq <- view gqersQueryExecution <$> AWS.send (getQueryExecution qeid)
+  case view qesState =<< (view qeStatus =<< eq) of
+    Just Succeeded -> return True
+    Just _         -> return False
+    Nothing        -> return False
