diff --git a/accumulo/pom.xml b/accumulo/pom.xml
index 1094be274f6a2f35ae7066f907d29a2f2a0d0070..08da0af6908b55296a6d3653607d49aad40d09f9 100644
--- a/accumulo/pom.xml
+++ b/accumulo/pom.xml
@@ -22,7 +22,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
   <artifactId>accumulo-binding</artifactId>
diff --git a/aerospike/pom.xml b/aerospike/pom.xml
index 23cc3bcc78a926f3887cd37702b791818247205e..97a3213e74b433778aa0de2a607be3ee62178fa2 100644
--- a/aerospike/pom.xml
+++ b/aerospike/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
 
diff --git a/binding-parent/datastore-specific-descriptor/pom.xml b/binding-parent/datastore-specific-descriptor/pom.xml
index 1c0a31ed7ff55147e5ecd27b23ba8e2ba898521a..840242e7f5f71b824213e14e3974a0edd86bc31e 100644
--- a/binding-parent/datastore-specific-descriptor/pom.xml
+++ b/binding-parent/datastore-specific-descriptor/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>root</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
 
diff --git a/binding-parent/pom.xml b/binding-parent/pom.xml
index fbca4de167b3e5ad79183d27529fbfa9b6751802..0416208b2b9846e22d3a43117c8c64c2e44c5b56 100644
--- a/binding-parent/pom.xml
+++ b/binding-parent/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>root</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>binding-parent</artifactId>
diff --git a/cassandra/pom.xml b/cassandra/pom.xml
index 4b3cbae5a92b85cc55c671aa7a49e799473acc51..274ed5264506b69366abbb75180fc7c3b40265f3 100644
--- a/cassandra/pom.xml
+++ b/cassandra/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
      <groupId>com.yahoo.ycsb</groupId>
      <artifactId>binding-parent</artifactId>
-     <version>0.8.0-SNAPSHOT</version>
+     <version>0.9.0-SNAPSHOT</version>
      <relativePath>../binding-parent</relativePath>
   </parent>
   
diff --git a/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient10.java b/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient10.java
index 9eaf2eeb5ef35867a170358af536d3bc8469d721..b3d8e4a7d18824f13ed28a5dff051c69eb5e8ac4 100644
--- a/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient10.java
+++ b/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient10.java
@@ -453,6 +453,10 @@ public class CassandraClient10 extends DB {
     }
 
     for (int i = 0; i < operationRetries; i++) {
+      mutations.clear();
+      mutationMap.clear();
+      record.clear();
+
       if (debug) {
         System.out.println("Inserting key: " + key);
       }
@@ -479,10 +483,6 @@ public class CassandraClient10 extends DB {
 
         client.batch_mutate(record, writeConsistencyLevel);
 
-        mutations.clear();
-        mutationMap.clear();
-        record.clear();
-
         if (debug) {
           System.out
               .println("ConsistencyLevel=" + writeConsistencyLevel.toString());
diff --git a/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient7.java b/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient7.java
index 8f63554953f0574d5f7f8f9c467e0dd847155994..f2075e7f77780a8a609d03af84aa127ad7d5419b 100644
--- a/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient7.java
+++ b/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient7.java
@@ -418,6 +418,10 @@ public class CassandraClient7 extends DB {
     }
 
     for (int i = 0; i < operationRetries; i++) {
+      mutations.clear();
+      mutationMap.clear();
+      record.clear();
+
       if (debug) {
         System.out.println("Inserting key: " + key);
       }
@@ -444,10 +448,6 @@ public class CassandraClient7 extends DB {
 
         client.batch_mutate(record, ConsistencyLevel.ONE);
 
-        mutations.clear();
-        mutationMap.clear();
-        record.clear();
-
         return Status.OK;
       } catch (Exception e) {
         errorexception = e;
diff --git a/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient8.java b/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient8.java
index ca6b0cf79bfce1a21771780c9435740b1295e924..ca72c339da797073df4da5e0e9d1af42c612a360 100644
--- a/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient8.java
+++ b/cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient8.java
@@ -397,6 +397,10 @@ public class CassandraClient8 extends DB {
     }
 
     for (int i = 0; i < operationRetries; i++) {
+      mutations.clear();
+      mutationMap.clear();
+      record.clear();
+
       if (debug) {
         System.out.println("Inserting key: " + key);
       }
@@ -423,10 +427,6 @@ public class CassandraClient8 extends DB {
 
         client.batch_mutate(record, ConsistencyLevel.ONE);
 
-        mutations.clear();
-        mutationMap.clear();
-        record.clear();
-
         return Status.OK;
       } catch (Exception e) {
         errorexception = e;
diff --git a/cassandra2/pom.xml b/cassandra2/pom.xml
index f0f19edecc5a1aed5e69a46d7f4cb1a8c655e752..1a4b0ab6eb7fcddb87a3c29880c61b8665d77b04 100644
--- a/cassandra2/pom.xml
+++ b/cassandra2/pom.xml
@@ -23,7 +23,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
 
@@ -31,6 +31,11 @@ LICENSE file.
   <name>Cassandra 2.1+ DB Binding</name>
   <packaging>jar</packaging>
 
+  <properties>
+    <!-- Skip tests by default. will be activated by jdk8 profile -->
+    <skipTests>true</skipTests>
+  </properties>
+
   <dependencies>
     <!-- CQL driver -->
     <dependency>
@@ -46,8 +51,9 @@ LICENSE file.
     </dependency>
     <dependency>
       <groupId>org.cassandraunit</groupId>
-      <artifactId>cassandra-unit-shaded</artifactId>
-      <version>2.1.9.2</version>
+      <artifactId>cassandra-unit</artifactId>
+      <version>3.0.0.1</version>
+      <classifier>shaded</classifier>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -57,4 +63,19 @@ LICENSE file.
       <scope>test</scope>
     </dependency>
   </dependencies>
+
+  <profiles>
+    <!-- Cassandra 2.2+ requires JDK8 to run, so none of our tests
+         will work unless we're using jdk8.
+      -->
+    <profile>
+      <id>jdk8-tests</id>
+      <activation>
+        <jdk>1.8</jdk>
+      </activation>
+      <properties>
+        <skipTests>false</skipTests>
+      </properties>
+    </profile>
+  </profiles>
 </project>
diff --git a/cassandra2/src/test/java/com/yahoo/ycsb/db/CassandraCQLClientTest.java b/cassandra2/src/test/java/com/yahoo/ycsb/db/CassandraCQLClientTest.java
index bc73a73710506b957e39ce80ab730da908ea6654..60b7e2f33f392d68265f89352b17d62fc261e297 100644
--- a/cassandra2/src/test/java/com/yahoo/ycsb/db/CassandraCQLClientTest.java
+++ b/cassandra2/src/test/java/com/yahoo/ycsb/db/CassandraCQLClientTest.java
@@ -63,11 +63,12 @@ public class CassandraCQLClientTest {
   private Session session;
 
   @ClassRule
-  public static CassandraCQLUnit cassandraUnit =
-      new CassandraCQLUnit(new ClassPathCQLDataSet("ycsb.cql", "ycsb"));
+  public static CassandraCQLUnit cassandraUnit = new CassandraCQLUnit(new ClassPathCQLDataSet("ycsb.cql", "ycsb"));
 
   @Before
-  public void setUpClient() throws Exception {
+  public void setUp() throws Exception {
+    session = cassandraUnit.getSession();
+
     Properties p = new Properties();
     p.setProperty("hosts", HOST);
     p.setProperty("port", Integer.toString(PORT));
@@ -81,14 +82,11 @@ public class CassandraCQLClientTest {
     client.init();
   }
 
-  @Before
-  public void setSession() {
-    session = cassandraUnit.getSession();
-  }
-
   @After
   public void tearDownClient() throws Exception {
-    client.cleanup();
+    if (client != null) {
+      client.cleanup();
+    }
     client = null;
   }
 
@@ -96,7 +94,9 @@ public class CassandraCQLClientTest {
   public void clearTable() throws Exception {
     // Clear the table so that each test starts fresh.
     final Statement truncate = QueryBuilder.truncate(TABLE);
-    cassandraUnit.getSession().execute(truncate);
+    if (cassandraUnit != null) {
+      cassandraUnit.getSession().execute(truncate);
+    }
   }
 
   @Test
diff --git a/core/pom.xml b/core/pom.xml
index e914c5c04b996deee017a0dc151cdf13e44f53e6..3300cf485f3d63e505e349350605830d6c12c8b1 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>root</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
   </parent>
   
   <artifactId>core</artifactId>
diff --git a/core/src/main/java/com/yahoo/ycsb/Utils.java b/core/src/main/java/com/yahoo/ycsb/Utils.java
index f49bc0f5c03cd1b3cd7993d9d97ba619cc5cde37..5fe699afdaa311d1953b4f2b1674edfcc345750d 100644
--- a/core/src/main/java/com/yahoo/ycsb/Utils.java
+++ b/core/src/main/java/com/yahoo/ycsb/Utils.java
@@ -1,5 +1,5 @@
 /**                                                                                                                                                                                
- * Copyright (c) 2010 Yahoo! Inc. All rights reserved.                                                                                                                             
+ * Copyright (c) 2010 Yahoo! Inc., 2016 YCSB contributors. All rights reserved.                                                                                                                             
  *                                                                                                                                                                                 
  * Licensed under the Apache License, Version 2.0 (the "License"); you                                                                                                             
  * may not use this file except in compliance with the License. You                                                                                                                
@@ -113,4 +113,65 @@ public class Utils
 	 }
 	 return Math.abs(hashval);
       }
+
+      /**
+       * Reads a big-endian 8-byte long from an offset in the given array.
+       * @param bytes The array to read from.
+       * @return A long integer.
+       * @throws IndexOutOfBoundsException if the byte array is too small.
+       * @throws NullPointerException if the byte array is null.
+       */
+      public static long bytesToLong(final byte[] bytes) {
+        return (bytes[0] & 0xFFL) << 56
+             | (bytes[1] & 0xFFL) << 48
+             | (bytes[2] & 0xFFL) << 40
+             | (bytes[3] & 0xFFL) << 32
+             | (bytes[4] & 0xFFL) << 24
+             | (bytes[5] & 0xFFL) << 16
+             | (bytes[6] & 0xFFL) << 8
+             | (bytes[7] & 0xFFL) << 0;
+      }
+      
+      /**
+       * Writes a big-endian 8-byte long at an offset in the given array.
+       * @param val The value to encode.
+       * @throws IndexOutOfBoundsException if the byte array is too small.
+       */
+      public static byte[] longToBytes(final long val) {
+        final byte[] bytes = new byte[8];
+        bytes[0] = (byte) (val >>> 56);
+        bytes[1] = (byte) (val >>> 48);
+        bytes[2] = (byte) (val >>> 40);
+        bytes[3] = (byte) (val >>> 32);
+        bytes[4] = (byte) (val >>> 24);
+        bytes[5] = (byte) (val >>> 16);
+        bytes[6] = (byte) (val >>>  8);
+        bytes[7] = (byte) (val >>>  0);
+        return bytes;
+      }
+      
+      /**
+       * Parses the byte array into a double.
+       * The byte array must be at least 8 bytes long and have been encoded using 
+       * {@link #doubleToBytes}. If the array is longer than 8 bytes, only the
+       * first 8 bytes are parsed.
+       * @param bytes The byte array to parse, at least 8 bytes.
+       * @return A double value read from the byte array.
+       * @throws IllegalArgumentException if the byte array is not 8 bytes wide.
+       */
+      public static double bytesToDouble(final byte[] bytes) {
+        if (bytes.length < 8) {
+          throw new IllegalArgumentException("Byte array must be 8 bytes wide.");
+        }
+        return Double.longBitsToDouble(bytesToLong(bytes));
+      }
+      
+      /**
+       * Encodes the double value as an 8 byte array.
+       * @param val The double value to encode.
+       * @return A byte array of length 8.
+       */
+      public static byte[] doubleToBytes(final double val) {
+        return longToBytes(Double.doubleToRawLongBits(val));
+      }
 }
diff --git a/core/src/main/java/com/yahoo/ycsb/generator/UnixEpochTimestampGenerator.java b/core/src/main/java/com/yahoo/ycsb/generator/UnixEpochTimestampGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..914bb7fe4163c1f1e9c5c8de9b8841bfe59b3cd3
--- /dev/null
+++ b/core/src/main/java/com/yahoo/ycsb/generator/UnixEpochTimestampGenerator.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) 2016 YCSB contributors. All rights reserved.
+ *
+ * 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. See accompanying
+ * LICENSE file.
+ */
+
+package com.yahoo.ycsb.generator;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A generator that produces Unix epoch timestamps in seconds, milli, micro or
+ * nanoseconds and increments the stamp a given interval each time 
+ * {@link #nextValue()} is called. The result is emitted as a long in the same
+ * way calls to {@code System.currentTimeMillis()} and 
+ * {@code System.nanoTime()} behave.
+ * <p>
+ * By default, the current system time of the host is used as the starting
+ * timestamp. Calling {@link #initalizeTimestamp(long)} can adjust the timestamp
+ * back or forward in time. For example, if a workload will generate an hour of 
+ * data at 1 minute intervals, then to set the start timestamp an hour in the past
+ * from the current run, use:
+ * <pre>{@code
+ * UnixEpochTimestampGenerator generator = new UnixEpochTimestampGenerator();
+ * generator.initalizeTimestamp(-60);
+ * }</pre>
+ * A constructor is also present for setting an explicit start time. 
+ * Negative intervals are supported as well for iterating back in time.
+ * <p>
+ * WARNING: This generator is not thread safe and should not called from multiple
+ * threads.
+ */
+public class UnixEpochTimestampGenerator extends Generator<Long> {
+  
+  /** The current timestamp that will be incremented. */
+  private long currentTimestamp;
+  
+  /** The last used timestamp. Should always be one interval behind current. */
+  private long lastTimestamp;
+  
+  /** The interval to increment by. Multiplied by {@link #timeUnits}. */
+  private long interval;
+  
+  /** The units of time the interval represents. */
+  private TimeUnit timeUnits;
+  
+  /**
+   * Default ctor with the current system time and a 60 second interval.
+   */
+  public UnixEpochTimestampGenerator() {
+    this(60, TimeUnit.SECONDS);
+  }
+  
+  /**
+   * Ctor that uses the current system time as current.
+   * @param interval The interval for incrementing the timestamp.
+   * @param timeUnits The units of time the increment represents.
+   */
+  public UnixEpochTimestampGenerator(final long interval, final TimeUnit timeUnits) {
+    this.interval = interval;
+    this.timeUnits = timeUnits;
+    // move the first timestamp by 1 interval so that the first call to nextValue
+    // returns this timestamp
+    initalizeTimestamp(-1);
+    currentTimestamp -= getOffset(1);
+    lastTimestamp = currentTimestamp;
+  }
+  
+  /**
+   * Ctor for supplying a starting timestamp.
+   * @param interval The interval for incrementing the timestamp.
+   * @param timeUnits The units of time the increment represents.
+   * @param startTimestamp The start timestamp to use. 
+   * NOTE that this must match the time units used for the interval. 
+   * If the units are in nanoseconds, provide a nanosecond timestamp {@code System.nanoTime()}
+   * or in microseconds, {@code System.nanoTime() / 1000}
+   * or in millis, {@code System.currentTimeMillis()}
+   * or seconds and any interval above, {@code System.currentTimeMillis() / 1000}
+   */
+  public UnixEpochTimestampGenerator(final long interval, final TimeUnit timeUnits,
+      final long startTimestamp) {
+    this.interval = interval;
+    this.timeUnits = timeUnits;
+    // move the first timestamp by 1 interval so that the first call to nextValue
+    // returns this timestamp
+    this.currentTimestamp = startTimestamp - getOffset(1);
+    lastTimestamp = currentTimestamp - getOffset(1);
+  }
+  
+  /**
+   * Sets the starting timestamp to the current system time plus the interval offset.
+   * E.g. to set the time an hour in the past, supply a value of {@code -60}.
+   * @param intervalOffset The interval to increment or decrement by.
+   */
+  public void initalizeTimestamp(final long intervalOffset) {
+    switch (timeUnits) {
+    case NANOSECONDS:
+      currentTimestamp = System.nanoTime() + getOffset(intervalOffset);
+      break;
+    case MICROSECONDS:
+      currentTimestamp = (System.nanoTime() / 1000) + getOffset(intervalOffset);
+      break;
+    case MILLISECONDS:
+      currentTimestamp = System.currentTimeMillis() + getOffset(intervalOffset);
+      break;
+    case SECONDS:
+      currentTimestamp = (System.currentTimeMillis() / 1000) + 
+          getOffset(intervalOffset);
+      break;
+    case MINUTES:
+      currentTimestamp = (System.currentTimeMillis() / 1000) + 
+          getOffset(intervalOffset);
+      break;
+    case HOURS:
+      currentTimestamp = (System.currentTimeMillis() / 1000) + 
+          getOffset(intervalOffset);
+      break;
+    case DAYS:
+      currentTimestamp = (System.currentTimeMillis() / 1000) + 
+          getOffset(intervalOffset);
+      break;
+    default:
+      throw new IllegalArgumentException("Unhandled time unit type: " + timeUnits);
+    }
+  }
+  
+  @Override
+  public Long nextValue() {
+    lastTimestamp = currentTimestamp;
+    currentTimestamp += getOffset(1);
+    return currentTimestamp;
+  }
+
+  /**
+   * Returns the proper increment offset to use given the interval and timeunits. 
+   * @param intervalOffset The amount of offset to multiply by.
+   * @return An offset value to adjust the timestamp by.
+   */
+  public long getOffset(final long intervalOffset) {
+    switch (timeUnits) {
+    case NANOSECONDS:
+    case MICROSECONDS:
+    case MILLISECONDS:
+    case SECONDS:
+      return intervalOffset * interval; 
+    case MINUTES:
+      return intervalOffset * interval * (long) 60;
+    case HOURS:
+      return intervalOffset * interval * (long) (60 * 60);
+    case DAYS:
+      return intervalOffset * interval * (long) (60 * 60 * 24);
+    default:
+      throw new IllegalArgumentException("Unhandled time unit type: " + timeUnits);
+    }
+  }
+  
+  @Override
+  public Long lastValue() {
+    return lastTimestamp;
+  }
+
+  /** @return The current timestamp as set by the last call to {@link #nextValue()} */
+  public long currentValue() {
+    return currentTimestamp;
+  }
+  
+}
diff --git a/core/src/test/java/com/yahoo/ycsb/TestUtils.java b/core/src/test/java/com/yahoo/ycsb/TestUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..cde5177656b728fc7d2d636b78e65ec808cf733f
--- /dev/null
+++ b/core/src/test/java/com/yahoo/ycsb/TestUtils.java
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2016 YCSB contributors. All rights reserved.
+ *
+ * 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. See accompanying
+ * LICENSE file.
+ */
+
+package com.yahoo.ycsb;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Arrays;
+
+import org.testng.annotations.Test;
+
+public class TestUtils {
+
+  @Test
+  public void bytesToFromLong() throws Exception {
+    byte[] bytes = new byte[8];
+    assertEquals(Utils.bytesToLong(bytes), 0L);
+    assertArrayEquals(Utils.longToBytes(0), bytes);
+    
+    bytes[7] = 1;
+    assertEquals(Utils.bytesToLong(bytes), 1L);
+    assertArrayEquals(Utils.longToBytes(1L), bytes);
+    
+    bytes = new byte[] { 127, -1, -1, -1, -1, -1, -1, -1 };
+    assertEquals(Utils.bytesToLong(bytes), Long.MAX_VALUE);
+    assertArrayEquals(Utils.longToBytes(Long.MAX_VALUE), bytes);
+    
+    bytes = new byte[] { -128, 0, 0, 0, 0, 0, 0, 0 };
+    assertEquals(Utils.bytesToLong(bytes), Long.MIN_VALUE);
+    assertArrayEquals(Utils.longToBytes(Long.MIN_VALUE), bytes);
+    
+    bytes = new byte[] { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 
+        (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF  };
+    assertEquals(Utils.bytesToLong(bytes), -1L);
+    assertArrayEquals(Utils.longToBytes(-1L), bytes);
+    
+    // if the array is too long we just skip the remainder
+    bytes = new byte[] { 0, 0, 0, 0, 0, 0, 0, 1, 42, 42, 42 };
+    assertEquals(Utils.bytesToLong(bytes), 1L);
+  }
+  
+  @Test
+  public void bytesToFromDouble() throws Exception {
+    byte[] bytes = new byte[8];
+    assertEquals(Utils.bytesToDouble(bytes), 0, 0.0001);
+    assertArrayEquals(Utils.doubleToBytes(0), bytes);
+    
+    bytes = new byte[] { 63, -16, 0, 0, 0, 0, 0, 0 };
+    assertEquals(Utils.bytesToDouble(bytes), 1, 0.0001);
+    assertArrayEquals(Utils.doubleToBytes(1), bytes);
+    
+    bytes = new byte[] { -65, -16, 0, 0, 0, 0, 0, 0 };
+    assertEquals(Utils.bytesToDouble(bytes), -1, 0.0001);
+    assertArrayEquals(Utils.doubleToBytes(-1), bytes);
+    
+    bytes = new byte[] { 127, -17, -1, -1, -1, -1, -1, -1 };
+    assertEquals(Utils.bytesToDouble(bytes), Double.MAX_VALUE, 0.0001);
+    assertArrayEquals(Utils.doubleToBytes(Double.MAX_VALUE), bytes);
+    
+    bytes = new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 };
+    assertEquals(Utils.bytesToDouble(bytes), Double.MIN_VALUE, 0.0001);
+    assertArrayEquals(Utils.doubleToBytes(Double.MIN_VALUE), bytes);
+    
+    bytes = new byte[] { 127, -8, 0, 0, 0, 0, 0, 0 };
+    assertTrue(Double.isNaN(Utils.bytesToDouble(bytes)));
+    assertArrayEquals(Utils.doubleToBytes(Double.NaN), bytes);
+    
+    bytes = new byte[] { 63, -16, 0, 0, 0, 0, 0, 0, 42, 42, 42 };
+    assertEquals(Utils.bytesToDouble(bytes), 1, 0.0001);
+  }
+  
+  @Test (expectedExceptions = NullPointerException.class)
+  public void bytesToLongNull() throws Exception {
+    Utils.bytesToLong(null);
+  }
+  
+  @Test (expectedExceptions = IndexOutOfBoundsException.class)
+  public void bytesToLongTooShort() throws Exception {
+    Utils.bytesToLong(new byte[] { 0, 0, 0, 0, 0, 0, 0 });
+  }
+  
+  @Test (expectedExceptions = IllegalArgumentException.class)
+  public void bytesToDoubleTooShort() throws Exception {
+    Utils.bytesToDouble(new byte[] { 0, 0, 0, 0, 0, 0, 0 });
+  }
+  
+  /**
+   * Since this version of TestNG doesn't appear to have an assertArrayEquals,
+   * this will compare the two to make sure they're the same. 
+   * @param actual Actual array to validate
+   * @param expected What the array should contain
+   * @throws AssertionError if the test fails.
+   */
+  public void assertArrayEquals(final byte[] actual, final byte[] expected) {
+    if (actual == null && expected != null) {
+      throw new AssertionError("Expected " + Arrays.toString(expected) + 
+          " but found [null]");
+    }
+    if (actual != null && expected == null) {
+      throw new AssertionError("Expected [null] but found " + 
+          Arrays.toString(actual));
+    }
+    if (actual.length != expected.length) {
+      throw new AssertionError("Expected length " + expected.length + 
+          " but found " + actual.length);
+    }
+    for (int i = 0; i < expected.length; i++) {
+      if (actual[i] != expected[i]) {
+        throw new AssertionError("Expected byte [" + expected[i] + 
+            "] at index " + i + " but found [" + actual[i] + "]");
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/core/src/test/java/com/yahoo/ycsb/generator/TestUnixEpochTimestampGenerator.java b/core/src/test/java/com/yahoo/ycsb/generator/TestUnixEpochTimestampGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..f92ec0f6cfcece57d838e0f28873c7dc6c252216
--- /dev/null
+++ b/core/src/test/java/com/yahoo/ycsb/generator/TestUnixEpochTimestampGenerator.java
@@ -0,0 +1,122 @@
+/**                                                                                                                                                                                
+ * Copyright (c) 2016 YCSB contributors. All rights reserved.                                                                                                                             
+ *                                                                                                                                                                                 
+ * 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. See accompanying                                                                                                                 
+ * LICENSE file.                                                                                                                                                                   
+ */
+package com.yahoo.ycsb.generator;
+
+import static org.testng.Assert.assertEquals;
+
+import java.util.concurrent.TimeUnit;
+import org.testng.annotations.Test;
+
+public class TestUnixEpochTimestampGenerator {
+
+  @Test
+  public void defaultCtor() throws Exception {
+    final UnixEpochTimestampGenerator generator = 
+        new UnixEpochTimestampGenerator();
+    final long startTime = generator.currentValue();
+    assertEquals((long) generator.nextValue(), startTime + 60);
+    assertEquals((long) generator.lastValue(), startTime);
+    assertEquals((long) generator.nextValue(), startTime + 120);
+    assertEquals((long) generator.lastValue(), startTime + 60);
+    assertEquals((long) generator.nextValue(), startTime + 180);
+  }
+  
+  @Test
+  public void ctorWithIntervalAndUnits() throws Exception {
+    final UnixEpochTimestampGenerator generator = 
+        new UnixEpochTimestampGenerator(120, TimeUnit.SECONDS);
+    final long startTime = generator.currentValue();
+    assertEquals((long) generator.nextValue(), startTime + 120);
+    assertEquals((long) generator.lastValue(), startTime);
+    assertEquals((long) generator.nextValue(), startTime + 240);
+    assertEquals((long) generator.lastValue(), startTime + 120);
+  }
+  
+  @Test
+  public void ctorWithIntervalAndUnitsAndStart() throws Exception {
+    final UnixEpochTimestampGenerator generator = 
+        new UnixEpochTimestampGenerator(120, TimeUnit.SECONDS, 1072915200L);
+    assertEquals((long) generator.nextValue(), 1072915200L);
+    assertEquals((long) generator.lastValue(), 1072915200L - 120);
+    assertEquals((long) generator.nextValue(), 1072915200L + 120);
+    assertEquals((long) generator.lastValue(), 1072915200L);
+  }
+  
+  @Test
+  public void variousIntervalsAndUnits() throws Exception {
+    // negatives could happen, just start and roll back in time
+    UnixEpochTimestampGenerator generator = 
+        new UnixEpochTimestampGenerator(-60, TimeUnit.SECONDS);
+    long startTime = generator.currentValue();
+    assertEquals((long) generator.nextValue(), startTime - 60);
+    assertEquals((long) generator.lastValue(), startTime);
+    assertEquals((long) generator.nextValue(), startTime - 120);
+    assertEquals((long) generator.lastValue(), startTime - 60);
+    
+    generator = new UnixEpochTimestampGenerator(100, TimeUnit.NANOSECONDS);
+    startTime = generator.currentValue();
+    assertEquals((long) generator.nextValue(), startTime + 100);
+    assertEquals((long) generator.lastValue(), startTime);
+    assertEquals((long) generator.nextValue(), startTime + 200);
+    assertEquals((long) generator.lastValue(), startTime + 100);
+    
+    generator = new UnixEpochTimestampGenerator(100, TimeUnit.MICROSECONDS);
+    startTime = generator.currentValue();
+    assertEquals((long) generator.nextValue(), startTime + 100);
+    assertEquals((long) generator.lastValue(), startTime);
+    assertEquals((long) generator.nextValue(), startTime + 200);
+    assertEquals((long) generator.lastValue(), startTime + 100);
+    
+    generator = new UnixEpochTimestampGenerator(100, TimeUnit.MILLISECONDS);
+    startTime = generator.currentValue();
+    assertEquals((long) generator.nextValue(), startTime + 100);
+    assertEquals((long) generator.lastValue(), startTime);
+    assertEquals((long) generator.nextValue(), startTime + 200);
+    assertEquals((long) generator.lastValue(), startTime + 100);
+    
+    generator = new UnixEpochTimestampGenerator(100, TimeUnit.SECONDS);
+    startTime = generator.currentValue();
+    assertEquals((long) generator.nextValue(), startTime + 100);
+    assertEquals((long) generator.lastValue(), startTime);
+    assertEquals((long) generator.nextValue(), startTime + 200);
+    assertEquals((long) generator.lastValue(), startTime + 100);
+    
+    generator = new UnixEpochTimestampGenerator(1, TimeUnit.MINUTES);
+    startTime = generator.currentValue();
+    assertEquals((long) generator.nextValue(), startTime + (1 * 60));
+    assertEquals((long) generator.lastValue(), startTime);
+    assertEquals((long) generator.nextValue(), startTime + (2 * 60));
+    assertEquals((long) generator.lastValue(), startTime + (1 * 60));
+    
+    generator = new UnixEpochTimestampGenerator(1, TimeUnit.HOURS);
+    startTime = generator.currentValue();
+    assertEquals((long) generator.nextValue(), startTime + (1 * 60 * 60));
+    assertEquals((long) generator.lastValue(), startTime);
+    assertEquals((long) generator.nextValue(), startTime + (2 * 60 * 60));
+    assertEquals((long) generator.lastValue(), startTime + (1 * 60 * 60));
+    
+    generator = new UnixEpochTimestampGenerator(1, TimeUnit.DAYS);
+    startTime = generator.currentValue();
+    assertEquals((long) generator.nextValue(), startTime + (1 * 60 * 60 * 24));
+    assertEquals((long) generator.lastValue(), startTime);
+    assertEquals((long) generator.nextValue(), startTime + (2 * 60 * 60 * 24));
+    assertEquals((long) generator.lastValue(), startTime + (1 * 60 * 60 * 24));
+  }
+  
+  // TODO - With PowerMockito we could UT the initializeTimestamp(long) call.
+  // Otherwise it would involve creating more functions and that would get ugly.
+}
diff --git a/couchbase/pom.xml b/couchbase/pom.xml
index e98566d7ef4f772c7bfef5b8ad00209720391314..5f4780aa96eb68689befd4ed028d454470cab4b4 100644
--- a/couchbase/pom.xml
+++ b/couchbase/pom.xml
@@ -22,7 +22,7 @@ LICENSE file.
     <parent>
         <groupId>com.yahoo.ycsb</groupId>
         <artifactId>binding-parent</artifactId>
-        <version>0.8.0-SNAPSHOT</version>
+        <version>0.9.0-SNAPSHOT</version>
         <relativePath>../binding-parent</relativePath>
     </parent>
 
diff --git a/distribution/pom.xml b/distribution/pom.xml
index 7aca65212354814ec6c0d5eb35d71600847619d6..a6f219432412eab93878dbbc07c70b506fdd2bd3 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>root</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>ycsb</artifactId>
diff --git a/dynamodb/pom.xml b/dynamodb/pom.xml
index 2cf25ad18837e51044cccb4537965763f746387d..593371a649b90929a99c90851e43ef6fb8233fa5 100644
--- a/dynamodb/pom.xml
+++ b/dynamodb/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
 
@@ -50,4 +50,28 @@ LICENSE file.
     <scope>provided</scope>
     </dependency>
   </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+        <version>2.15</version>
+        <configuration>
+          <consoleOutput>true</consoleOutput>
+          <configLocation>../checkstyle.xml</configLocation>
+          <failOnViolation>true</failOnViolation>
+          <failsOnError>true</failsOnError>
+        </configuration>
+        <executions>
+          <execution>
+            <id>validate</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>checkstyle</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 </project>
diff --git a/dynamodb/src/main/java/com/yahoo/ycsb/db/DynamoDBClient.java b/dynamodb/src/main/java/com/yahoo/ycsb/db/DynamoDBClient.java
index e529976031992435cd3b10b0263b640d8b73ba44..c643768ba5f882dc63452128053a26e501627dac 100644
--- a/dynamodb/src/main/java/com/yahoo/ycsb/db/DynamoDBClient.java
+++ b/dynamodb/src/main/java/com/yahoo/ycsb/db/DynamoDBClient.java
@@ -1,6 +1,6 @@
 /*
-
  * Copyright 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * Copyright 2015-2016 YCSB Contributors. All Rights Reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License").
  * You may not use this file except in compliance with the License.
@@ -22,21 +22,8 @@ import com.amazonaws.ClientConfiguration;
 import com.amazonaws.auth.AWSCredentials;
 import com.amazonaws.auth.PropertiesCredentials;
 import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
-import com.amazonaws.services.dynamodbv2.model.AttributeValue;
-import com.amazonaws.services.dynamodbv2.model.AttributeValueUpdate;
-import com.amazonaws.services.dynamodbv2.model.DeleteItemRequest;
-import com.amazonaws.services.dynamodbv2.model.GetItemRequest;
-import com.amazonaws.services.dynamodbv2.model.GetItemResult;
-import com.amazonaws.services.dynamodbv2.model.PutItemRequest;
-import com.amazonaws.services.dynamodbv2.model.ScanRequest;
-import com.amazonaws.services.dynamodbv2.model.ScanResult;
-import com.amazonaws.services.dynamodbv2.model.UpdateItemRequest;
-import com.yahoo.ycsb.ByteIterator;
-import com.yahoo.ycsb.DB;
-import com.yahoo.ycsb.DBException;
-import com.yahoo.ycsb.Status;
-import com.yahoo.ycsb.StringByteIterator;
-
+import com.amazonaws.services.dynamodbv2.model.*;
+import com.yahoo.ycsb.*;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 
@@ -48,308 +35,307 @@ import java.util.Set;
 import java.util.Vector;
 
 /**
- * DynamoDB v1.10.48 client for YCSB
+ * DynamoDB v1.10.48 client for YCSB.
  */
 
 public class DynamoDBClient extends DB {
 
-    /**
-     * Defines the primary key type used in this particular DB instance.
-     *
-     * By default, the primary key type is "HASH". Optionally, the user can
-     * choose to use hash_and_range key type. See documentation in the
-     * DynamoDB.Properties file for more details.
-     */
-    private enum PrimaryKeyType {
-      HASH,
-      HASH_AND_RANGE
+  /**
+   * Defines the primary key type used in this particular DB instance.
+   * <p>
+   * By default, the primary key type is "HASH". Optionally, the user can
+   * choose to use hash_and_range key type. See documentation in the
+   * DynamoDB.Properties file for more details.
+   */
+  private enum PrimaryKeyType {
+    HASH,
+    HASH_AND_RANGE
+  }
+
+  private AmazonDynamoDBClient dynamoDB;
+  private String primaryKeyName;
+  private PrimaryKeyType primaryKeyType = PrimaryKeyType.HASH;
+
+  // If the user choose to use HASH_AND_RANGE as primary key type, then
+  // the following two variables become relevant. See documentation in the
+  // DynamoDB.Properties file for more details.
+  private String hashKeyValue;
+  private String hashKeyName;
+
+  private boolean consistentRead = false;
+  private String endpoint = "http://dynamodb.us-east-1.amazonaws.com";
+  private int maxConnects = 50;
+  private static final Logger LOGGER = Logger.getLogger(DynamoDBClient.class);
+  private static final Status CLIENT_ERROR = new Status("CLIENT_ERROR", "An error occurred on the client.");
+  private static final String DEFAULT_HASH_KEY_VALUE = "YCSB_0";
+
+  @Override
+  public void init() throws DBException {
+    String debug = getProperties().getProperty("dynamodb.debug", null);
+
+    if (null != debug && "true".equalsIgnoreCase(debug)) {
+      LOGGER.setLevel(Level.DEBUG);
+    }
+
+    String configuredEndpoint = getProperties().getProperty("dynamodb.endpoint", null);
+    String credentialsFile = getProperties().getProperty("dynamodb.awsCredentialsFile", null);
+    String primaryKey = getProperties().getProperty("dynamodb.primaryKey", null);
+    String primaryKeyTypeString = getProperties().getProperty("dynamodb.primaryKeyType", null);
+    String consistentReads = getProperties().getProperty("dynamodb.consistentReads", null);
+    String connectMax = getProperties().getProperty("dynamodb.connectMax", null);
+
+    if (null != connectMax) {
+      this.maxConnects = Integer.parseInt(connectMax);
+    }
+
+    if (null != consistentReads && "true".equalsIgnoreCase(consistentReads)) {
+      this.consistentRead = true;
+    }
+
+    if (null != configuredEndpoint) {
+      this.endpoint = configuredEndpoint;
+    }
+
+    if (null == primaryKey || primaryKey.length() < 1) {
+      throw new DBException("Missing primary key attribute name, cannot continue");
+    }
+
+    if (null != primaryKeyTypeString) {
+      try {
+        this.primaryKeyType = PrimaryKeyType.valueOf(primaryKeyTypeString.trim().toUpperCase());
+      } catch (IllegalArgumentException e) {
+        throw new DBException("Invalid primary key mode specified: " + primaryKeyTypeString +
+          ". Expecting HASH or HASH_AND_RANGE.");
+      }
+    }
+
+    if (this.primaryKeyType == PrimaryKeyType.HASH_AND_RANGE) {
+      // When the primary key type is HASH_AND_RANGE, keys used by YCSB
+      // are range keys so we can benchmark performance of individual hash
+      // partitions. In this case, the user must specify the hash key's name
+      // and optionally can designate a value for the hash key.
+
+      String configuredHashKeyName = getProperties().getProperty("dynamodb.hashKeyName", null);
+      if (null == configuredHashKeyName || configuredHashKeyName.isEmpty()) {
+        throw new DBException("Must specify a non-empty hash key name when the primary key type is HASH_AND_RANGE.");
+      }
+      this.hashKeyName = configuredHashKeyName;
+      this.hashKeyValue = getProperties().getProperty("dynamodb.hashKeyValue", DEFAULT_HASH_KEY_VALUE);
     }
 
-    private AmazonDynamoDBClient dynamoDB;
-    private String primaryKeyName;
-    private PrimaryKeyType primaryKeyType = PrimaryKeyType.HASH;
-
-    // If the user choose to use HASH_AND_RANGE as primary key type, then
-    // the following two variables become relevant. See documentation in the
-    // DynamoDB.Properties file for more details.
-    private String hashKeyValue;
-    private String hashKeyName;
-
-    private boolean debug = false;
-    private boolean consistentRead = false;
-    private String endpoint = "http://dynamodb.us-east-1.amazonaws.com";
-    private int maxConnects = 50;
-    private static Logger logger = Logger.getLogger(DynamoDBClient.class);
-    private static final Status CLIENT_ERROR = new Status("CLIENT_ERROR",
-        "An error occurred on the client.");
-    private static final String DEFAULT_HASH_KEY_VALUE = "YCSB_0";
-
-    /**
-     * Initialize any state for this DB. Called once per DB instance; there is
-     * one DB instance per client thread.
-     */
-    @Override
-    public void init() throws DBException {
-        // initialize DynamoDb driver & table.
-        String debug = getProperties().getProperty("dynamodb.debug", null);
-
-        if (null != debug && "true".equalsIgnoreCase(debug)) {
-            logger.setLevel(Level.DEBUG);
-        }
-
-        String endpoint = getProperties().getProperty("dynamodb.endpoint", null);
-        String credentialsFile = getProperties().getProperty("dynamodb.awsCredentialsFile", null);
-        String primaryKey = getProperties().getProperty("dynamodb.primaryKey", null);
-        String primaryKeyTypeString = getProperties().getProperty("dynamodb.primaryKeyType", null);
-        String consistentReads = getProperties().getProperty("dynamodb.consistentReads", null);
-        String connectMax = getProperties().getProperty("dynamodb.connectMax", null);
-
-        if (null != connectMax) {
-            this.maxConnects = Integer.parseInt(connectMax);
-        }
-
-        if (null != consistentReads && "true".equalsIgnoreCase(consistentReads)) {
-            this.consistentRead = true;
-        }
-
-        if (null != endpoint) {
-            this.endpoint = endpoint;
-        }
-
-        if (null == primaryKey || primaryKey.length() < 1) {
-            String errMsg = "Missing primary key attribute name, cannot continue";
-            logger.error(errMsg);
-        }
-
-        if (null != primaryKeyTypeString) {
-            try {
-              this.primaryKeyType = PrimaryKeyType.valueOf(
-                  primaryKeyTypeString.trim().toUpperCase());
-            } catch (IllegalArgumentException e) {
-              throw new DBException("Invalid primary key mode specified: " +
-                  primaryKeyTypeString + ". Expecting HASH or HASH_AND_RANGE.");
-            }
-        }
-
-        if (this.primaryKeyType == PrimaryKeyType.HASH_AND_RANGE) {
-          // When the primary key type is HASH_AND_RANGE, keys used by YCSB
-          // are range keys so we can benchmark performance of individual hash
-          // partitions. In this case, the user must specify the hash key's name
-          // and optionally can designate a value for the hash key.
-
-          String hashKeyName = getProperties().getProperty("dynamodb.hashKeyName", null);
-          if (null == hashKeyName || hashKeyName.isEmpty()) {
-            throw new DBException("Must specify a non-empty hash key name " +
-                "when the primary key type is HASH_AND_RANGE.");
-          }
-          this.hashKeyName = hashKeyName;
-          this.hashKeyValue = getProperties().getProperty(
-              "dynamodb.hashKeyValue", DEFAULT_HASH_KEY_VALUE);
-        }
-
-        try {
-            AWSCredentials credentials = new PropertiesCredentials(new File(credentialsFile));
-            ClientConfiguration cconfig = new ClientConfiguration();
-            cconfig.setMaxConnections(maxConnects);
-            dynamoDB = new AmazonDynamoDBClient(credentials, cconfig);
-            dynamoDB.setEndpoint(this.endpoint);
-            primaryKeyName = primaryKey;
-            logger.info("dynamodb connection created with " + this.endpoint);
-        } catch (Exception e1) {
-            String errMsg = "DynamoDBClient.init(): Could not initialize DynamoDB client: " + e1.getMessage();
-            logger.error(errMsg);
-        }
+    try {
+      AWSCredentials credentials = new PropertiesCredentials(new File(credentialsFile));
+      ClientConfiguration cconfig = new ClientConfiguration();
+      cconfig.setMaxConnections(maxConnects);
+      dynamoDB = new AmazonDynamoDBClient(credentials, cconfig);
+      dynamoDB.setEndpoint(this.endpoint);
+      primaryKeyName = primaryKey;
+      LOGGER.info("dynamodb connection created with " + this.endpoint);
+    } catch (Exception e1) {
+      LOGGER.error("DynamoDBClient.init(): Could not initialize DynamoDB client.", e1);
     }
+  }
 
-    @Override
-    public Status read(String table, String key, Set<String> fields,
-            HashMap<String, ByteIterator> result) {
-
-        logger.debug("readkey: " + key + " from table: " + table);
-        GetItemRequest req = new GetItemRequest(table, createPrimaryKey(key));
-        req.setAttributesToGet(fields);
-        req.setConsistentRead(consistentRead);
-        GetItemResult res = null;
-
-        try {
-            res = dynamoDB.getItem(req);
-        }catch (AmazonServiceException ex) {
-            logger.error(ex.getMessage());
-            return Status.ERROR;
-        }catch (AmazonClientException ex){
-            logger.error(ex.getMessage());
-            return CLIENT_ERROR;
-        }
-
-        if (null != res.getItem()) {
-            result.putAll(extractResult(res.getItem()));
-            logger.debug("Result: " + res.toString());
-        }
-        return Status.OK;
+  @Override
+  public Status read(String table, String key, Set<String> fields, HashMap<String, ByteIterator> result) {
+    if(LOGGER.isDebugEnabled()) {
+      LOGGER.debug("readkey: " + key + " from table: " + table);
     }
 
-    @Override
-    public Status scan(String table, String startkey, int recordcount,
-        Set<String> fields, Vector<HashMap<String, ByteIterator>> result) {
-        logger.debug("scan " + recordcount + " records from key: " + startkey + " on table: " + table);
-        /*
-         * on DynamoDB's scan, startkey is *exclusive* so we need to
-         * getItem(startKey) and then use scan for the res
-         */
-        GetItemRequest greq = new GetItemRequest(table, createPrimaryKey(startkey));
-        greq.setAttributesToGet(fields);
-
-        GetItemResult gres = null;
-
-        try {
-            gres = dynamoDB.getItem(greq);
-        }catch (AmazonServiceException ex) {
-            logger.error(ex.getMessage());
-            return Status.ERROR;
-        }catch (AmazonClientException ex){
-            logger.error(ex.getMessage());
-           return CLIENT_ERROR;
-        }
-
-        if (null != gres.getItem()) {
-            result.add(extractResult(gres.getItem()));
-        }
-
-        int count = 1; // startKey is done, rest to go.
-
-        Map<String, AttributeValue> startKey = createPrimaryKey(startkey);
-        ScanRequest req = new ScanRequest(table);
-        req.setAttributesToGet(fields);
-        while (count < recordcount) {
-            req.setExclusiveStartKey(startKey);
-            req.setLimit(recordcount - count);
-            ScanResult res = null;
-            try {
-                res = dynamoDB.scan(req);
-            }catch (AmazonServiceException ex) {
-                logger.error(ex.getMessage());
-              ex.printStackTrace();
-             return Status.ERROR;
-            }catch (AmazonClientException ex){
-                logger.error(ex.getMessage());
-               ex.printStackTrace();
-             return CLIENT_ERROR;
-            }
-
-            count += res.getCount();
-            for (Map<String, AttributeValue> items : res.getItems()) {
-                result.add(extractResult(items));
-            }
-            startKey = res.getLastEvaluatedKey();
-
-        }
-
-        return Status.OK;
+    GetItemRequest req = new GetItemRequest(table, createPrimaryKey(key));
+    req.setAttributesToGet(fields);
+    req.setConsistentRead(consistentRead);
+    GetItemResult res;
+
+    try {
+      res = dynamoDB.getItem(req);
+    } catch (AmazonServiceException ex) {
+      LOGGER.error(ex);
+      return Status.ERROR;
+    } catch (AmazonClientException ex) {
+      LOGGER.error(ex);
+      return CLIENT_ERROR;
     }
 
-    @Override
-    public Status update(String table, String key, HashMap<String, ByteIterator> values) {
-        logger.debug("updatekey: " + key + " from table: " + table);
-
-        Map<String, AttributeValueUpdate> attributes = new HashMap<String, AttributeValueUpdate>(
-                values.size());
-        for (Entry<String, ByteIterator> val : values.entrySet()) {
-            AttributeValue v = new AttributeValue(val.getValue().toString());
-            attributes.put(val.getKey(), new AttributeValueUpdate()
-                    .withValue(v).withAction("PUT"));
-        }
-
-        UpdateItemRequest req = new UpdateItemRequest(table, createPrimaryKey(key), attributes);
-
-        try {
-            dynamoDB.updateItem(req);
-        }catch (AmazonServiceException ex) {
-            logger.error(ex.getMessage());
-            return Status.ERROR;
-        }catch (AmazonClientException ex){
-            logger.error(ex.getMessage());
-            return CLIENT_ERROR;
-        }
-        return Status.OK;
+    if (null != res.getItem()) {
+      result.putAll(extractResult(res.getItem()));
+      if(LOGGER.isDebugEnabled()) {
+        LOGGER.debug("Result: " + res.toString());
+      }
     }
+    return Status.OK;
+  }
 
-    @Override
-    public Status insert(String table, String key, HashMap<String, ByteIterator> values) {
-        logger.debug("insertkey: " + primaryKeyName + "-" + key + " from table: " + table);
-        Map<String, AttributeValue> attributes = createAttributes(values);
-        // adding primary key
-        attributes.put(primaryKeyName, new AttributeValue(key));
-        if (primaryKeyType == PrimaryKeyType.HASH_AND_RANGE) {
-          // If the primary key type is HASH_AND_RANGE, then what has been put
-          // into the attributes map above is the range key part of the primary
-          // key, we still need to put in the hash key part here.
-          attributes.put(hashKeyName, new AttributeValue(hashKeyValue));
-        }
-
-        PutItemRequest putItemRequest = new PutItemRequest(table, attributes);
-        try {
-            dynamoDB.putItem(putItemRequest);
-        }catch (AmazonServiceException ex) {
-            logger.error(ex.getMessage());
-            return Status.ERROR;
-        }catch (AmazonClientException ex){
-            logger.error(ex.getMessage());
-            return CLIENT_ERROR;
-        }
-        return Status.OK;
+  @Override
+  public Status scan(String table, String startkey, int recordcount,
+                     Set<String> fields, Vector<HashMap<String, ByteIterator>> result) {
+
+    if(LOGGER.isDebugEnabled()) {
+      LOGGER.debug("scan " + recordcount + " records from key: " + startkey + " on table: " + table);
     }
 
-    @Override
-    public Status delete(String table, String key) {
-        logger.debug("deletekey: " + key + " from table: " + table);
-        DeleteItemRequest req = new DeleteItemRequest(table, createPrimaryKey(key));
-
-        try {
-            dynamoDB.deleteItem(req);
-        }catch (AmazonServiceException ex) {
-            logger.error(ex.getMessage());
-            return Status.ERROR;
-        }catch (AmazonClientException ex){
-            logger.error(ex.getMessage());
-            return CLIENT_ERROR;
-        }
-        return Status.OK;
+    /*
+     * on DynamoDB's scan, startkey is *exclusive* so we need to
+     * getItem(startKey) and then use scan for the res
+    */
+    GetItemRequest greq = new GetItemRequest(table, createPrimaryKey(startkey));
+    greq.setAttributesToGet(fields);
+
+    GetItemResult gres;
+
+    try {
+      gres = dynamoDB.getItem(greq);
+    } catch (AmazonServiceException ex) {
+      LOGGER.error(ex);
+      return Status.ERROR;
+    } catch (AmazonClientException ex) {
+      LOGGER.error(ex);
+      return CLIENT_ERROR;
     }
 
-    private static Map<String, AttributeValue> createAttributes(
-            HashMap<String, ByteIterator> values) {
-        Map<String, AttributeValue> attributes = new HashMap<String, AttributeValue>(
-                values.size() + 1); //leave space for the PrimaryKey
-        for (Entry<String, ByteIterator> val : values.entrySet()) {
-            attributes.put(val.getKey(), new AttributeValue(val.getValue()
-                    .toString()));
-        }
-        return attributes;
+    if (null != gres.getItem()) {
+      result.add(extractResult(gres.getItem()));
     }
 
-    private HashMap<String, ByteIterator> extractResult(Map<String, AttributeValue> item) {
-        if(null == item)
-            return null;
-        HashMap<String, ByteIterator> rItems = new HashMap<String, ByteIterator>(item.size());
+    int count = 1; // startKey is done, rest to go.
+
+    Map<String, AttributeValue> startKey = createPrimaryKey(startkey);
+    ScanRequest req = new ScanRequest(table);
+    req.setAttributesToGet(fields);
+    while (count < recordcount) {
+      req.setExclusiveStartKey(startKey);
+      req.setLimit(recordcount - count);
+      ScanResult res;
+      try {
+        res = dynamoDB.scan(req);
+      } catch (AmazonServiceException ex) {
+        LOGGER.error(ex);
+        return Status.ERROR;
+      } catch (AmazonClientException ex) {
+        LOGGER.error(ex);
+        return CLIENT_ERROR;
+      }
+
+      count += res.getCount();
+      for (Map<String, AttributeValue> items : res.getItems()) {
+        result.add(extractResult(items));
+      }
+      startKey = res.getLastEvaluatedKey();
 
-        for (Entry<String, AttributeValue> attr : item.entrySet()) {
-            logger.debug(String.format("Result- key: %s, value: %s", attr.getKey(), attr.getValue()));
-            rItems.put(attr.getKey(), new StringByteIterator(attr.getValue().getS()));
-        }
-        return rItems;
     }
 
-    private Map<String, AttributeValue> createPrimaryKey(String key) {
-        Map<String, AttributeValue> k = new HashMap<String, AttributeValue>();
-        if (primaryKeyType == PrimaryKeyType.HASH) {
-          k.put(primaryKeyName, new AttributeValue().withS(key));
-        } else if (primaryKeyType == PrimaryKeyType.HASH_AND_RANGE) {
-          k.put(hashKeyName, new AttributeValue().withS(hashKeyValue));
-          k.put(primaryKeyName, new AttributeValue().withS(key));
-        } else {
-          throw new RuntimeException("Assertion Error: impossible primary key"
-                  + " type");
-        }
-        return k;
+    return Status.OK;
+  }
+
+  @Override
+  public Status update(String table, String key, HashMap<String, ByteIterator> values) {
+    if(LOGGER.isDebugEnabled()) {
+      LOGGER.debug("updatekey: " + key + " from table: " + table);
+    }
+
+    Map<String, AttributeValueUpdate> attributes = new HashMap<>(values.size());
+    for (Entry<String, ByteIterator> val : values.entrySet()) {
+      AttributeValue v = new AttributeValue(val.getValue().toString());
+      attributes.put(val.getKey(), new AttributeValueUpdate().withValue(v).withAction("PUT"));
+    }
+
+    UpdateItemRequest req = new UpdateItemRequest(table, createPrimaryKey(key), attributes);
+
+    try {
+      dynamoDB.updateItem(req);
+    } catch (AmazonServiceException ex) {
+      LOGGER.error(ex);
+      return Status.ERROR;
+    } catch (AmazonClientException ex) {
+      LOGGER.error(ex);
+      return CLIENT_ERROR;
+    }
+    return Status.OK;
+  }
+
+  @Override
+  public Status insert(String table, String key, HashMap<String, ByteIterator> values) {
+    if(LOGGER.isDebugEnabled()) {
+      LOGGER.debug("insertkey: " + primaryKeyName + "-" + key + " from table: " + table);
+    }
+
+    Map<String, AttributeValue> attributes = createAttributes(values);
+    // adding primary key
+    attributes.put(primaryKeyName, new AttributeValue(key));
+    if (primaryKeyType == PrimaryKeyType.HASH_AND_RANGE) {
+      // If the primary key type is HASH_AND_RANGE, then what has been put
+      // into the attributes map above is the range key part of the primary
+      // key, we still need to put in the hash key part here.
+      attributes.put(hashKeyName, new AttributeValue(hashKeyValue));
+    }
+
+    PutItemRequest putItemRequest = new PutItemRequest(table, attributes);
+    try {
+      dynamoDB.putItem(putItemRequest);
+    } catch (AmazonServiceException ex) {
+      LOGGER.error(ex);
+      return Status.ERROR;
+    } catch (AmazonClientException ex) {
+      LOGGER.error(ex);
+      return CLIENT_ERROR;
+    }
+    return Status.OK;
+  }
+
+  @Override
+  public Status delete(String table, String key) {
+    if(LOGGER.isDebugEnabled()) {
+      LOGGER.debug("deletekey: " + key + " from table: " + table);
+    }
+
+    DeleteItemRequest req = new DeleteItemRequest(table, createPrimaryKey(key));
+
+    try {
+      dynamoDB.deleteItem(req);
+    } catch (AmazonServiceException ex) {
+      LOGGER.error(ex);
+      return Status.ERROR;
+    } catch (AmazonClientException ex) {
+      LOGGER.error(ex);
+      return CLIENT_ERROR;
+    }
+    return Status.OK;
+  }
+
+  private static Map<String, AttributeValue> createAttributes(HashMap<String, ByteIterator> values) {
+    //leave space for the PrimaryKey
+    Map<String, AttributeValue> attributes = new HashMap<>(values.size() + 1);
+    for (Entry<String, ByteIterator> val : values.entrySet()) {
+      attributes.put(val.getKey(), new AttributeValue(val.getValue().toString()));
+    }
+    return attributes;
+  }
+
+  private HashMap<String, ByteIterator> extractResult(Map<String, AttributeValue> item) {
+    if (null == item) {
+      return null;
+    }
+    HashMap<String, ByteIterator> rItems = new HashMap<>(item.size());
+
+    for (Entry<String, AttributeValue> attr : item.entrySet()) {
+      if(LOGGER.isDebugEnabled()) {
+        LOGGER.debug(String.format("Result- key: %s, value: %s", attr.getKey(), attr.getValue()));
+      }
+      rItems.put(attr.getKey(), new StringByteIterator(attr.getValue().getS()));
+    }
+    return rItems;
+  }
+
+  private Map<String, AttributeValue> createPrimaryKey(String key) {
+    Map<String, AttributeValue> k = new HashMap<>();
+    if (primaryKeyType == PrimaryKeyType.HASH) {
+      k.put(primaryKeyName, new AttributeValue().withS(key));
+    } else if (primaryKeyType == PrimaryKeyType.HASH_AND_RANGE) {
+      k.put(hashKeyName, new AttributeValue().withS(hashKeyValue));
+      k.put(primaryKeyName, new AttributeValue().withS(key));
+    } else {
+      throw new RuntimeException("Assertion Error: impossible primary key type");
     }
+    return k;
+  }
 }
diff --git a/dynamodb/src/main/java/com/yahoo/ycsb/db/package-info.java b/dynamodb/src/main/java/com/yahoo/ycsb/db/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad3cbaa7a510ea741072861a168ba92c36bd5781
--- /dev/null
+++ b/dynamodb/src/main/java/com/yahoo/ycsb/db/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2015-2016 YCSB Contributors. All Rights Reserved.
+ *
+ * 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. See accompanying
+ * LICENSE file.
+ */
+
+/**
+ * The YCSB binding for <a href="https://aws.amazon.com/dynamodb/">DynamoDB</a>.
+ */
+package com.yahoo.ycsb.db;
+
diff --git a/elasticsearch/pom.xml b/elasticsearch/pom.xml
index c4aad6324f124d3e807bf1eb2f1ec65f13ea7675..f285dab2b47525458b78aa87c6325b316259c27f 100644
--- a/elasticsearch/pom.xml
+++ b/elasticsearch/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
     <parent>
         <groupId>com.yahoo.ycsb</groupId>
         <artifactId>binding-parent</artifactId>
-        <version>0.8.0-SNAPSHOT</version>
+        <version>0.9.0-SNAPSHOT</version>
         <relativePath>../binding-parent</relativePath>
     </parent>
 
diff --git a/geode/pom.xml b/geode/pom.xml
index fa36bbd53c1ea2f05f546f124f189dd210928c4e..40111413e57ee824c8b717296c6228c5719ebb27 100644
--- a/geode/pom.xml
+++ b/geode/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
   
@@ -46,5 +46,29 @@ LICENSE file.
       <scope>provided</scope>
     </dependency>
   </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+        <version>2.15</version>
+        <configuration>
+          <consoleOutput>true</consoleOutput>
+          <configLocation>../checkstyle.xml</configLocation>
+          <failOnViolation>true</failOnViolation>
+          <failsOnError>true</failsOnError>
+        </configuration>
+        <executions>
+          <execution>
+            <id>validate</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>checkstyle</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
   
 </project>
diff --git a/geode/src/main/java/com/yahoo/ycsb/db/GeodeClient.java b/geode/src/main/java/com/yahoo/ycsb/db/GeodeClient.java
index cdbfc96189ed635219e37bf28f2db960ef7eb43f..f6bcc01a92ad385202e2950706b605bd0e5212b5 100644
--- a/geode/src/main/java/com/yahoo/ycsb/db/GeodeClient.java
+++ b/geode/src/main/java/com/yahoo/ycsb/db/GeodeClient.java
@@ -1,12 +1,12 @@
 /**
  * Copyright (c) 2013 - 2016 YCSB Contributors. All rights reserved.
- *
+ * <p>
  * 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
- *
+ * <p>
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
  * 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
@@ -17,32 +17,18 @@
 
 package com.yahoo.ycsb.db;
 
-import com.gemstone.gemfire.cache.Cache;
-import com.gemstone.gemfire.cache.CacheFactory;
-import com.gemstone.gemfire.cache.GemFireCache;
-import com.gemstone.gemfire.cache.Region;
-import com.gemstone.gemfire.cache.RegionExistsException;
-import com.gemstone.gemfire.cache.RegionFactory;
-import com.gemstone.gemfire.cache.RegionShortcut;
+import com.gemstone.gemfire.cache.*;
 import com.gemstone.gemfire.cache.client.ClientCache;
 import com.gemstone.gemfire.cache.client.ClientCacheFactory;
 import com.gemstone.gemfire.cache.client.ClientRegionFactory;
 import com.gemstone.gemfire.cache.client.ClientRegionShortcut;
 import com.gemstone.gemfire.internal.admin.remote.DistributionLocatorId;
-import com.yahoo.ycsb.ByteArrayByteIterator;
-import com.yahoo.ycsb.ByteIterator;
-import com.yahoo.ycsb.DB;
-import com.yahoo.ycsb.DBException;
-import com.yahoo.ycsb.Status;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.Vector;
+import com.yahoo.ycsb.*;
+
+import java.util.*;
 
 /**
- * Apache Geode (incubating) client for the YCSB benchmark.<br /> 
+ * Apache Geode (incubating) client for the YCSB benchmark.<br />
  * <p>By default acts as a Geode client and tries to connect
  * to Geode cache server running on localhost with default
  * cache server port. Hostname and port of a Geode cacheServer
@@ -50,34 +36,33 @@ import java.util.Vector;
  * geode.serverhost=host</code> properties on YCSB command line.
  * A locator may also be used for discovering a cacheServer
  * by using the property <code>geode.locator=host[port]</code></p>
- * 
+ *
  * <p>To run this client in a peer-to-peer topology with other Geode
  * nodes, use the property <code>geode.topology=p2p</code>. Running
  * in p2p mode will enable embedded caching in this client.</p>
- * 
+ *
  * <p>YCSB by default does its operations against "usertable". When running
  * as a client this is a <code>ClientRegionShortcut.PROXY</code> region,
  * when running in p2p mode it is a <code>RegionShortcut.PARTITION</code>
  * region. A cache.xml defining "usertable" region can be placed in the
  * working directory to override these region definitions.</p>
- * 
+ *
  */
 public class GeodeClient extends DB {
-
-  /** property name of the port where Geode server is listening for connections */
+  /** property name of the port where Geode server is listening for connections. */
   private static final String SERVERPORT_PROPERTY_NAME = "geode.serverport";
 
-  /** property name of the host where Geode server is running */
+  /** property name of the host where Geode server is running. */
   private static final String SERVERHOST_PROPERTY_NAME = "geode.serverhost";
 
-  /** default value of {@link #SERVERHOST_PROPERTY_NAME} */
+  /** default value of {@link #SERVERHOST_PROPERTY_NAME}. */
   private static final String SERVERHOST_PROPERTY_DEFAULT = "localhost";
 
   /** property name to specify a Geode locator. This property can be used in both
    * client server and p2p topology */
   private static final String LOCATOR_PROPERTY_NAME = "geode.locator";
 
-  /** property name to specify Geode topology */
+  /** property name to specify Geode topology. */
   private static final String TOPOLOGY_PROPERTY_NAME = "geode.topology";
 
   /** value of {@value #TOPOLOGY_PROPERTY_NAME} when peer to peer topology should be used.
@@ -86,12 +71,9 @@ public class GeodeClient extends DB {
 
   private GemFireCache cache;
 
-  /**
-   * true if ycsb client runs as a client to a
-   * Geode cache server
-   */
+  /** true if ycsb client runs as a client to a Geode cache server. */
   private boolean isClient;
-  
+
   @Override
   public void init() throws DBException {
     Properties props = getProperties();
@@ -108,7 +90,7 @@ public class GeodeClient extends DB {
       }
       serverHost = props.getProperty(SERVERHOST_PROPERTY_NAME, SERVERHOST_PROPERTY_DEFAULT);
       locatorStr = props.getProperty(LOCATOR_PROPERTY_NAME);
-      
+
       String topology = props.getProperty(TOPOLOGY_PROPERTY_NAME);
       if (topology != null && topology.equals(TOPOLOGY_P2P_VALUE)) {
         CacheFactory cf = new CacheFactory();
@@ -133,10 +115,10 @@ public class GeodeClient extends DB {
     }
     cache = ccf.create();
   }
-  
+
   @Override
   public Status read(String table, String key, Set<String> fields,
-      HashMap<String, ByteIterator> result) {
+                     HashMap<String, ByteIterator> result) {
     Region<String, Map<String, byte[]>> r = getRegion(table);
     Map<String, byte[]> val = r.get(key);
     if (val != null) {
@@ -156,7 +138,7 @@ public class GeodeClient extends DB {
 
   @Override
   public Status scan(String table, String startkey, int recordcount,
-      Set<String> fields, Vector<HashMap<String, ByteIterator>> result) {
+                     Set<String> fields, Vector<HashMap<String, ByteIterator>> result) {
     // Geode does not support scan
     return Status.ERROR;
   }
@@ -179,23 +161,24 @@ public class GeodeClient extends DB {
     return Status.OK;
   }
 
-  private Map<String, byte[]> convertToBytearrayMap(Map<String,ByteIterator> values) {
+  private Map<String, byte[]> convertToBytearrayMap(Map<String, ByteIterator> values) {
     Map<String, byte[]> retVal = new HashMap<String, byte[]>();
     for (Map.Entry<String, ByteIterator> entry : values.entrySet()) {
       retVal.put(entry.getKey(), entry.getValue().toArray());
     }
     return retVal;
   }
-  
+
   private Region<String, Map<String, byte[]>> getRegion(String table) {
     Region<String, Map<String, byte[]>> r = cache.getRegion(table);
     if (r == null) {
       try {
         if (isClient) {
-          ClientRegionFactory<String, Map<String, byte[]>> crf = ((ClientCache) cache).createClientRegionFactory(ClientRegionShortcut.PROXY);
+          ClientRegionFactory<String, Map<String, byte[]>> crf =
+              ((ClientCache) cache).createClientRegionFactory(ClientRegionShortcut.PROXY);
           r = crf.create(table);
         } else {
-          RegionFactory<String, Map<String, byte[]>> rf = ((Cache)cache).createRegionFactory(RegionShortcut.PARTITION);
+          RegionFactory<String, Map<String, byte[]>> rf = ((Cache) cache).createRegionFactory(RegionShortcut.PARTITION);
           r = rf.create(table);
         }
       } catch (RegionExistsException e) {
@@ -205,5 +188,4 @@ public class GeodeClient extends DB {
     }
     return r;
   }
-
-}
+}
\ No newline at end of file
diff --git a/geode/src/main/java/com/yahoo/ycsb/db/package-info.java b/geode/src/main/java/com/yahoo/ycsb/db/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b6db476efe15b518a452d6b7cc06432fd1a267d
--- /dev/null
+++ b/geode/src/main/java/com/yahoo/ycsb/db/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2014-2016, Yahoo!, Inc. All rights reserved.
+ *
+ * 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. See accompanying
+ * LICENSE file.
+ */
+
+/**
+ * YCSB binding for <a href="https://geode.incubator.apache.org/">Apache Geode (incubating)</a>.
+ */
+package com.yahoo.ycsb.db;
\ No newline at end of file
diff --git a/googledatastore/pom.xml b/googledatastore/pom.xml
index beea713908bfcf81eba2dcdccd13a41403cebb2b..57db3505c288e6d27c309dbd19a0bcf1ba1fbd2e 100644
--- a/googledatastore/pom.xml
+++ b/googledatastore/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
 
diff --git a/hbase094/pom.xml b/hbase094/pom.xml
index 2622150d3ffd213c357cf8cc0ce9e7c1ecbb41e1..ca7d4c60f62525c841e16b1b98f947fedddfc4b5 100644
--- a/hbase094/pom.xml
+++ b/hbase094/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent/</relativePath>
   </parent>
 
diff --git a/hbase098/pom.xml b/hbase098/pom.xml
index 99f7805b9fba6992bbdf960fb4af6aa9f7811e9e..29600f7f28c5126af931f393d04ca8da04c051f6 100644
--- a/hbase098/pom.xml
+++ b/hbase098/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent/</relativePath>
   </parent>
 
diff --git a/hbase10/pom.xml b/hbase10/pom.xml
index 5d782adf55ae68e57881502efcda0f5592d99716..3f6bec078debc77aaec15380ed744f326b2d5b30 100644
--- a/hbase10/pom.xml
+++ b/hbase10/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent/</relativePath>
   </parent>
 
diff --git a/hbase10/src/main/java/com/yahoo/ycsb/db/HBaseClient10.java b/hbase10/src/main/java/com/yahoo/ycsb/db/HBaseClient10.java
index 00fb615b6ccfd8439b6bba76011742c249924c74..a41c1987325afef791e0cc5b5bfa37f9aa737bef 100644
--- a/hbase10/src/main/java/com/yahoo/ycsb/db/HBaseClient10.java
+++ b/hbase10/src/main/java/com/yahoo/ycsb/db/HBaseClient10.java
@@ -51,7 +51,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.Vector;
-import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * HBase 1.0 client for YCSB framework.
@@ -64,7 +63,9 @@ import java.util.concurrent.atomic.AtomicInteger;
  */
 public class HBaseClient10 extends com.yahoo.ycsb.DB {
   private Configuration config = HBaseConfiguration.create();
-  private static final AtomicInteger THREAD_COUNT = new AtomicInteger(0);
+  
+  // Must be an object for synchronization and tracking running thread counts. 
+  private static Integer threadCount = 0;
 
   private boolean debug = false;
 
@@ -132,9 +133,11 @@ public class HBaseClient10 extends com.yahoo.ycsb.DB {
     }
 
     try {
-      THREAD_COUNT.getAndIncrement();
-      synchronized(THREAD_COUNT) {
-        connection = ConnectionFactory.createConnection(config);
+      synchronized(threadCount) {
+        ++threadCount;
+        if (connection == null) {
+          connection = ConnectionFactory.createConnection(config);
+        }
       }
     } catch (java.io.IOException e) {
       throw new DBException(e);
@@ -190,10 +193,11 @@ public class HBaseClient10 extends com.yahoo.ycsb.DB {
       long en = System.nanoTime();
       final String type = clientSideBuffering ? "UPDATE" : "CLEANUP";
       measurements.measure(type, (int) ((en - st) / 1000));
-      synchronized(THREAD_COUNT) {
-        int threadCount = THREAD_COUNT.decrementAndGet();
+      synchronized(threadCount) {
+        --threadCount;
         if (threadCount <= 0 && connection != null) {
           connection.close();
+          connection = null;
         }
       }
     } catch (IOException e) {
diff --git a/hypertable/pom.xml b/hypertable/pom.xml
index 8348fc0ba2d5f3405f0be4ca8860a3c00b145ba5..6c457f72777deb576ef40cf2dc160206d846b94f 100644
--- a/hypertable/pom.xml
+++ b/hypertable/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
   
diff --git a/infinispan/pom.xml b/infinispan/pom.xml
index 70dcbe43495175a4dcec0d519a5f5cf8b12bbc7f..943b1937e0b7051508905fdf31ab90aa6c04b3a8 100644
--- a/infinispan/pom.xml
+++ b/infinispan/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
   
@@ -51,4 +51,28 @@ LICENSE file.
       <scope>provided</scope>
     </dependency>
   </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+        <version>2.15</version>
+        <configuration>
+          <consoleOutput>true</consoleOutput>
+          <configLocation>../checkstyle.xml</configLocation>
+          <failOnViolation>true</failOnViolation>
+          <failsOnError>true</failsOnError>
+        </configuration>
+        <executions>
+          <execution>
+            <id>validate</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>checkstyle</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 </project>
diff --git a/infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanClient.java b/infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanClient.java
index 3abf7f6501456be2ca32b143bd8bab37a8f25be5..7fa75fd13f46d28e51d139fb239853f387f36d4a 100644
--- a/infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanClient.java
+++ b/infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanClient.java
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2012 YCSB contributors. All rights reserved.
+ * Copyright (c) 2012-2016 YCSB contributors. All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you
  * may not use this file except in compliance with the License. You
@@ -39,112 +39,118 @@ import java.util.Vector;
 
 /**
  * This is a client implementation for Infinispan 5.x.
- *
- * Some settings:
- *
- * @author Manik Surtani (manik AT jboss DOT org)
  */
 public class InfinispanClient extends DB {
-
-   // An optimisation for clustered mode
-   private final boolean clustered;
-
-   private EmbeddedCacheManager infinispanManager;
-
-   private static final Log logger = LogFactory.getLog(InfinispanClient.class);
-
-   public InfinispanClient() {
-      clustered = Boolean.getBoolean("infinispan.clustered");
-   }
-
-   public void init() throws DBException {
-      try {
-         infinispanManager = new DefaultCacheManager("infinispan-config.xml");
-      } catch (IOException e) {
-         throw new DBException(e);
+  private static final Log LOGGER = LogFactory.getLog(InfinispanClient.class);
+
+  // An optimisation for clustered mode
+  private final boolean clustered;
+
+  private EmbeddedCacheManager infinispanManager;
+
+  public InfinispanClient() {
+    clustered = Boolean.getBoolean("infinispan.clustered");
+  }
+
+  public void init() throws DBException {
+    try {
+      infinispanManager = new DefaultCacheManager("infinispan-config.xml");
+    } catch (IOException e) {
+      throw new DBException(e);
+    }
+  }
+
+  public void cleanup() {
+    infinispanManager.stop();
+    infinispanManager = null;
+  }
+
+  public Status read(String table, String key, Set<String> fields,
+      HashMap<String, ByteIterator> result) {
+    try {
+      Map<String, String> row;
+      if (clustered) {
+        row = AtomicMapLookup.getAtomicMap(infinispanManager.getCache(table), key, false);
+      } else {
+        Cache<String, Map<String, String>> cache = infinispanManager.getCache(table);
+        row = cache.get(key);
       }
-   }
-
-   public void cleanup() {
-      infinispanManager.stop();
-      infinispanManager = null;
-   }
-
-   public Status read(String table, String key, Set<String> fields, HashMap<String, ByteIterator> result) {
-      try {
-         Map<String, String> row;
-         if (clustered) {
-            row = AtomicMapLookup.getAtomicMap(infinispanManager.getCache(table), key, false);
-         } else {
-            Cache<String, Map<String, String>> cache = infinispanManager.getCache(table);
-            row = cache.get(key);
-         }
-         if (row != null) {
-            result.clear();
-            if (fields == null || fields.isEmpty()) {
-		StringByteIterator.putAllAsByteIterators(result, row);
-            } else {
-	       for (String field : fields) result.put(field, new StringByteIterator(row.get(field)));
-            }
-         }
-         return Status.OK;
-      } catch (Exception e) {
-         return Status.ERROR;
+      if (row != null) {
+        result.clear();
+        if (fields == null || fields.isEmpty()) {
+          StringByteIterator.putAllAsByteIterators(result, row);
+        } else {
+          for (String field : fields) {
+            result.put(field, new StringByteIterator(row.get(field)));
+          }
+        }
       }
-   }
-
-   public Status scan(String table, String startkey, int recordcount, Set<String> fields, Vector<HashMap<String, ByteIterator>> result) {
-      logger.warn("Infinispan does not support scan semantics");
       return Status.OK;
-   }
-
-   public Status update(String table, String key, HashMap<String, ByteIterator> values) {
-      try {
-         if (clustered) {
-            AtomicMap<String, String> row = AtomicMapLookup.getAtomicMap(infinispanManager.getCache(table), key);
-            StringByteIterator.putAllAsStrings(row, values);
-         } else {
-            Cache<String, Map<String, String>> cache = infinispanManager.getCache(table);
-            Map<String, String> row = cache.get(key);
-            if (row == null) {
-               row = StringByteIterator.getStringMap(values);
-               cache.put(key, row);
-            } else {
-               StringByteIterator.putAllAsStrings(row, values);
-            }
-         }
-
-         return Status.OK;
-      } catch (Exception e) {
-         return Status.ERROR;
+    } catch (Exception e) {
+      LOGGER.error(e);
+      return Status.ERROR;
+    }
+  }
+
+  public Status scan(String table, String startkey, int recordcount,
+      Set<String> fields, Vector<HashMap<String, ByteIterator>> result) {
+    LOGGER.warn("Infinispan does not support scan semantics");
+    return Status.OK;
+  }
+
+  public Status update(String table, String key,
+      HashMap<String, ByteIterator> values) {
+    try {
+      if (clustered) {
+        AtomicMap<String, String> row = AtomicMapLookup.getAtomicMap(infinispanManager.getCache(table), key);
+        StringByteIterator.putAllAsStrings(row, values);
+      } else {
+        Cache<String, Map<String, String>> cache = infinispanManager.getCache(table);
+        Map<String, String> row = cache.get(key);
+        if (row == null) {
+          row = StringByteIterator.getStringMap(values);
+          cache.put(key, row);
+        } else {
+          StringByteIterator.putAllAsStrings(row, values);
+        }
       }
-   }
-
-   public Status insert(String table, String key, HashMap<String, ByteIterator> values) {
-      try {
-         if (clustered) {
-            AtomicMap<String, String> row = AtomicMapLookup.getAtomicMap(infinispanManager.getCache(table), key);
-            row.clear();
-            StringByteIterator.putAllAsStrings(row, values);
-         } else {
-            infinispanManager.getCache(table).put(key, values);
-         }
-
-         return Status.OK;
-      } catch (Exception e) {
-         return Status.ERROR;
+
+      return Status.OK;
+    } catch (Exception e) {
+      LOGGER.error(e);
+      return Status.ERROR;
+    }
+  }
+
+  public Status insert(String table, String key,
+      HashMap<String, ByteIterator> values) {
+    try {
+      if (clustered) {
+        AtomicMap<String, String> row = AtomicMapLookup.getAtomicMap(infinispanManager.getCache(table), key);
+        row.clear();
+        StringByteIterator.putAllAsStrings(row, values);
+      } else {
+        infinispanManager.getCache(table).put(key, values);
       }
-   }
-
-   public Status delete(String table, String key) {
-      try {
-         if (clustered)
-            AtomicMapLookup.removeAtomicMap(infinispanManager.getCache(table), key);
-         else
-            infinispanManager.getCache(table).remove(key);
-         return Status.OK;
-      } catch (Exception e) {
-         return Status.ERROR;
+
+      return Status.OK;
+    } catch (Exception e) {
+      LOGGER.error(e);
+      return Status.ERROR;
+    }
+  }
+
+  public Status delete(String table, String key) {
+    try {
+      if (clustered) {
+        AtomicMapLookup.removeAtomicMap(infinispanManager.getCache(table), key);
+      } else {
+        infinispanManager.getCache(table).remove(key);
       }
-   }
+      return Status.OK;
+    } catch (Exception e) {
+      LOGGER.error(e);
+      return Status.ERROR;
+    }
+  }
 }
diff --git a/infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanRemoteClient.java b/infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanRemoteClient.java
index 9b09f553aa9b43d2448b6e7f1f64fdf4d11cb707..26ce835942d452cd8fe90064b38831e6de900b2d 100644
--- a/infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanRemoteClient.java
+++ b/infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanRemoteClient.java
@@ -1,12 +1,12 @@
 /**
- * Copyright (c) 2015 YCSB contributors. All rights reserved.
- *
+ * Copyright (c) 2015-2016 YCSB contributors. All rights reserved.
+ * <p>
  * 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
- *
+ * <p>
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
  * 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
@@ -17,12 +17,7 @@
 
 package com.yahoo.ycsb.db;
 
-import com.yahoo.ycsb.ByteIterator;
-import com.yahoo.ycsb.DB;
-import com.yahoo.ycsb.DBException;
-import com.yahoo.ycsb.Status;
-import com.yahoo.ycsb.StringByteIterator;
-
+import com.yahoo.ycsb.*;
 import org.infinispan.client.hotrod.RemoteCache;
 import org.infinispan.client.hotrod.RemoteCacheManager;
 import org.infinispan.util.logging.Log;
@@ -35,108 +30,110 @@ import java.util.Vector;
 
 /**
  * This is a client implementation for Infinispan 5.x in client-server mode.
- * 
- * @author mylesjao
- *
  */
 public class InfinispanRemoteClient extends DB {
 
-   private RemoteCacheManager remoteIspnManager;
-   
-   private String cacheName = null;
-
-   private static final Log logger = LogFactory.getLog(InfinispanRemoteClient.class);
-
-   @Override
-   public void init() throws DBException {
-	  remoteIspnManager = RemoteCacheManagerHolder.getInstance(getProperties());
-	  cacheName = getProperties().getProperty("cache");
-   }
-   
-   @Override
-   public void cleanup() {
-      remoteIspnManager.stop();
-      remoteIspnManager = null;
-   }
-   
-   @Override
-   public Status insert(String table, String recordKey, HashMap<String, ByteIterator> values) {
-	   String compositKey = createKey(table, recordKey);
-	   Map<String, String> stringValues = new HashMap<String,String>();
-	   StringByteIterator.putAllAsStrings(stringValues, values);
-	   try {
-    	  cache().put(compositKey, stringValues);
-         return Status.OK;
-      } catch (Exception e) {
-         return Status.ERROR;
-      }
-   }
-   
-   @Override
-   public Status read(String table, String recordKey, Set<String> fields, HashMap<String, ByteIterator> result) {
-	   String compositKey = createKey(table, recordKey);
-	   try {	  
-    	  Map<String, String> values = cache().get(compositKey);
-    	  
-    	  if(values == null || values.isEmpty()){
-    		  return Status.NOT_FOUND;
-    	  }
-    	  
-    	  if(fields == null){ //get all field/value pairs
-    		  StringByteIterator.putAllAsByteIterators(result, values);
-    	  }else{
-    		  for(String field: fields){
-    			  String value = values.get(field);
-    			  if(value != null){
-    				  result.put(field, new StringByteIterator(value) );
-    			  }
-    		  }
-    	  }
-    	  
-    	  return Status.OK;
-      } catch (Exception e) {
-         return Status.ERROR;
-      }
-   }
-   
-   @Override
-   public Status scan(String table, String startkey, int recordcount, Set<String> fields, Vector<HashMap<String, ByteIterator>> result) {
-      logger.warn("Infinispan does not support scan semantics");
-      return Status.NOT_IMPLEMENTED;
-   }
-   
-   @Override
-   public Status update(String table, String recordKey, HashMap<String, ByteIterator> values) {
-	   String compositKey = createKey(table, recordKey);
-      try {
-    	  Map<String, String> stringValues = new HashMap<String, String>();
-    	  StringByteIterator.putAllAsStrings(stringValues, values);
-    	  cache().put(compositKey, stringValues);
-         return Status.OK;
-      } catch (Exception e) {
-         return Status.ERROR;
+  private static final Log LOGGER = LogFactory.getLog(InfinispanRemoteClient.class);
+
+  private RemoteCacheManager remoteIspnManager;
+  private String cacheName = null;
+
+  @Override
+  public void init() throws DBException {
+    remoteIspnManager = RemoteCacheManagerHolder.getInstance(getProperties());
+    cacheName = getProperties().getProperty("cache");
+  }
+
+  @Override
+  public void cleanup() {
+    remoteIspnManager.stop();
+    remoteIspnManager = null;
+  }
+
+  @Override
+  public Status insert(String table, String recordKey, HashMap<String, ByteIterator> values) {
+    String compositKey = createKey(table, recordKey);
+    Map<String, String> stringValues = new HashMap<>();
+    StringByteIterator.putAllAsStrings(stringValues, values);
+    try {
+      cache().put(compositKey, stringValues);
+      return Status.OK;
+    } catch (Exception e) {
+      LOGGER.error(e);
+      return Status.ERROR;
+    }
+  }
+
+  @Override
+  public Status read(String table, String recordKey, Set<String> fields, HashMap<String, ByteIterator> result) {
+    String compositKey = createKey(table, recordKey);
+    try {
+      Map<String, String> values = cache().get(compositKey);
+
+      if (values == null || values.isEmpty()) {
+        return Status.NOT_FOUND;
       }
-   }
-   @Override
-   public Status delete(String table, String recordKey) {
-	   String compositKey = createKey(table, recordKey);
-      try {
-    	  cache().remove(compositKey);
-    	  return Status.OK;
-      } catch (Exception e) {
-         return Status.ERROR;
+
+      if (fields == null) { //get all field/value pairs
+        StringByteIterator.putAllAsByteIterators(result, values);
+      } else {
+        for (String field : fields) {
+          String value = values.get(field);
+          if (value != null) {
+            result.put(field, new StringByteIterator(value));
+          }
+        }
       }
-   }
-   
-   private RemoteCache<String, Map<String,String>> cache(){
-	   if(this.cacheName != null){
-		   return remoteIspnManager.getCache(cacheName);
-	   }else{
-		   return remoteIspnManager.getCache();
-	   }
-   }
-   
-   private String createKey(String table, String recordKey){
-	   return table + "-" + recordKey;
-   }
+
+      return Status.OK;
+    } catch (Exception e) {
+      LOGGER.error(e);
+      return Status.ERROR;
+    }
+  }
+
+  @Override
+  public Status scan(String table, String startkey, int recordcount, Set<String> fields,
+                     Vector<HashMap<String, ByteIterator>> result) {
+    LOGGER.warn("Infinispan does not support scan semantics");
+    return Status.NOT_IMPLEMENTED;
+  }
+
+  @Override
+  public Status update(String table, String recordKey, HashMap<String, ByteIterator> values) {
+    String compositKey = createKey(table, recordKey);
+    try {
+      Map<String, String> stringValues = new HashMap<>();
+      StringByteIterator.putAllAsStrings(stringValues, values);
+      cache().put(compositKey, stringValues);
+      return Status.OK;
+    } catch (Exception e) {
+      LOGGER.error(e);
+      return Status.ERROR;
+    }
+  }
+
+  @Override
+  public Status delete(String table, String recordKey) {
+    String compositKey = createKey(table, recordKey);
+    try {
+      cache().remove(compositKey);
+      return Status.OK;
+    } catch (Exception e) {
+      LOGGER.error(e);
+      return Status.ERROR;
+    }
+  }
+
+  private RemoteCache<String, Map<String, String>> cache() {
+    if (this.cacheName != null) {
+      return remoteIspnManager.getCache(cacheName);
+    } else {
+      return remoteIspnManager.getCache();
+    }
+  }
+
+  private String createKey(String table, String recordKey) {
+    return table + "-" + recordKey;
+  }
 }
diff --git a/infinispan/src/main/java/com/yahoo/ycsb/db/RemoteCacheManagerHolder.java b/infinispan/src/main/java/com/yahoo/ycsb/db/RemoteCacheManagerHolder.java
index b166f6b882993654657d52d6cafa1a182758caa0..aea795e00f2c020039cd0b23811d536400856d25 100644
--- a/infinispan/src/main/java/com/yahoo/ycsb/db/RemoteCacheManagerHolder.java
+++ b/infinispan/src/main/java/com/yahoo/ycsb/db/RemoteCacheManagerHolder.java
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2015 YCSB contributors. All rights reserved.
+ * Copyright (c) 2015-2016 YCSB contributors. All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License"); you
  * may not use this file except in compliance with the License. You
@@ -21,22 +21,27 @@ import java.util.Properties;
 
 import org.infinispan.client.hotrod.RemoteCacheManager;
 
-public class RemoteCacheManagerHolder {
-	
-	private static volatile RemoteCacheManager cacheManager = null;
-	
-	private RemoteCacheManagerHolder() {}
-	
-	public static RemoteCacheManager getInstance(Properties props){
-		RemoteCacheManager result = cacheManager;
-		if(result == null){
-			synchronized (RemoteCacheManagerHolder.class) {
-				result = cacheManager;
-				if (result == null) {
-					cacheManager = result = new RemoteCacheManager(props);
-				}
-			}
-		}
-		return result;
-	}
+/**
+ * Utility class to ensure only a single RemoteCacheManager is created.
+ */
+final class RemoteCacheManagerHolder {
+
+  private static volatile RemoteCacheManager cacheManager = null;
+
+  private RemoteCacheManagerHolder() {
+  }
+
+  static RemoteCacheManager getInstance(Properties props) {
+    RemoteCacheManager result = cacheManager;
+    if (result == null) {
+      synchronized (RemoteCacheManagerHolder.class) {
+        result = cacheManager;
+        if (result == null) {
+          result = new RemoteCacheManager(props);
+          cacheManager = new RemoteCacheManager(props);
+        }
+      }
+    }
+    return result;
+  }
 }
diff --git a/infinispan/src/main/java/com/yahoo/ycsb/db/package-info.java b/infinispan/src/main/java/com/yahoo/ycsb/db/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..01231c0248e67601251217039dbec0b39d4e5179
--- /dev/null
+++ b/infinispan/src/main/java/com/yahoo/ycsb/db/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2015-2016 YCSB Contributors. All rights reserved.
+ *
+ * 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. See accompanying
+ * LICENSE file.
+ */
+
+/**
+ * The YCSB binding for <a href="http://infinispan.org/">Infinispan</a>.
+ */
+package com.yahoo.ycsb.db;
+
diff --git a/jdbc/pom.xml b/jdbc/pom.xml
index 3caee4733ca9dea078ac6fc4e83e42f1f4a12617..6777033698fdb5393eb47661694c4e1043c4d29c 100644
--- a/jdbc/pom.xml
+++ b/jdbc/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
   
diff --git a/kudu/pom.xml b/kudu/pom.xml
index 867513d93b0cd62cdae21567d64374c962a40f23..f0d3088c06b67e88170ffa31fdf9c8136e0d4d53 100644
--- a/kudu/pom.xml
+++ b/kudu/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
 
diff --git a/mapkeeper/pom.xml b/mapkeeper/pom.xml
index 6786b96c94804c655400430b906d346e1abb7e8f..6fac3795c72b15599b2b848c803ea285efe8bc5c 100644
--- a/mapkeeper/pom.xml
+++ b/mapkeeper/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
   
diff --git a/memcached/pom.xml b/memcached/pom.xml
index 706b406135a397a0a95fa91466b97f3571656768..10bcbbe9467d1341d951dd0ab6265702097feccb 100644
--- a/memcached/pom.xml
+++ b/memcached/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
 
diff --git a/mongodb/pom.xml b/mongodb/pom.xml
index ad287ac260857cc69e54d50ba3109eeeaf29fc65..f510d19aa272acceb9737be103c95f8e3f295ef2 100644
--- a/mongodb/pom.xml
+++ b/mongodb/pom.xml
@@ -22,7 +22,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
 
diff --git a/nosqldb/pom.xml b/nosqldb/pom.xml
index 9398ea408a59bedc60f53a92abeb7ed21fc67638..e2823102e4452796ffd6402efbf11aebde97c78c 100644
--- a/nosqldb/pom.xml
+++ b/nosqldb/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
   
diff --git a/orientdb/pom.xml b/orientdb/pom.xml
index 3a8302cc68fb9ea112c13715d1f5ae0e12cd162b..db83a942d6955e12374d3b6055f6c7843c0a7e66 100644
--- a/orientdb/pom.xml
+++ b/orientdb/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
 
diff --git a/pom.xml b/pom.xml
index eb27af2c6e9e31e5969b1698e6edaa27bc600c1c..14cd0885fbbb413a5ee0289a4613c9dbfcf10a66 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
 
   <groupId>com.yahoo.ycsb</groupId>
   <artifactId>root</artifactId>
-  <version>0.8.0-SNAPSHOT</version>
+  <version>0.9.0-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <name>YCSB Root</name>
@@ -74,7 +74,7 @@ LICENSE file.
     <accumulo.version>1.6.0</accumulo.version>
     <cassandra.version>1.2.9</cassandra.version>
     <cassandra.cql.version>1.0.3</cassandra.cql.version>
-    <cassandra2.cql.version>2.1.8</cassandra2.cql.version>
+    <cassandra2.cql.version>3.0.0</cassandra2.cql.version>
     <geode.version>1.0.0-incubating.M1</geode.version>
     <infinispan.version>7.2.2.Final</infinispan.version>
     <kudu.version>0.6.0</kudu.version>
diff --git a/redis/pom.xml b/redis/pom.xml
index a958a0ecbf2fa0a6582e40e79a68aee1d1bd174e..65dbc50bf928e8e41333a48472d2f43f530f2fd5 100644
--- a/redis/pom.xml
+++ b/redis/pom.xml
@@ -21,7 +21,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
   </parent>
   
diff --git a/s3/pom.xml b/s3/pom.xml
index 44a288c4271df2c19a638bedaae9bf3d82ca967e..d5726a4621ffd67093a47c1498a0d6ac47758d32 100644
--- a/s3/pom.xml
+++ b/s3/pom.xml
@@ -19,7 +19,7 @@ LICENSE file.
     <parent>
         <groupId>com.yahoo.ycsb</groupId>
         <artifactId>binding-parent</artifactId>
-        <version>0.8.0-SNAPSHOT</version>
+        <version>0.9.0-SNAPSHOT</version>
         <relativePath>../binding-parent</relativePath>
     </parent>
   
diff --git a/s3/src/main/java/com/yahoo/ycsb/db/S3Client.java b/s3/src/main/java/com/yahoo/ycsb/db/S3Client.java
index f9f5b2daddbd1e4ced604ec3e3a27cf610b016f5..8ef3f5be38c30bf7f342440bab2203c87a585a47 100644
--- a/s3/src/main/java/com/yahoo/ycsb/db/S3Client.java
+++ b/s3/src/main/java/com/yahoo/ycsb/db/S3Client.java
@@ -353,6 +353,7 @@ public class S3Client extends DB {
         int sizeOfFile = (int)objectAndMetadata.getValue().getContentLength();
         fieldCount = sizeOfFile/sizeArray;
         totalSize = sizeOfFile;
+        objectAndMetadata.getKey().close();
       } catch (Exception e){
         System.err.println("Not possible to get the object :"+key);
         e.printStackTrace();
@@ -431,6 +432,7 @@ public class S3Client extends DB {
       objectData.read(inputStreamToByte, 0, sizeOfFile);
       result.put(key, new ByteArrayByteIterator(inputStreamToByte));
       objectData.close();
+      objectAndMetadata.getKey().close();
     } catch (Exception e){
       System.err.println("Not possible to get the object "+key);
       e.printStackTrace();
diff --git a/solr/pom.xml b/solr/pom.xml
index 30929e88532c5a669ad56dfa86bfe1fa6f00cfb4..8253ea02dbf57303494a58cf09010da762cae15e 100644
--- a/solr/pom.xml
+++ b/solr/pom.xml
@@ -23,7 +23,7 @@ LICENSE file.
 	<parent>
 		<groupId>com.yahoo.ycsb</groupId>
 		<artifactId>binding-parent</artifactId>
-		<version>0.8.0-SNAPSHOT</version>
+		<version>0.9.0-SNAPSHOT</version>
 		<relativePath>../binding-parent</relativePath>
 	</parent>
 
diff --git a/tarantool/pom.xml b/tarantool/pom.xml
index 6754818e8fb18dcfc40b0d7ae5cea742839f8540..acaea4ffc824e3640fe8afb08a415ac63cf2f07b 100644
--- a/tarantool/pom.xml
+++ b/tarantool/pom.xml
@@ -22,7 +22,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent/</relativePath>
   </parent>
 
@@ -47,4 +47,29 @@ LICENSE file.
       <scope>provided</scope>
     </dependency>
   </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+        <version>2.15</version>
+        <configuration>
+          <consoleOutput>true</consoleOutput>
+          <configLocation>../checkstyle.xml</configLocation>
+          <failOnViolation>true</failOnViolation>
+          <failsOnError>true</failsOnError>
+        </configuration>
+        <executions>
+          <execution>
+            <id>validate</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>checkstyle</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 </project>
diff --git a/tarantool/src/main/java/com/yahoo/ycsb/db/TarantoolClient.java b/tarantool/src/main/java/com/yahoo/ycsb/db/TarantoolClient.java
index b90dff119296ebde7a0fdf99b6138086a39f90db..e86120e1cfb10987d25497a01508e860a0a360d0 100644
--- a/tarantool/src/main/java/com/yahoo/ycsb/db/TarantoolClient.java
+++ b/tarantool/src/main/java/com/yahoo/ycsb/db/TarantoolClient.java
@@ -1,12 +1,12 @@
 /**
- * Copyright (c) 2014, Yahoo!, Inc. All rights reserved.
- *
+ * Copyright (c) 2014 - 2016 YCSB Contributors. All rights reserved.
+ * <p>
  * 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
- *
+ * <p>
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
  * 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
@@ -16,162 +16,137 @@
  */
 package com.yahoo.ycsb.db;
 
-import com.yahoo.ycsb.ByteIterator;
-import com.yahoo.ycsb.DB;
-import com.yahoo.ycsb.DBException;
-import com.yahoo.ycsb.Status;
-import com.yahoo.ycsb.StringByteIterator;
-
+import com.yahoo.ycsb.*;
 import org.tarantool.TarantoolConnection16;
 import org.tarantool.TarantoolConnection16Impl;
 import org.tarantool.TarantoolException;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.Vector;
+import java.util.*;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+/**
+ * YCSB binding for <a href="http://tarantool.org/">Tarantool</a>.
+ */
 public class TarantoolClient extends DB {
-
-	public static final String HOST_PROPERTY  = "tarantool.host";
-	public static final String PORT_PROPERTY  = "tarantool.port";
-	public static final String SPACE_PROPERTY = "tarantool.space";
-
-	public static final String DEFAULT_HOST   = "localhost";
-	public static final int    DEFAULT_PORT   = 3301;
-	public static final int    DEFAULT_SPACE  = 1024;
-
-	private static final Logger logger = Logger.getLogger(TarantoolClient.class.getName());
-	private TarantoolConnection16 connection;
-	private int spaceNo;
-
-	public void init() throws DBException {
-		Properties props = getProperties();
-
-		int port = DEFAULT_PORT;
-		String portString = props.getProperty(PORT_PROPERTY);
-		if (portString != null) {
-			port = Integer.parseInt(portString);
-		}
-
-		String host = props.getProperty(HOST_PROPERTY);
-		if (host == null) {
-			host = DEFAULT_HOST;
-		}
-
-		spaceNo = DEFAULT_SPACE;
-		String spaceString = props.getProperty(SPACE_PROPERTY);
-		if (spaceString != null) {
-			spaceNo = Integer.parseInt(spaceString);
-		}
-
-		try {
-			this.connection = new TarantoolConnection16Impl(host, port);
-		} catch (Exception exc) {
-			logger.log(Level.SEVERE,"Can't initialize Tarantool connection", exc);
-			return;
-		}
-	}
-
-	public void cleanup() throws DBException{
-		this.connection.close();
-	}
-
-	@Override
-	public Status insert(String table, String key, HashMap<String, ByteIterator> values) {
-		return replace(key, values, "Can't insert element");
-	}
-
-	private HashMap<String, ByteIterator> tuple_convert_filter (List<String> input,
-			Set<String> fields) {
-		HashMap<String, ByteIterator> result = new HashMap<String, ByteIterator>();
-		if (input == null)
-			return result;
-		for (int i = 1; i < input.toArray().length; i += 2)
-			if (fields == null || fields.contains(input.get(i)))
-				result.put(input.get(i), new StringByteIterator(input.get(i+1)));
-		return result;
-	}
-
-	@Override
-	public Status read(String table, String key, Set<String> fields,
-			HashMap<String, ByteIterator> result) {
-		try {
-			List<String> response;
-			response = this.connection.select(this.spaceNo, 0, Arrays.asList(key), 0, 1, 0);
-			result = tuple_convert_filter(response, fields);
-			return Status.OK;
-		} catch (TarantoolException exc) {
-			logger.log(Level.SEVERE,"Can't select element", exc);
-			return Status.ERROR;
-		} catch (NullPointerException exc) {
-			return Status.ERROR;
-		}
-	}
-
-	@Override
-	public Status scan(String table, String startkey,
-			int recordcount, Set<String> fields,
-			Vector<HashMap<String, ByteIterator>> result) {
-		List<List<String>> response;
-		try {
-			response = this.connection.select(this.spaceNo, 0, Arrays.asList(startkey), 0, recordcount, 6);
-		} catch (TarantoolException exc) {
-			logger.log(Level.SEVERE,"Can't select range elements", exc);
-			return Status.ERROR;
-		} catch (NullPointerException exc) {
-			return Status.ERROR;
-		}
-		for(List<String> i: response) {
-			HashMap<String, ByteIterator> temp = tuple_convert_filter(i, fields);
-			if (!temp.isEmpty())
-				result.add((HashMap<String, ByteIterator>) temp.clone());
-		}
-		return Status.OK;
-	}
-
-	@Override
-	public Status delete(String table, String key) {
-		try {
-			this.connection.delete(this.spaceNo, Arrays.asList(key));
-		} catch (TarantoolException exc) {
-			logger.log(Level.SEVERE,"Can't delete element", exc);
-			return Status.ERROR;
-		} catch (NullPointerException e) {
-			return Status.ERROR;
-		}
-		return Status.OK;
-	}
-	@Override
-	public Status update(String table, String key,
-			HashMap<String, ByteIterator> values) {
-		return replace(key, values, "Can't replace element");
-
-	}
-
-	private Status replace(String key,
-						  HashMap<String, ByteIterator> values,
-						  String exceptionDescription) {
-		int j = 0;
-		String[] tuple = new String[1 + 2 * values.size()];
-		tuple[0] = key;
-		for (Map.Entry<String, ByteIterator> i: values.entrySet()) {
-			tuple[j + 1] = i.getKey();
-			tuple[j + 2] = i.getValue().toString();
-			j += 2;
-		}
-		try {
-			this.connection.replace(this.spaceNo, tuple);
-		} catch (TarantoolException exc) {
-			logger.log(Level.SEVERE,exceptionDescription, exc);
-			return Status.ERROR;
-		}
-		return Status.OK;
-
-	}
+  private static final Logger LOGGER = Logger.getLogger(TarantoolClient.class.getName());
+
+  private static final String HOST_PROPERTY = "tarantool.host";
+  private static final String PORT_PROPERTY = "tarantool.port";
+  private static final String SPACE_PROPERTY = "tarantool.space";
+  private static final String DEFAULT_HOST = "localhost";
+  private static final String DEFAULT_PORT = "3301";
+  private static final String DEFAULT_SPACE = "1024";
+
+  private TarantoolConnection16 connection;
+  private int spaceNo;
+
+  public void init() throws DBException {
+    Properties props = getProperties();
+
+    int port = Integer.parseInt(props.getProperty(PORT_PROPERTY, DEFAULT_PORT));
+    String host = props.getProperty(HOST_PROPERTY, DEFAULT_HOST);
+    spaceNo = Integer.parseInt(props.getProperty(SPACE_PROPERTY, DEFAULT_SPACE));
+
+    try {
+      this.connection = new TarantoolConnection16Impl(host, port);
+    } catch (Exception exc) {
+      throw new DBException("Can't initialize Tarantool connection", exc);
+    }
+  }
+
+  public void cleanup() throws DBException {
+    this.connection.close();
+  }
+
+  @Override
+  public Status insert(String table, String key, HashMap<String, ByteIterator> values) {
+    return replace(key, values, "Can't insert element");
+  }
+
+  private HashMap<String, ByteIterator> tupleConvertFilter(List<String> input, Set<String> fields) {
+    HashMap<String, ByteIterator> result = new HashMap<>();
+    if (input == null) {
+      return result;
+    }
+    for (int i = 1; i < input.toArray().length; i += 2) {
+      if (fields == null || fields.contains(input.get(i))) {
+        result.put(input.get(i), new StringByteIterator(input.get(i + 1)));
+      }
+    }
+    return result;
+  }
+
+  @Override
+  public Status read(String table, String key, Set<String> fields, HashMap<String, ByteIterator> result) {
+    try {
+      List<String> response = this.connection.select(this.spaceNo, 0, Arrays.asList(key), 0, 1, 0);
+      result = tupleConvertFilter(response, fields);
+      return Status.OK;
+    } catch (TarantoolException exc) {
+      LOGGER.log(Level.SEVERE, "Can't select element", exc);
+      return Status.ERROR;
+    } catch (NullPointerException exc) {
+      return Status.ERROR;
+    }
+  }
+
+  @Override
+  public Status scan(String table, String startkey,
+                     int recordcount, Set<String> fields,
+                     Vector<HashMap<String, ByteIterator>> result) {
+    List<List<String>> response;
+    try {
+      response = this.connection.select(this.spaceNo, 0, Arrays.asList(startkey), 0, recordcount, 6);
+    } catch (TarantoolException exc) {
+      LOGGER.log(Level.SEVERE, "Can't select range elements", exc);
+      return Status.ERROR;
+    } catch (NullPointerException exc) {
+      return Status.ERROR;
+    }
+    for (List<String> i : response) {
+      HashMap<String, ByteIterator> temp = tupleConvertFilter(i, fields);
+      if (!temp.isEmpty()) {
+        result.add((HashMap<String, ByteIterator>) temp.clone());
+      }
+    }
+    return Status.OK;
+  }
+
+  @Override
+  public Status delete(String table, String key) {
+    try {
+      this.connection.delete(this.spaceNo, Collections.singletonList(key));
+    } catch (TarantoolException exc) {
+      LOGGER.log(Level.SEVERE, "Can't delete element", exc);
+      return Status.ERROR;
+    } catch (NullPointerException e) {
+      return Status.ERROR;
+    }
+    return Status.OK;
+  }
+
+  @Override
+  public Status update(String table, String key, HashMap<String, ByteIterator> values) {
+    return replace(key, values, "Can't replace element");
+  }
+
+  private Status replace(String key, HashMap<String, ByteIterator> values, String exceptionDescription) {
+    int j = 0;
+    String[] tuple = new String[1 + 2 * values.size()];
+    tuple[0] = key;
+    for (Map.Entry<String, ByteIterator> i : values.entrySet()) {
+      tuple[j + 1] = i.getKey();
+      tuple[j + 2] = i.getValue().toString();
+      j += 2;
+    }
+    try {
+      this.connection.replace(this.spaceNo, tuple);
+    } catch (TarantoolException exc) {
+      LOGGER.log(Level.SEVERE, exceptionDescription, exc);
+      return Status.ERROR;
+    }
+    return Status.OK;
+
+  }
 }
diff --git a/tarantool/src/main/java/com/yahoo/ycsb/db/package-info.java b/tarantool/src/main/java/com/yahoo/ycsb/db/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f34b7c99cfda4b48d8c10fc01311291705101fb
--- /dev/null
+++ b/tarantool/src/main/java/com/yahoo/ycsb/db/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2014 - 2016 YCSB Contributors. All rights reserved.
+ *
+ * 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. See accompanying
+ * LICENSE file.
+ */
+
+/**
+ * YCSB binding for <a href="http://tarantool.org/">Tarantool</a>.
+ */
+package com.yahoo.ycsb.db;
+
diff --git a/voldemort/pom.xml b/voldemort/pom.xml
index f79f06e768cad69d7b5ddd4890e94989ce6b0698..f891a65a9f8b1e886c7a40fa64747a5d3f363c9e 100644
--- a/voldemort/pom.xml
+++ b/voldemort/pom.xml
@@ -22,7 +22,7 @@ LICENSE file.
   <parent>
     <groupId>com.yahoo.ycsb</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>0.8.0-SNAPSHOT</version>
+    <version>0.9.0-SNAPSHOT</version>
     <relativePath>../binding-parent</relativePath>
    </parent>