diff --git a/ttorrent-master/test-api/pom.xml b/ttorrent-master/test-api/pom.xml
new file mode 100644
index 0000000..b407722
--- /dev/null
+++ b/ttorrent-master/test-api/pom.xml
@@ -0,0 +1,26 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.turn</groupId>
+        <artifactId>ttorrent</artifactId>
+        <version>1.3.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <name>ttorrent/test-api</name>
+    <url>http://turn.github.com/ttorrent/</url>
+    <artifactId>ttorrent-test-api</artifactId>
+    <version>1.0</version>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.turn</groupId>
+            <artifactId>ttorrent-common</artifactId>
+            <version>1.3.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/MockTimeService.java b/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/MockTimeService.java
new file mode 100644
index 0000000..80806d7
--- /dev/null
+++ b/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/MockTimeService.java
@@ -0,0 +1,17 @@
+package com.turn.ttorrent;
+
+import com.turn.ttorrent.common.TimeService;
+
+public class MockTimeService implements TimeService {
+
+  private volatile long time = 0;
+
+  @Override
+  public long now() {
+    return time;
+  }
+
+  public void setTime(long time) {
+    this.time = time;
+  }
+}
diff --git a/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/TempFiles.java b/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/TempFiles.java
new file mode 100644
index 0000000..0ebed92
--- /dev/null
+++ b/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/TempFiles.java
@@ -0,0 +1,142 @@
+package com.turn.ttorrent;
+
+import org.apache.commons.io.FileUtils;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * @author Pavel.Sher
+ * Date: 05.03.2008
+ */
+public class TempFiles {
+  private static final File ourCurrentTempDir = FileUtils.getTempDirectory();
+  private final File myCurrentTempDir;
+
+  private static Random ourRandom;
+
+  static {
+    ourRandom = new Random();
+    ourRandom.setSeed(System.currentTimeMillis());
+  }
+
+  private final List<File> myFilesToDelete = new ArrayList<File>();
+  private final Thread myShutdownHook;
+  private volatile boolean myInsideShutdownHook;
+
+  public TempFiles() {
+    myCurrentTempDir = ourCurrentTempDir;
+    if (!myCurrentTempDir.isDirectory()) {
+
+      throw new IllegalStateException("Temp directory is not a directory, was deleted by some process: " + myCurrentTempDir.getAbsolutePath() +
+              "\njava.io.tmpdir: " + FileUtils.getTempDirectory());
+    }
+
+    myShutdownHook = new Thread(new Runnable() {
+      public void run() {
+        myInsideShutdownHook = true;
+        cleanup();
+      }
+    });
+    Runtime.getRuntime().addShutdownHook(myShutdownHook);
+  }
+
+  private File doCreateTempDir(String prefix, String suffix) throws IOException {
+    prefix = prefix == null ? "" : prefix;
+    suffix = suffix == null ? ".tmp" : suffix;
+
+    do {
+      int count = ourRandom.nextInt();
+      final File f = new File(myCurrentTempDir, prefix + count + suffix);
+      if (!f.exists() && f.mkdirs()) {
+        return f.getCanonicalFile();
+      }
+    } while (true);
+
+  }
+
+  private File doCreateTempFile(String prefix, String suffix) throws IOException {
+    final File file = doCreateTempDir(prefix, suffix);
+    file.delete();
+    file.createNewFile();
+    return file;
+  }
+
+  public final File createTempFile() throws IOException {
+    File tempFile = doCreateTempFile("test", null);
+    registerAsTempFile(tempFile);
+    return tempFile;
+  }
+
+  public void registerAsTempFile(final File tempFile) {
+    myFilesToDelete.add(tempFile);
+  }
+
+  public final File createTempFile(int size) throws IOException {
+    File tempFile = createTempFile();
+    int bufLen = Math.min(8 * 1024, size);
+    final Random random = new Random();
+    if (bufLen == 0) return tempFile;
+    final OutputStream fos = new BufferedOutputStream(new FileOutputStream(tempFile));
+    try {
+      byte[] buf = new byte[bufLen];
+
+      int numWritten = 0;
+      for (int i = 0; i < size / buf.length; i++) {
+        random.nextBytes(buf);
+        fos.write(buf);
+        numWritten += buf.length;
+      }
+
+      if (size > numWritten) {
+        random.nextBytes(buf);
+        fos.write(buf, 0, size - numWritten);
+      }
+    } finally {
+      fos.close();
+    }
+
+    return tempFile;
+  }
+
+  /**
+   * Returns a File object for created temp directory.
+   * Also stores the value into this object accessed with {@link #getCurrentTempDir()}
+   *
+   * @return a File object for created temp directory
+   * @throws IOException if directory creation fails.
+   */
+  public final File createTempDir() throws IOException {
+    File f = doCreateTempDir("test", "");
+    registerAsTempFile(f);
+    return f;
+  }
+
+  /**
+   * Returns the current directory used by the test or null if no test is running or no directory is created yet.
+   *
+   * @return see above
+   */
+  public File getCurrentTempDir() {
+    return myCurrentTempDir;
+  }
+
+  public void cleanup() {
+    try {
+      for (File file : myFilesToDelete) {
+        try {
+          FileUtils.forceDelete(file);
+        } catch (IOException e) {
+        }
+      }
+
+      myFilesToDelete.clear();
+    } finally {
+      if (!myInsideShutdownHook) {
+        Runtime.getRuntime().removeShutdownHook(myShutdownHook);
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/Utils.java b/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/Utils.java
new file mode 100644
index 0000000..a2ce0f1
--- /dev/null
+++ b/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/Utils.java
@@ -0,0 +1,13 @@
+package com.turn.ttorrent;
+
+import org.apache.log4j.Level;
+
+public class Utils {
+
+  private final static String LOG_PROPERTY_KEY = "com.turn.ttorrent.logLevel";
+
+  public static Level getLogLevel() {
+    final String levelStr = System.getProperty(LOG_PROPERTY_KEY);
+    return Level.toLevel(levelStr, Level.INFO);
+  }
+}
diff --git a/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/WaitFor.java b/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/WaitFor.java
new file mode 100644
index 0000000..d8b939b
--- /dev/null
+++ b/ttorrent-master/test-api/src/main/java/com/turn/ttorrent/WaitFor.java
@@ -0,0 +1,30 @@
+package com.turn.ttorrent;
+
+public abstract class WaitFor {
+  public static final long POLL_INTERVAL = 500;
+
+  private boolean myResult = false;
+
+  protected WaitFor() {
+    this(60 * 1000);
+  }
+
+  protected WaitFor(long timeout) {
+    long maxTime = System.currentTimeMillis() + timeout;
+    try {
+      while (System.currentTimeMillis() < maxTime && !condition()) {
+        Thread.sleep(POLL_INTERVAL);
+      }
+      if (condition()) {
+        myResult = true;
+      }
+    } catch (InterruptedException e) {
+    }
+  }
+
+  public boolean isMyResult() {
+    return myResult;
+  }
+
+  protected abstract boolean condition();
+}
