       (.prepare session q))
     (let [^Statement built-statement (build-statement query)]
       (if *async*
-        (let [async-result (.executeAsync session built-statement)]
-          (proxy [clojure.lang.IDeref
-                  clojure.lang.IBlockingDeref] []
-            (deref
-              ([]
-                 (conv/to-clj @async-result))
-              ([time-period time-unit]
-                 (conv/to-clj (deref async-result time-period time-unit))))
-            ))
-
+        (AsyncResult. (.executeAsync session built-statement))
         (-> (.execute session built-statement)
             (conv/to-clj))
         ))))

            Cluster$Builder SimpleStatement PreparedStatement BoundStatement HostDistance PoolingOptions
            SSLOptions ProtocolOptions$Compression]
           [com.datastax.driver.auth DseAuthProvider]
           [com.google.common.util.concurrent Futures FutureCallback]
           java.net.URI
           [javax.net.ssl TrustManagerFactory KeyManagerFactory SSLContext]
           [java.security KeyStore SecureRandom]

  (build-statement [s]
    s))

(defprotocol Listenable
  (add-listener [_ runnable executor]))
(deftype AsyncResult [fut]
  clojure.lang.IDeref
  (deref [_]
    (conv/to-clj @fut))

  clojure.lang.IBlockingDeref
  (deref [_ time-period time-unit]
    (conv/to-clj (deref fut time-period time-unit)))

  Listenable
  (add-listener [_ runnable executor]
    (.addListener fut runnable executor)
    )
  )

(defn execute
  [^Session session query]
  (if hayt/*prepared-statement*
