diff --git a/h2-jdbc/README.md b/h2-jdbc/README.md
deleted file mode 100644
index 0c74dfa..0000000
--- a/h2-jdbc/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-## H2 provider ##
-h2-jdbc is a storage provider for the h2 embedded database. It is implemented using JPA and Hibernate.
-
-## Running the tests ##
-To run the tests you can use this command
-```
-mvn test
-```
-You can also run the integration tests with
-```
-mvn integration-test
-```
diff --git a/h2-jdbc/pom.xml b/h2-jdbc/pom.xml
deleted file mode 100644
index 61df81f..0000000
--- a/h2-jdbc/pom.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You 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.
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.jclouds.labs</groupId>
-    <artifactId>jclouds-labs</artifactId>
-    <version>2.2.0-SNAPSHOT</version>
-  </parent>
-  <artifactId>h2-jdbc</artifactId>
-  <name>jclouds h2 jdbc provider</name>
-  <description>jclouds implementation to target h2 databases</description>
-  <packaging>bundle</packaging>
-
-  <properties>
-    <jclouds.osgi.export>org.jclouds.jdbc*;version="${project.version}"</jclouds.osgi.export>
-    <jclouds.osgi.import>org.jclouds*;version="${project.version}",*</jclouds.osgi.import>
-  </properties>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>integration</id>
-            <phase>integration-test</phase>
-            <goals>
-              <goal>test</goal>
-            </goals>
-            <configuration>
-              <parallel>none</parallel>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.jclouds.labs</groupId>
-      <artifactId>jdbc</artifactId>
-      <version>${project.version}</version>
-      <type>jar</type>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.jclouds</groupId>
-      <artifactId>jclouds-blobstore</artifactId>
-      <version>${project.version}</version>
-      <type>jar</type>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.jclouds</groupId>
-      <artifactId>jclouds-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.jclouds</groupId>
-      <artifactId>jclouds-blobstore</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.jclouds.driver</groupId>
-      <artifactId>jclouds-log4j</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.auto.service</groupId>
-      <artifactId>auto-service</artifactId>
-      <scope>provided</scope>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>com.google.inject.extensions</groupId>
-      <artifactId>guice-persist</artifactId>
-      <version>4.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.hibernate.javax.persistence</groupId>
-      <artifactId>hibernate-jpa-2.1-api</artifactId>
-      <version>1.0.0.Final</version>
-    </dependency>
-    <dependency>
-      <groupId>org.hibernate</groupId>
-      <artifactId>hibernate-entitymanager</artifactId>
-      <version>4.3.9.Final</version>
-    </dependency>
-    <dependency>
-      <groupId>com.h2database</groupId>
-      <artifactId>h2</artifactId>
-      <version>1.4.187</version>
-    </dependency>
-
-    <!-- Test Dependencies -->
-    <dependency>
-      <groupId>org.assertj</groupId>
-      <artifactId>assertj-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-</project>
-
diff --git a/h2-jdbc/src/main/java/org/jclouds/h2/jdbc/H2JdbcProviderMetadata.java b/h2-jdbc/src/main/java/org/jclouds/h2/jdbc/H2JdbcProviderMetadata.java
deleted file mode 100644
index 93aa6e7..0000000
--- a/h2-jdbc/src/main/java/org/jclouds/h2/jdbc/H2JdbcProviderMetadata.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.h2.jdbc;
-
-import org.jclouds.h2.jdbc.config.H2JdbcBlobStoreContextModule;
-import org.jclouds.jdbc.JdbcApiMetadata;
-import org.jclouds.providers.ProviderMetadata;
-import org.jclouds.providers.internal.BaseProviderMetadata;
-
-import com.google.auto.service.AutoService;
-
-@AutoService(ProviderMetadata.class)
-public class H2JdbcProviderMetadata extends BaseProviderMetadata {
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   @Override
-   public Builder toBuilder() {
-      return builder().fromProviderMetadata(this);
-   }
-
-   public H2JdbcProviderMetadata() {
-      super(builder());
-   }
-
-   public H2JdbcProviderMetadata(Builder builder) {
-      super(builder);
-   }
-
-   public static class Builder extends BaseProviderMetadata.Builder {
-      protected Builder() {
-         id("h2-jdbc")
-               .name("H2 Jdbc")
-               .apiMetadata(new JdbcApiMetadata()
-                     .toBuilder()
-                     .defaultModule(H2JdbcBlobStoreContextModule.class)
-                     .build());
-      }
-
-      @Override
-      public H2JdbcProviderMetadata build() {
-         return new H2JdbcProviderMetadata(this);
-      }
-
-      @Override
-      public Builder fromProviderMetadata(ProviderMetadata in) {
-         super.fromProviderMetadata(in);
-         return this;
-      }
-   }
-}
diff --git a/h2-jdbc/src/main/java/org/jclouds/h2/jdbc/config/H2JdbcBlobStoreContextModule.java b/h2-jdbc/src/main/java/org/jclouds/h2/jdbc/config/H2JdbcBlobStoreContextModule.java
deleted file mode 100644
index 30064d0..0000000
--- a/h2-jdbc/src/main/java/org/jclouds/h2/jdbc/config/H2JdbcBlobStoreContextModule.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.h2.jdbc.config;
-
-import java.util.Properties;
-
-import org.jclouds.jdbc.config.JdbcBlobStoreContextModule;
-
-import com.google.inject.persist.jpa.JpaPersistModule;
-
-public class H2JdbcBlobStoreContextModule extends JdbcBlobStoreContextModule {
-
-   private static final String DEFAULT_FILE = "./jclouds-db";
-
-   protected void configure() {
-      super.configure();
-
-      Properties properties = new Properties();
-      properties.setProperty("hibernate.connection.url", "jdbc:h2:" + DEFAULT_FILE);
-
-      install(new JpaPersistModule("jclouds-h2").properties(properties));
-   }
-
-}
diff --git a/h2-jdbc/src/main/resources/META-INF/persistence.xml b/h2-jdbc/src/main/resources/META-INF/persistence.xml
deleted file mode 100644
index 30a8b35..0000000
--- a/h2-jdbc/src/main/resources/META-INF/persistence.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You 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.
-
--->
-<persistence xmlns="http://java.sun.com/xml/ns/persistence"
-             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
-             version="1.0">
-
-  <persistence-unit name="jclouds-h2" transaction-type="RESOURCE_LOCAL">
-    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
-
-    <class>org.jclouds.jdbc.entity.ContainerEntity</class>
-    <class>org.jclouds.jdbc.entity.BlobEntity</class>
-    <class>org.jclouds.jdbc.entity.ChunkEntity</class>
-    <class>org.jclouds.jdbc.entity.PayloadEntity</class>
-    <exclude-unlisted-classes>true</exclude-unlisted-classes>
-
-    <properties>
-      <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
-      <property name="hibernate.connection.driver_class" value="org.h2.Driver" />
-      <property name="hibernate.connection.user" value="sa" />
-      <!-- Allow hibernate to generate our schema -->
-      <property name="hibernate.hbm2ddl.auto" value="create" />
-    </properties>
-  </persistence-unit>
-
-</persistence>
diff --git a/h2-jdbc/src/test/java/org/jclouds/h2/jdbc/H2JdbcProviderTest.java b/h2-jdbc/src/test/java/org/jclouds/h2/jdbc/H2JdbcProviderTest.java
deleted file mode 100644
index 2330ad7..0000000
--- a/h2-jdbc/src/test/java/org/jclouds/h2/jdbc/H2JdbcProviderTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.h2.jdbc;
-
-import org.jclouds.jdbc.JdbcApiMetadata;
-import org.jclouds.providers.internal.BaseProviderMetadataTest;
-import org.testng.annotations.Test;
-
-@Test(groups = "unit", testName = "H2JdbcProviderTest")
-public class H2JdbcProviderTest extends BaseProviderMetadataTest {
-
-   public H2JdbcProviderTest() {
-      super(new H2JdbcProviderMetadata(), new JdbcApiMetadata());
-   }
-
-}
diff --git a/h2-jdbc/src/test/java/org/jclouds/h2/jdbc/blobstore/H2JdbcBlobIntegrationTest.java b/h2-jdbc/src/test/java/org/jclouds/h2/jdbc/blobstore/H2JdbcBlobIntegrationTest.java
deleted file mode 100644
index e17aca7..0000000
--- a/h2-jdbc/src/test/java/org/jclouds/h2/jdbc/blobstore/H2JdbcBlobIntegrationTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.h2.jdbc.blobstore;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest;
-import org.testng.annotations.Test;
-import org.testng.SkipException;
-
-@Test(groups = { "integration" }, singleThreaded = true, testName = "blobstore.H2JdbcBlobIntegrationTest")
-public class H2JdbcBlobIntegrationTest extends BaseBlobIntegrationTest {
-   public H2JdbcBlobIntegrationTest() {
-      provider = "h2-jdbc";
-   }
-
-   @Override
-   protected Iterable<Module> setupModules() {
-      return ImmutableSet.<Module> of(this.getLoggingModule());
-   }
-
-   @Override
-   public void testSetBlobAccess() throws Exception {
-       throw new SkipException("jdbc does not support anonymous access");
-   }
-}
diff --git a/h2-jdbc/src/test/java/org/jclouds/h2/jdbc/blobstore/H2JdbcContainerIntegrationTest.java b/h2-jdbc/src/test/java/org/jclouds/h2/jdbc/blobstore/H2JdbcContainerIntegrationTest.java
deleted file mode 100644
index 09549ad..0000000
--- a/h2-jdbc/src/test/java/org/jclouds/h2/jdbc/blobstore/H2JdbcContainerIntegrationTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.h2.jdbc.blobstore;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest;
-import org.testng.annotations.Test;
-import org.testng.SkipException;
-
-@Test(groups = { "integration" }, singleThreaded = true, testName = "blobstore.H2JdbcContainerIntegrationTest")
-public class H2JdbcContainerIntegrationTest extends BaseContainerIntegrationTest {
-   public H2JdbcContainerIntegrationTest() {
-      provider = "h2-jdbc";
-   }
-
-   @Override
-   protected Iterable<Module> setupModules() {
-      return ImmutableSet.<Module> of(this.getLoggingModule());
-   }
-
-   @Override
-   public void testSetContainerAccess() throws Exception {
-       throw new SkipException("jdbc does not support anonymous access");
-   }
-
-   @Override
-   public void testClearWithOptions() throws InterruptedException {
-      throw new SkipException("jdbc does not support clear with options");
-   }
-}
diff --git a/h2-jdbc/src/test/resources/log4j.properties b/h2-jdbc/src/test/resources/log4j.properties
deleted file mode 100644
index 0815baa..0000000
--- a/h2-jdbc/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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.
-#
-#
-log4j.rootLogger=WARN, A1
-log4j.appender.A1=org.apache.log4j.ConsoleAppender
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
-log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
-log4j.logger.org.hibernate = ERROR
diff --git a/jdbc/README.md b/jdbc/README.md
deleted file mode 100644
index ffcee1c..0000000
--- a/jdbc/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-## Jdbc api ##
-jclouds-jdbc is a storage api for relational databases. It is implemented using Guice Persist and JPA, so the user must
-provide an entity manager and a persistence.xml file with the required data source. An example of the persistence.xml can be
-found [here](https://github.com/jclouds/jclouds-labs/blob/master/jdbc/src/test/resources/META-INF/persistence.xml).
-
-## Running the tests ##
-Jdbc tests set up an embedded database and run the tests against it. To run the tests you can use this command.
-```
-mvn test
-```
-You can also run the integration tests with
-```
-mvn integration-test
-```
diff --git a/jdbc/pom.xml b/jdbc/pom.xml
deleted file mode 100644
index 1b25e2e..0000000
--- a/jdbc/pom.xml
+++ /dev/null
@@ -1,175 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You 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.
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.apache.jclouds.labs</groupId>
-    <artifactId>jclouds-labs</artifactId>
-    <version>2.2.0-SNAPSHOT</version>
-  </parent>
-  <groupId>org.apache.jclouds.labs</groupId>
-  <artifactId>jdbc</artifactId>
-  <name>jclouds jdbc core</name>
-  <description>jclouds components to access jdbc</description>
-  <packaging>bundle</packaging>
-
-  <properties>
-    <jclouds.osgi.export>org.jclouds.jdbc*;version="${project.version}"</jclouds.osgi.export>
-    <jclouds.osgi.import>org.jclouds*;version="${project.version}",*</jclouds.osgi.import>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.jclouds</groupId>
-      <artifactId>jclouds-blobstore</artifactId>
-      <version>${project.version}</version>
-      <type>jar</type>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.jclouds</groupId>
-      <artifactId>jclouds-core</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.jclouds</groupId>
-      <artifactId>jclouds-blobstore</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.jclouds.driver</groupId>
-      <artifactId>jclouds-log4j</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.google.auto.service</groupId>
-      <artifactId>auto-service</artifactId>
-      <scope>provided</scope>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>com.google.inject.extensions</groupId>
-      <artifactId>guice-persist</artifactId>
-      <version>4.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.hibernate.javax.persistence</groupId>
-      <artifactId>hibernate-jpa-2.1-api</artifactId>
-      <version>1.0.0.Final</version>
-    </dependency>
-
-
-    <!-- Test Dependencies -->
-    <dependency>
-      <groupId>org.hibernate</groupId>
-      <artifactId>hibernate-entitymanager</artifactId>
-      <version>4.3.9.Final</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.persistence</groupId>
-      <artifactId>eclipselink</artifactId>
-      <version>2.6.0</version>
-      <scope>test</scope>
-      <exclusions>
-        <exclusion>
-          <artifactId>javax.persistence</artifactId>
-          <groupId>org.eclipse.persistence</groupId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.assertj</groupId>
-      <artifactId>assertj-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <version>2.3.2</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.h2database</groupId>
-      <artifactId>h2</artifactId>
-      <version>1.4.187</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-            <threadCount>1</threadCount>
-        </configuration>
-        <executions>
-          <execution>
-            <id>integration</id>
-            <phase>integration-test</phase>
-            <goals>
-              <goal>test</goal>
-            </goals>
-            <configuration>
-              <threadCount>1</threadCount>
-              <excludes>
-                <exclude>**/*LiveTest.java</exclude>
-                <exclude>**/Base*Test.java</exclude>
-              </excludes>
-              <includes>
-                <include>**/*IntegrationTest.java</include>
-              </includes>
-              <systemPropertyVariables>
-                <jclouds.blobstore.httpstream.url>${jclouds.blobstore.httpstream.url}</jclouds.blobstore.httpstream.url>
-                <jclouds.blobstore.httpstream.md5>${jclouds.blobstore.httpstream.md5}</jclouds.blobstore.httpstream.md5>
-              </systemPropertyVariables>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>animal-sniffer-maven-plugin</artifactId>
-        <configuration>
-          <signature>
-            <groupId>org.codehaus.mojo.signature</groupId>
-            <artifactId>java16</artifactId>
-            <version>1.0</version>
-          </signature>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.basepom.maven</groupId>
-        <artifactId>duplicate-finder-maven-plugin</artifactId>
-        <configuration>
-          <checkTestClasspath>false</checkTestClasspath>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
-
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/JdbcApiMetadata.java b/jdbc/src/main/java/org/jclouds/jdbc/JdbcApiMetadata.java
deleted file mode 100644
index b478505..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/JdbcApiMetadata.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc;
-
-import com.google.auto.service.AutoService;
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-import org.jclouds.apis.ApiMetadata;
-import org.jclouds.apis.internal.BaseApiMetadata;
-import org.jclouds.blobstore.BlobStoreContext;
-import org.jclouds.jdbc.config.JdbcBlobStoreContextModule;
-
-import java.net.URI;
-
-/**
- * Implementation of {@link ApiMetadata} for jclouds Jdbc BlobStore
- */
-@AutoService(ApiMetadata.class)
-public class JdbcApiMetadata extends BaseApiMetadata {
-
-   @Override
-   public Builder toBuilder() {
-      return new Builder().fromApiMetadata(this);
-   }
-
-   public JdbcApiMetadata() {
-      super(new Builder());
-   }
-
-   protected JdbcApiMetadata(Builder builder) {
-      super(builder);
-   }
-
-   public static class Builder extends BaseApiMetadata.Builder<Builder> {
-
-      protected Builder() {
-         id("jdbc")
-         .name("Jdbc BlobStore")
-         .identityName("Unused")
-         .credentialName("unused")
-         .defaultEndpoint("http://localhost/transient")
-         .defaultIdentity("unused")
-         .defaultCredential("unused")
-         .version("1")
-         .documentation(URI.create("http://www.jclouds.org/documentation/userguide/blobstore-guide"))
-         .view(BlobStoreContext.class)
-         .defaultModules(ImmutableSet.<Class<? extends Module>>of(JdbcBlobStoreContextModule.class));
-      }
-
-      @Override
-      public JdbcApiMetadata build() {
-         return new JdbcApiMetadata(this);
-      }
-
-      @Override
-      protected Builder self() {
-         return this;
-      }
-   }
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/config/JPAInitializer.java b/jdbc/src/main/java/org/jclouds/jdbc/config/JPAInitializer.java
deleted file mode 100644
index 08dba6e..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/config/JPAInitializer.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.config;
-
-import java.io.Closeable;
-
-import org.jclouds.lifecycle.Closer;
-
-import com.google.inject.Inject;
-import com.google.inject.persist.PersistService;
-
-public class JPAInitializer {
-
-   @Inject
-   private JPAInitializer(final PersistService persistService, Closer closer) {
-      persistService.start();
-      closer.addToClose(new Closeable() {
-         @Override
-         public void close() {
-            persistService.stop();
-         }
-      });
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/config/JdbcBlobStoreContextModule.java b/jdbc/src/main/java/org/jclouds/jdbc/config/JdbcBlobStoreContextModule.java
deleted file mode 100644
index 3619eb6..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/config/JdbcBlobStoreContextModule.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.config;
-
-import com.google.inject.AbstractModule;
-import org.jclouds.blobstore.BlobRequestSigner;
-import org.jclouds.blobstore.BlobStore;
-import org.jclouds.blobstore.LocalBlobRequestSigner;
-import org.jclouds.blobstore.LocalStorageStrategy;
-import org.jclouds.blobstore.attr.ConsistencyModel;
-import org.jclouds.blobstore.config.BlobStoreObjectModule;
-import org.jclouds.blobstore.config.LocalBlobStore;
-import org.jclouds.blobstore.util.BlobUtils;
-import org.jclouds.jdbc.strategy.JdbcStorageStrategy;
-import org.jclouds.jdbc.util.JdbcBlobUtils;
-
-public class JdbcBlobStoreContextModule extends AbstractModule {
-
-   @Override
-   protected void configure() {
-      bind(JPAInitializer.class).asEagerSingleton();
-      bind(BlobStore.class).to(LocalBlobStore.class);
-      install(new BlobStoreObjectModule());
-      bind(ConsistencyModel.class).toInstance(ConsistencyModel.STRICT);
-      bind(LocalStorageStrategy.class).to(JdbcStorageStrategy.class);
-      bind(BlobUtils.class).to(JdbcBlobUtils.class);
-      bind(BlobRequestSigner.class).to(LocalBlobRequestSigner.class);
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/conversion/BlobEntityToBlob.java b/jdbc/src/main/java/org/jclouds/jdbc/conversion/BlobEntityToBlob.java
deleted file mode 100644
index 9d99778..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/conversion/BlobEntityToBlob.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.conversion;
-
-import com.google.common.base.Function;
-import com.google.common.hash.HashCode;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import org.jclouds.blobstore.domain.Blob;
-import org.jclouds.blobstore.domain.BlobBuilder;
-import org.jclouds.blobstore.domain.StorageType;
-import org.jclouds.jdbc.entity.BlobEntity;
-import org.jclouds.jdbc.entity.PayloadEntity;
-import org.jclouds.jdbc.service.JdbcService;
-import org.jclouds.jdbc.util.JdbcInputStream;
-
-public class BlobEntityToBlob implements Function<BlobEntity, Blob> {
-
-   private final Provider<BlobBuilder> blobBuilders;
-   private final JdbcService jdbcService;
-
-   @Inject
-   BlobEntityToBlob(Provider<BlobBuilder> blobBuilders, JdbcService jdbcService) {
-      this.blobBuilders = blobBuilders;
-      this.jdbcService = jdbcService;
-   }
-
-   @Override
-   public Blob apply(BlobEntity blobEntity) {
-      if (blobEntity == null) {
-         return null;
-      }
-
-      PayloadEntity payload = blobEntity.getPayload();
-      BlobBuilder builder = blobBuilders.get()
-            .name(blobEntity.getKey())
-            .userMetadata(blobEntity.getUserMetadata());
-
-      if (blobEntity.isDirectory()) {
-         builder.type(StorageType.FOLDER);
-      }
-      else {
-         builder.payload(new JdbcInputStream(jdbcService, blobEntity.getPayload().getChunks()));
-      }
-
-      Blob blob = builder.build();
-
-      blob.getMetadata().setContainer(blobEntity.getContainerEntity().getName());
-      blob.getMetadata().setCreationDate(blobEntity.getCreationDate());
-      blob.getMetadata().setLastModified(blobEntity.getLastModified());
-      blob.getMetadata().setSize(blobEntity.getSize());
-      blob.getMetadata().setUserMetadata(blobEntity.getUserMetadata());
-
-      blob.getMetadata().getContentMetadata().setCacheControl(payload.getCacheControl());
-      blob.getMetadata().getContentMetadata().setContentType(payload.getContentType());
-      blob.getMetadata().getContentMetadata().setContentDisposition(payload.getContentDisposition());
-      blob.getMetadata().getContentMetadata().setContentEncoding(payload.getContentEncoding());
-      blob.getMetadata().getContentMetadata().setContentLanguage(payload.getContentLanguage());
-      blob.getMetadata().getContentMetadata().setContentLength(payload.getContentLength());
-      blob.getMetadata().getContentMetadata().setContentMD5(payload.getContentMD5() == null ?
-            null :
-            HashCode.fromBytes(payload.getContentMD5()));
-      blob.getMetadata().setETag(blobEntity.getEtag());
-      blob.getMetadata().getContentMetadata().setExpires(payload.getExpires());
-      blob.getMetadata().setTier(blobEntity.getTier());
-      return blob;
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/conversion/BlobToBlobEntity.java b/jdbc/src/main/java/org/jclouds/jdbc/conversion/BlobToBlobEntity.java
deleted file mode 100644
index d217404..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/conversion/BlobToBlobEntity.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.conversion;
-
-import com.google.common.base.Function;
-import org.jclouds.blobstore.domain.Blob;
-import org.jclouds.blobstore.domain.MutableBlobMetadata;
-import org.jclouds.io.ContentMetadata;
-import org.jclouds.jdbc.entity.BlobEntity;
-import org.jclouds.jdbc.entity.PayloadEntity;
-
-public class BlobToBlobEntity implements Function<Blob, BlobEntity> {
-   @Override
-   public BlobEntity apply(Blob blob) {
-      MutableBlobMetadata metadata = blob.getMetadata();
-      ContentMetadata contentMetadata = metadata.getContentMetadata();
-      PayloadEntity payload = PayloadEntity.builder()
-            .cacheControl(contentMetadata.getCacheControl())
-            .contentDisposition(contentMetadata.getContentDisposition())
-            .contentEncoding(contentMetadata.getContentEncoding())
-            .contentLanguage(contentMetadata.getContentLanguage())
-            .contentLength(contentMetadata.getContentLength())
-            .contentMD5(contentMetadata.getContentMD5AsHashCode() == null ?
-                  null :
-                  contentMetadata.getContentMD5AsHashCode().asBytes())
-            .contentType(contentMetadata.getContentType())
-            .expires(contentMetadata.getExpires())
-            .build();
-      return BlobEntity.builder(null, null)
-            .payload(payload)
-            .userMetadata(metadata.getUserMetadata())
-            .size(blob.getPayload().getContentMetadata().getContentLength())
-            .build();
-   }
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/entity/BlobEntity.java b/jdbc/src/main/java/org/jclouds/jdbc/entity/BlobEntity.java
deleted file mode 100644
index 9a96a36..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/entity/BlobEntity.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.entity;
-
-import org.jclouds.blobstore.domain.BlobAccess;
-import org.jclouds.blobstore.domain.Tier;
-
-import javax.persistence.CascadeType;
-import javax.persistence.ElementCollection;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToOne;
-import javax.persistence.PrePersist;
-import javax.persistence.Table;
-import java.util.Date;
-import java.util.Map;
-
-@Entity
-@Table
-@IdClass(value = BlobEntityPK.class)
-public class BlobEntity {
-
-   @Id
-   @ManyToOne
-   @JoinColumn(name = "id")
-   private ContainerEntity containerEntity;
-
-   @Id
-   private String key;
-
-   @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
-   private PayloadEntity payload;
-
-   @ElementCollection(fetch = FetchType.EAGER)
-   public Map<String, String> userMetadata;
-
-   private Date creationDate;
-   private Date lastModified;
-   private BlobAccess blobAccess;
-   private Tier tier;
-   private Long size;
-   private String etag;
-   private boolean directory;
-
-   @PrePersist
-   private void defaults() {
-      this.lastModified = new Date();
-      if (this.creationDate == null) {
-         this.creationDate = new Date();
-      }
-      if (blobAccess == null) {
-         this.blobAccess = BlobAccess.PRIVATE;
-      }
-   }
-
-   public BlobEntity() {
-   }
-
-   public BlobEntity(ContainerEntity containerEntity, String key, PayloadEntity payload, Date creationDate, Date lastModified,
-         BlobAccess blobAccess, Tier tier, Map<String, String> userMetadata, Long size, String etag, boolean directory) {
-      this.containerEntity = containerEntity;
-      this.key = key;
-      this.creationDate = creationDate;
-      this.lastModified = lastModified;
-      this.payload = payload;
-      this.blobAccess = blobAccess;
-      this.tier = tier;
-      this.userMetadata = userMetadata;
-      this.size = size;
-      this.etag = etag;
-      this.directory = directory;
-   }
-
-   public ContainerEntity getContainerEntity() {
-      return containerEntity;
-   }
-
-   public boolean isDirectory() {
-      return directory;
-   }
-
-   public void setDirectory(boolean directory) {
-      this.directory = directory;
-   }
-
-   public void setContainerEntity(ContainerEntity containerEntity) {
-      this.containerEntity = containerEntity;
-   }
-
-   public String getKey() {
-      return key;
-   }
-
-   public void setKey(String key) {
-      this.key = key;
-   }
-
-   public PayloadEntity getPayload() {
-      return payload;
-   }
-
-   public void setPayload(PayloadEntity payload) {
-      this.payload = payload;
-   }
-
-   public Date getLastModified() {
-      return lastModified;
-   }
-
-   public void setLastModified(Date lastModified) {
-      this.lastModified = lastModified;
-   }
-
-   public Date getCreationDate() {
-      return creationDate;
-   }
-
-   public void setCreationDate(Date creationDate) {
-      this.creationDate = creationDate;
-   }
-
-   public BlobAccess getBlobAccess() {
-      return blobAccess;
-   }
-
-   public void setBlobAccess(BlobAccess blobAccess) {
-      this.blobAccess = blobAccess;
-   }
-
-   public Tier getTier() {
-      return tier;
-   }
-
-   public void setTier(Tier tier) {
-      this.tier = tier;
-   }
-
-   public Map<String, String> getUserMetadata() {
-      return userMetadata;
-   }
-
-   public void setUserMetadata(Map<String, String> userMetadata) {
-      this.userMetadata = userMetadata;
-   }
-
-   public Long getSize() {
-      return size;
-   }
-
-   public void setSize(Long size) {
-      this.size = size;
-   }
-
-   public String getEtag() {
-      return etag;
-   }
-
-   public void setEtag(String etag) {
-      this.etag = etag;
-   }
-
-   public static Builder builder(ContainerEntity containerEntity, String key) {
-      return new Builder(containerEntity, key);
-   }
-
-   public static class Builder {
-      private ContainerEntity containerEntity;
-      private String key;
-      private PayloadEntity payload;
-      private BlobAccess blobAccess;
-      private Tier tier;
-      private Long size;
-      private String etag;
-      private Map<String, String> userMetadata;
-      private boolean directory;
-
-      public Builder(ContainerEntity containerEntity, String key) {
-         this.containerEntity = containerEntity;
-         this.key = key;
-         this.directory = false;
-      }
-
-      public Builder blobAccess(BlobAccess blobAccess) {
-         this.blobAccess = blobAccess;
-         return this;
-      }
-
-      public Builder tier(Tier tier) {
-         this.tier = tier;
-         return this;
-      }
-
-      public Builder payload(PayloadEntity payload) {
-         this.payload = payload;
-         return this;
-      }
-
-      public Builder userMetadata(Map<String, String> userMetadata) {
-         this.userMetadata = userMetadata;
-         return this;
-      }
-
-      public Builder size(Long size) {
-         this.size = size;
-         return this;
-      }
-
-      public Builder etag(String etag) {
-         this.etag = etag;
-         return this;
-      }
-
-      public Builder directory(boolean directory) {
-         this.directory = directory;
-         return this;
-      }
-
-      public BlobEntity build() {
-         return new BlobEntity(containerEntity, key, payload, null, null, blobAccess, tier, userMetadata, size, etag, directory);
-      }
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/entity/BlobEntityPK.java b/jdbc/src/main/java/org/jclouds/jdbc/entity/BlobEntityPK.java
deleted file mode 100644
index e57342f..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/entity/BlobEntityPK.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.entity;
-
-import java.io.Serializable;
-
-public class BlobEntityPK implements Serializable {
-
-   private Long containerEntity;
-   private String key;
-
-   public Long getContainerEntity() {
-      return containerEntity;
-   }
-
-   public String getKey() {
-      return key;
-   }
-
-   public BlobEntityPK() {
-   }
-
-   public BlobEntityPK(Long containerEntity, String key) {
-      this.containerEntity = containerEntity;
-      this.key = key;
-   }
-
-   @Override
-   public boolean equals(Object o) {
-      if (this == o)
-         return true;
-      if (o == null || getClass() != o.getClass())
-         return false;
-
-      BlobEntityPK blobEntityPK = (BlobEntityPK) o;
-
-      return containerEntity.equals(blobEntityPK.containerEntity) && key.equals(blobEntityPK.key);
-   }
-
-   @Override
-   public int hashCode() {
-      int result = containerEntity.hashCode();
-      result = 31 * result + key.hashCode();
-      return result;
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/entity/ChunkEntity.java b/jdbc/src/main/java/org/jclouds/jdbc/entity/ChunkEntity.java
deleted file mode 100644
index 41a8cee..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/entity/ChunkEntity.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.entity;
-
-import org.jclouds.jdbc.reference.JdbcConstants;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-import javax.persistence.Table;
-
-@Entity
-@Table
-public class ChunkEntity {
-
-   @Id
-   @GeneratedValue
-   private Long id;
-
-   @Lob
-   @Column(length = JdbcConstants.DEFAULT_CHUNK_SIZE)
-   private byte[] data;
-
-   private int size;
-
-   public ChunkEntity(byte[] data, int size) {
-      this.data = data;
-      this.size = size;
-   }
-
-   public ChunkEntity() {
-   }
-
-   public Long getId() {
-      return id;
-   }
-
-   public void setId(Long id) {
-      this.id = id;
-   }
-
-   public byte[] getData() {
-      return data;
-   }
-
-   public void setData(byte[] data) {
-      this.data = data;
-   }
-
-   public int getSize() {
-      return size;
-   }
-
-   public void setSize(int size) {
-      this.size = size;
-   }
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/entity/ContainerEntity.java b/jdbc/src/main/java/org/jclouds/jdbc/entity/ContainerEntity.java
deleted file mode 100644
index ab30f06..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/entity/ContainerEntity.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.entity;
-
-import org.jclouds.blobstore.domain.ContainerAccess;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.PrePersist;
-import javax.persistence.Table;
-import java.util.Date;
-
-@Entity
-@Table
-public class ContainerEntity {
-
-   @Id
-   @GeneratedValue
-   private Long id;
-
-   @Column(unique = true)
-   private String name;
-
-   private Date creationDate;
-
-   private ContainerAccess containerAccess;
-
-   public ContainerEntity() {
-   }
-
-   public ContainerEntity(Long id, String name, Date creationDate, ContainerAccess containerAccess) {
-      this.id = id;
-      this.name = name;
-      this.creationDate = creationDate;
-      this.containerAccess = containerAccess;
-   }
-
-   @PrePersist
-   private void defaults() {
-      this.creationDate = new Date();
-      if (containerAccess == null) {
-         this.containerAccess = ContainerAccess.PRIVATE;
-      }
-   }
-
-   public Long getId() {
-      return id;
-   }
-
-   public void setId(Long id) {
-      this.id = id;
-   }
-
-   public String getName() {
-      return name;
-   }
-
-   public void setName(String name) {
-      this.name = name;
-   }
-
-   public Date getCreationDate() {
-      return creationDate;
-   }
-
-   public void setCreationDate(Date creationDate) {
-      this.creationDate = creationDate;
-   }
-
-   public ContainerAccess getContainerAccess() {
-      return containerAccess;
-   }
-
-   public void setContainerAccess(ContainerAccess containerAccess) {
-      this.containerAccess = containerAccess;
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-      private String name;
-      private ContainerAccess containerAccess;
-
-      public Builder() {
-      }
-
-      public Builder name(String name){
-         this.name = name;
-         return this;
-      }
-
-      public Builder containerAccess(ContainerAccess containerAccess){
-         this.containerAccess = containerAccess;
-         return this;
-      }
-
-      public ContainerEntity build() {
-         return new ContainerEntity(null, name, null, containerAccess);
-      }
-   }
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/entity/PayloadEntity.java b/jdbc/src/main/java/org/jclouds/jdbc/entity/PayloadEntity.java
deleted file mode 100644
index ca71a69..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/entity/PayloadEntity.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.entity;
-
-import com.google.common.collect.ImmutableList;
-
-import javax.persistence.ElementCollection;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import java.util.Date;
-import java.util.List;
-
-@Entity
-public class PayloadEntity {
-
-   @Id
-   @GeneratedValue
-   private Long id;
-
-   @ElementCollection(fetch = FetchType.EAGER)
-   private List<Long> chunks;
-
-   private String cacheControl;
-   private String contentType;
-   private Long contentLength;
-   private byte[] contentMD5;
-   private String contentDisposition;
-   private String contentLanguage;
-   private String contentEncoding;
-   private Date expires;
-
-   public PayloadEntity(List<Long> chunks, String cacheControl, String contentType, Long contentLength, byte[] contentMD5,
-         String contentDisposition, String contentLanguage, String contentEncoding, Date expires) {
-      this.chunks = chunks;
-      this.cacheControl = cacheControl;
-      this.contentType = contentType;
-      this.contentLength = contentLength;
-      this.contentMD5 = contentMD5;
-      this.contentDisposition = contentDisposition;
-      this.contentLanguage = contentLanguage;
-      this.contentEncoding = contentEncoding;
-      this.expires = expires;
-   }
-
-   public PayloadEntity() {
-   }
-
-   public Long getId() {
-      return id;
-   }
-
-   public void setId(Long id) {
-      this.id = id;
-   }
-
-   public List<Long> getChunks() {
-      return chunks;
-   }
-
-   public void setChunks(List<Long> chunks) {
-      this.chunks = chunks;
-   }
-
-   public String getCacheControl() {
-      return cacheControl;
-   }
-
-   public void setCacheControl(String cacheControl) {
-      this.cacheControl = cacheControl;
-   }
-
-   public String getContentType() {
-      return contentType;
-   }
-
-   public void setContentType(String contentType) {
-      this.contentType = contentType;
-   }
-
-   public Long getContentLength() {
-      return contentLength;
-   }
-
-   public void setContentLength(Long contentLength) {
-      this.contentLength = contentLength;
-   }
-
-   public byte[] getContentMD5() {
-      return contentMD5;
-   }
-
-   public void setContentMD5(byte[] contentMD5) {
-      this.contentMD5 = contentMD5;
-   }
-
-   public String getContentDisposition() {
-      return contentDisposition;
-   }
-
-   public void setContentDisposition(String contentDisposition) {
-      this.contentDisposition = contentDisposition;
-   }
-
-   public String getContentLanguage() {
-      return contentLanguage;
-   }
-
-   public void setContentLanguage(String contentLanguage) {
-      this.contentLanguage = contentLanguage;
-   }
-
-   public String getContentEncoding() {
-      return contentEncoding;
-   }
-
-   public void setContentEncoding(String contentEncoding) {
-      this.contentEncoding = contentEncoding;
-   }
-
-   public Date getExpires() {
-      return expires;
-   }
-
-   public void setExpires(Date expires) {
-      this.expires = expires;
-   }
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-      private List<Long> chunks;
-      private String cacheControl;
-      private String contentType;
-      private Long contentLength;
-      private byte[] contentMD5;
-      private String contentDisposition;
-      private String contentLanguage;
-      private String contentEncoding;
-      private Date expires;
-
-      public Builder() {
-         this.chunks = ImmutableList.of();
-      }
-
-      public Builder chunks(List<Long> chunks) {
-         this.chunks = chunks;
-         return this;
-      }
-
-      public Builder cacheControl(String cacheControl) {
-         this.cacheControl = cacheControl;
-         return this;
-      }
-
-      public Builder contentType(String contentType) {
-         this.contentType = contentType;
-         return this;
-      }
-
-      public Builder contentLength(Long contentLength) {
-         this.contentLength = contentLength;
-         return this;
-      }
-
-      public Builder contentMD5(byte[] contentMD5) {
-         this.contentMD5 = contentMD5;
-         return this;
-      }
-
-      public Builder contentDisposition(String contentDisposition) {
-         this.contentDisposition = contentDisposition;
-         return this;
-      }
-
-      public Builder contentLanguage(String contentLanguage) {
-         this.contentLanguage = contentLanguage;
-         return this;
-      }
-
-      public Builder contentEncoding(String contentEncoding) {
-         this.contentEncoding = contentEncoding;
-         return this;
-      }
-
-      public Builder expires(Date expires) {
-         this.expires = expires;
-         return this;
-      }
-
-      public PayloadEntity build() {
-         return new PayloadEntity(chunks, cacheControl, contentType, contentLength, contentMD5, contentDisposition, contentLanguage, contentEncoding, expires);
-      }
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/predicates/validators/JdbcBlobKeyValidator.java b/jdbc/src/main/java/org/jclouds/jdbc/predicates/validators/JdbcBlobKeyValidator.java
deleted file mode 100644
index 7083244..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/predicates/validators/JdbcBlobKeyValidator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.predicates.validators;
-
-import com.google.inject.Singleton;
-import org.jclouds.predicates.Validator;
-
-/**
- * Validates name for jdbc container blob keys implementation
- *
- * @see org.jclouds.rest.InputParamValidator
- * @see org.jclouds.predicates.Validator
- */
-@Singleton
-public class JdbcBlobKeyValidator extends Validator<String> {
-
-   @Override
-   public void validate(String name) throws IllegalArgumentException {
-      if (name == null || name.length() < 1) {
-         throw new IllegalArgumentException("Blob key can not be null or empty");
-      }
-
-      if (name.startsWith("/")) {
-         throw new IllegalArgumentException("Blob key can not start with character /");
-      }
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/predicates/validators/JdbcContainerNameValidator.java b/jdbc/src/main/java/org/jclouds/jdbc/predicates/validators/JdbcContainerNameValidator.java
deleted file mode 100644
index 1441340..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/predicates/validators/JdbcContainerNameValidator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.predicates.validators;
-
-import com.google.inject.Singleton;
-import org.jclouds.predicates.Validator;
-
-/**
- * Validates container name for jdbc provider implementation
- *
- * @see org.jclouds.rest.InputParamValidator
- * @see org.jclouds.predicates.Validator
- */
-@Singleton
-public class JdbcContainerNameValidator extends Validator<String> {
-
-   @Override
-   public void validate(String name) throws IllegalArgumentException {
-      if (name == null || name.length() < 1) {
-         throw new IllegalArgumentException("Container name can not be null or empty");
-      }
-
-      if (name.contains("/")) {
-         throw new IllegalArgumentException("Container name can not contain character /");
-      }
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/reference/JdbcConstants.java b/jdbc/src/main/java/org/jclouds/jdbc/reference/JdbcConstants.java
deleted file mode 100644
index 1e629f6..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/reference/JdbcConstants.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.reference;
-
-/**
- * Common constants used in jdbc provider
- */
-public final class JdbcConstants {
-
-    public static final int DEFAULT_CHUNK_SIZE = 1024 * 1024;
-
-    private JdbcConstants() {
-        throw new AssertionError("Intentionally Unimplemented");
-    }
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/repository/BlobRepository.java b/jdbc/src/main/java/org/jclouds/jdbc/repository/BlobRepository.java
deleted file mode 100644
index 21b2be7..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/repository/BlobRepository.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.repository;
-
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import org.jclouds.jdbc.entity.BlobEntity;
-import org.jclouds.jdbc.entity.BlobEntityPK;
-import org.jclouds.jdbc.entity.ContainerEntity;
-
-import javax.persistence.EntityManager;
-import java.util.List;
-
-@Singleton
-public class BlobRepository extends GenericRepository<BlobEntity, BlobEntityPK> {
-
-   @Inject
-   private BlobRepository(Provider<EntityManager> entityManager) {
-      super(entityManager);
-   }
-
-    public List<BlobEntity> findBlobsByContainer(ContainerEntity containerEntity) {
-        return entityManager.get().createQuery("SELECT b FROM " + entityClass.getName() + " b "
-              + "WHERE"
-              + " b.containerEntity = :containerEntity", entityClass)
-                .setParameter("containerEntity", containerEntity)
-                .getResultList();
-    }
-
-   public List<BlobEntity> findBlobsByDirectory(ContainerEntity containerEntity, String directory) {
-      return entityManager.get().createQuery("SELECT b FROM " + entityClass.getName() + " b "
-            + "WHERE b.containerEntity = :containerEntity AND b.key != :directoryName AND b.key LIKE :directoryLike ", entityClass)
-            .setParameter("containerEntity", containerEntity)
-            .setParameter("directoryName", directory)
-            .setParameter("directoryLike", directory + "%")
-            .getResultList();
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/repository/ChunkRepository.java b/jdbc/src/main/java/org/jclouds/jdbc/repository/ChunkRepository.java
deleted file mode 100644
index 5b89e84..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/repository/ChunkRepository.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.repository;
-
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import org.jclouds.jdbc.entity.ChunkEntity;
-
-import javax.persistence.EntityManager;
-
-@Singleton
-public class ChunkRepository extends GenericRepository<ChunkEntity, Long> {
-
-   @Inject
-   private ChunkRepository(Provider<EntityManager> entityManager) {
-      super(entityManager);
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/repository/ContainerRepository.java b/jdbc/src/main/java/org/jclouds/jdbc/repository/ContainerRepository.java
deleted file mode 100644
index 7894683..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/repository/ContainerRepository.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.repository;
-
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import org.jclouds.jdbc.entity.ContainerEntity;
-
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import java.util.List;
-
-@Singleton
-public class ContainerRepository extends GenericRepository<ContainerEntity, Long> {
-
-   @Inject
-   private ContainerRepository(Provider<EntityManager> entityManager) {
-      super(entityManager);
-   }
-
-   public ContainerEntity findContainerByName(String name) {
-      try {
-         return entityManager.get().createQuery("SELECT c FROM " + entityClass.getName() + " c WHERE c.name = :name", entityClass)
-               .setParameter("name", name)
-               .getSingleResult();
-      } catch (NoResultException e) {
-         return null;
-      }
-   }
-
-   public List<ContainerEntity> findAllContainers() {
-      return entityManager.get().createQuery("SELECT c FROM " + entityClass.getName() + " c", entityClass)
-            .getResultList();
-   }
-
-   public void deleteContainerByName(String name) {
-      ContainerEntity containerEntity = findContainerByName(name);
-      if (containerEntity != null) {
-         delete(containerEntity);
-      }
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/repository/GenericRepository.java b/jdbc/src/main/java/org/jclouds/jdbc/repository/GenericRepository.java
deleted file mode 100644
index 84e896d..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/repository/GenericRepository.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.repository;
-
-import com.google.inject.Provider;
-
-import javax.persistence.EntityManager;
-import java.io.Serializable;
-import java.lang.reflect.ParameterizedType;
-
-public abstract class GenericRepository<T, PK extends Serializable> {
-
-   protected final Class<T> entityClass;
-   protected final Provider<EntityManager> entityManager;
-
-   @SuppressWarnings("unchecked")
-   protected GenericRepository(Provider<EntityManager> entityManager) {
-      this.entityManager = entityManager;
-      this.entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
-   }
-
-   public T create(T entity) {
-      entityManager.get().persist(entity);
-      return entity;
-   }
-
-   public T find(PK id) {
-      return entityManager.get().find(entityClass, id);
-   }
-
-   public T save(T entity) {
-      return entityManager.get().merge(entity);
-   }
-
-   public void delete(T entity) {
-      entityManager.get().remove(entity);
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/service/JdbcService.java b/jdbc/src/main/java/org/jclouds/jdbc/service/JdbcService.java
deleted file mode 100644
index 786f080..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/service/JdbcService.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.service;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.hash.HashCode;
-import com.google.common.hash.Hashing;
-import com.google.common.hash.HashingInputStream;
-import com.google.common.io.ByteStreams;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.persist.Transactional;
-import org.jclouds.blobstore.domain.Blob;
-import org.jclouds.blobstore.domain.BlobAccess;
-import org.jclouds.blobstore.domain.ContainerAccess;
-import org.jclouds.jdbc.conversion.BlobToBlobEntity;
-import org.jclouds.jdbc.entity.BlobEntity;
-import org.jclouds.jdbc.entity.BlobEntityPK;
-import org.jclouds.jdbc.entity.ChunkEntity;
-import org.jclouds.jdbc.entity.ContainerEntity;
-import org.jclouds.jdbc.entity.PayloadEntity;
-import org.jclouds.jdbc.reference.JdbcConstants;
-import org.jclouds.jdbc.repository.BlobRepository;
-import org.jclouds.jdbc.repository.ChunkRepository;
-import org.jclouds.jdbc.repository.ContainerRepository;
-import org.jclouds.util.Closeables2;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
-import static com.google.common.io.BaseEncoding.base16;
-
-@Singleton
-public class JdbcService {
-
-   private static final String DIRECTORY_MD5 = Hashing.md5().hashBytes(new byte[0]).toString();
-
-   private final ContainerRepository containerRepository;
-   private final BlobRepository blobRepository;
-   private final ChunkRepository chunkRepository;
-   private final BlobToBlobEntity blobToBlobEntity;
-
-   @Inject
-   JdbcService(ContainerRepository containerRepository, BlobRepository blobRepository, ChunkRepository chunkRepository,
-         BlobToBlobEntity blobToBlobEntity) {
-      this.containerRepository = containerRepository;
-      this.blobRepository = blobRepository;
-      this.chunkRepository = chunkRepository;
-      this.blobToBlobEntity = blobToBlobEntity;
-   }
-
-   @Transactional
-   public void createContainer(String containerName, ContainerAccess access) {
-      containerRepository.create(ContainerEntity.builder().name(containerName).containerAccess(access).build());
-   }
-
-   @Transactional
-   public void createContainer(String containerName) {
-      createContainer(containerName, null);
-   }
-
-   @Transactional
-   public List<ContainerEntity> findAllContainers() {
-      return containerRepository.findAllContainers();
-   }
-
-   @Transactional
-   public ContainerEntity findContainerByName(String containerName) {
-      return containerRepository.findContainerByName(containerName);
-   }
-
-   @Transactional
-   public void deleteContainerByName(String containerName) {
-      containerRepository.deleteContainerByName(containerName);
-   }
-
-   @Transactional
-   public void setContainerAccessByName(String containerName, ContainerAccess access) {
-      ContainerEntity containerEntity = containerRepository.findContainerByName(containerName);
-      containerEntity.setContainerAccess(access);
-      containerRepository.save(containerEntity);
-   }
-
-   @Transactional
-   public boolean blobExists(String containerName, String key) {
-      return findBlobById(containerName, key) != null;
-   }
-
-   @Transactional(rollbackOn = IOException.class)
-   public BlobEntity createOrModifyBlob(String containerName, Blob blob, BlobAccess blobAccess) throws IOException {
-      List<Long> chunks;
-      HashingInputStream his = new HashingInputStream(Hashing.md5(), blob.getPayload().openStream());
-      try {
-         chunks = storeData(his);
-      } finally {
-         Closeables2.closeQuietly(his);
-      }
-      HashCode actualHashCode = his.hash();
-      HashCode expectedHashCode = blob.getPayload().getContentMetadata().getContentMD5AsHashCode();
-      if (expectedHashCode != null && !actualHashCode.equals(expectedHashCode)) {
-         throw new IOException("MD5 hash code mismatch, actual: " + actualHashCode +
-               " expected: " + expectedHashCode);
-      }
-
-      String key = blob.getMetadata().getName();
-      Date creationDate = null;
-      BlobEntity oldBlobEntity = findBlobById(containerName, key);
-      if (oldBlobEntity != null) {
-         creationDate = oldBlobEntity.getCreationDate();
-      }
-      BlobEntity blobEntity = blobToBlobEntity.apply(blob);
-      blobEntity.getPayload().setChunks(chunks);
-      blobEntity.setContainerEntity(containerRepository.findContainerByName(containerName));
-      blobEntity.setKey(key);
-      blobEntity.setBlobAccess(blobAccess);
-      blobEntity.setTier(blob.getMetadata().getTier());
-      blobEntity.setCreationDate(creationDate);
-      blobEntity.setLastModified(new Date());
-      blobEntity.setEtag(base16().lowerCase().encode(actualHashCode.asBytes()));
-      blobEntity.getPayload().setContentMD5(actualHashCode.asBytes());
-
-      BlobEntity result = blobRepository.save(blobEntity);
-      return result;
-   }
-
-   @Transactional
-   public BlobEntity createDirectoryBlob(String containerName, Blob blob, BlobAccess blobAccess) {
-      BlobEntity blobEntity = BlobEntity.builder(null, null)
-            .userMetadata(blob.getMetadata().getUserMetadata())
-            .directory(true)
-            .payload(PayloadEntity.builder().contentType("application/directory").build())
-            .build();
-      blobEntity.setContainerEntity(containerRepository.findContainerByName(containerName));
-      blobEntity.setKey(blob.getMetadata().getName());
-      blobEntity.setBlobAccess(blobAccess);
-      blobEntity.setEtag(DIRECTORY_MD5);
-      return blobRepository.save(blobEntity);
-   }
-
-   @Transactional
-   public BlobEntity createDirectoryBlob(String containerName, Blob blob) {
-      return createDirectoryBlob(containerName, blob, null);
-   }
-
-   @Transactional(rollbackOn = IOException.class)
-   public BlobEntity createOrModifyBlob(String containerName, Blob blob) throws IOException {
-      return createOrModifyBlob(containerName, blob, null);
-   }
-
-   @Transactional
-   public BlobEntity findBlobById(String containerName, String key) {
-      ContainerEntity containerEntity = containerRepository.findContainerByName(containerName);
-      return containerEntity == null ? null : blobRepository.find(new BlobEntityPK(containerEntity.getId(), key));
-   }
-
-   @Transactional
-   public ChunkEntity findChunkById(Long id) {
-      return chunkRepository.find(id);
-   }
-
-   @Transactional
-   public List<BlobEntity> findBlobsByContainer(String containerName) {
-      return blobRepository.findBlobsByContainer(containerRepository.findContainerByName(containerName));
-   }
-
-   @Transactional
-   public List<BlobEntity> findBlobsByDirectory(String containerName, String directoryName, boolean recursive) {
-      ImmutableList.Builder<BlobEntity> result = ImmutableList.builder();
-      List<BlobEntity> blobEntities = blobRepository
-            .findBlobsByDirectory(containerRepository.findContainerByName(containerName), directoryName);
-      result.addAll(blobEntities);
-      if (recursive) {
-         for (BlobEntity blobEntity : blobEntities) {
-            if (blobEntity.isDirectory()) {
-               result.addAll(findBlobsByDirectory(containerName, blobEntity.getKey(), true));
-            }
-         }
-      }
-      return result.build();
-   }
-
-   @Transactional
-   public void deleteBlobsByContainer(String containerName) {
-      List<BlobEntity> blobs = findBlobsByContainer(containerName);
-      for (BlobEntity blob : blobs) {
-         deleteBlob(containerName, blob.getKey());
-      }
-   }
-
-   @Transactional
-   public void deleteBlobsByDirectory(String containerName, String directoryName, boolean recursive) {
-      List<BlobEntity> blobs = findBlobsByDirectory(containerName, directoryName, false);
-      for (BlobEntity blob : blobs) {
-         if (!blob.isDirectory()) {
-            deleteBlob(containerName, blob.getKey());
-         }
-         else {
-            if (recursive) {
-               deleteBlobsByDirectory(containerName, blob.getKey(), true);
-               deleteBlob(containerName, blob.getKey());
-            }
-         }
-      }
-   }
-
-   @Transactional
-   public void deleteBlob(String containerName, String key) {
-      BlobEntity blobEntity = findBlobById(containerName, key);
-      if (blobEntity != null) {
-         deleteChunks(blobEntity.getPayload().getChunks());
-         blobRepository.delete(blobEntity);
-      }
-   }
-
-   @Transactional
-   public void setBlobAccessById(String containerName, String key, BlobAccess access) {
-      BlobEntity blobEntity = findBlobById(containerName, key);
-      blobEntity.setBlobAccess(access);
-      blobRepository.save(blobEntity);
-   }
-
-   @Transactional
-   private void deleteChunks(List<Long> chunkIds) {
-      for (Long chunkId : chunkIds) {
-         chunkRepository.delete(chunkRepository.find(chunkId));
-      }
-   }
-
-   @Transactional(rollbackOn = IOException.class)
-   private List<Long> storeData(InputStream data) throws IOException {
-      ImmutableList.Builder<Long> chunks = ImmutableList.builder();
-      while (true) {
-         byte[] buffer = new byte[JdbcConstants.DEFAULT_CHUNK_SIZE];
-         int bytes = ByteStreams.read(data, buffer, 0, JdbcConstants.DEFAULT_CHUNK_SIZE);
-         if (bytes == 0) {
-            break;
-         } else if (bytes != buffer.length) {
-            buffer = Arrays.copyOf(buffer, bytes);
-         }
-         chunks.add(chunkRepository.create(new ChunkEntity(buffer, bytes)).getId());
-      }
-      return chunks.build();
-   }
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/strategy/JdbcStorageStrategy.java b/jdbc/src/main/java/org/jclouds/jdbc/strategy/JdbcStorageStrategy.java
deleted file mode 100644
index 5cad097..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/strategy/JdbcStorageStrategy.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.strategy;
-
-import java.io.IOException;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.List;
-
-import javax.inject.Inject;
-import javax.inject.Provider;
-import javax.persistence.PersistenceException;
-
-import org.jclouds.blobstore.LocalStorageStrategy;
-import org.jclouds.blobstore.domain.Blob;
-import org.jclouds.blobstore.domain.BlobAccess;
-import org.jclouds.blobstore.domain.BlobBuilder;
-import org.jclouds.blobstore.domain.ContainerAccess;
-import org.jclouds.blobstore.domain.MutableStorageMetadata;
-import org.jclouds.blobstore.domain.StorageMetadata;
-import org.jclouds.blobstore.domain.StorageType;
-import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
-import org.jclouds.blobstore.options.CreateContainerOptions;
-import org.jclouds.blobstore.options.ListContainerOptions;
-import org.jclouds.domain.Location;
-import org.jclouds.domain.LocationBuilder;
-import org.jclouds.domain.LocationScope;
-import org.jclouds.io.ContentMetadata;
-import org.jclouds.jdbc.conversion.BlobEntityToBlob;
-import org.jclouds.jdbc.entity.BlobEntity;
-import org.jclouds.jdbc.entity.ContainerEntity;
-import org.jclouds.jdbc.predicates.validators.JdbcBlobKeyValidator;
-import org.jclouds.jdbc.predicates.validators.JdbcContainerNameValidator;
-import org.jclouds.jdbc.service.JdbcService;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-
-/**
- * JdbcStorageStrategy implements a blob store that stores objects
- * on a jdbc supported database. Content metadata and user attributes are stored in
- * the database as well.
- */
-public class JdbcStorageStrategy implements LocalStorageStrategy {
-
-   private final Provider<BlobBuilder> blobBuilders;
-   private final JdbcService jdbcService;
-   private final JdbcContainerNameValidator jdbcContainerNameValidator;
-   private final JdbcBlobKeyValidator jdbcBlobKeyValidator;
-   private final BlobEntityToBlob blobEntityToBlob;
-   private final Location mockLocation;
-
-   @Inject
-   JdbcStorageStrategy(Provider<BlobBuilder> blobBuilders,
-         JdbcContainerNameValidator jdbcContainerNameValidator, JdbcBlobKeyValidator jdbcBlobKeyValidator,
-         JdbcService jdbcService, BlobEntityToBlob blobEntityToBlob)
-         throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
-      this.jdbcService = jdbcService;
-      this.blobBuilders = blobBuilders;
-      this.jdbcContainerNameValidator = jdbcContainerNameValidator;
-      this.jdbcBlobKeyValidator = jdbcBlobKeyValidator;
-      this.blobEntityToBlob = blobEntityToBlob;
-      this.mockLocation = new LocationBuilder()
-            .id("jdbc")
-            .scope(LocationScope.PROVIDER)
-            .description("http://localhost/transient")
-            .build();
-   }
-
-   /**
-    * Checks if a container exists
-    *
-    * @param container the name of the container to check
-    * @return true if the container exists, false otherwise
-    */
-   @Override
-   public boolean containerExists(String container) {
-      jdbcContainerNameValidator.validate(container);
-      return jdbcService.findContainerByName(container) != null;
-   }
-
-   /**
-    * Lists all the container names
-    *
-    * @return an iterable with the container names
-    */
-   @Override
-   public Collection<String> getAllContainerNames() {
-      List<ContainerEntity> containerEntities = jdbcService.findAllContainers();
-      ImmutableList.Builder<String> result = ImmutableList.builder();
-      for (ContainerEntity c : containerEntities) {
-         result.add(c.getName());
-      }
-      return result.build();
-   }
-
-   /**
-    * Creates a container. The location is ignored.
-    *
-    * @param container the name of the container to create
-    * @param createContainerOptions creation options to the container. defaults the ContainerAccess
-    *                               to ContainerAccess.PRIVATE
-    * @return true if the container was created, false otherwise
-    */
-   @Override
-   public boolean createContainerInLocation(String container, Location location,
-         CreateContainerOptions createContainerOptions) {
-      jdbcContainerNameValidator.validate(container);
-
-      ContainerAccess containerAccess = createContainerOptions == null ? ContainerAccess.PRIVATE
-            : (createContainerOptions.isPublicRead() ? ContainerAccess.PUBLIC_READ
-            : ContainerAccess.PRIVATE);
-      try {
-         jdbcService.createContainer(container, containerAccess);
-      } catch (PersistenceException e) {
-         return false;
-      } catch (IllegalArgumentException e) {
-         return false;
-      }
-      return true;
-   }
-
-   /**
-    * Gets the container accessibility
-    *
-    * @param container the name of the container
-    * @return a value with the container's accessibility
-    */
-   @Override
-   public ContainerAccess getContainerAccess(String container) {
-      return jdbcService.findContainerByName(container).getContainerAccess();
-   }
-
-   /**
-    * Sets the container accessibility
-    *
-    * @param container the name of the container
-    * @param containerAccess the new container access for the container
-    */
-   @Override
-   public void setContainerAccess(String container, ContainerAccess containerAccess) {
-      jdbcService.setContainerAccessByName(container, containerAccess);
-   }
-
-   /**
-    * Deletes a container and all the blobs in it
-    *
-    * @param container the name of the container to delete
-    */
-   @Override
-   public void deleteContainer(String container) {
-      jdbcContainerNameValidator.validate(container);
-      jdbcService.deleteBlobsByContainer(container);
-      jdbcService.deleteContainerByName(container);
-   }
-
-   /**
-    * Deletes all the blobs in a container
-    *
-    * @param container the name of the container to clear
-    */
-   @Override
-   public void clearContainer(String container) {
-      jdbcService.deleteBlobsByContainer(container);
-   }
-
-   /**
-    * Deletes all the blobs in a container
-    *
-    * @param container the name of the container to clear
-    * @param options options to filter what blobs are cleared
-    */
-   @Override
-   public void clearContainer(String container, ListContainerOptions options) {
-      Preconditions.checkArgument(options.getPrefix() == null, "prefix not yet implemented");
-      if (options.getDir() != null) {
-         jdbcService.deleteBlobsByDirectory(container, options.getDir(), true);
-      }
-      else {
-         clearContainer(container);
-      }
-   }
-
-   /**
-    * Gets a container's metadata
-    *
-    * @param containerName the name of the container
-    * @return the container's metadata
-    */
-   @Override
-   public StorageMetadata getContainerMetadata(String containerName) {
-      ContainerEntity containerEntity = jdbcService.findContainerByName(containerName);
-      MutableStorageMetadata metadata = null;
-      if (containerEntity != null) {
-         metadata = new MutableStorageMetadataImpl();
-         metadata.setName(containerName);
-         metadata.setType(StorageType.CONTAINER);
-         metadata.setLocation(mockLocation);
-         metadata.setCreationDate(containerEntity.getCreationDate());
-      }
-      return metadata;
-   }
-
-   /**
-    * Checks if a blob exists
-    *
-    * @param container the name of the container containing the blob
-    * @param key the blob's key
-    * @return true if the blob exists in the container, false otherwise
-    */
-   @Override
-   public boolean blobExists(String container, String key) {
-      jdbcContainerNameValidator.validate(container);
-      jdbcBlobKeyValidator.validate(key);
-      return jdbcService.blobExists(container, key);
-   }
-
-   /**
-    * Lists all the blob keys in a container
-    *
-    * @param container the name of the container
-    * @return the blob keys inside the container
-    */
-   @Override
-   public Iterable<String> getBlobKeysInsideContainer(String container, String prefix) throws IOException {
-      List<BlobEntity> blobEntities = jdbcService.findBlobsByContainer(container);
-      ImmutableList.Builder<String> result = ImmutableList.builder();
-      for (BlobEntity blobEntity : blobEntities) {
-         if (prefix != null && !blobEntity.getKey().startsWith(prefix)) {
-            continue;
-         }
-         result.add(blobEntity.getKey());
-      }
-      return result.build();
-   }
-
-   /**
-    * Gets a blob in a container
-    *
-    * @param container the name of the container containing the blob
-    * @param key the key of the blob to get
-    * @return the blob in the container or null if the blob does not exist
-    */
-   @Override
-   public Blob getBlob(String container, String key) {
-      return blobEntityToBlob.apply(jdbcService.findBlobById(container, key));
-   }
-
-   /**
-    * Store a blob in a container
-    *
-    * @param container the name of the container
-    * @param blob the blob to store
-    * @return the blob's etag
-    */
-   @Override
-   public String putBlob(String container, Blob blob) throws IOException {
-      String key = blob.getMetadata().getName();
-      jdbcContainerNameValidator.validate(container);
-      jdbcBlobKeyValidator.validate(key);
-      return jdbcService.createOrModifyBlob(container, blob).getEtag();
-   }
-
-   /**
-    * Removes a blob from a container
-    *
-    * @param container the name of the container containing the blob
-    * @param key the blob's key
-    */
-   @Override
-   public void removeBlob(String container, String key) {
-      jdbcService.deleteBlob(container, key);
-   }
-
-   /**
-    * Gets the blob accessibility
-    *
-    * @param container the name of the container containing the blob
-    * @param key the blob's key
-    * @return a value with the container's accessibility
-    */
-   @Override
-   public BlobAccess getBlobAccess(String container, String key) {
-      return jdbcService.findBlobById(container, key).getBlobAccess();
-   }
-
-   /**
-    * Sets the blob accessibility
-    *
-    * @param container the name of the container containing the blob
-    * @param key the blob's key
-    * @param blobAccess the new blob access for the blob
-    */
-   @Override
-   public void setBlobAccess(String container, String key, BlobAccess blobAccess) {
-      jdbcService.setBlobAccessById(container, key, blobAccess);
-   }
-
-   /**
-    * Gets the container location
-    *
-    * @return always return null
-    */
-   @Override
-   public Location getLocation(String container) {
-      return mockLocation;
-   }
-
-   /**
-    * Gets the separator used for directory naming
-    *
-    * @return a string containing "/"
-    */
-   @Override
-   public String getSeparator() {
-      return "/";
-   }
-
-   /**
-    * Count the blobs in a container
-    *
-    * @param container the name of the container
-    * @param options options to filter what blobs are counted
-    * @return the number of blobs in the container
-    */
-   public long countBlobs(String container, ListContainerOptions options) {
-      return options.getDir() == null ? jdbcService.findBlobsByContainer(container).size()
-             : jdbcService.findBlobsByDirectory(container, options.getDir(), options.isRecursive()).size();
-   }
-
-   /**
-    * Checks if a directory exists
-    *
-    * @param container the name of the container
-    * @param directory the name of the directory
-    * @return true if the directory exists, false otherwise
-    */
-   public boolean directoryExists(String container, String directory) {
-      Blob blob = getBlob(container, directory);
-      return blob != null && "application/directory".equals(
-            blob.getMetadata().getContentMetadata().getContentType());
-   }
-
-   /**
-    * Store a blob in a directory
-    *
-    * @param container the name of the container
-    * @param blob the blob to store
-    * @return the blob's etag
-    */
-   private String putDirectoryBlob(final String container, final Blob blob) {
-      String blobKey = blob.getMetadata().getName();
-      ContentMetadata metadata = blob.getMetadata().getContentMetadata();
-      Long contentLength = metadata.getContentLength();
-      if (contentLength != null && contentLength != 0) {
-         throw new IllegalArgumentException(
-               "Directory blob cannot have content: " + blobKey);
-      }
-      return jdbcService.createDirectoryBlob(container, blob).getEtag();
-   }
-
-   /**
-    * Creates a new directory
-    *
-    * @param container the name of the container
-    * @param directory the name of the directory to create
-    */
-   public void createDirectory(String container, String directory) {
-      Blob blob = blobBuilders.get().name(directory).payload("").build();
-      blob.getMetadata().getContentMetadata().setContentType("application/directory");
-      putDirectoryBlob(container, blob);
-   }
-
-   /**
-    * Delete an existing directory
-    *
-    * @param container the name of the container
-    * @param directory the name of the directory to delete
-    */
-   public void deleteDirectory(String container, String directory) {
-      BlobEntity entity = jdbcService.findBlobById(container, directory);
-      if (entity != null && entity.isDirectory()) {
-         jdbcService.deleteBlob(container, directory);
-      }
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/util/JdbcBlobUtils.java b/jdbc/src/main/java/org/jclouds/jdbc/util/JdbcBlobUtils.java
deleted file mode 100644
index 2327b20..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/util/JdbcBlobUtils.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.util;
-
-import javax.inject.Provider;
-
-import org.jclouds.blobstore.LocalStorageStrategy;
-import org.jclouds.blobstore.domain.BlobBuilder;
-import org.jclouds.blobstore.options.ListContainerOptions;
-import org.jclouds.blobstore.util.BlobUtils;
-import org.jclouds.jdbc.strategy.JdbcStorageStrategy;
-
-import com.google.inject.Inject;
-
-/**
- * Implements the {@link BlobUtils} interfaced and act as a bridge to
- * {@link LocalStorageStrategy} when used inside {@link BlobStore}
- */
-public class JdbcBlobUtils implements BlobUtils {
-
-   protected final JdbcStorageStrategy storageStrategy;
-   protected final Provider<BlobBuilder> blobBuilders;
-
-   @Inject
-   JdbcBlobUtils(LocalStorageStrategy storageStrategy, Provider<BlobBuilder> blobBuilders) {
-      this.storageStrategy = (JdbcStorageStrategy) storageStrategy;
-      this.blobBuilders = blobBuilders;
-   }
-
-   @Override
-   public BlobBuilder blobBuilder() {
-      return blobBuilders.get();
-   }
-
-   @Override
-   public boolean directoryExists(String container, String directory) {
-      return storageStrategy.directoryExists(container, directory);
-   }
-
-   @Override
-   public void createDirectory(String container, String directory) {
-      storageStrategy.createDirectory(container, directory);
-   }
-
-   @Override
-   public long countBlobs(String container, ListContainerOptions listContainerOptions) {
-      return storageStrategy.countBlobs(container, listContainerOptions);
-   }
-
-   @Override
-   public void clearContainer(String container, ListContainerOptions options) {
-      storageStrategy.clearContainer(container, options);
-   }
-
-   @Override
-   public void deleteDirectory(String container, String directory) {
-      storageStrategy.deleteDirectory(container, directory);
-   }
-
-}
diff --git a/jdbc/src/main/java/org/jclouds/jdbc/util/JdbcInputStream.java b/jdbc/src/main/java/org/jclouds/jdbc/util/JdbcInputStream.java
deleted file mode 100644
index 24e4edc..0000000
--- a/jdbc/src/main/java/org/jclouds/jdbc/util/JdbcInputStream.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.util;
-
-import org.jclouds.jdbc.entity.ChunkEntity;
-import org.jclouds.jdbc.service.JdbcService;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-public class JdbcInputStream extends InputStream {
-
-   private JdbcService jdbcService;
-
-   private final List<Long> chunks;
-   private ChunkEntity currentChunk;
-   private int bytesRead;
-
-   public JdbcInputStream(JdbcService jdbcService, List<Long> chunks) {
-      this.jdbcService = checkNotNull(jdbcService, "jdbcService");
-      // Need to remove duplicates due to https://hibernate.atlassian.net/browse/HHH-6783
-      this.chunks = new ArrayList<Long>(new LinkedHashSet<Long>(checkNotNull(chunks, "chunks")));
-      try {
-         readNextChunk();
-      } catch (IOException e) {
-         throw new IllegalArgumentException(e);
-      }
-   }
-
-   @Override
-   public synchronized int read() throws IOException {
-      if (hasFinished()) {
-         return -1;
-      }
-      int b = currentChunk.getData()[bytesRead] & 0xff;
-      bytesRead = bytesRead + 1;
-      if (bytesRead >= currentChunk.getSize()) {
-         readNextChunk();
-      }
-      return b;
-   }
-
-   private boolean hasFinished() {
-      return currentChunk == null || (chunks.size() == 0 && bytesRead >= currentChunk.getSize());
-   }
-
-   private void readNextChunk() throws IOException {
-      if (chunks.size() > 0) {
-         this.currentChunk = jdbcService.findChunkById(chunks.get(0));
-         if (currentChunk == null) {
-            throw new IOException("Could not find chunk.");
-         }
-         chunks.remove(0);
-         this.bytesRead = 0;
-      }
-   }
-
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/BaseJdbcBlobStoreTest.java b/jdbc/src/test/java/org/jclouds/jdbc/BaseJdbcBlobStoreTest.java
deleted file mode 100644
index 0fb9eb4..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/BaseJdbcBlobStoreTest.java
+++ /dev/null
@@ -1,736 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.common.io.ByteSource;
-import com.google.inject.Module;
-import com.google.inject.persist.jpa.JpaPersistModule;
-import org.jclouds.ContextBuilder;
-import org.jclouds.blobstore.BlobRequestSigner;
-import org.jclouds.blobstore.BlobStore;
-import org.jclouds.blobstore.BlobStoreContext;
-import org.jclouds.blobstore.ContainerNotFoundException;
-import org.jclouds.blobstore.domain.Blob;
-import org.jclouds.blobstore.domain.BlobMetadata;
-import org.jclouds.blobstore.domain.PageSet;
-import org.jclouds.blobstore.domain.StorageMetadata;
-import org.jclouds.blobstore.domain.StorageType;
-import org.jclouds.blobstore.options.GetOptions;
-import org.jclouds.blobstore.options.ListContainerOptions;
-import org.jclouds.http.HttpRequest;
-import org.jclouds.io.Payload;
-import org.jclouds.io.payloads.PhantomPayload;
-import org.jclouds.io.payloads.StringPayload;
-import org.jclouds.util.Closeables2;
-import org.jclouds.util.Strings2;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.net.URI;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.UUID;
-
-import static com.google.common.io.BaseEncoding.base16;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.jclouds.utils.TestUtils.randomByteSource;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-import static org.testng.FileAssert.fail;
-
-public abstract class BaseJdbcBlobStoreTest {
-
-   private static final String CONTAINER_NAME = "test-container";
-   private static final String BLOB_NAME = "jclouds-test-blob";
-   private static final String PROVIDER = "jdbc";
-
-   private final String jpaModuleName;
-
-   private BlobStoreContext context = null;
-   private BlobStore blobStore = null;
-
-   protected BaseJdbcBlobStoreTest(String jpaModuleName) {
-      this.jpaModuleName = jpaModuleName;
-   }
-
-   @BeforeMethod
-   protected void setUp() throws Exception {
-      context = ContextBuilder.newBuilder(PROVIDER)
-            .modules(ImmutableSet.<Module> of(new JpaPersistModule(jpaModuleName)))
-            .build(BlobStoreContext.class);
-      blobStore = context.getBlobStore();
-   }
-
-   @AfterMethod
-   protected void tearDown() throws IOException {
-      context.close();
-   }
-
-   @Test
-   public void testCreateContainerDoesNotExist() {
-      assertThat(blobStore.containerExists(CONTAINER_NAME)).isFalse();
-   }
-
-   @Test
-   public void testCreateContainerInLocation() {
-      assertThat(blobStore.createContainerInLocation(null, CONTAINER_NAME)).isTrue();
-      assertThat(blobStore.containerExists(CONTAINER_NAME)).isTrue();
-   }
-
-   @Test
-   public void testDeleteContainer() {
-      assertThat(blobStore.createContainerInLocation(null, CONTAINER_NAME)).isTrue();
-      assertThat(blobStore.containerExists(CONTAINER_NAME)).isTrue();
-      blobStore.deleteContainer(CONTAINER_NAME);
-      assertThat(blobStore.containerExists(CONTAINER_NAME)).isFalse();
-   }
-
-   @Test
-   public void testPutBlob() {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      assertThat(blobStore.blobExists(CONTAINER_NAME, BLOB_NAME)).isFalse();
-      createBlobInContainer(CONTAINER_NAME, BLOB_NAME);
-      assertThat(blobStore.blobExists(CONTAINER_NAME, BLOB_NAME)).isTrue();
-   }
-
-   @Test
-   public void testListRoot() throws IOException {
-      PageSet<? extends StorageMetadata> containersRetrieved = blobStore.list();
-      assertTrue(containersRetrieved.isEmpty(), "List operation returns a not empty set of container");
-
-      String[] containerNames = {"34343", "aaaa", "bbbbb"};
-      Set<String> containersCreated = Sets.newHashSet();
-      for (String containerName : containerNames) {
-         blobStore.createContainerInLocation(null, containerName);
-         containersCreated.add(containerName);
-      }
-
-      containersRetrieved = blobStore.list();
-      assertEquals(containersCreated.size(), containersRetrieved.size(), "Different numbers of container");
-
-      for (StorageMetadata data : containersRetrieved) {
-         String containerName = data.getName();
-         if (!containersCreated.remove(containerName)) {
-            fail("Container list contains unexpected value [" + containerName + "]");
-         }
-      }
-      assertTrue(containersCreated.isEmpty(), "List operation doesn't return all values.");
-
-      for (String containerName : containerNames) {
-         blobStore.deleteContainer(containerName);
-      }
-      containersRetrieved = blobStore.list();
-      assertTrue(containersRetrieved.isEmpty(), "List operation returns a not empty set of container");
-   }
-
-   @Test
-   public void testListNoOptionSingleContainer() throws IOException {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      checkForContainerContent(CONTAINER_NAME, null);
-
-      List<String> blobsExpected = createBlobsInContainer(CONTAINER_NAME, "a", 5);
-      checkForContainerContent(CONTAINER_NAME, blobsExpected);
-   }
-
-   @Test
-   public void testListRootNonRecursive() throws IOException {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      checkForContainerContent(CONTAINER_NAME, null);
-      List<String> result = createBlobsInContainer(CONTAINER_NAME, "a", 4);
-      ListContainerOptions options = ListContainerOptions.Builder
-            .withDetails()
-            .inDirectory("");
-      PageSet<? extends StorageMetadata> res = blobStore.list(CONTAINER_NAME, options);
-      checkForContainerContent(CONTAINER_NAME, "", result);
-   }
-
-   @Test(expectedExceptions = ContainerNotFoundException.class)
-   public void testListNotExistingContainer() {
-      blobStore.list(CONTAINER_NAME);
-   }
-
-   @Test
-   public void testListNoOptionDoubleContainer() throws IOException {
-      final String CONTAINER_NAME2 = "container2";
-
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      checkForContainerContent(CONTAINER_NAME, null);
-
-      blobStore.createContainerInLocation(null, CONTAINER_NAME2);
-      checkForContainerContent(CONTAINER_NAME2, null);
-
-      List<String> blobNamesCreatedInContainer1 = createBlobsInContainer(CONTAINER_NAME, "a", 5);
-
-      blobStore.createContainerInLocation(null, CONTAINER_NAME2);
-      List<String> blobNamesCreatedInContainer2 = createBlobsInContainer(CONTAINER_NAME2, "b", 5);
-
-      checkForContainerContent(CONTAINER_NAME, blobNamesCreatedInContainer1);
-      checkForContainerContent(CONTAINER_NAME2, blobNamesCreatedInContainer2);
-   }
-
-   @Test
-   public void testListSubdirectory() throws IOException {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      checkForContainerContent(CONTAINER_NAME, null);
-
-      createBlobInContainer(CONTAINER_NAME, "bbb/ccc/ddd/1234.jpg");
-      createBlobInContainer(CONTAINER_NAME, "4rrr.jpg");
-
-      List<String> blobsExpected = Lists.newArrayList();
-      blobsExpected.add(createBlobInContainer(CONTAINER_NAME, "rrr/sss/788.jpg"));
-      blobsExpected.add(createBlobInContainer(CONTAINER_NAME, "rrr/wet.kpg"));
-
-      checkForContainerContent(CONTAINER_NAME, "rrr", blobsExpected);
-      checkForContainerContent(CONTAINER_NAME, "rrr/", blobsExpected);
-   }
-
-   @Test
-   public void testClearContainerNotExistingContainer() {
-      blobStore.clearContainer(CONTAINER_NAME);
-   }
-
-   @Test
-   public void testClearContainer_NoOptions() throws IOException {
-      final String CONTAINER_NAME2 = "containerToClear";
-
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      blobStore.createContainerInLocation(null, CONTAINER_NAME2);
-
-      List<String> blobNamesCreatedInContainer1 = createBlobsInContainer(CONTAINER_NAME, "a", 5);
-      List<String> blobNamesCreatedInContainer2 = createBlobsInContainer(CONTAINER_NAME2, "b", 5);
-
-      checkForContainerContent(CONTAINER_NAME, blobNamesCreatedInContainer1);
-      checkForContainerContent(CONTAINER_NAME2, blobNamesCreatedInContainer2);
-
-      blobStore.clearContainer(CONTAINER_NAME);
-      checkForContainerContent(CONTAINER_NAME, null);
-      checkForContainerContent(CONTAINER_NAME2, blobNamesCreatedInContainer2);
-
-      blobStore.clearContainer(CONTAINER_NAME2);
-      checkForContainerContent(CONTAINER_NAME, null);
-      checkForContainerContent(CONTAINER_NAME2, null);
-   }
-
-   @Test
-   public void testCountBlobsNotExistingContainer() {
-      blobStore.countBlobs(PROVIDER);
-   }
-
-   @Test
-   public void testCountBlobsNoOptionsEmptyContainer() {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      blobStore.countBlobs(PROVIDER);
-   }
-
-   @Test
-   public void testCountBlobsNoOptions() {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      blobStore.countBlobs(PROVIDER);
-   }
-
-   @Test
-   public void testRemoveBlobSimpleBlobKey() {
-      final String BLOB_KEY = createRandomBlobKey(null, ".txt");
-
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      boolean result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY);
-      assertFalse(result, "Blob exists");
-
-      createBlobInContainer(CONTAINER_NAME, BLOB_KEY);
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY);
-      assertTrue(result, "Blob exists");
-
-      blobStore.removeBlob(CONTAINER_NAME, BLOB_KEY);
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY);
-      assertFalse(result, "Blob still exists");
-   }
-
-   @Test
-   public void testRemoveBlobTwoSimpleBlobKeys() {
-      final String BLOB_KEY1 = createRandomBlobKey();
-      final String BLOB_KEY2 = createRandomBlobKey();
-
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      boolean result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY1);
-      assertFalse(result, "Blob1 exists");
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY2);
-      assertFalse(result, "Blob2 exists");
-
-      createBlobInContainer(CONTAINER_NAME, BLOB_KEY1);
-      createBlobInContainer(CONTAINER_NAME, BLOB_KEY2);
-
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY1);
-      assertTrue(result, "Blob " + BLOB_KEY1 + " doesn't exist");
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY2);
-      assertTrue(result, "Blob " + BLOB_KEY2 + " doesn't exist");
-
-      blobStore.removeBlob(CONTAINER_NAME, BLOB_KEY1);
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY1);
-      assertFalse(result, "Blob1 still exists");
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY2);
-      assertTrue(result, "Blob2 doesn't exist");
-
-      blobStore.removeBlob(CONTAINER_NAME, BLOB_KEY2);
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY2);
-      assertFalse(result, "Blob2 still exists");
-   }
-
-   @Test
-   public void testRemoveBlobComplexBlobKey() throws IOException {
-      final String BLOB_KEY = createRandomBlobKey("aa/bb/cc/dd/", null);
-
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      boolean result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY);
-      assertFalse(result, "Blob exists");
-
-      createBlobInContainer(CONTAINER_NAME, BLOB_KEY);
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY);
-      assertTrue(result, "Blob doesn't exist");
-
-      blobStore.removeBlob(CONTAINER_NAME, BLOB_KEY);
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY);
-      assertFalse(result, "Blob still exists");
-   }
-
-   @Test
-   public void testRemoveBlobTwoComplexBlobKeys() throws IOException {
-      final String BLOB_KEY1 = createRandomBlobKey("aa/bb/cc/dd/", null);
-      final String BLOB_KEY2 = createRandomBlobKey("aa/bb/ee/ff/", null);
-
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-
-      boolean result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY1);
-      assertFalse(result, "Blob1 exists");
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY2);
-      assertFalse(result, "Blob2 exists");
-
-      createBlobInContainer(CONTAINER_NAME, BLOB_KEY1);
-      createBlobInContainer(CONTAINER_NAME, BLOB_KEY2);
-
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY1);
-      assertTrue(result, "Blob " + BLOB_KEY1 + " doesn't exist");
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY2);
-      assertTrue(result, "Blob " + BLOB_KEY2 + " doesn't exist");
-
-      blobStore.removeBlob(CONTAINER_NAME, BLOB_KEY1);
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY1);
-      assertFalse(result, "Blob still exists");
-
-      blobStore.removeBlob(CONTAINER_NAME, BLOB_KEY2);
-      result = blobStore.blobExists(CONTAINER_NAME, BLOB_KEY2);
-      assertFalse(result, "Blob still exists");
-   }
-
-   @Test
-   public void testCreateContainersInLocation() {
-      final String CONTAINER_NAME2 = "funambol-test-2";
-
-      boolean result = blobStore.containerExists(CONTAINER_NAME);
-      assertFalse(result, "Container exists");
-      result = blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      assertTrue(result, "Container not created");
-      result = blobStore.containerExists(CONTAINER_NAME);
-      assertTrue(result, "Container doesn't exist");
-
-      result = blobStore.containerExists(CONTAINER_NAME2);
-      assertFalse(result, "Container exists");
-      result = blobStore.createContainerInLocation(null, CONTAINER_NAME2);
-      assertTrue(result, "Container not created");
-      result = blobStore.containerExists(CONTAINER_NAME2);
-      assertTrue(result, "Container doesn't exist");
-   }
-
-   @Test
-   public void testPutDirectoryBlobs() {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-
-      String parentKey = createRandomBlobKey("a/b/c/directory-", "/");
-      String childKey = createRandomBlobKey(parentKey + "directory-", "/");
-
-      blobStore.putBlob(CONTAINER_NAME, createDirBlob(parentKey));
-      assertTrue(blobStore.blobExists(CONTAINER_NAME, parentKey));
-
-      blobStore.putBlob(CONTAINER_NAME, createDirBlob(childKey));
-      assertTrue(blobStore.blobExists(CONTAINER_NAME, childKey));
-
-      blobStore.removeBlob(CONTAINER_NAME, parentKey);
-      assertFalse(blobStore.blobExists(CONTAINER_NAME, parentKey));
-      assertTrue(blobStore.blobExists(CONTAINER_NAME, childKey));
-   }
-
-   @Test
-   public void testGetDirectoryBlob() throws IOException {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-
-      String blobKey = createRandomBlobKey("a/b/c/directory-", "/");
-      blobStore.putBlob(CONTAINER_NAME, createDirBlob(blobKey));
-
-      assertTrue(blobStore.blobExists(CONTAINER_NAME, blobKey));
-
-      Blob blob = blobStore.getBlob(CONTAINER_NAME, blobKey);
-      assertEquals(blob.getMetadata().getName(), blobKey, "Created blob name is different");
-
-      assertTrue(!blobStore.blobExists(CONTAINER_NAME,
-            blobKey.substring(0, blobKey.length() - 1)));
-   }
-
-   @Test
-   public void testPutBlobSimpleName() {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      putBlobAndCheckIt(createRandomBlobKey("putBlob-", ".jpg"));
-      putBlobAndCheckIt(createRandomBlobKey("putBlob-", ".jpg"));
-   }
-
-   @Test
-   public void testListDirectoryBlobs() {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      checkForContainerContent(CONTAINER_NAME, null);
-
-      List<String> dirs = ImmutableList.of(createRandomBlobKey("directory-", "/"));
-      for (String d : dirs) {
-         blobStore.putBlob(CONTAINER_NAME, createDirBlob(d));
-         assertTrue(blobStore.blobExists(CONTAINER_NAME, d));
-      }
-      checkForContainerContent(CONTAINER_NAME, dirs);
-   }
-
-   @Test
-   public void testListDirectoryBlobsS3FS() {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      checkForContainerContent(CONTAINER_NAME, null);
-
-      String d = createRandomBlobKey("directory-", "");
-      blobStore.putBlob(CONTAINER_NAME, createDirBlob(d + "/"));
-      assertTrue(blobStore.blobExists(CONTAINER_NAME, d + "/"));
-
-      ListContainerOptions options = ListContainerOptions.Builder
-            .withDetails()
-            .inDirectory("");
-      PageSet<? extends StorageMetadata> res = blobStore.list(CONTAINER_NAME, options);
-      assertTrue(res.size() == 1);
-      assertEquals(res.iterator().next().getName(), d + "/");
-   }
-
-   @Test
-   public void testPutBlobComplexName1() {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      putBlobAndCheckIt(createRandomBlobKey("picture/putBlob-", ".jpg"));
-      putBlobAndCheckIt(createRandomBlobKey("video/putBlob-", ".jpg"));
-      putBlobAndCheckIt(createRandomBlobKey("putBlob-", ".jpg"));
-      putBlobAndCheckIt(createRandomBlobKey("video/putBlob-", ".jpg"));
-   }
-
-   @Test
-   public void testPutBlobComplexName2() {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      putBlobAndCheckIt(createRandomBlobKey("aa/bb/cc/dd/ee/putBlob-", ".jpg"));
-      putBlobAndCheckIt(createRandomBlobKey("aa/bb/cc/dd/ee/putBlob-", ".jpg"));
-      putBlobAndCheckIt(createRandomBlobKey("putBlob-", ".jpg"));
-   }
-
-   @Test
-   public void testBlobExists() throws IOException {
-      String blobKey = createRandomBlobKey();
-
-      try {
-         blobStore.blobExists(CONTAINER_NAME, blobKey);
-         fail();
-      } catch (ContainerNotFoundException cnfe) {
-         // expected
-      }
-
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      boolean result = blobStore.blobExists(CONTAINER_NAME, blobKey);
-      assertFalse(result, "Blob exists");
-
-      createBlobInContainer(CONTAINER_NAME, blobKey);
-      result = blobStore.blobExists(CONTAINER_NAME, blobKey);
-      assertTrue(result, "Blob doesn't exist");
-
-      blobKey = createRandomBlobKey("ss/asdas/", "");
-      result = blobStore.blobExists(CONTAINER_NAME, blobKey);
-      assertFalse(result, "Blob exists");
-      createBlobInContainer(CONTAINER_NAME, blobKey);
-      result = blobStore.blobExists(CONTAINER_NAME, blobKey);
-      assertTrue(result, "Blob doesn't exist");
-   }
-
-   @Test(expectedExceptions = ContainerNotFoundException.class)
-   public void testGetBlob_NotExistingContainer() {
-      blobStore.getBlob(CONTAINER_NAME, createRandomBlobKey(), null);
-   }
-
-   @Test
-   public void testGetBlob() {
-      String blobKey = createRandomBlobKey();
-
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      Blob resultBlob = blobStore.getBlob(CONTAINER_NAME, blobKey, null);
-      assertNull(resultBlob, "Blob exists");
-
-      createBlobInContainer(CONTAINER_NAME, blobKey);
-      resultBlob = blobStore.getBlob(CONTAINER_NAME, blobKey, null);
-      assertNotNull(resultBlob, "Blob exists");
-   }
-
-   @Test
-   public void testBlobMetadataWithDefaultMetadata() throws IOException {
-      String BLOB_KEY = createRandomBlobKey(null, null);
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      Blob blob = blobStore.blobBuilder(BLOB_KEY)
-            .payload(randomByteSource().slice(0, 1024))
-            .build();
-      blobStore.putBlob(CONTAINER_NAME, blob);
-
-      BlobMetadata metadata = blobStore.blobMetadata(CONTAINER_NAME, BLOB_KEY);
-      assertNotNull(metadata, "Metadata null");
-
-      assertEquals(metadata.getName(), BLOB_KEY, "Wrong blob name");
-      assertEquals(metadata.getType(), StorageType.BLOB, "Wrong blob type");
-      assertEquals(metadata.getContentMetadata().getContentType(), "application/unknown", "Wrong blob content-type");
-      assertEquals(base16().lowerCase().encode(metadata.getContentMetadata().getContentMD5()), metadata.getETag(),
-            "Wrong blob MD5");
-      assertEquals(metadata.getLocation(), null, "Wrong blob location");
-      assertEquals(metadata.getProviderId(), null, "Wrong blob provider id");
-      assertEquals(metadata.getUri(), null, "Wrong blob URI");
-      assertNotNull(metadata.getUserMetadata(), "No blob UserMetadata");
-      assertEquals(metadata.getUserMetadata().size(), 0, "Wrong blob UserMetadata");
-   }
-
-   @Test
-   public void testDeleteContainerNotExistingContainer() {
-      blobStore.deleteContainer(CONTAINER_NAME);
-   }
-
-   @Test
-   public void testDeleteContainerEmptyContanier() {
-      boolean result;
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-
-      result = blobStore.containerExists(CONTAINER_NAME);
-      assertTrue(result, "Container doesn't exists");
-
-      blobStore.deleteContainer(CONTAINER_NAME);
-      result = blobStore.containerExists(CONTAINER_NAME);
-      assertFalse(result, "Container still exists");
-   }
-
-   @Test
-   public void testDeleteContainers() {
-      boolean result;
-      String CONTAINER_NAME2 = "container-to-delete";
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      blobStore.createContainerInLocation(null, CONTAINER_NAME2);
-
-      result = blobStore.containerExists(CONTAINER_NAME);
-      assertTrue(result, "Container [" + CONTAINER_NAME + "] doesn't exists");
-      result = blobStore.containerExists(CONTAINER_NAME2);
-      assertTrue(result, "Container [" + CONTAINER_NAME2 + "] doesn't exists");
-
-      createBlobsInContainer(CONTAINER_NAME, "a", 5);
-      createBlobsInContainer(CONTAINER_NAME, "b", 5);
-
-      // delete first container
-      blobStore.deleteContainer(CONTAINER_NAME);
-      result = blobStore.containerExists(CONTAINER_NAME);
-      assertFalse(result, "Container [" + CONTAINER_NAME + "] still exists");
-      result = blobStore.containerExists(CONTAINER_NAME2);
-      assertTrue(result, "Container [" + CONTAINER_NAME2 + "] still exists");
-      // delete second container
-      blobStore.deleteContainer(CONTAINER_NAME2);
-      result = blobStore.containerExists(CONTAINER_NAME2);
-      assertFalse(result, "Container [" + CONTAINER_NAME2 + "] still exists");
-   }
-
-   @Test
-   public void testInvalidContainerName() {
-      String containerName = "file/system";
-      try {
-         blobStore.createContainerInLocation(null, containerName);
-         fail("Wrong container name not recognized");
-      } catch (IllegalArgumentException e) {
-      }
-      try {
-         blobStore.containerExists(containerName);
-         fail("Wrong container name not recognized");
-      } catch (IllegalArgumentException e) {
-      }
-   }
-
-   @Test
-   public void testRanges() throws IOException {
-      blobStore.createContainerInLocation(null, CONTAINER_NAME);
-      String input = "abcdefgh";
-      Payload payload;
-      Blob blob = blobStore.blobBuilder("test").payload(new StringPayload(input)).build();
-      blobStore.putBlob(CONTAINER_NAME, blob);
-
-      GetOptions getOptionsRangeStartAt = new GetOptions();
-      getOptionsRangeStartAt.startAt(1);
-      Blob blobRangeStartAt = blobStore.getBlob(CONTAINER_NAME, blob.getMetadata().getName(), getOptionsRangeStartAt);
-      payload = blobRangeStartAt.getPayload();
-      try {
-         assertEquals(input.substring(1), Strings2.toStringAndClose(payload.openStream()));
-      } finally {
-         Closeables2.closeQuietly(payload);
-      }
-
-      GetOptions getOptionsRangeTail = new GetOptions();
-      getOptionsRangeTail.tail(3);
-      Blob blobRangeTail = blobStore.getBlob(CONTAINER_NAME, blob.getMetadata().getName(), getOptionsRangeTail);
-      payload = blobRangeTail.getPayload();
-      try {
-         assertEquals(input.substring(5), Strings2.toStringAndClose(payload.openStream()));
-      } finally {
-         Closeables2.closeQuietly(payload);
-      }
-
-      GetOptions getOptionsFragment = new GetOptions();
-      getOptionsFragment.range(4, 6);
-      Blob blobFragment = blobStore.getBlob(CONTAINER_NAME, blob.getMetadata().getName(), getOptionsFragment);
-      payload = blobFragment.getPayload();
-      try {
-         assertEquals(input.substring(4, 7), Strings2.toStringAndClose(payload.openStream()));
-      } finally {
-         Closeables2.closeQuietly(payload);
-      }
-   }
-
-   @Test
-   public void testBlobRequestSigner() throws Exception {
-      String containerName = "container";
-      String blobName = "blob";
-      URI endPoint = new URI("http", "localhost",
-            String.format("/transient/%s/%s", containerName, blobName),
-                /*fragment=*/ null);
-      BlobRequestSigner signer = context.getSigner();
-      HttpRequest request;
-      HttpRequest expected;
-
-      request = signer.signGetBlob(containerName, blobName);
-      expected = HttpRequest.builder()
-            .method("GET")
-            .endpoint(endPoint)
-            .headers(request.getHeaders())
-            .build();
-      assertEquals(expected, request);
-
-      Blob blob = blobStore.blobBuilder(blobName).forSigning().build();
-      request = signer.signPutBlob(containerName, blob);
-      expected = HttpRequest.builder()
-            .method("PUT")
-            .endpoint(endPoint)
-            .headers(request.getHeaders())
-            .payload(new PhantomPayload())
-            .build();
-      assertEquals(expected, request);
-   }
-
-   private List<String> createBlobsInContainer(String containerName, String prefix, int numberOfFiles) {
-      List<String> blobNames = Lists.newArrayList();
-      for (int i = 0; i < numberOfFiles; i++) {
-         String name = prefix + Integer.toString(i);
-         blobNames.add(name);
-         createBlobInContainer(containerName, name);
-      }
-      return blobNames;
-   }
-
-   private void checkForContainerContent(final String containerName, List<String> expectedBlobKeys) {
-      checkForContainerContent(containerName, null, expectedBlobKeys);
-   }
-
-   private void checkForContainerContent(final String containerName, String inDirectory, List<String> expectedBlobKeys) {
-      ListContainerOptions options = ListContainerOptions.Builder.recursive();
-      if (null != inDirectory && !"".equals(inDirectory))
-         options.inDirectory(inDirectory);
-
-      PageSet<? extends StorageMetadata> blobsRetrieved = blobStore.list(containerName, options);
-      for (Iterator<? extends StorageMetadata> it = blobsRetrieved.iterator(); it.hasNext();) {
-         if (it.next().getType() != StorageType.BLOB) {
-            it.remove();
-         }
-      }
-
-      if (null == expectedBlobKeys || 0 == expectedBlobKeys.size()) {
-         assertTrue(blobsRetrieved.isEmpty(), "Wrong blob number retrieved in the container [" + containerName + "]");
-         return;
-      }
-
-      Set<String> expectedBlobKeysCopy = Sets.newHashSet();
-      for (String value : expectedBlobKeys) {
-         expectedBlobKeysCopy.add(value);
-      }
-      assertEquals(blobsRetrieved.size(), expectedBlobKeysCopy.size(),
-            "Wrong blob number retrieved in the container [" + containerName + "]");
-      for (StorageMetadata data : blobsRetrieved) {
-         String blobName = data.getName();
-         if (!expectedBlobKeysCopy.remove(blobName)) {
-            fail("List for container [" + containerName + "] contains unexpected value [" + blobName + "]");
-         }
-      }
-      assertTrue(expectedBlobKeysCopy.isEmpty(), "List operation for container [" + containerName
-            + "] doesn't return all values.");
-   }
-
-   private static String createRandomBlobKey(String prefix, String extension) {
-      String okPrefix = (null != prefix && !"".equals(prefix)) ? prefix : "testkey-";
-      String okExtension = (null != extension && !"".equals(extension)) ? extension : ".jpg";
-      return okPrefix + UUID.randomUUID().toString() + okExtension;
-   }
-
-   public static String createRandomBlobKey() {
-      return createRandomBlobKey("", "");
-   }
-
-   private String createBlobInContainer(String containerName, String blobName) {
-      blobStore.putBlob(containerName,
-            blobStore.blobBuilder(blobName).payload(randomByteSource().slice(0, 1024)).build());
-      return blobName;
-   }
-
-   private String createBlobInContainer(String containerName) {
-      String blobName = createRandomBlobKey();
-      blobStore.putBlob(containerName, blobStore.blobBuilder(blobName)
-            .payload(randomByteSource().slice(0, 1024))
-            .build());
-      return blobName;
-   }
-
-   private Blob createDirBlob(String keyName) {
-      return blobStore.blobBuilder(keyName)
-            .payload(ByteSource.empty())
-            .build();
-   }
-
-   private void putBlobAndCheckIt(String blobKey) {
-      createBlobInContainer(CONTAINER_NAME, blobKey);
-      blobStore.getBlob(CONTAINER_NAME, blobKey);
-      assertTrue(blobStore.blobExists(CONTAINER_NAME, blobKey));
-   }
-
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/EclipselinkH2BlobStoreTest.java b/jdbc/src/test/java/org/jclouds/jdbc/EclipselinkH2BlobStoreTest.java
deleted file mode 100644
index c7b4fe3..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/EclipselinkH2BlobStoreTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc;
-
-import org.testng.annotations.Test;
-
-@Test(groups = "unit", testName = "EclipselinkH2BlobStoreTest", singleThreaded = true)
-public class EclipselinkH2BlobStoreTest extends BaseJdbcBlobStoreTest {
-
-   protected EclipselinkH2BlobStoreTest() {
-      super("jclouds-test-h2");
-   }
-
-   // For some reason testng needs at least a method here
-   public void ohMyTest() {}
-
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/HibernateHsqldbBlobStoreTest.java b/jdbc/src/test/java/org/jclouds/jdbc/HibernateHsqldbBlobStoreTest.java
deleted file mode 100644
index 4002ac8..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/HibernateHsqldbBlobStoreTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc;
-
-import org.testng.annotations.Test;
-
-@Test(groups = "unit", testName = "HibernateHsqldbBlobStoreTest", singleThreaded = true)
-public class HibernateHsqldbBlobStoreTest extends BaseJdbcBlobStoreTest {
-
-   protected HibernateHsqldbBlobStoreTest() {
-      super("jclouds-test-hsqldb");
-   }
-
-   // For some reason testng needs at least a method here
-   public void ohMyTest() {}
-
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/JdbcApiMetadataTest.java b/jdbc/src/test/java/org/jclouds/jdbc/JdbcApiMetadataTest.java
deleted file mode 100644
index 036612d..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/JdbcApiMetadataTest.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc;
-
-import org.jclouds.blobstore.internal.BaseBlobStoreApiMetadataTest;
-import org.testng.annotations.Test;
-
-@Test(groups = "unit", testName = "JdbcApiMetadataTest")
-public class JdbcApiMetadataTest extends BaseBlobStoreApiMetadataTest {
-
-   public JdbcApiMetadataTest() {
-      super(new JdbcApiMetadata());
-   }
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/JdbcInputStreamTest.java b/jdbc/src/test/java/org/jclouds/jdbc/JdbcInputStreamTest.java
deleted file mode 100644
index 0e335b4..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/JdbcInputStreamTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc;
-
-import com.google.common.collect.ImmutableList;
-import org.jclouds.jdbc.service.JdbcService;
-import org.jclouds.jdbc.util.JdbcInputStream;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.expect;
-
-@Test(groups = "unit", testName = "JdbcInputStreamTest")
-public class JdbcInputStreamTest {
-
-   private JdbcService mockJdbcService;
-
-   @BeforeMethod
-   public void setUp() {
-      mockJdbcService = createNiceMock(JdbcService.class);
-   }
-
-   @Test(expectedExceptions = IllegalArgumentException.class)
-   public void testInvalidIdList() throws IOException {
-      expect(mockJdbcService.findChunkById(0L)).andReturn(null);
-      new JdbcInputStream(mockJdbcService, ImmutableList.<Long>builder().add(0L).build());
-   }
-
-   @Test(expectedExceptions = NullPointerException.class)
-   public void testNullList() {
-      new JdbcInputStream(mockJdbcService, null);
-   }
-
-   @Test
-   public void testEmptyIdList() throws IOException {
-      JdbcInputStream jdbcInputStream = new JdbcInputStream(mockJdbcService,
-            ImmutableList.<Long>builder().build());
-      assertThat(jdbcInputStream.read()).isEqualTo(-1);
-   }
-
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/integration/EclipselinkH2BlobIntegrationTest.java b/jdbc/src/test/java/org/jclouds/jdbc/integration/EclipselinkH2BlobIntegrationTest.java
deleted file mode 100644
index 05a0fc0..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/integration/EclipselinkH2BlobIntegrationTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.integration;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-import com.google.inject.persist.jpa.JpaPersistModule;
-import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest;
-import org.testng.annotations.Test;
-import org.testng.SkipException;
-
-@Test(groups = { "integration" }, singleThreaded = true,  testName = "blobstore.EclipselinkH2BlobIntegrationTest")
-public class EclipselinkH2BlobIntegrationTest extends BaseBlobIntegrationTest {
-   public EclipselinkH2BlobIntegrationTest() {
-      provider = "jdbc";
-   }
-
-   @Override
-   protected Iterable<Module> setupModules() {
-      return ImmutableSet.<Module> of(this.getLoggingModule(), new JpaPersistModule("jclouds-test-h2"));
-   }
-
-   @Override
-   @Test(groups = { "integration", "live" })
-   public void testSetBlobAccess() throws Exception {
-      throw new SkipException("jdbc does not support anonymous access");
-   }
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/integration/EclipselinkH2ContainerIntegrationTest.java b/jdbc/src/test/java/org/jclouds/jdbc/integration/EclipselinkH2ContainerIntegrationTest.java
deleted file mode 100644
index 871bfd2..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/integration/EclipselinkH2ContainerIntegrationTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.integration;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-import com.google.inject.persist.jpa.JpaPersistModule;
-import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest;
-import org.testng.annotations.Test;
-import org.testng.SkipException;
-
-@Test(groups = { "integration" }, singleThreaded = true,  testName = "blobstore.EclipselinkH2ContainerIntegrationTest")
-public class EclipselinkH2ContainerIntegrationTest extends BaseContainerIntegrationTest {
-   public EclipselinkH2ContainerIntegrationTest() {
-      provider = "jdbc";
-   }
-
-   @Override
-   protected Iterable<Module> setupModules() {
-      return ImmutableSet.<Module> of(this.getLoggingModule(), new JpaPersistModule("jclouds-test-h2"));
-   }
-
-   @Override
-   @Test(groups = { "integration", "live" })
-   public void testSetContainerAccess() throws Exception {
-      throw new SkipException("jdbc does not support anonymous access");
-   }
-
-   @Override
-   public void testClearWithOptions() throws InterruptedException {
-      throw new SkipException("jdbc does not support clear with options");
-   }
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/integration/EclipselinkH2ServiceIntegrationTest.java b/jdbc/src/test/java/org/jclouds/jdbc/integration/EclipselinkH2ServiceIntegrationTest.java
deleted file mode 100644
index 9d393b6..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/integration/EclipselinkH2ServiceIntegrationTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.integration;
-
-import org.jclouds.blobstore.integration.internal.BaseServiceIntegrationTest;
-import org.testng.annotations.Test;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-import com.google.inject.persist.jpa.JpaPersistModule;
-
-@Test(groups = { "integration" }, singleThreaded = true,  testName = "blobstore.EclipselinkH2ServiceIntegrationTest")
-public class EclipselinkH2ServiceIntegrationTest extends BaseServiceIntegrationTest {
-   public EclipselinkH2ServiceIntegrationTest() {
-      provider = "jdbc";
-   }
-
-   @Override
-   protected Iterable<Module> setupModules() {
-      return ImmutableSet.<Module> of(this.getLoggingModule(), new JpaPersistModule("jclouds-test-h2"));
-   }
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/integration/HibernateHsqldbBlobIntegrationTest.java b/jdbc/src/test/java/org/jclouds/jdbc/integration/HibernateHsqldbBlobIntegrationTest.java
deleted file mode 100644
index 69fc6ef..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/integration/HibernateHsqldbBlobIntegrationTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.integration;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-import com.google.inject.persist.jpa.JpaPersistModule;
-import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest;
-import org.testng.annotations.Test;
-import org.testng.SkipException;
-
-@Test(groups = { "integration" }, singleThreaded = true,  testName = "blobstore.HibernateHsqldbBlobIntegrationTest")
-public class HibernateHsqldbBlobIntegrationTest extends BaseBlobIntegrationTest {
-   public HibernateHsqldbBlobIntegrationTest() {
-      provider = "jdbc";
-   }
-
-   @Override
-   protected Iterable<Module> setupModules() {
-      return ImmutableSet.<Module> of(this.getLoggingModule(), new JpaPersistModule("jclouds-test-hsqldb"));
-   }
-
-   @Override
-   @Test(groups = { "integration", "live" })
-   public void testSetBlobAccess() throws Exception {
-      throw new SkipException("jdbc does not support anonymous access");
-   }
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/integration/HibernateHsqldbContainerIntegrationTest.java b/jdbc/src/test/java/org/jclouds/jdbc/integration/HibernateHsqldbContainerIntegrationTest.java
deleted file mode 100644
index c6abbc8..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/integration/HibernateHsqldbContainerIntegrationTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.integration;
-
-import java.util.Set;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-import com.google.inject.persist.jpa.JpaPersistModule;
-import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest;
-import org.testng.annotations.Test;
-import org.testng.SkipException;
-
-@Test(groups = { "integration" }, singleThreaded = true,  testName = "blobstore.HibernateHsqldbContainerIntegrationTest")
-public class HibernateHsqldbContainerIntegrationTest extends BaseContainerIntegrationTest {
-   public HibernateHsqldbContainerIntegrationTest() {
-      provider = "jdbc";
-   }
-
-   @Override
-   protected Iterable<Module> setupModules() {
-      return ImmutableSet.<Module> of(this.getLoggingModule(), new JpaPersistModule("jclouds-test-hsqldb"));
-   }
-
-   @Override
-   public void testBlobNameEscaping(Set<String> blobNames) throws InterruptedException {
-       //This test fails due to how hibernate ignores trailing whitespaces in keys.
-   }
-
-   @Override
-   @Test(groups = { "integration", "live" })
-   public void testSetContainerAccess() throws Exception {
-      throw new SkipException("jdbc does not support anonymous access");
-   }
-
-   @Override
-   public void testClearWithOptions() throws InterruptedException {
-      throw new SkipException("jdbc does not support clear with options");
-   }
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/integration/HibernateHsqldbServiceIntegrationTest.java b/jdbc/src/test/java/org/jclouds/jdbc/integration/HibernateHsqldbServiceIntegrationTest.java
deleted file mode 100644
index 724d30e..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/integration/HibernateHsqldbServiceIntegrationTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.integration;
-
-import org.jclouds.blobstore.integration.internal.BaseServiceIntegrationTest;
-import org.testng.annotations.Test;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-import com.google.inject.persist.jpa.JpaPersistModule;
-
-@Test(groups = { "integration" }, singleThreaded = true,  testName = "blobstore.HibernateHsqldbServiceIntegrationTest")
-public class HibernateHsqldbServiceIntegrationTest extends BaseServiceIntegrationTest {
-   public HibernateHsqldbServiceIntegrationTest() {
-      provider = "jdbc";
-   }
-
-   @Override
-   protected Iterable<Module> setupModules() {
-      return ImmutableSet.<Module> of(this.getLoggingModule(), new JpaPersistModule("jclouds-test-hsqldb"));
-   }
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/module/TestContextModule.java b/jdbc/src/test/java/org/jclouds/jdbc/module/TestContextModule.java
deleted file mode 100644
index 0798813..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/module/TestContextModule.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.module;
-
-import com.google.inject.AbstractModule;
-import org.jclouds.jdbc.config.JPAInitializer;
-
-public class TestContextModule extends AbstractModule {
-
-   @Override
-   protected void configure() {
-      bind(JPAInitializer.class).asEagerSingleton();
-   }
-
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/strategy/BaseJdbcStorageStrategyTest.java b/jdbc/src/test/java/org/jclouds/jdbc/strategy/BaseJdbcStorageStrategyTest.java
deleted file mode 100644
index 7e636cb..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/strategy/BaseJdbcStorageStrategyTest.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.strategy;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Module;
-import com.google.inject.persist.PersistService;
-import com.google.inject.persist.jpa.JpaPersistModule;
-import org.jclouds.blobstore.domain.Blob;
-import org.jclouds.blobstore.domain.BlobAccess;
-import org.jclouds.blobstore.domain.ContainerAccess;
-import org.jclouds.blobstore.domain.StorageMetadata;
-import org.jclouds.blobstore.domain.StorageType;
-import org.jclouds.blobstore.domain.internal.BlobBuilderImpl;
-import org.jclouds.blobstore.options.CreateContainerOptions;
-import org.jclouds.jdbc.module.TestContextModule;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-import java.util.Date;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.jclouds.utils.TestUtils.randomByteSource;
-
-public abstract class BaseJdbcStorageStrategyTest {
-
-   private static final String CONTAINER_NAME = "jclouds-test-container";
-   private static final String BLOB_NAME = "jclouds-test-blob";
-
-   private final String jpaModuleName;
-
-   private JdbcStorageStrategy storageStrategy;
-   private Injector injector;
-
-   protected BaseJdbcStorageStrategyTest(String jpaModuleName) {
-      this.jpaModuleName = jpaModuleName;
-   }
-
-   @BeforeMethod
-   protected void setUp() throws Exception {
-      injector = Guice.createInjector(ImmutableSet.<Module> of(new TestContextModule(), new JpaPersistModule(jpaModuleName)));
-      storageStrategy = injector.getInstance(JdbcStorageStrategy.class);
-   }
-
-   @AfterMethod
-   protected void tearDown() {
-      injector.getInstance(PersistService.class).stop();
-   }
-
-   @Test
-   public void testCreateContainerInLocation() {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-      assertThat(storageStrategy.containerExists(CONTAINER_NAME)).isTrue();
-   }
-
-   @Test
-   public void testCreateDuplicateContainerInLocation() {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isFalse();
-   }
-
-   @Test
-   public void testDefaultContainerAccess() {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-      assertThat(storageStrategy.getContainerAccess(CONTAINER_NAME)).isEqualTo(ContainerAccess.PRIVATE);
-   }
-
-   @Test
-   public void testOverridedPublicContainerAccess() {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, new CreateContainerOptions().publicRead())).isTrue();
-      assertThat(storageStrategy.getContainerAccess(CONTAINER_NAME)).isEqualTo(ContainerAccess.PUBLIC_READ);
-   }
-
-   @Test
-   public void testOverridedPrivateContainerAccess() {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, CreateContainerOptions.NONE)).isTrue();
-      assertThat(storageStrategy.getContainerAccess(CONTAINER_NAME)).isEqualTo(ContainerAccess.PRIVATE);
-   }
-
-   @Test
-   public void testDeleteContainer() {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-      assertThat(storageStrategy.containerExists(CONTAINER_NAME)).isTrue();
-      storageStrategy.deleteContainer(CONTAINER_NAME);
-      assertThat(storageStrategy.containerExists(CONTAINER_NAME)).isFalse();
-   }
-
-   @Test
-   public void testGetAllContainerNames() {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME + "1", null, null)).isTrue();
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME + "2", null, null)).isTrue();
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME + "3", null, null)).isTrue();
-      assertThat(storageStrategy.getAllContainerNames()).containsExactly(CONTAINER_NAME + "1", CONTAINER_NAME + "2",
-            CONTAINER_NAME + "3");
-   }
-
-   @Test
-   public void testGetContainerMetadata() {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-      StorageMetadata storageMetadata = storageStrategy.getContainerMetadata(CONTAINER_NAME);
-      assertThat(storageMetadata.getName()).isEqualTo(CONTAINER_NAME);
-      assertThat(storageMetadata.getType()).isEqualTo(StorageType.CONTAINER);
-      assertThat(storageMetadata.getCreationDate()).isBefore(new Date());
-   }
-
-   @Test
-   public void testBlobDoesNotExist() throws IOException {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-      assertThat(storageStrategy.blobExists(CONTAINER_NAME, BLOB_NAME)).isFalse();
-   }
-
-   @Test
-   public void testPutBlob() throws IOException {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-      storageStrategy.putBlob(CONTAINER_NAME,
-            new BlobBuilderImpl().name(BLOB_NAME).payload(randomByteSource().slice(0, 4 * 1024 * 1024)).build());
-      assertThat(storageStrategy.blobExists(CONTAINER_NAME, BLOB_NAME)).isTrue();
-   }
-
-   @Test
-   public void testGetBlobKeysInContainer() throws IOException {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-      storageStrategy.putBlob(CONTAINER_NAME,
-            new BlobBuilderImpl().name(BLOB_NAME + "1").payload(randomByteSource().slice(0, 4 * 1024 * 1024)).build());
-      storageStrategy.putBlob(CONTAINER_NAME,
-            new BlobBuilderImpl().name(BLOB_NAME + "2").payload(randomByteSource().slice(0, 4 * 1024 * 1024)).build());
-      storageStrategy.putBlob(CONTAINER_NAME, new BlobBuilderImpl()
-            .name(BLOB_NAME + "3")
-            .payload(randomByteSource().slice(0, 4 * 1024 * 1024))
-            .build());
-      assertThat(storageStrategy.getBlobKeysInsideContainer(CONTAINER_NAME, null))
-            .containsExactly(BLOB_NAME + "1", BLOB_NAME + "2", BLOB_NAME + "3");
-   }
-
-    @Test
-    public void testGetBlob() throws IOException {
-        assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-        Blob blob = new BlobBuilderImpl()
-                .name(BLOB_NAME)
-                .payload(getByteArray('a', 4 * 1024 * 1024))
-                .build();
-        storageStrategy.putBlob(CONTAINER_NAME, blob);
-        InputStream data = storageStrategy.getBlob(CONTAINER_NAME, BLOB_NAME).getPayload().openStream();
-        int i;
-        while ((i = data.read()) != -1) {
-            assertThat((char) i).isEqualTo('a');
-        }
-    }
-
-   @Test
-   public void testRemoveBlob() throws IOException {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-      storageStrategy.putBlob(CONTAINER_NAME,
-            new BlobBuilderImpl().name(BLOB_NAME).payload(randomByteSource().slice(0, 4 * 1024 * 1024)).build());
-      assertThat(storageStrategy.blobExists(CONTAINER_NAME, BLOB_NAME)).isTrue();
-      storageStrategy.removeBlob(CONTAINER_NAME, BLOB_NAME);
-      assertThat(storageStrategy.blobExists(CONTAINER_NAME, BLOB_NAME)).isFalse();
-   }
-
-   @Test
-   public void testGetBlobAccess() throws IOException {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-      storageStrategy.putBlob(CONTAINER_NAME,
-            new BlobBuilderImpl().name(BLOB_NAME).payload(randomByteSource().slice(0, 4 * 1024 * 1024)).build());
-      assertThat(storageStrategy.blobExists(CONTAINER_NAME, BLOB_NAME)).isTrue();
-      assertThat(storageStrategy.getBlobAccess(CONTAINER_NAME, BLOB_NAME)).isEqualTo(BlobAccess.PRIVATE);
-   }
-
-   @Test
-   public void testClearContainer() throws IOException {
-      assertThat(storageStrategy.createContainerInLocation(CONTAINER_NAME, null, null)).isTrue();
-      storageStrategy.putBlob(CONTAINER_NAME,
-            new BlobBuilderImpl().name(BLOB_NAME + "1").payload(randomByteSource().slice(0, 4 * 1024 * 1024)).build());
-      storageStrategy.putBlob(CONTAINER_NAME,
-            new BlobBuilderImpl().name(BLOB_NAME + "2").payload(randomByteSource().slice(0, 4 * 1024 * 1024)).build());
-      storageStrategy.putBlob(CONTAINER_NAME,
-            new BlobBuilderImpl().name(BLOB_NAME + "3").payload(randomByteSource().slice(0, 4 * 1024 * 1024)).build());
-      assertThat(storageStrategy.getBlobKeysInsideContainer(CONTAINER_NAME, null))
-            .containsExactly(BLOB_NAME + "1", BLOB_NAME + "2", BLOB_NAME + "3");
-      storageStrategy.clearContainer(CONTAINER_NAME);
-      assertThat(storageStrategy.getBlobKeysInsideContainer(CONTAINER_NAME, null)).isEmpty();
-      storageStrategy.deleteContainer(CONTAINER_NAME);
-      assertThat(storageStrategy.containerExists(CONTAINER_NAME)).isFalse();
-   }
-
-    private byte[] getByteArray(char c, int len) {
-        byte[] array = new byte[len];
-        Arrays.fill(array, (byte) c);
-        return array;
-    }
-
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/strategy/EclipselinkH2StorageStrategyTest.java b/jdbc/src/test/java/org/jclouds/jdbc/strategy/EclipselinkH2StorageStrategyTest.java
deleted file mode 100644
index 28aa48a..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/strategy/EclipselinkH2StorageStrategyTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.strategy;
-
-import org.testng.annotations.Test;
-
-@Test(groups = "unit", testName = "EclipselinkH2StorageStrategyTest", singleThreaded = true)
-public class EclipselinkH2StorageStrategyTest extends BaseJdbcStorageStrategyTest {
-
-   public EclipselinkH2StorageStrategyTest() {
-      super("jclouds-test-h2");
-   }
-
-   // For some reason testng needs at least a test here
-   public void ohMyTest() {}
-
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/strategy/HibernateHsqldbStorageStrategyTest.java b/jdbc/src/test/java/org/jclouds/jdbc/strategy/HibernateHsqldbStorageStrategyTest.java
deleted file mode 100644
index a0176b5..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/strategy/HibernateHsqldbStorageStrategyTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.strategy;
-
-import org.testng.annotations.Test;
-
-@Test(groups = "unit", testName = "HibernateHsqldbStorageStrategyTest", singleThreaded = true)
-public class HibernateHsqldbStorageStrategyTest extends BaseJdbcStorageStrategyTest {
-
-   protected HibernateHsqldbStorageStrategyTest() {
-      super("jclouds-test-hsqldb");
-   }
-
-   // For some reason testng needs at least a test here
-   public void ohMyTest() {}
-
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/validators/JdbcBlobKeyValidatorTest.java b/jdbc/src/test/java/org/jclouds/jdbc/validators/JdbcBlobKeyValidatorTest.java
deleted file mode 100644
index 94e690c..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/validators/JdbcBlobKeyValidatorTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.validators;
-
-import org.jclouds.jdbc.predicates.validators.JdbcBlobKeyValidator;
-import org.testng.annotations.Test;
-
-
-/**
- * Test class for {@link JdbcBlobKeyValidator } class
- */
-@Test(groups = "unit", testName = "jdbc.JdbcBlobKeyValidatorTest")
-public class JdbcBlobKeyValidatorTest {
-
-   private static final JdbcBlobKeyValidator validator = new JdbcBlobKeyValidator();
-
-   @Test
-   public void testNamesValidity() {
-      validator.validate("all.img");
-      validator.validate("all/is/ok");
-   }
-
-   @Test(expectedExceptions = IllegalArgumentException.class)
-   public void testEmptyName() {
-      validator.validate("");
-   }
-
-   @Test(expectedExceptions = IllegalArgumentException.class)
-   public void testInvalidName() {
-      validator.validate("/is/not/ok");
-   }
-
-}
diff --git a/jdbc/src/test/java/org/jclouds/jdbc/validators/JdbcContainerNameValidatorTest.java b/jdbc/src/test/java/org/jclouds/jdbc/validators/JdbcContainerNameValidatorTest.java
deleted file mode 100644
index 60d020b..0000000
--- a/jdbc/src/test/java/org/jclouds/jdbc/validators/JdbcContainerNameValidatorTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.jdbc.validators;
-
-import org.jclouds.jdbc.predicates.validators.JdbcContainerNameValidator;
-import org.testng.annotations.Test;
-
-
-/**
- * Test class for {@link JdbcContainerNameValidator } class
- */
-@Test(groups = "unit", testName = "jdbc.JdbcContainerNameValidatorTest")
-public class JdbcContainerNameValidatorTest {
-
-    private static final JdbcContainerNameValidator validator = new JdbcContainerNameValidator();
-
-    @Test
-    public void testNamesValidity() {
-        validator.validate("all.img");
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testEmptyName() {
-        validator.validate("");
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullName() {
-        validator.validate(null);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testInvalidStartingCharacterInName() {
-        validator.validate("/is/not/ok");
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testInvalidEndingCharacterInName() {
-        validator.validate("is/not/ok/");
-    }
-
-}
diff --git a/jdbc/src/test/resources/META-INF/persistence.xml b/jdbc/src/test/resources/META-INF/persistence.xml
deleted file mode 100644
index d26b8d1..0000000
--- a/jdbc/src/test/resources/META-INF/persistence.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<persistence xmlns="http://java.sun.com/xml/ns/persistence"
-             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
-             version="1.0">
-
-  <persistence-unit name="jclouds-test-hsqldb" transaction-type="RESOURCE_LOCAL">
-    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
-
-    <class>org.jclouds.jdbc.entity.ContainerEntity</class>
-    <class>org.jclouds.jdbc.entity.BlobEntity</class>
-    <class>org.jclouds.jdbc.entity.ChunkEntity</class>
-    <class>org.jclouds.jdbc.entity.PayloadEntity</class>
-    <exclude-unlisted-classes>true</exclude-unlisted-classes>
-
-    <properties>
-      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
-      <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />
-      <!-- Hsqldb must be set to multiversion concurrency control to run the tests correctly -->
-      <property name="hibernate.connection.url" value="jdbc:hsqldb:file:target/testdb;shutdown=true;sql.enforce_strict_size=true;hsqldb.tx=mvcc" />
-      <property name="hibernate.connection.user" value="sa" />
-      <!-- Allow hibernate to generate our schema -->
-      <property name="hibernate.hbm2ddl.auto" value="create" />
-      <property name="hibernate.order_updates" value="true" />
-      <property name="hibernate.order_inserts" value="true" />
-    </properties>
-  </persistence-unit>
-
-  <persistence-unit name="jclouds-test-h2" transaction-type="RESOURCE_LOCAL">
-    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
-
-    <class>org.jclouds.jdbc.entity.ContainerEntity</class>
-    <class>org.jclouds.jdbc.entity.BlobEntity</class>
-    <class>org.jclouds.jdbc.entity.ChunkEntity</class>
-    <class>org.jclouds.jdbc.entity.PayloadEntity</class>
-    <exclude-unlisted-classes>true</exclude-unlisted-classes>
-
-    <properties>
-      <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
-      <property name="javax.persistence.jdbc.url" value="jdbc:h2:./target/h2-2" />
-      <property name="javax.persistence.jdbc.user" value="sa" />
-      <!-- Allow eclipselink to generate our schema -->
-      <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
-      <property name="eclipselink.ddl-generation.output-mode" value="database" />
-    </properties>
-  </persistence-unit>
-
-</persistence>
diff --git a/jdbc/src/test/resources/log4j.properties b/jdbc/src/test/resources/log4j.properties
deleted file mode 100644
index 0815baa..0000000
--- a/jdbc/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you 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.
-#
-#
-log4j.rootLogger=WARN, A1
-log4j.appender.A1=org.apache.log4j.ConsoleAppender
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
-log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
-log4j.logger.org.hibernate = ERROR
diff --git a/pom.xml b/pom.xml
index 278dc40..5818fd0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,8 +63,6 @@
     <module>cloudsigma2-wdc</module>
     <module>cloudsigma2-zrh</module>
     <module>dimensiondata</module>
-    <module>jdbc</module>
-    <module>h2-jdbc</module>
     <module>joyent-cloudapi</module>
     <module>joyentcloud</module>
     <module>abiquo</module>
