diff --git a/java/client/src/com/thoughtworks/selenium/Wait.java b/java/client/src/com/thoughtworks/selenium/Wait.java
index fe1cefc999b13..cf6915af607e7 100644
--- a/java/client/src/com/thoughtworks/selenium/Wait.java
+++ b/java/client/src/com/thoughtworks/selenium/Wait.java
@@ -33,6 +33,8 @@
*
*
* @author Dan Fabulich
+ *
+ * @deprecated Moved to com.thoughtworks.selenium.webdriven
*
*/
public abstract class Wait {
diff --git a/java/client/src/com/thoughtworks/selenium/webdriven/Wait.java b/java/client/src/com/thoughtworks/selenium/webdriven/Wait.java
new file mode 100644
index 0000000000000..041930c23d56a
--- /dev/null
+++ b/java/client/src/com/thoughtworks/selenium/webdriven/Wait.java
@@ -0,0 +1,118 @@
+/*
+Copyright 2006-2014 Selenium committers
+Copyright 2006-2014 Software Freedom Conservancy
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+
+package com.thoughtworks.selenium.webdriven;
+
+/**
+ * A utility class, designed to help the user automatically wait until a condition turns true.
+ *
+ * Use it like this:
+ *
+ *
+ * new Wait("Couldn't find close button!") {
+ * boolean until() {
+ * return selenium.isElementPresent("button_Close");
+ * }
+ * };
+ *
+ */
+public abstract class Wait {
+ public Wait() {
+ }
+
+ public Wait(String messageToShowIfTimeout) {
+ wait(messageToShowIfTimeout, DEFAULT_TIMEOUT, DEFAULT_INTERVAL);
+ }
+
+ /** Returns true when it's time to stop waiting */
+ public abstract boolean until();
+
+ /** The amount of time to wait before giving up; the default is 30 seconds */
+ public static final long DEFAULT_TIMEOUT = 30000L;
+
+ /** The interval to pause between checking; the default is 500 milliseconds */
+ public static final long DEFAULT_INTERVAL = 500L;
+
+ /**
+ * Wait until the "until" condition returns true or time runs out.
+ *
+ * @param message the failure message
+ * @throws WaitTimedOutException if "until" doesn't return true until the timeout
+ * @see #until()
+ */
+ public void wait(String message) {
+ wait(message, DEFAULT_TIMEOUT, DEFAULT_INTERVAL);
+ }
+
+ /**
+ * Wait until the "until" condition returns true or time runs out.
+ *
+ * @param message the failure message
+ * @param timeoutInMilliseconds the amount of time to wait before giving up
+ * @throws WaitTimedOutException if "until" doesn't return true until the timeout
+ * @see #until()
+ */
+ public void wait(String message, long timeoutInMilliseconds) {
+ wait(message, timeoutInMilliseconds, DEFAULT_INTERVAL);
+ }
+
+ /**
+ * Wait until the "until" condition returns true or time runs out.
+ *
+ * @param message the failure message
+ * @param timeoutInMilliseconds the amount of time to wait before giving up
+ * @param intervalInMilliseconds the interval to pause between checking "until"
+ * @throws WaitTimedOutException if "until" doesn't return true until the timeout
+ * @see #until()
+ */
+ public void wait(String message, long timeoutInMilliseconds, long intervalInMilliseconds) {
+ long start = System.currentTimeMillis();
+ long end = start + timeoutInMilliseconds;
+ while (System.currentTimeMillis() < end) {
+ if (until()) return;
+ try {
+ Thread.sleep(intervalInMilliseconds);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ throw new WaitTimedOutException(message);
+ }
+
+ public class WaitTimedOutException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ public WaitTimedOutException() {
+ super();
+ }
+
+ public WaitTimedOutException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public WaitTimedOutException(String message) {
+ super(message);
+ }
+
+ public WaitTimedOutException(Throwable cause) {
+ super(cause);
+ }
+
+ }
+}
diff --git a/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForCondition.java b/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForCondition.java
index 385075ebbb3f0..61f1dd03c73f0 100644
--- a/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForCondition.java
+++ b/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForCondition.java
@@ -17,7 +17,7 @@
package com.thoughtworks.selenium.webdriven.commands;
-import com.thoughtworks.selenium.Wait;
+import com.thoughtworks.selenium.webdriven.Wait;
import com.thoughtworks.selenium.webdriven.ScriptMutator;
import com.thoughtworks.selenium.webdriven.SeleneseCommand;
diff --git a/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForPageToLoad.java b/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForPageToLoad.java
index ac00bcd366fca..875a29a76c3a8 100644
--- a/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForPageToLoad.java
+++ b/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForPageToLoad.java
@@ -18,7 +18,7 @@
import com.google.common.base.Throwables;
-import com.thoughtworks.selenium.Wait;
+import com.thoughtworks.selenium.webdriven.Wait;
import com.thoughtworks.selenium.webdriven.SeleneseCommand;
import org.openqa.selenium.By;
diff --git a/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForPopup.java b/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForPopup.java
index bae9c2b7e0957..522246bb7b6ab 100644
--- a/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForPopup.java
+++ b/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForPopup.java
@@ -17,7 +17,7 @@
package com.thoughtworks.selenium.webdriven.commands;
import com.thoughtworks.selenium.SeleniumException;
-import com.thoughtworks.selenium.Wait;
+import com.thoughtworks.selenium.webdriven.Wait;
import com.thoughtworks.selenium.webdriven.SeleneseCommand;
import com.thoughtworks.selenium.webdriven.Windows;
diff --git a/java/client/test/com/thoughtworks/selenium/WaitTest.java b/java/client/test/com/thoughtworks/selenium/WaitTest.java
index 8ae2f9a3acdc9..915c57fa818dd 100644
--- a/java/client/test/com/thoughtworks/selenium/WaitTest.java
+++ b/java/client/test/com/thoughtworks/selenium/WaitTest.java
@@ -21,7 +21,8 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import com.thoughtworks.selenium.Wait.WaitTimedOutException;
+import com.thoughtworks.selenium.webdriven.Wait;
+import com.thoughtworks.selenium.webdriven.Wait.WaitTimedOutException;
import org.junit.Before;
import org.junit.Test;
diff --git a/java/client/test/org/openqa/selenium/v1/WebDriverBackedSeleniumLargeTest.java b/java/client/test/org/openqa/selenium/v1/WebDriverBackedSeleniumLargeTest.java
index 03eeb049c2be3..90f0c3e24a387 100644
--- a/java/client/test/org/openqa/selenium/v1/WebDriverBackedSeleniumLargeTest.java
+++ b/java/client/test/org/openqa/selenium/v1/WebDriverBackedSeleniumLargeTest.java
@@ -20,7 +20,7 @@
import static org.junit.Assert.fail;
import com.thoughtworks.selenium.Selenium;
-import com.thoughtworks.selenium.Wait;
+import com.thoughtworks.selenium.webdriven.Wait;
import com.thoughtworks.selenium.webdriven.WebDriverBackedSelenium;
import org.junit.Before;