diff --git a/Cargo.toml b/Cargo.toml
index 503e90a..d3f7525 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -28,7 +28,7 @@ serde = "1.0"
serde_json = "1.0"
futures-core = "0.3.0"
futures-util = "0.3.0"
-tokio = { version = "0.2.0", features = [ "sync" ] }
+tokio = { version = "0.2.0", features = [ "sync", "time" ] }
hyper = { version = "0.13.0", features = [ "stream" ] }
hyper-tls = "0.4.0"
cookie = { version = "0.13", features = ["percent-encode"] }
diff --git a/src/call.rs b/src/call.rs
new file mode 100644
index 0000000..d15b6a1
--- /dev/null
+++ b/src/call.rs
@@ -0,0 +1,222 @@
+use crate::{error, Client, Element, Locator};
+
+use futures_util::future::{select, Either};
+use futures_util::pin_mut;
+
+use std::fmt;
+use std::future::Future;
+use std::pin::Pin;
+use std::task::{Context, Poll};
+use std::time::Duration;
+
+use tokio::time::Instant;
+
+use webdriver::command::{LocatorParameters, WebDriverCommand};
+use webdriver::common::WebElement;
+
+type PinBoxFut = Pin> + Send>>;
+type PinMutFut<'a, T> = Pin<&'a mut (dyn Future
+