diff --git a/README.md b/README.md
index 859bdca..4e7adae 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,11 @@
 jclouds
 ======
-jclouds is an open source library that helps you get started in the cloud and reuse your java and clojure development skills. Our api allows you freedom to use portable abstractions or cloud-specific features. We test support of 30 cloud providers and cloud software stacks, including Amazon, GoGrid, Ninefold, vCloud, OpenStack, and Azure.
-We offer several API abstractions as java and clojure libraries. The following are the most mature:
+jclouds allows provisioning and control of cloud resources, including blobstore
+and compute, from Java and Clojure.  Our API gives allows developers to use
+both portable abstractions and cloud-specific features.  We test support of 30
+cloud providers and cloud software stacks, including Amazon, Azure, GoGrid,
+Ninefold, OpenStack, and vCloud.  jclouds is licensed under the Apache License,
+Version 2.0
 
 Features
 --------
diff --git a/README.txt b/README.txt
index 2bb3cce..296958e 100644
--- a/README.txt
+++ b/README.txt
@@ -1,11 +1,11 @@
 Overview:
  
-jclouds is an open source library that helps you get started in the cloud
-and reuse your java and clojure development skills. Our api allows you to 
-freedom to use portable abstractions or cloud-specific features.  We have
-two abstractions at the moment: compute and blobstore.  compute helps you
-bootstrap machines in the cloud.  blobstore helps you manage key-value
-data.
+jclouds allows provisioning and control of cloud resources, including blobstore
+and compute, from Java and Clojure.  Our API gives allows developers to use
+both portable abstractions and cloud-specific features.  We test support of 30
+cloud providers and cloud software stacks, including Amazon, Azure, GoGrid,
+Ninefold, OpenStack, and vCloud.  jclouds is licensed under the Apache License,
+Version 2.0
  
 our current version is 1.4.2
 our next maintenance version is 1.4.2-SNAPSHOT
diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/handlers/ParseAtmosErrorFromXmlContent.java b/apis/atmos/src/main/java/org/jclouds/atmos/handlers/ParseAtmosErrorFromXmlContent.java
index 07d854d..9c69e07 100644
--- a/apis/atmos/src/main/java/org/jclouds/atmos/handlers/ParseAtmosErrorFromXmlContent.java
+++ b/apis/atmos/src/main/java/org/jclouds/atmos/handlers/ParseAtmosErrorFromXmlContent.java
@@ -71,7 +71,7 @@
          AtmosError error = null;
          if (response.getPayload() != null) {
             try {
-               String content = Strings2.toStringAndClose(response.getPayload().getInput());
+               String content = Strings2.toString(response.getPayload());
                if (content != null && content.indexOf('<') >= 0) {
                   error = utils.parseAtmosErrorFromContent(command, response, Strings2.toInputStream(content));
                } else {
diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/options/ListOptions.java b/apis/atmos/src/main/java/org/jclouds/atmos/options/ListOptions.java
index 7b2f6fc..6ec8a61 100644
--- a/apis/atmos/src/main/java/org/jclouds/atmos/options/ListOptions.java
+++ b/apis/atmos/src/main/java/org/jclouds/atmos/options/ListOptions.java
@@ -72,7 +72,7 @@
 
    public Integer getLimit() {
       String maxresults = getFirstHeaderOrNull("x-emc-limit");
-      return (maxresults != null) ? new Integer(maxresults) : null;
+      return (maxresults != null) ? Integer.valueOf(maxresults) : null;
    }
 
    public static class Builder {
diff --git a/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java b/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java
index 04e9675..d54c061 100644
--- a/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java
+++ b/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java
@@ -239,19 +239,19 @@
    private static void verifyHeadObject(AtmosClient connection, String path, String metadataValue)
             throws InterruptedException, ExecutionException, TimeoutException, IOException {
       AtmosObject getBlob = connection.headFile(path);
-      assertEquals(Strings2.toStringAndClose(getBlob.getPayload().getInput()), "");
+      assertEquals(Strings2.toString(getBlob.getPayload()), "");
       verifyMetadata(metadataValue, getBlob);
    }
 
    private static void verifyObject(AtmosClient connection, String path, String compare, String metadataValue)
             throws InterruptedException, ExecutionException, TimeoutException, IOException {
       AtmosObject getBlob = connection.readFile(path);
-      assertEquals(Strings2.toStringAndClose(getBlob.getPayload().getInput()), compare);
+      assertEquals(Strings2.toString(getBlob.getPayload()), compare);
       verifyMetadata(metadataValue, getBlob);
    }
 
    private static void verifyMetadata(String metadataValue, AtmosObject getBlob) {
-      assertEquals(getBlob.getContentMetadata().getContentLength(), new Long(16));
+      assertEquals(getBlob.getContentMetadata().getContentLength(), Long.valueOf(16));
       assert getBlob.getContentMetadata().getContentType().startsWith("text/plain");
       assertEquals(getBlob.getUserMetadata().getMetadata().get("Metadata"), metadataValue);
       SystemMetadata md = getBlob.getSystemMetadata();
diff --git a/apis/atmos/src/test/java/org/jclouds/atmos/internal/StubAtmosAsyncClient.java b/apis/atmos/src/test/java/org/jclouds/atmos/internal/StubAtmosAsyncClient.java
index 7e67622..c4bd2c0 100644
--- a/apis/atmos/src/test/java/org/jclouds/atmos/internal/StubAtmosAsyncClient.java
+++ b/apis/atmos/src/test/java/org/jclouds/atmos/internal/StubAtmosAsyncClient.java
@@ -43,7 +43,7 @@
 import org.jclouds.atmos.domain.UserMetadata;
 import org.jclouds.atmos.options.ListOptions;
 import org.jclouds.atmos.options.PutOptions;
-import org.jclouds.blobstore.TransientAsyncBlobStore;
+import org.jclouds.blobstore.LocalAsyncBlobStore;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.domain.BlobMetadata;
 import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions;
@@ -61,7 +61,7 @@
  */
 public class StubAtmosAsyncClient implements AtmosAsyncClient {
    private final HttpGetOptionsListToGetOptions httpGetOptionsConverter;
-   private final TransientAsyncBlobStore blobStore;
+   private final LocalAsyncBlobStore blobStore;
    private final AtmosObject.Factory objectProvider;
    private final ObjectToBlob object2Blob;
    private final BlobToObject blob2Object;
@@ -71,7 +71,7 @@
    private final ExecutorService service;
 
    @Inject
-   private StubAtmosAsyncClient(TransientAsyncBlobStore blobStore, AtmosObject.Factory objectProvider,
+   private StubAtmosAsyncClient(LocalAsyncBlobStore blobStore, AtmosObject.Factory objectProvider,
             HttpGetOptionsListToGetOptions httpGetOptionsConverter, ObjectToBlob object2Blob, BlobToObject blob2Object,
             BlobMetadataToObject blob2ObjectInfo, ListOptionsToBlobStoreListOptions container2ContainerListOptions,
             @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service,
diff --git a/apis/cloudloadbalancers/src/main/java/org/jclouds/cloudloadbalancers/handlers/ParseCloudLoadBalancersErrorFromHttpResponse.java b/apis/cloudloadbalancers/src/main/java/org/jclouds/cloudloadbalancers/handlers/ParseCloudLoadBalancersErrorFromHttpResponse.java
index 52dfbd2..e494bb6 100644
--- a/apis/cloudloadbalancers/src/main/java/org/jclouds/cloudloadbalancers/handlers/ParseCloudLoadBalancersErrorFromHttpResponse.java
+++ b/apis/cloudloadbalancers/src/main/java/org/jclouds/cloudloadbalancers/handlers/ParseCloudLoadBalancersErrorFromHttpResponse.java
@@ -85,7 +85,7 @@
    String parseErrorFromContentOrNull(HttpCommand command, HttpResponse response) {
       if (response.getPayload() != null) {
          try {
-            return Strings2.toStringAndClose(response.getPayload().getInput());
+            return Strings2.toString(response.getPayload());
          } catch (IOException e) {
             logger.warn(e, "exception reading error from response", response);
          }
diff --git a/apis/cloudloadbalancers/src/test/java/org/jclouds/cloudloadbalancers/features/LoadBalancerClientLiveTest.java b/apis/cloudloadbalancers/src/test/java/org/jclouds/cloudloadbalancers/features/LoadBalancerClientLiveTest.java
index 2b67216..3cd80da 100644
--- a/apis/cloudloadbalancers/src/test/java/org/jclouds/cloudloadbalancers/features/LoadBalancerClientLiveTest.java
+++ b/apis/cloudloadbalancers/src/test/java/org/jclouds/cloudloadbalancers/features/LoadBalancerClientLiveTest.java
@@ -136,7 +136,7 @@
       assertEquals(lb.getRegion(), region);
       assertEquals(lb.getName(), name);
       assertEquals(lb.getProtocol(), "HTTP");
-      assertEquals(lb.getPort(), new Integer(80));
+      assertEquals(lb.getPort(), Integer.valueOf(80));
       assertEquals(Iterables.get(lb.getVirtualIPs(), 0).getType(), Type.PUBLIC);
    }
 
diff --git a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/handlers/ParseCloudServersErrorFromHttpResponse.java b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/handlers/ParseCloudServersErrorFromHttpResponse.java
index 9fdaaa2..6675d84 100644
--- a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/handlers/ParseCloudServersErrorFromHttpResponse.java
+++ b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/handlers/ParseCloudServersErrorFromHttpResponse.java
@@ -85,7 +85,7 @@
    String parseErrorFromContentOrNull(HttpCommand command, HttpResponse response) {
       if (response.getPayload() != null) {
          try {
-            return Strings2.toStringAndClose(response.getPayload().getInput());
+            return Strings2.toString(response.getPayload());
          } catch (IOException e) {
             logger.warn(e, "exception reading error from response", response);
          }
diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/CloudServersClientLiveTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/CloudServersClientLiveTest.java
index 453db3b..0b4457e 100644
--- a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/CloudServersClientLiveTest.java
+++ b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/CloudServersClientLiveTest.java
@@ -344,8 +344,8 @@
       assertNotNull(server.getHostId());
       assertEquals(server.getStatus(), ServerStatus.ACTIVE);
       assert server.getProgress() >= 0 : "newDetails.getProgress()" + server.getProgress();
-      assertEquals(new Integer(14362), server.getImageId());
-      assertEquals(new Integer(1), server.getFlavorId());
+      assertEquals(Integer.valueOf(14362), server.getImageId());
+      assertEquals(Integer.valueOf(1), server.getFlavorId());
       assertNotNull(server.getAddresses());
       // listAddresses tests..
       assertEquals(client.getAddresses(serverId), server.getAddresses());
@@ -383,7 +383,7 @@
       try {
          client.connect();
          Payload etcPasswd = client.get("/etc/jclouds.txt");
-         String etcPasswdContents = Strings2.toStringAndClose(etcPasswd.getInput());
+         String etcPasswdContents = Strings2.toString(etcPasswd);
          assertEquals("rackspace", etcPasswdContents.trim());
       } finally {
          if (client != null)
@@ -445,7 +445,7 @@
       blockUntilServerActive(serverId2);
       assertIpConfigured(server, adminPass2);
       assert server.getAddresses().getPublicAddresses().contains(ip) : server.getAddresses() + " doesn't contain " + ip;
-      assertEquals(server.getSharedIpGroupId(), new Integer(sharedIpGroupId));
+      assertEquals(server.getSharedIpGroupId(), Integer.valueOf(sharedIpGroupId));
    }
 
    private void assertIpConfigured(Server server, String password) {
@@ -518,7 +518,7 @@
    public void testCreateImage() throws Exception {
       Image image = client.createImageFromServer("hoofie", serverId);
       assertEquals("hoofie", image.getName());
-      assertEquals(new Integer(serverId), image.getServerId());
+      assertEquals(Integer.valueOf(serverId), image.getServerId());
       imageId = image.getId();
       blockUntilImageActive(imageId);
    }
@@ -528,7 +528,7 @@
       client.rebuildServer(serverId, new RebuildServerOptions().withImage(imageId));
       blockUntilServerActive(serverId);
       // issue Web Hosting #119580 imageId comes back incorrect after rebuild
-      assert !new Integer(imageId).equals(client.getServer(serverId).getImageId());
+      assert !Integer.valueOf(imageId).equals(client.getServer(serverId).getImageId());
    }
 
    @Test(timeOut = 10 * 60 * 1000, dependsOnMethods = "testRebuildServer")
@@ -549,7 +549,7 @@
       blockUntilServerVerifyResize(serverId);
       client.revertResizeServer(serverId);
       blockUntilServerActive(serverId);
-      assertEquals(new Integer(1), client.getServer(serverId).getFlavorId());
+      assertEquals(Integer.valueOf(1), client.getServer(serverId).getFlavorId());
    }
 
    @Test(timeOut = 10 * 60 * 1000, dependsOnMethods = "testRebootSoft")
@@ -558,7 +558,7 @@
       blockUntilServerVerifyResize(serverId2);
       client.confirmResizeServer(serverId2);
       blockUntilServerActive(serverId2);
-      assertEquals(new Integer(2), client.getServer(serverId2).getFlavorId());
+      assertEquals(Integer.valueOf(2), client.getServer(serverId2).getFlavorId());
    }
 
    @Test(timeOut = 10 * 60 * 1000, dependsOnMethods = { "testRebootSoft", "testRevertResize", "testConfirmResize" })
diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseFlavorListFromJsonResponseTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseFlavorListFromJsonResponseTest.java
index 85884d2..2f6b839 100644
--- a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseFlavorListFromJsonResponseTest.java
+++ b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseFlavorListFromJsonResponseTest.java
@@ -67,13 +67,13 @@
       List<Flavor> response = parser.apply(HttpResponse.builder().statusCode(200).message("ok").payload(is).build());
       assertEquals(response.get(0).getId(), 1);
       assertEquals(response.get(0).getName(), "256 MB Server");
-      assertEquals(response.get(0).getDisk(), new Integer(10));
-      assertEquals(response.get(0).getRam(), new Integer(256));
+      assertEquals(response.get(0).getDisk(), Integer.valueOf(10));
+      assertEquals(response.get(0).getRam(), Integer.valueOf(256));
 
       assertEquals(response.get(1).getId(), 2);
       assertEquals(response.get(1).getName(), "512 MB Server");
-      assertEquals(response.get(1).getDisk(), new Integer(20));
-      assertEquals(response.get(1).getRam(), new Integer(512));
+      assertEquals(response.get(1).getDisk(), Integer.valueOf(20));
+      assertEquals(response.get(1).getRam(), Integer.valueOf(512));
 
    }
 
diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseImageFromJsonResponseTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseImageFromJsonResponseTest.java
index 66598ad..f5d95ab 100644
--- a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseImageFromJsonResponseTest.java
+++ b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseImageFromJsonResponseTest.java
@@ -63,8 +63,8 @@
       assertEquals(response.getId(), 2);
       assertEquals(response.getName(), "CentOS 5.2");
       assertEquals(response.getCreated(), dateService.iso8601SecondsDateParse("2010-08-10T12:00:00Z"));
-      assertEquals(response.getProgress(), new Integer(80));
-      assertEquals(response.getServerId(), new Integer(12));
+      assertEquals(response.getProgress(), Integer.valueOf(80));
+      assertEquals(response.getServerId(), Integer.valueOf(12));
       assertEquals(response.getStatus(), ImageStatus.SAVING);
       assertEquals(response.getUpdated(), dateService.iso8601SecondsDateParse(("2010-10-10T12:00:00Z")));
 
diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseImageListFromJsonResponseTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseImageListFromJsonResponseTest.java
index 89f716f..4eb3c4a 100644
--- a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseImageListFromJsonResponseTest.java
+++ b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseImageListFromJsonResponseTest.java
@@ -91,8 +91,8 @@
       assertEquals(response.get(1).getName(), "My Server Backup");
       assertEquals(response.get(1).getCreated(), dateService.iso8601SecondsDateParse("2009-07-07T09:56:16-05:00"));
       ;
-      assertEquals(response.get(1).getProgress(), new Integer(80));
-      assertEquals(response.get(1).getServerId(), new Integer(12));
+      assertEquals(response.get(1).getProgress(), Integer.valueOf(80));
+      assertEquals(response.get(1).getServerId(), Integer.valueOf(12));
       assertEquals(response.get(1).getStatus(), ImageStatus.SAVING);
       assertEquals(response.get(1).getUpdated(), dateService.iso8601SecondsDateParse("2010-10-10T12:00:00Z"));
    }
diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseServerFromJsonResponseTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseServerFromJsonResponseTest.java
index fbdaf1b..f3983d7 100644
--- a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseServerFromJsonResponseTest.java
+++ b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseServerFromJsonResponseTest.java
@@ -52,11 +52,11 @@
 
       assertEquals(response.getId(), 1234);
       assertEquals(response.getName(), "sample-server");
-      assertEquals(response.getImageId(), new Integer(2));
-      assertEquals(response.getFlavorId(), new Integer(1));
+      assertEquals(response.getImageId(), Integer.valueOf(2));
+      assertEquals(response.getFlavorId(), Integer.valueOf(1));
       assertEquals(response.getHostId(), "e4d909c290d0fb1ca068ffaddf22cbd0");
       assertEquals(response.getStatus(), ServerStatus.BUILD);
-      assertEquals(response.getProgress(), new Integer(60));
+      assertEquals(response.getProgress(), Integer.valueOf(60));
       List<String> publicAddresses = Lists.newArrayList("67.23.10.132", "67.23.10.131");
       List<String> privateAddresses = Lists.newArrayList("10.176.42.16");
       Addresses addresses1 = new Addresses();
diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseServerListFromJsonResponseTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseServerListFromJsonResponseTest.java
index de4a989..8733cab 100644
--- a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseServerListFromJsonResponseTest.java
+++ b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/functions/ParseServerListFromJsonResponseTest.java
@@ -73,11 +73,11 @@
 
       assertEquals(response.get(0).getId(), 1234);
       assertEquals(response.get(0).getName(), "sample-server");
-      assertEquals(response.get(0).getImageId(), new Integer(2));
-      assertEquals(response.get(0).getFlavorId(), new Integer(1));
+      assertEquals(response.get(0).getImageId(), Integer.valueOf(2));
+      assertEquals(response.get(0).getFlavorId(), Integer.valueOf(1));
       assertEquals(response.get(0).getHostId(), "e4d909c290d0fb1ca068ffaddf22cbd0");
       assertEquals(response.get(0).getStatus(), ServerStatus.BUILD);
-      assertEquals(response.get(0).getProgress(), new Integer(60));
+      assertEquals(response.get(0).getProgress(), Integer.valueOf(60));
       List<String> publicAddresses = Lists.newArrayList("67.23.10.132", "67.23.10.131");
       List<String> privateAddresses = Lists.newArrayList("10.176.42.16");
       Addresses addresses1 = new Addresses();
@@ -87,8 +87,8 @@
       assertEquals(response.get(0).getMetadata(), ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1"));
       assertEquals(response.get(1).getId(), 5678);
       assertEquals(response.get(1).getName(), "sample-server2");
-      assertEquals(response.get(1).getImageId(), new Integer(2));
-      assertEquals(response.get(1).getFlavorId(), new Integer(1));
+      assertEquals(response.get(1).getImageId(), Integer.valueOf(2));
+      assertEquals(response.get(1).getFlavorId(), Integer.valueOf(1));
       assertEquals(response.get(1).getHostId(), "9e107d9d372bb6826bd81d3542a419d6");
       assertEquals(response.get(1).getStatus(), ServerStatus.ACTIVE);
       assertEquals(response.get(1).getProgress(), null);
diff --git a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToDriveInfo.java b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToDriveInfo.java
index 9f9c371..ee3d529 100644
--- a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToDriveInfo.java
+++ b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToDriveInfo.java
@@ -69,7 +69,7 @@
       if (from.containsKey("readers"))
          builder.readers(Splitter.on(' ').split(from.get("readers")));
       if (from.containsKey("size"))
-         builder.size(new Long(from.get("size")));
+         builder.size(Long.valueOf(from.get("size")));
       Map<String, String> metadata = Maps.newLinkedHashMap();
       for (Entry<String, String> entry : from.entrySet()) {
          if (entry.getKey().startsWith("user:"))
@@ -78,7 +78,7 @@
       if (from.containsKey("use"))
          builder.use(Splitter.on(' ').split(from.get("use")));
       if (from.containsKey("bits"))
-         builder.bits(new Integer(from.get("bits")));
+         builder.bits(Integer.valueOf(from.get("bits")));
       if (from.containsKey("url"))
          builder.url(URI.create(from.get("url")));
       builder.encryptionKey(from.get("encryption:key"));
@@ -88,9 +88,9 @@
       if (from.containsKey("drive_type"))
          builder.driveType(Splitter.on(',').split(from.get("drive_type")));
       if (from.containsKey("autoexpanding"))
-         builder.autoexpanding(new Boolean(from.get("autoexpanding")));
+         builder.autoexpanding(Boolean.valueOf(from.get("autoexpanding")));
       if (from.containsKey("free"))
-         builder.free(new Boolean(from.get("free")));
+         builder.free(Boolean.valueOf(from.get("free")));
       if (from.containsKey("type"))
          builder.type(DriveType.fromValue(from.get("type")));
       try {
@@ -104,13 +104,13 @@
    protected DriveMetrics buildMetrics(Map<String, String> from) {
       DriveMetrics.Builder metricsBuilder = new DriveMetrics.Builder();
       if (from.containsKey("read:bytes"))
-         metricsBuilder.readBytes(new Long(from.get("read:bytes")));
+         metricsBuilder.readBytes(Long.valueOf(from.get("read:bytes")));
       if (from.containsKey("read:requests"))
-         metricsBuilder.readRequests(new Long(from.get("read:requests")));
+         metricsBuilder.readRequests(Long.valueOf(from.get("read:requests")));
       if (from.containsKey("write:bytes"))
-         metricsBuilder.writeBytes(new Long(from.get("write:bytes")));
+         metricsBuilder.writeBytes(Long.valueOf(from.get("write:bytes")));
       if (from.containsKey("write:requests"))
-         metricsBuilder.writeRequests(new Long(from.get("write:requests")));
+         metricsBuilder.writeRequests(Long.valueOf(from.get("write:requests")));
       return metricsBuilder.build();
    }
 }
\ No newline at end of file
diff --git a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToDriveMetrics.java b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToDriveMetrics.java
index 8aff913..8ab6bdc 100644
--- a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToDriveMetrics.java
+++ b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToDriveMetrics.java
@@ -74,13 +74,13 @@
    protected DriveMetrics buildMetrics(String key, Map<String, String> from) {
       DriveMetrics.Builder builder = new DriveMetrics.Builder();
       if (from.containsKey(key + ":read:bytes"))
-         builder.readBytes(new Long(from.get(key + ":read:bytes")));
+         builder.readBytes(Long.valueOf(from.get(key + ":read:bytes")));
       if (from.containsKey(key + ":read:requests"))
-         builder.readRequests(new Long(from.get(key + ":read:requests")));
+         builder.readRequests(Long.valueOf(from.get(key + ":read:requests")));
       if (from.containsKey(key + ":write:bytes"))
-         builder.writeBytes(new Long(from.get(key + ":write:bytes")));
+         builder.writeBytes(Long.valueOf(from.get(key + ":write:bytes")));
       if (from.containsKey(key + ":write:requests"))
-         builder.writeRequests(new Long(from.get(key + ":write:requests")));
+         builder.writeRequests(Long.valueOf(from.get(key + ":write:requests")));
       return builder.build();
    }
 }
\ No newline at end of file
diff --git a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToServerInfo.java b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToServerInfo.java
index 3359518..859783a 100644
--- a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToServerInfo.java
+++ b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToServerInfo.java
@@ -68,12 +68,12 @@
       if (from.containsKey("status"))
          builder.status(ServerStatus.fromValue(from.get("status")));
       if (from.containsKey("smp") && !"auto".equals(from.get("smp")))
-         builder.smp(new Integer(from.get("smp")));
+         builder.smp(Integer.valueOf(from.get("smp")));
       builder.cpu(Integer.parseInt(from.get("cpu")));
       builder.mem(Integer.parseInt(from.get("mem")));
       builder.user(from.get("user"));
       if (from.containsKey("started"))
-         builder.started(new Date(new Long(from.get("started"))));
+         builder.started(new Date(Long.valueOf(from.get("started"))));
       builder.uuid(from.get("server"));
       builder.vnc(new VNC(from.get("vnc:ip"), from.get("vnc:password"), from.containsKey("vnc:tls")
             && Boolean.valueOf(from.get("vnc:tls"))));
diff --git a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToServerMetrics.java b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToServerMetrics.java
index c74a0de..b4375ca 100644
--- a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToServerMetrics.java
+++ b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/functions/MapToServerMetrics.java
@@ -44,13 +44,13 @@
    public ServerMetrics apply(Map<String, String> from) {
       ServerMetrics.Builder metricsBuilder = new ServerMetrics.Builder();
       if (from.containsKey("tx:packets"))
-         metricsBuilder.txPackets(new Long(from.get("tx:packets")));
+         metricsBuilder.txPackets(Long.valueOf(from.get("tx:packets")));
       if (from.containsKey("tx"))
-         metricsBuilder.tx(new Long(from.get("tx")));
+         metricsBuilder.tx(Long.valueOf(from.get("tx")));
       if (from.containsKey("rx:packets"))
-         metricsBuilder.rxPackets(new Long(from.get("rx:packets")));
+         metricsBuilder.rxPackets(Long.valueOf(from.get("rx:packets")));
       if (from.containsKey("rx"))
-         metricsBuilder.rx(new Long(from.get("rx")));
+         metricsBuilder.rx(Long.valueOf(from.get("rx")));
       metricsBuilder.driveMetrics(mapToDriveMetrics.apply(from));
 
       ServerMetrics metrics = metricsBuilder.build();
diff --git a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java
index 7c78409..8c7f999 100644
--- a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java
+++ b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java
@@ -94,7 +94,7 @@
       if (response.getPayload() == null)
          return null;
       try {
-         return Strings2.toStringAndClose(response.getPayload().getInput());
+         return Strings2.toString(response.getPayload());
       } catch (IOException e) {
          throw new RuntimeException(e);
       } finally {
diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Account.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Account.java
index e967115..c592cdf 100644
--- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Account.java
+++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Account.java
@@ -103,7 +103,7 @@
       }
 
       public static Type fromValue(String type) {
-         Integer code = new Integer(checkNotNull(type, "type"));
+         Integer code = Integer.valueOf(checkNotNull(type, "type"));
          return INDEX.containsKey(code) ? INDEX.get(code) : UNRECOGNIZED;
       }
 
@@ -473,7 +473,7 @@
    }
 
    private static Long toLongNullIfUnlimited(String in) {
-      return in == null || "Unlimited".equals(in) ? null : new Long(in);
+      return in == null || "Unlimited".equals(in) ? null : Long.valueOf(in);
    }
 
    protected Account(String id, @Nullable Account.Type type, @Nullable String networkDomain, @Nullable String domain,
diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Capacity.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Capacity.java
index 712f63e..e975e01 100644
--- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Capacity.java
+++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Capacity.java
@@ -75,7 +75,7 @@
       }
 
       public static Type fromValue(String type) {
-         Integer code = new Integer(checkNotNull(type, "type"));
+         Integer code = Integer.valueOf(checkNotNull(type, "type"));
          return INDEX.containsKey(code) ? INDEX.get(code) : UNRECOGNIZED;
       }
    }
diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/ResourceLimit.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/ResourceLimit.java
index 6066556..2c6fe0e 100644
--- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/ResourceLimit.java
+++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/ResourceLimit.java
@@ -91,7 +91,7 @@
       }
 
       public static ResourceType fromValue(String resourceType) {
-         Integer code = new Integer(checkNotNull(resourceType, "resourcetype"));
+         Integer code = Integer.valueOf(checkNotNull(resourceType, "resourcetype"));
          return INDEX.containsKey(code) ? INDEX.get(code) : UNRECOGNIZED;
       }
    }
diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/UsageRecord.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/UsageRecord.java
index 8b6f192..6c07a6b 100644
--- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/UsageRecord.java
+++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/UsageRecord.java
@@ -80,7 +80,7 @@
       }
 
       public static UsageType fromValue(String usageType) {
-         Integer code = new Integer(checkNotNull(usageType, "usageType"));
+         Integer code = Integer.valueOf(checkNotNull(usageType, "usageType"));
          return INDEX.containsKey(code) ? INDEX.get(code) : UNRECOGNIZED;
       }
 
diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/VirtualMachine.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/VirtualMachine.java
index 675114c..5e5fee9 100644
--- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/VirtualMachine.java
+++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/VirtualMachine.java
@@ -588,7 +588,7 @@
                             @Nullable VirtualMachine.State state, @Nullable String templateDisplayText, @Nullable String templateId,
                             @Nullable String templateName, @Nullable String zoneId, @Nullable String zoneName, @Nullable Set<NIC> nics,
                             @Nullable String hypervisor, @Nullable Set<SecurityGroup> securityGroups) {
-      Preconditions.checkArgument(Strings.isNullOrEmpty(cpuUsed) || cpuUsed.matches("^[0-9\\.]+%$"), "cpuUsed value should be a decimal number followed by %");
+      Preconditions.checkArgument(Strings.isNullOrEmpty(cpuUsed) || cpuUsed.matches("^[0-9\\.\\-]+%$"), "cpuUsed value should be a decimal number followed by %");
       this.id = checkNotNull(id, "id");
       this.account = account;
       this.cpuCount = cpuCount;
diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Volume.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Volume.java
index e7e73ba..e96a10f 100644
--- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Volume.java
+++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Volume.java
@@ -108,7 +108,7 @@
       }
 
       public static Type fromValue(String resourceType) {
-         Integer code = new Integer(checkNotNull(resourceType, "resourcetype"));
+         Integer code = Integer.valueOf(checkNotNull(resourceType, "resourcetype"));
          return INDEX.containsKey(code) ? INDEX.get(code) : UNRECOGNIZED;
       }
 
diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/handlers/CloudStackErrorHandler.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/handlers/CloudStackErrorHandler.java
index 7c051ec..b2c7e98 100644
--- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/handlers/CloudStackErrorHandler.java
+++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/handlers/CloudStackErrorHandler.java
@@ -92,7 +92,7 @@
       if (response.getPayload() == null)
          return null;
       try {
-         return Strings2.toStringAndClose(response.getPayload().getInput());
+         return Strings2.toString(response.getPayload());
       } catch (IOException e) {
          throw new RuntimeException(e);
       } finally {
diff --git a/apis/deltacloud/src/main/java/org/jclouds/deltacloud/handlers/DeltacloudErrorHandler.java b/apis/deltacloud/src/main/java/org/jclouds/deltacloud/handlers/DeltacloudErrorHandler.java
index 011bc0f..73b5b7d 100644
--- a/apis/deltacloud/src/main/java/org/jclouds/deltacloud/handlers/DeltacloudErrorHandler.java
+++ b/apis/deltacloud/src/main/java/org/jclouds/deltacloud/handlers/DeltacloudErrorHandler.java
@@ -87,7 +87,7 @@
       if (response.getPayload() == null)
          return null;
       try {
-         return Strings2.toStringAndClose(response.getPayload().getInput());
+         return Strings2.toString(response.getPayload());
       } catch (IOException e) {
          throw new RuntimeException(e);
       } finally {
diff --git a/apis/deltacloud/src/main/java/org/jclouds/deltacloud/xml/HardwarePropertyHandler.java b/apis/deltacloud/src/main/java/org/jclouds/deltacloud/xml/HardwarePropertyHandler.java
index c7c392e..dba96e3 100644
--- a/apis/deltacloud/src/main/java/org/jclouds/deltacloud/xml/HardwarePropertyHandler.java
+++ b/apis/deltacloud/src/main/java/org/jclouds/deltacloud/xml/HardwarePropertyHandler.java
@@ -87,7 +87,7 @@
       if (DOUBLE.matcher(in).matches())
          return new Double(in);
       else if (LONG.matcher(in).matches())
-         return new Long(in);
+         return Long.valueOf(in);
       return null;
    }
 
diff --git a/apis/deltacloud/src/test/java/org/jclouds/deltacloud/xml/HardwareProfileHandlerTest.java b/apis/deltacloud/src/test/java/org/jclouds/deltacloud/xml/HardwareProfileHandlerTest.java
index ae945b5..8ff48a4 100644
--- a/apis/deltacloud/src/test/java/org/jclouds/deltacloud/xml/HardwareProfileHandlerTest.java
+++ b/apis/deltacloud/src/test/java/org/jclouds/deltacloud/xml/HardwareProfileHandlerTest.java
@@ -65,13 +65,13 @@
       HardwareProfile expects = new HardwareProfile(
             URI.create("http://localhost:3001/api/hardware_profiles/m1-xlarge"), "m1-xlarge", "m1-xlarge",
             ImmutableSet.<HardwareProperty> of(
-                  new FixedHardwareProperty("cpu", "count", new Long(4)),
-                  new RangeHardwareProperty("memory", "MB", new Long(12288), new HardwareParameter(URI
+                  new FixedHardwareProperty("cpu", "count", Long.valueOf(4)),
+                  new RangeHardwareProperty("memory", "MB", Long.valueOf(12288), new HardwareParameter(URI
                         .create("http://localhost:3001/api/instances"), "post", "hwp_memory", "create"),
-                        new Long(12288), new Long(32768)),
-                  new EnumHardwareProperty("storage", "GB", new Long(1024), new HardwareParameter(URI
+                        Long.valueOf(12288), Long.valueOf(32768)),
+                  new EnumHardwareProperty("storage", "GB", Long.valueOf(1024), new HardwareParameter(URI
                         .create("http://localhost:3001/api/instances"), "post", "hwp_storage", "create"),
-                        ImmutableSet.<Object> of(new Long(1024), new Long(2048), new Long(4096))),
+                        ImmutableSet.<Object> of(Long.valueOf(1024), Long.valueOf(2048), Long.valueOf(4096))),
                   new FixedHardwareProperty("architecture", "label", "x86_64"))
       );
       assertEquals(parseHardwareProfile(), expects);
diff --git a/apis/deltacloud/src/test/java/org/jclouds/deltacloud/xml/HardwareProfilesHandlerTest.java b/apis/deltacloud/src/test/java/org/jclouds/deltacloud/xml/HardwareProfilesHandlerTest.java
index 25eab51..a3cd0b7 100644
--- a/apis/deltacloud/src/test/java/org/jclouds/deltacloud/xml/HardwareProfilesHandlerTest.java
+++ b/apis/deltacloud/src/test/java/org/jclouds/deltacloud/xml/HardwareProfilesHandlerTest.java
@@ -50,27 +50,27 @@
       Set<? extends HardwareProfile> expects = ImmutableSet.of(
             new HardwareProfile(URI.create("http://localhost:3001/api/hardware_profiles/m1-small"), "m1-small",
                   "m1-small", ImmutableSet.<HardwareProperty> of(
-                        new FixedHardwareProperty("cpu", "count", new Long(1)), new FixedHardwareProperty("memory",
-                              "MB", new Double(1740.8)), new FixedHardwareProperty("storage", "GB", new Long(160)),
+                        new FixedHardwareProperty("cpu", "count", Long.valueOf(1)), new FixedHardwareProperty("memory",
+                              "MB", new Double(1740.8)), new FixedHardwareProperty("storage", "GB", Long.valueOf(160)),
                         new FixedHardwareProperty("architecture", "label", "i386"))),
             new HardwareProfile(URI.create("http://localhost:3001/api/hardware_profiles/m1-large"), "m1-large",
                   "m1-large", ImmutableSet.<HardwareProperty> of(
-                        new FixedHardwareProperty("cpu", "count", new Long(2)),
-                        new RangeHardwareProperty("memory", "MB", new Long(10240), new HardwareParameter(URI
+                        new FixedHardwareProperty("cpu", "count", Long.valueOf(2)),
+                        new RangeHardwareProperty("memory", "MB", Long.valueOf(10240), new HardwareParameter(URI
                               .create("http://localhost:3001/api/instances"), "post", "hwp_memory", "create"),
-                              new Double(7680.0), new Long(15360)), new EnumHardwareProperty("storage", "GB", new Long(
+                              new Double(7680.0), Long.valueOf(15360)), new EnumHardwareProperty("storage", "GB", Long.valueOf(
                               850), new HardwareParameter(URI.create("http://localhost:3001/api/instances"), "post",
-                              "hwp_storage", "create"), ImmutableSet.<Object> of(new Long(850), new Long(1024))),
+                              "hwp_storage", "create"), ImmutableSet.<Object> of(Long.valueOf(850), Long.valueOf(1024))),
                         new FixedHardwareProperty("architecture", "label", "x86_64"))),
             new HardwareProfile(URI.create("http://localhost:3001/api/hardware_profiles/m1-xlarge"), "m1-xlarge",
                   "m1-xlarge", ImmutableSet.<HardwareProperty> of(
-                        new FixedHardwareProperty("cpu", "count", new Long(4)),
-                        new RangeHardwareProperty("memory", "MB", new Long(12288), new HardwareParameter(URI
+                        new FixedHardwareProperty("cpu", "count", Long.valueOf(4)),
+                        new RangeHardwareProperty("memory", "MB", Long.valueOf(12288), new HardwareParameter(URI
                               .create("http://localhost:3001/api/instances"), "post", "hwp_memory", "create"),
-                              new Long(12288), new Long(32768)),
-                        new EnumHardwareProperty("storage", "GB", new Long(1024), new HardwareParameter(URI
+                              Long.valueOf(12288), Long.valueOf(32768)),
+                        new EnumHardwareProperty("storage", "GB", Long.valueOf(1024), new HardwareParameter(URI
                               .create("http://localhost:3001/api/instances"), "post", "hwp_storage", "create"),
-                              ImmutableSet.<Object> of(new Long(1024), new Long(2048), new Long(4096))),
+                              ImmutableSet.<Object> of(Long.valueOf(1024), Long.valueOf(2048), Long.valueOf(4096))),
                         new FixedHardwareProperty("architecture", "label", "x86_64"))),
             new HardwareProfile(URI.create("http://localhost:3001/api/hardware_profiles/opaque"), "opaque", "opaque",
                   ImmutableSet.<HardwareProperty> of()));
diff --git a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToDriveInfo.java b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToDriveInfo.java
index effbd07..c72f9ba 100644
--- a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToDriveInfo.java
+++ b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToDriveInfo.java
@@ -65,7 +65,7 @@
       if (from.containsKey("readers"))
          builder.readers(Splitter.on(' ').split(from.get("readers")));
       if (from.containsKey("size"))
-         builder.size(new Long(from.get("size")));
+         builder.size(Long.valueOf(from.get("size")));
       Map<String, String> metadata = Maps.newLinkedHashMap();
       for (Entry<String, String> entry : from.entrySet()) {
          if (entry.getKey().startsWith("user:"))
@@ -83,13 +83,13 @@
    protected DriveMetrics buildMetrics(Map<String, String> from) {
       DriveMetrics.Builder metricsBuilder = new DriveMetrics.Builder();
       if (from.containsKey("read:bytes"))
-         metricsBuilder.readBytes(new Long(from.get("read:bytes")));
+         metricsBuilder.readBytes(Long.valueOf(from.get("read:bytes")));
       if (from.containsKey("read:requests"))
-         metricsBuilder.readRequests(new Long(from.get("read:requests")));
+         metricsBuilder.readRequests(Long.valueOf(from.get("read:requests")));
       if (from.containsKey("write:bytes"))
-         metricsBuilder.writeBytes(new Long(from.get("write:bytes")));
+         metricsBuilder.writeBytes(Long.valueOf(from.get("write:bytes")));
       if (from.containsKey("write:requests"))
-         metricsBuilder.writeRequests(new Long(from.get("write:requests")));
+         metricsBuilder.writeRequests(Long.valueOf(from.get("write:requests")));
       return metricsBuilder.build();
    }
 }
\ No newline at end of file
diff --git a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToDriveMetrics.java b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToDriveMetrics.java
index ba30714..6de7a9e 100644
--- a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToDriveMetrics.java
+++ b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToDriveMetrics.java
@@ -74,13 +74,13 @@
    protected DriveMetrics buildMetrics(String key, Map<String, String> from) {
       DriveMetrics.Builder builder = new DriveMetrics.Builder();
       if (from.containsKey(key + ":read:bytes"))
-         builder.readBytes(new Long(from.get(key + ":read:bytes")));
+         builder.readBytes(Long.valueOf(from.get(key + ":read:bytes")));
       if (from.containsKey(key + ":read:requests"))
-         builder.readRequests(new Long(from.get(key + ":read:requests")));
+         builder.readRequests(Long.valueOf(from.get(key + ":read:requests")));
       if (from.containsKey(key + ":write:bytes"))
-         builder.writeBytes(new Long(from.get(key + ":write:bytes")));
+         builder.writeBytes(Long.valueOf(from.get(key + ":write:bytes")));
       if (from.containsKey(key + ":write:requests"))
-         builder.writeRequests(new Long(from.get(key + ":write:requests")));
+         builder.writeRequests(Long.valueOf(from.get(key + ":write:requests")));
       return builder.build();
    }
 }
\ No newline at end of file
diff --git a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToServerInfo.java b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToServerInfo.java
index 98b6f98..e5307ab 100644
--- a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToServerInfo.java
+++ b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToServerInfo.java
@@ -68,16 +68,16 @@
 
 
       if (from.containsKey("smp:cores")) {
-            builder.smp(new Integer(from.get("smp:cores")));
+            builder.smp(Integer.valueOf(from.get("smp:cores")));
       } else if (from.containsKey("smp") && !"auto".equals(from.get("smp"))) {
-            builder.smp(new Integer(from.get("smp")));
+            builder.smp(Integer.valueOf(from.get("smp")));
       }
 
       builder.cpu(Integer.parseInt(from.get("cpu")));
       builder.mem(Integer.parseInt(from.get("mem")));
       builder.user(from.get("user"));
       if (from.containsKey("started"))
-         builder.started(new Date(new Long(from.get("started"))));
+         builder.started(new Date(Long.valueOf(from.get("started"))));
       builder.uuid(from.get("server"));
       if (from.containsKey("boot"))
          builder.bootDeviceIds(Splitter.on(' ').split(from.get("boot")));
diff --git a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToServerMetrics.java b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToServerMetrics.java
index a8b38b5..2c2ff6f 100644
--- a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToServerMetrics.java
+++ b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/functions/MapToServerMetrics.java
@@ -44,13 +44,13 @@
    public ServerMetrics apply(Map<String, String> from) {
       ServerMetrics.Builder metricsBuilder = new ServerMetrics.Builder();
       if (from.containsKey("tx:packets"))
-         metricsBuilder.txPackets(new Long(from.get("tx:packets")));
+         metricsBuilder.txPackets(Long.valueOf(from.get("tx:packets")));
       if (from.containsKey("tx"))
-         metricsBuilder.tx(new Long(from.get("tx")));
+         metricsBuilder.tx(Long.valueOf(from.get("tx")));
       if (from.containsKey("rx:packets"))
-         metricsBuilder.rxPackets(new Long(from.get("rx:packets")));
+         metricsBuilder.rxPackets(Long.valueOf(from.get("rx:packets")));
       if (from.containsKey("rx"))
-         metricsBuilder.rx(new Long(from.get("rx")));
+         metricsBuilder.rx(Long.valueOf(from.get("rx")));
       metricsBuilder.driveMetrics(mapToDriveMetrics.apply(from));
 
       ServerMetrics metrics = metricsBuilder.build();
diff --git a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/handlers/ElasticStackErrorHandler.java b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/handlers/ElasticStackErrorHandler.java
index b55bb32..4ebc647 100644
--- a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/handlers/ElasticStackErrorHandler.java
+++ b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/handlers/ElasticStackErrorHandler.java
@@ -92,7 +92,7 @@
       if (response.getPayload() == null)
          return null;
       try {
-         return Strings2.toStringAndClose(response.getPayload().getInput());
+         return Strings2.toString(response.getPayload());
       } catch (IOException e) {
          throw new RuntimeException(e);
       } finally {
diff --git a/apis/elasticstack/src/test/java/org/jclouds/elasticstack/ElasticStackClientLiveTest.java b/apis/elasticstack/src/test/java/org/jclouds/elasticstack/ElasticStackClientLiveTest.java
index 1eea179..badcb39 100644
--- a/apis/elasticstack/src/test/java/org/jclouds/elasticstack/ElasticStackClientLiveTest.java
+++ b/apis/elasticstack/src/test/java/org/jclouds/elasticstack/ElasticStackClientLiveTest.java
@@ -326,7 +326,7 @@
    public void testWeCanReadAndWriteToDrive() throws IOException {
       drive2 = client.createDrive(new CreateDriveRequest.Builder().name(prefix + "2").size(1 * 1024 * 1024l).build());
       client.writeDrive(drive2.getUuid(), Payloads.newStringPayload("foo"));
-      assertEquals(Strings2.toStringAndClose(client.readDrive(drive2.getUuid(), 0, 3).getInput()), "foo");
+      assertEquals(Strings2.toString(client.readDrive(drive2.getUuid(), 0, 3)), "foo");
    }
 
    @Test(dependsOnMethods = "testWeCanReadAndWriteToDrive")
@@ -341,7 +341,7 @@
          assert driveNotClaimed.apply(drive2) : client.getDriveInfo(drive2.getUuid());
          System.err.println("after image; drive 2" + client.getDriveInfo(drive2.getUuid()));
          System.err.println("after image; drive 3" + client.getDriveInfo(drive3.getUuid()));
-         assertEquals(Strings2.toStringAndClose(client.readDrive(drive3.getUuid(), 0, 3).getInput()), "foo");
+         assertEquals(Strings2.toString(client.readDrive(drive3.getUuid(), 0, 3)), "foo");
       } finally {
          client.destroyDrive(drive2.getUuid());
          client.destroyDrive(drive3.getUuid());
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/FilesystemBlobStore.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/FilesystemBlobStore.java
deleted file mode 100644
index e21c3c0..0000000
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/FilesystemBlobStore.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds 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.filesystem;
-
-import java.util.concurrent.TimeUnit;
-
-import org.jclouds.blobstore.BlobStore;
-import org.jclouds.concurrent.Timeout;
-
-/**
- *
- * @author Alfredo "Rainbowbreeze" Morresi
- */
-@Timeout(duration = 2, timeUnit = TimeUnit.MINUTES) public interface FilesystemBlobStore  extends BlobStore {
-}
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java
index 4560bd5..1eb4079 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java
+++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java
@@ -21,18 +21,18 @@
 import org.jclouds.blobstore.AsyncBlobStore;
 import org.jclouds.blobstore.BlobRequestSigner;
 import org.jclouds.blobstore.BlobStore;
+import org.jclouds.blobstore.LocalAsyncBlobStore;
+import org.jclouds.blobstore.LocalStorageStrategy;
 import org.jclouds.blobstore.TransientBlobRequestSigner;
 import org.jclouds.blobstore.attr.ConsistencyModel;
 import org.jclouds.blobstore.config.BlobStoreMapModule;
 import org.jclouds.blobstore.config.BlobStoreObjectModule;
+import org.jclouds.blobstore.config.LocalBlobStore;
 import org.jclouds.blobstore.util.BlobUtils;
-import org.jclouds.filesystem.FilesystemAsyncBlobStore;
-import org.jclouds.filesystem.FilesystemBlobStore;
 import org.jclouds.filesystem.predicates.validators.FilesystemBlobKeyValidator;
 import org.jclouds.filesystem.predicates.validators.FilesystemContainerNameValidator;
 import org.jclouds.filesystem.predicates.validators.internal.FilesystemBlobKeyValidatorImpl;
 import org.jclouds.filesystem.predicates.validators.internal.FilesystemContainerNameValidatorImpl;
-import org.jclouds.filesystem.strategy.FilesystemStorageStrategy;
 import org.jclouds.filesystem.strategy.internal.FilesystemStorageStrategyImpl;
 import org.jclouds.filesystem.util.internal.FileSystemBlobUtilsImpl;
 import org.jclouds.rest.config.BinderUtils;
@@ -48,15 +48,15 @@
 
    @Override
    protected void configure() {
-      bind(AsyncBlobStore.class).to(FilesystemAsyncBlobStore.class).asEagerSingleton();
+      bind(AsyncBlobStore.class).to(LocalAsyncBlobStore.class).asEagerSingleton();
       // forward all requests from TransientBlobStore to TransientAsyncBlobStore.  needs above binding as cannot proxy a class
-      BinderUtils.bindClient(binder(), FilesystemBlobStore.class, AsyncBlobStore.class, ImmutableMap.<Class<?>, Class<?>>of());
-      bind(BlobStore.class).to(FilesystemBlobStore.class);
+      BinderUtils.bindClient(binder(), LocalBlobStore.class, AsyncBlobStore.class, ImmutableMap.<Class<?>, Class<?>>of());
+      bind(BlobStore.class).to(LocalBlobStore.class);
 
       install(new BlobStoreObjectModule());
       install(new BlobStoreMapModule());
       bind(ConsistencyModel.class).toInstance(ConsistencyModel.STRICT);
-      bind(FilesystemStorageStrategy.class).to(FilesystemStorageStrategyImpl.class);
+      bind(LocalStorageStrategy.class).to(FilesystemStorageStrategyImpl.class);
       bind(BlobUtils.class).to(FileSystemBlobUtilsImpl.class);
       bind(FilesystemBlobKeyValidator.class).to(FilesystemBlobKeyValidatorImpl.class);
       bind(FilesystemContainerNameValidator.class).to(FilesystemContainerNameValidatorImpl.class);
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/FilesystemStorageStrategy.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/FilesystemStorageStrategy.java
deleted file mode 100644
index fc648f1..0000000
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/FilesystemStorageStrategy.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds 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.filesystem.strategy;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.jclouds.blobstore.domain.Blob;
-import org.jclouds.blobstore.options.ListContainerOptions;
-import org.jclouds.io.Payload;
-
-/**
- * Strategy for filesystem operations related to container and blob
- *
- * @author Alfredo "Rainbowbreeze" Morresi
- */
-public interface FilesystemStorageStrategy {
-
-    /**
-     * Creates a new container
-     *
-     * @param container
-     * @return
-     */
-    boolean createContainer(String container);
-
-    /**
-     * Deletes a container and all its content
-     * @param container
-     */
-    void deleteContainer(String container);
-
-    /**
-     * Checks if a container exists
-     * @param container
-     * @return
-     */
-    boolean containerExists(String container);
-
-    /**
-     * Empty the container of its content (files and subdirectories), but doesn't
-     * delete the container itself
-     * @param container
-     */
-    void clearContainer(final String container);
-
-    /**
-    * Like {@link #clearContainer(String)} except you can use options to do things like recursive
-    * deletes, or clear at a different path than root.
-    *
-    * @param container
-    *           what to clear
-    * @param options
-    *           recursion and path to clear
-    */
-    void clearContainer(String container, ListContainerOptions options);
-
-    /**
-     * Return an iterator that reports all the containers under base path
-     * @return
-     */
-    Iterable<String> getAllContainerNames();
-
-    /**
-    * Determines if a directory exists
-    *
-    * @param container
-    *           container where the directory resides
-    * @param directory
-    *           full path to the directory
-    */
-    boolean directoryExists(String container, String directory);
-
-    /**
-    * Creates a folder or a directory marker depending on the service
-    *
-    * @param container
-    *           container to create the directory in
-    * @param directory
-    *           full path to the directory
-    */
-    void createDirectory(String container, String directory);
-
-    /**
-    * Deletes a folder or a directory marker depending on the service
-    *
-    * @param container
-    *           container to delete the directory from
-    * @param directory
-    *           full path to the directory to delete
-    */
-    void deleteDirectory(String container, String directory);
-
-    
-    /**
-     * Creates a new blob
-     * @param name
-     * @return
-     */
-    Blob newBlob(String name);
-
-    /**
-     *
-     * @param container
-     * @param key
-     * @return
-     */
-    boolean blobExists(String container, String key);
-
-   /**
-    * Load the blob with the given key belonging to the container with the given
-    * name. There must exist a resource on the file system whose complete name
-    * is given concatenating the container name and the key
-    *
-    * @param container
-    *           it's the name of the container the blob belongs to
-    * @param key
-    *           it's the key of the blob
-    *
-    * @return the blob belonging to the given container with the given key
-    */
-    Blob getBlob(final String containerName, final String blobName);
-
-    /**
-     * Returns all the blobs key inside a container
-     * @param container
-     * @return
-     * @throws IOException
-     */
-    Iterable<String> getBlobKeysInsideContainer(String container) throws IOException;
-
-    /**
-     * Counts number of blobs inside a container
-     * @param container
-     * @param options
-     * @return
-     */
-    long countBlobs(String container, ListContainerOptions options);
-
-    /**
-     * Returns a {@link File} object that links to the blob
-     * @param container
-     * @param key
-     * @return
-     */
-    File getFileForBlobKey(String container, String key);
-
-    /**
-     *
-     * @param container
-     * @param key
-     */
-    void removeBlob(String container, String key);
-
-    /**
-     * Write a {@link Blob} into a file
-     * @param container
-     * @param blob
-     * @throws IOException
-     */
-    void putBlob(String containerName, Blob blob) throws IOException;
-
-}
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
index 918f9d2..c652dd7 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
+++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
@@ -35,15 +35,18 @@
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.filefilter.DirectoryFileFilter;
+import org.jclouds.blobstore.LocalStorageStrategy;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.domain.BlobBuilder;
 import org.jclouds.blobstore.options.ListContainerOptions;
+import org.jclouds.crypto.Crypto;
 import org.jclouds.crypto.CryptoStreams;
+import org.jclouds.domain.Location;
 import org.jclouds.filesystem.predicates.validators.FilesystemBlobKeyValidator;
 import org.jclouds.filesystem.predicates.validators.FilesystemContainerNameValidator;
 import org.jclouds.filesystem.reference.FilesystemConstants;
-import org.jclouds.filesystem.strategy.FilesystemStorageStrategy;
 import org.jclouds.io.Payload;
+import org.jclouds.io.Payloads;
 import org.jclouds.logging.Logger;
 import org.jclouds.rest.annotations.ParamValidators;
 
@@ -55,7 +58,7 @@
  * 
  * @author Alfredo "Rainbowbreeze" Morresi
  */
-public class FilesystemStorageStrategyImpl implements FilesystemStorageStrategy {
+public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
 
    private static final String BACK_SLASH = "\\";
 
@@ -66,17 +69,20 @@
    protected final String baseDirectory;
    protected final FilesystemContainerNameValidator filesystemContainerNameValidator;
    protected final FilesystemBlobKeyValidator filesystemBlobKeyValidator;
+   private final Crypto crypto;
 
    @Inject
    protected FilesystemStorageStrategyImpl(Provider<BlobBuilder> blobBuilders,
          @Named(FilesystemConstants.PROPERTY_BASEDIR) String baseDir,
          FilesystemContainerNameValidator filesystemContainerNameValidator,
-         FilesystemBlobKeyValidator filesystemBlobKeyValidator) {
+         FilesystemBlobKeyValidator filesystemBlobKeyValidator,
+         Crypto crypto) {
       this.blobBuilders = checkNotNull(blobBuilders, "filesystem storage strategy blobBuilders");
       this.baseDirectory = checkNotNull(baseDir, "filesystem storage strategy base directory");
       this.filesystemContainerNameValidator = checkNotNull(filesystemContainerNameValidator,
             "filesystem container name validator");
       this.filesystemBlobKeyValidator = checkNotNull(filesystemBlobKeyValidator, "filesystem blob key validator");
+      this.crypto = crypto;
    }
 
    @Override
@@ -109,8 +115,14 @@
       return blob;
    }
 
-   @Override
    public boolean createContainer(String container) {
+      filesystemContainerNameValidator.validate(container);
+      return createContainerInLocation(container, null);
+   }
+
+   @Override
+   public boolean createContainerInLocation(String container, Location location) {
+      // TODO: implement location
       logger.debug("Creating container %s", container);
       filesystemContainerNameValidator.validate(container);
       return createDirectoryWithResult(container, null);
@@ -151,7 +163,6 @@
       }
    }
 
-   @Override
    public Blob newBlob(@ParamValidators({ FilesystemBlobKeyValidator.class }) String name) {
       filesystemBlobKeyValidator.validate(name);
       return blobBuilders.get().name(name).build();
@@ -195,7 +206,6 @@
     * @param blobKey
     * @return
     */
-   @Override
    public File getFileForBlobKey(String container, String blobKey) {
       filesystemContainerNameValidator.validate(container);
       filesystemBlobKeyValidator.validate(blobKey);
@@ -205,7 +215,7 @@
    }
 
    @Override
-   public void putBlob(final String containerName, final Blob blob) throws IOException {
+   public String putBlob(final String containerName, final Blob blob) throws IOException {
       String blobKey = blob.getMetadata().getName();
       Payload payload = blob.getPayload();
       filesystemContainerNameValidator.validate(containerName);
@@ -220,6 +230,9 @@
             output = new FileOutputStream(outputFile);
             payload.writeTo(output);
          }
+         Payloads.calculateMD5(payload, crypto.md5());
+         String eTag = CryptoStreams.hex(payload.getContentMetadata().getContentMD5());
+         return eTag;
       } catch (IOException ex) {
          if (outputFile != null) {
             outputFile.delete();
@@ -263,16 +276,23 @@
    }
 
    @Override
+   public Location getLocation(final String containerName) {
+      return null;
+   }
+
+   @Override
+   public String getSeparator() {
+      return File.separator;
+   }
+
    public boolean directoryExists(String container, String directory) {
       return buildPathAndChecksIfDirectoryExists(container, directory);
    }
 
-   @Override
    public void createDirectory(String container, String directory) {
       createDirectoryWithResult(container, directory);
    }
 
-   @Override
    public void deleteDirectory(String container, String directory) {
       // create complete dir path
       String fullDirPath = buildPathStartingFromBaseDir(container, directory);
@@ -284,7 +304,6 @@
       }
    }
 
-   @Override
    public long countBlobs(String container, ListContainerOptions options) {
       // TODO
       throw new UnsupportedOperationException("Not supported yet.");
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/util/internal/FileSystemBlobUtilsImpl.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/util/internal/FileSystemBlobUtilsImpl.java
index b24a54d..87ff1cd 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/util/internal/FileSystemBlobUtilsImpl.java
+++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/util/internal/FileSystemBlobUtilsImpl.java
@@ -23,27 +23,28 @@
 import javax.inject.Provider;
 
 import org.jclouds.blobstore.AsyncBlobStore;
+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.filesystem.strategy.FilesystemStorageStrategy;
+import org.jclouds.filesystem.strategy.internal.FilesystemStorageStrategyImpl;
 
 import com.google.inject.Inject;
 
 /**
  * Implements the {@link BlobUtils} interfaced and act as a bridge to
- * {@link FilesystemStorageStrategy} when used inside {@link AsyncBlobStore}
+ * {@link LocalStorageStrategy} when used inside {@link AsyncBlobStore}
  * 
  * @author Alfredo "Rainbowbreeze" Morresi
  */
 public class FileSystemBlobUtilsImpl implements BlobUtils {
 
-   protected final FilesystemStorageStrategy storageStrategy;
+   protected final FilesystemStorageStrategyImpl storageStrategy;
    protected final Provider<BlobBuilder> blobBuilders;
 
    @Inject
-   public FileSystemBlobUtilsImpl(FilesystemStorageStrategy storageStrategy, Provider<BlobBuilder> blobBuilders) {
-      this.storageStrategy = checkNotNull(storageStrategy, "Filesystem Storage Strategy");
+   public FileSystemBlobUtilsImpl(LocalStorageStrategy storageStrategy, Provider<BlobBuilder> blobBuilders) {
+      this.storageStrategy = (FilesystemStorageStrategyImpl) checkNotNull(storageStrategy, "Filesystem Storage Strategy");
       this.blobBuilders = checkNotNull(blobBuilders, "Filesystem  blobBuilders");
    }
 
diff --git a/apis/filesystem/src/test/java/org/jclouds/filesystem/FilesystemAsyncBlobStoreTest.java b/apis/filesystem/src/test/java/org/jclouds/filesystem/FilesystemAsyncBlobStoreTest.java
index aa6bbab..7eeaad5 100644
--- a/apis/filesystem/src/test/java/org/jclouds/filesystem/FilesystemAsyncBlobStoreTest.java
+++ b/apis/filesystem/src/test/java/org/jclouds/filesystem/FilesystemAsyncBlobStoreTest.java
@@ -656,7 +656,7 @@
         assertEquals(metadata.getUserMetadata().size(), 0, "Wrong blob UserMetadata");
         // metadata.getLastModified()
         File file = new File(TARGET_CONTAINER_NAME + File.separator + BLOB_KEY);
-        assertEquals(metadata.getContentMetadata().getContentLength(), new Long(file.length()), "Wrong blob size");
+        assertEquals(metadata.getContentMetadata().getContentLength(), Long.valueOf(file.length()), "Wrong blob size");
     }
 
     public void testDeleteContainer_NotExistingContainer() {
diff --git a/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java b/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java
index 69c6ce1..203cce7 100644
--- a/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java
+++ b/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java
@@ -42,7 +42,6 @@
 import org.jclouds.encryption.internal.JCECrypto;
 import org.jclouds.filesystem.predicates.validators.internal.FilesystemBlobKeyValidatorImpl;
 import org.jclouds.filesystem.predicates.validators.internal.FilesystemContainerNameValidatorImpl;
-import org.jclouds.filesystem.strategy.FilesystemStorageStrategy;
 import org.jclouds.filesystem.utils.TestUtils;
 import org.jclouds.io.payloads.FilePayload;
 import org.testng.annotations.AfterMethod;
@@ -73,7 +72,7 @@
       System.setProperty(LOGGING_CONFIG_KEY, LOGGING_CONFIG_VALUE);
    }
 
-   private FilesystemStorageStrategy storageStrategy;
+   private FilesystemStorageStrategyImpl storageStrategy;
 
    @BeforeMethod
    protected void setUp() throws Exception {
@@ -87,7 +86,7 @@
             }
          }
 
-      }, TestUtils.TARGET_BASE_DIR, new FilesystemContainerNameValidatorImpl(), new FilesystemBlobKeyValidatorImpl());
+      }, TestUtils.TARGET_BASE_DIR, new FilesystemContainerNameValidatorImpl(), new FilesystemBlobKeyValidatorImpl(), new JCECrypto());
       TestUtils.cleanDirectoryContent(TestUtils.TARGET_BASE_DIR);
    }
 
@@ -409,12 +408,12 @@
       assertEquals(fileForPayload.getAbsolutePath(), fullPath + blobKey, "Wrong file path");
    }
 
-   public void testGetFileForBlobKey_AbsolutePath() throws IOException {
+   public void testGetFileForBlobKey_AbsolutePath() throws Exception {
       String absoluteBasePath = (new File(getAbsoluteDirectory(), "basedir")).getAbsolutePath() + FS;
       String absoluteContainerPath = absoluteBasePath + CONTAINER_NAME + FS;
 
       // create storageStrategy with an absolute path
-      FilesystemStorageStrategy storageStrategyAbsolute = new FilesystemStorageStrategyImpl(
+      FilesystemStorageStrategyImpl storageStrategyAbsolute = new FilesystemStorageStrategyImpl(
                new Provider<BlobBuilder>() {
                   @Override
                   public BlobBuilder get() {
@@ -424,7 +423,7 @@
                         return null;
                      }
                   }
-               }, absoluteBasePath, new FilesystemContainerNameValidatorImpl(), new FilesystemBlobKeyValidatorImpl());
+               }, absoluteBasePath, new FilesystemContainerNameValidatorImpl(), new FilesystemBlobKeyValidatorImpl(), new JCECrypto());
       TestUtils.cleanDirectoryContent(absoluteContainerPath);
 
       String blobKey;
diff --git a/apis/nova/src/main/java/org/jclouds/openstack/nova/handlers/ParseNovaErrorFromHttpResponse.java b/apis/nova/src/main/java/org/jclouds/openstack/nova/handlers/ParseNovaErrorFromHttpResponse.java
index 8f3d083..496d832 100644
--- a/apis/nova/src/main/java/org/jclouds/openstack/nova/handlers/ParseNovaErrorFromHttpResponse.java
+++ b/apis/nova/src/main/java/org/jclouds/openstack/nova/handlers/ParseNovaErrorFromHttpResponse.java
@@ -85,7 +85,7 @@
    String parseErrorFromContentOrNull(HttpCommand command, HttpResponse response) {
       if (response.getPayload() != null) {
          try {
-            return Strings2.toStringAndClose(response.getPayload().getInput());
+            return Strings2.toString(response.getPayload());
          } catch (IOException e) {
             logger.warn(e, "exception reading error from response", response);
          }
diff --git a/apis/nova/src/test/java/org/jclouds/openstack/nova/NovaClientLiveTest.java b/apis/nova/src/test/java/org/jclouds/openstack/nova/NovaClientLiveTest.java
index 397ee7e..bde2f87 100644
--- a/apis/nova/src/test/java/org/jclouds/openstack/nova/NovaClientLiveTest.java
+++ b/apis/nova/src/test/java/org/jclouds/openstack/nova/NovaClientLiveTest.java
@@ -264,8 +264,8 @@
       assertNotNull(server.getHostId());
       assertEquals(server.getStatus(), ServerStatus.ACTIVE);
       assert server.getProgress() >= 0 : "newDetails.getProgress()" + server.getProgress();
-      assertEquals(new Integer(14362), server.getImage());
-      assertEquals(new Integer(1), server.getFlavor());
+      assertEquals(Integer.valueOf(14362), server.getImage());
+      assertEquals(Integer.valueOf(1), server.getFlavor());
       assertNotNull(server.getAddresses());
       // listAddresses tests..
       assertEquals(client.getAddresses(serverId), server.getAddresses());
@@ -303,7 +303,7 @@
       try {
          client.connect();
          Payload etcPasswd = client.get("/etc/jclouds.txt");
-         String etcPasswdContents = Strings2.toStringAndClose(etcPasswd.getInput());
+         String etcPasswdContents = Strings2.toString(etcPasswd);
          assertEquals("nova", etcPasswdContents.trim());
       } finally {
          if (client != null)
@@ -332,7 +332,7 @@
    public void testCreateImage() throws Exception {
       Image image = client.createImageFromServer("hoofie", serverId);
       assertEquals("hoofie", image.getName());
-      assertEquals(new Integer(serverId), image.getServerRef());
+      assertEquals(Integer.valueOf(serverId), image.getServerRef());
       createdImageRef = image.getId()+"";
       blockUntilImageActive(createdImageRef);
    }
@@ -341,7 +341,7 @@
    public void testRebuildServer() throws Exception {
       client.rebuildServer(serverId, new RebuildServerOptions().withImage(createdImageRef));
       blockUntilServerActive(serverId);
-      assertEquals(new Integer(createdImageRef).intValue(),client.getServer(serverId).getImage().getId());
+      assertEquals(Integer.valueOf(createdImageRef).intValue(),client.getServer(serverId).getImage().getId());
    }
 
    @Test(timeOut = 10 * 60 * 1000, dependsOnMethods = "testRebuildServer")
@@ -362,7 +362,7 @@
       blockUntilServerVerifyResize(serverId);
       client.revertResizeServer(serverId);
       blockUntilServerActive(serverId);
-      assertEquals(new Integer(1), client.getServer(serverId).getFlavorRef());
+      assertEquals(Integer.valueOf(1), client.getServer(serverId).getFlavorRef());
    }
 
    @Test(timeOut = 10 * 60 * 1000, dependsOnMethods = "testRebootSoft")
@@ -371,7 +371,7 @@
       blockUntilServerVerifyResize(serverId2);
       client.confirmResizeServer(serverId2);
       blockUntilServerActive(serverId2);
-      assertEquals(new Integer(2), client.getServer(serverId2).getFlavorRef());
+      assertEquals(Integer.valueOf(2), client.getServer(serverId2).getFlavorRef());
    }
 
    @Test(timeOut = 10 * 60 * 1000, dependsOnMethods = { "testRebootSoft", "testRevertResize", "testConfirmResize" })
diff --git a/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseImageFromJsonResponseTest.java b/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseImageFromJsonResponseTest.java
index 90db416..b127379 100644
--- a/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseImageFromJsonResponseTest.java
+++ b/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseImageFromJsonResponseTest.java
@@ -64,7 +64,7 @@
       assertEquals(response.getId(), 2);
       assertEquals(response.getName(), "CentOS 5.2");
       assertEquals(response.getCreated(), dateService.iso8601SecondsDateParse("2010-08-10T12:00:00Z"));
-      assertEquals(response.getProgress(), new Integer(80));
+      assertEquals(response.getProgress(), Integer.valueOf(80));
       assertEquals(response.getStatus(), ImageStatus.SAVING);
       assertEquals(response.getUpdated(), dateService.iso8601SecondsDateParse(("2010-10-10T12:00:00Z")));
       assertEquals(response.getServerRef(), "http://servers.api.openstack.org/v1.1/1234/servers/12");
diff --git a/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseImageListFromJsonResponseTest.java b/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseImageListFromJsonResponseTest.java
index 5da9c57..95233c2 100644
--- a/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseImageListFromJsonResponseTest.java
+++ b/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseImageListFromJsonResponseTest.java
@@ -96,7 +96,7 @@
       assertEquals(response.get(1).getName(), "My Server Backup");
       assertEquals(response.get(1).getCreated(), dateService.iso8601SecondsDateParse("2009-07-07T09:56:16Z"));
 
-      assertEquals(response.get(1).getProgress(), new Integer(80));
+      assertEquals(response.get(1).getProgress(), Integer.valueOf(80));
       assertEquals(response.get(1).getStatus(), ImageStatus.SAVING);
       assertEquals(response.get(1).getUpdated(), dateService.iso8601SecondsDateParse("2010-10-10T12:00:00Z"));
       assertEquals(response.get(1).getServerRef(), "http://servers.api.openstack.org/v1.1/1234/servers/12");
diff --git a/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerFromJsonResponseDiabloTest.java b/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerFromJsonResponseDiabloTest.java
index 2d94c79..baf95cc 100644
--- a/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerFromJsonResponseDiabloTest.java
+++ b/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerFromJsonResponseDiabloTest.java
@@ -64,7 +64,7 @@
       assertEquals(response.getFlavor().getURI(), new URI("http://servers.api.openstack.org/1234/flavors/1"));
       assertEquals(response.getHostId(), "e4d909c290d0fb1ca068ffaddf22cbd0");
       assertEquals(response.getStatus(), ServerStatus.BUILD);
-      assertEquals(response.getProgress(), new Integer(60));
+      assertEquals(response.getProgress(), Integer.valueOf(60));
       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
       dateFormat.setTimeZone(new SimpleTimeZone(0, "GMT"));
       assertEquals(response.getCreated(), dateFormat.parse("2010-08-10T12:00:00Z"));
diff --git a/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerFromJsonResponseTest.java b/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerFromJsonResponseTest.java
index 6f282f8..3821b23 100644
--- a/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerFromJsonResponseTest.java
+++ b/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerFromJsonResponseTest.java
@@ -65,7 +65,7 @@
       assertEquals(response.getFlavorRef(), "http://servers.api.openstack.org/1234/flavors/1");
       assertEquals(response.getHostId(), "e4d909c290d0fb1ca068ffaddf22cbd0");
       assertEquals(response.getStatus(), ServerStatus.BUILD);
-      assertEquals(response.getProgress(), new Integer(60));
+      assertEquals(response.getProgress(), Integer.valueOf(60));
       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
       dateFormat.setTimeZone(new SimpleTimeZone(0, "GMT"));
       assertEquals(response.getCreated(), dateFormat.parse("2010-08-10T12:00:00Z"));
diff --git a/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerListFromJsonResponseTest.java b/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerListFromJsonResponseTest.java
index d5f45c0..e9f255b 100644
--- a/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerListFromJsonResponseTest.java
+++ b/apis/nova/src/test/java/org/jclouds/openstack/nova/functions/ParseServerListFromJsonResponseTest.java
@@ -88,7 +88,7 @@
       assertEquals(response.get(0).getHostId(), "e4d909c290d0fb1ca068ffaddf22cbd0");
       assertEquals(response.get(0).getUuid(), "d84e2086-fc0d-11e0-8e08-2837371c69ae");
       assertEquals(response.get(0).getStatus(), ServerStatus.BUILD);
-      assertEquals(response.get(0).getProgress(), new Integer(60));
+      assertEquals(response.get(0).getProgress(), Integer.valueOf(60));
 
       List<Address> publicAddresses = ImmutableList.copyOf(Iterables.transform(
                ImmutableList.of("67.23.10.132", "::babe:67.23.10.132", "67.23.10.131", "::babe:4317:0A83"),
diff --git a/apis/s3/src/main/java/org/jclouds/s3/options/ListBucketOptions.java b/apis/s3/src/main/java/org/jclouds/s3/options/ListBucketOptions.java
index d7da77c..53f48c7 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/options/ListBucketOptions.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/options/ListBucketOptions.java
@@ -85,7 +85,7 @@
 
    public Integer getMaxResults() {
       String returnVal = getFirstQueryOrNull("max-keys");
-      return (returnVal != null) ? new Integer(returnVal) : null;
+      return (returnVal != null) ? Integer.valueOf(returnVal) : null;
    }
 
    /**
diff --git a/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java b/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java
index 95e8eef..ef902bd 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java
@@ -104,7 +104,7 @@
          builder.eTag(currentETag);
          builder.contentMD5(CryptoStreams.hex(Strings2.replaceAll(currentETag, '"', "")));
       } else if (qName.equals("Size")) {
-         builder.contentLength(new Long(currentOrNull(currentText)));
+         builder.contentLength(Long.valueOf(currentOrNull(currentText)));
       } else if (qName.equals("Owner")) {
          builder.owner(currentOwner);
          currentOwner = null;
diff --git a/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java b/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
index 774871e..b06413e 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
@@ -284,7 +284,7 @@
       assertConsistencyAwareContainerSize(sourceContainer, 1);
       S3Object newObject = getApi().getObject(sourceContainer, key);
       assert newObject != null;
-      assertEquals(Strings2.toStringAndClose(newObject.getPayload().getInput()), TEST_STRING);
+      assertEquals(Strings2.toString(newObject.getPayload()), TEST_STRING);
       return newObject;
    }
 
diff --git a/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java b/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java
index 1f80a5e..85a5952 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java
@@ -37,12 +37,13 @@
 import org.jclouds.aws.domain.Region;
 import org.jclouds.blobstore.AsyncBlobStore;
 import org.jclouds.blobstore.KeyNotFoundException;
-import org.jclouds.blobstore.TransientAsyncBlobStore;
+import org.jclouds.blobstore.LocalAsyncBlobStore;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.domain.BlobMetadata;
 import org.jclouds.blobstore.domain.MutableBlobMetadata;
 import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions;
 import org.jclouds.blobstore.options.ListContainerOptions;
+import org.jclouds.blobstore.util.BlobStoreUtils;
 import org.jclouds.concurrent.Futures;
 import org.jclouds.date.DateService;
 import org.jclouds.domain.Location;
@@ -102,7 +103,7 @@
 
    @Inject
    private StubS3AsyncClient(@Named(Constants.PROPERTY_USER_THREADS) ExecutorService service,
-            TransientAsyncBlobStore blobStore, ConcurrentMap<String, ConcurrentMap<String, Blob>> containerToBlobs,
+            LocalAsyncBlobStore blobStore, ConcurrentMap<String, ConcurrentMap<String, Blob>> containerToBlobs,
             ConcurrentMap<String, Location> containerToLocation, DateService dateService,
             S3Object.Factory objectProvider, Blob.Factory blobProvider,
             HttpGetOptionsListToGetOptions httpGetOptionsConverter, ObjectToBlob object2Blob, BlobToObject blob2Object,
@@ -157,25 +158,25 @@
          Blob object = source.get(sourceObject);
          if (options.getIfMatch() != null) {
             if (!object.getMetadata().getETag().equals(options.getIfMatch()))
-               return immediateFailedFuture(TransientAsyncBlobStore.returnResponseException(412));
+               return immediateFailedFuture(LocalAsyncBlobStore.returnResponseException(412));
          }
          if (options.getIfNoneMatch() != null) {
             if (object.getMetadata().getETag().equals(options.getIfNoneMatch()))
-               return immediateFailedFuture(TransientAsyncBlobStore.returnResponseException(412));
+               return immediateFailedFuture(LocalAsyncBlobStore.returnResponseException(412));
          }
          if (options.getIfModifiedSince() != null) {
             Date modifiedSince = dateService.rfc822DateParse(options.getIfModifiedSince());
             if (modifiedSince.after(object.getMetadata().getLastModified()))
-               return immediateFailedFuture(TransientAsyncBlobStore.returnResponseException(412));
+               return immediateFailedFuture(LocalAsyncBlobStore.returnResponseException(412));
 
          }
          if (options.getIfUnmodifiedSince() != null) {
             Date unmodifiedSince = dateService.rfc822DateParse(options.getIfUnmodifiedSince());
             if (unmodifiedSince.before(object.getMetadata().getLastModified()))
-               return immediateFailedFuture(TransientAsyncBlobStore.returnResponseException(412));
+               return immediateFailedFuture(LocalAsyncBlobStore.returnResponseException(412));
          }
          Blob sourceS3 = source.get(sourceObject);
-         MutableBlobMetadata newMd = TransientAsyncBlobStore.copy(sourceS3.getMetadata(), destinationObject);
+         MutableBlobMetadata newMd = BlobStoreUtils.copy(sourceS3.getMetadata(), destinationObject);
          if (options.getAcl() != null)
             keyToAcl.put(destinationBucket + "/" + destinationObject, options.getAcl());
 
@@ -183,7 +184,7 @@
          Blob newBlob = blobProvider.create(newMd);
          newBlob.setPayload(sourceS3.getPayload());
          dest.put(destinationObject, newBlob);
-         return immediateFuture((ObjectMetadata) blob2ObjectMetadata.apply(TransientAsyncBlobStore.copy(newMd)));
+         return immediateFuture((ObjectMetadata) blob2ObjectMetadata.apply(BlobStoreUtils.copy(newMd)));
       }
       return immediateFailedFuture(new KeyNotFoundException(sourceBucket, sourceObject, sourceBucket + "/"
                + sourceObject));
diff --git a/apis/swift/src/main/java/org/jclouds/openstack/swift/blobstore/strategy/internal/ParallelMultipartUploadStrategy.java b/apis/swift/src/main/java/org/jclouds/openstack/swift/blobstore/strategy/internal/ParallelMultipartUploadStrategy.java
index 12481c2..f546f4d 100644
--- a/apis/swift/src/main/java/org/jclouds/openstack/swift/blobstore/strategy/internal/ParallelMultipartUploadStrategy.java
+++ b/apis/swift/src/main/java/org/jclouds/openstack/swift/blobstore/strategy/internal/ParallelMultipartUploadStrategy.java
@@ -164,7 +164,7 @@
                                 CountDownLatch latch = new CountDownLatch(effectiveParts);
                                 int part;
                                 while ((part = algorithm.getNextPart()) <= parts) {
-                                    Integer partKey = new Integer(part);
+                                    Integer partKey = Integer.valueOf(part);
                                     activeParts.put(partKey);
 
                                     prepareUploadPart(container, blob, key, partKey, payload,
@@ -173,7 +173,7 @@
                                             blob2Object);
                                 }
                                 if (remaining > 0) {
-                                    Integer partKey = new Integer(part);
+                                    Integer partKey = Integer.valueOf(part);
                                     activeParts.put(partKey);
                                     prepareUploadPart(container, blob, key, partKey, payload,
                                             algorithm.getNextChunkOffset(), remaining, etags,
@@ -187,7 +187,7 @@
                                     CountDownLatch retryLatch = new CountDownLatch(atOnce);
                                     for (int i = 0; i < atOnce; i++) {
                                         Part failedPart = toRetry.poll();
-                                        Integer partKey = new Integer(failedPart.getPart());
+                                        Integer partKey = Integer.valueOf(failedPart.getPart());
                                         activeParts.put(partKey);
                                         prepareUploadPart(container, blob, key, partKey, payload,
                                                 failedPart.getOffset(), failedPart.getSize(), etags,
diff --git a/apis/swift/src/main/java/org/jclouds/openstack/swift/options/ListContainerOptions.java b/apis/swift/src/main/java/org/jclouds/openstack/swift/options/ListContainerOptions.java
index 28f88a5..c6dfd07 100644
--- a/apis/swift/src/main/java/org/jclouds/openstack/swift/options/ListContainerOptions.java
+++ b/apis/swift/src/main/java/org/jclouds/openstack/swift/options/ListContainerOptions.java
@@ -57,7 +57,7 @@
 
    public int getMaxResults() {
       String val = getFirstQueryOrNull("limit");
-      return val != null ? new Integer(val) : 10000;
+      return val != null ? Integer.valueOf(val) : 10000;
    }
 
    /**
diff --git a/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientLiveTest.java b/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientLiveTest.java
index fb11ec3..504b833 100644
--- a/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientLiveTest.java
+++ b/apis/swift/src/test/java/org/jclouds/openstack/swift/CommonSwiftClientLiveTest.java
@@ -204,7 +204,7 @@
          MutableObjectInfoWithMetadata metadata = getApi().getObjectInfo(containerName, object.getInfo().getName());
          assertEquals(metadata.getName(), object.getInfo().getName());
 
-         assertEquals(metadata.getBytes(), new Long(data.length()));
+         assertEquals(metadata.getBytes(), Long.valueOf(data.length()));
          assert metadata.getContentType().startsWith("text/plain") : metadata.getContentType();
 
          assertEquals(CryptoStreams.hex(md5), CryptoStreams.hex(metadata.getHash()));
@@ -222,10 +222,10 @@
          assert getApi().getObject(containerName, "non-existent-object") == null;
          // Test GET of object (including updated metadata)
          SwiftObject getBlob = getApi().getObject(containerName, object.getInfo().getName());
-         assertEquals(Strings2.toStringAndClose(getBlob.getPayload().getInput()), data);
+         assertEquals(Strings2.toString(getBlob.getPayload()), data);
          // TODO assertEquals(getBlob.getName(),
          // object.getMetadata().getName());
-         assertEquals(getBlob.getInfo().getBytes(), new Long(data.length()));
+         assertEquals(getBlob.getInfo().getBytes(), Long.valueOf(data.length()));
          testGetObjectContentType(getBlob);
          assertEquals(CryptoStreams.hex(md5), CryptoStreams.hex(getBlob.getInfo().getHash()));
          assertEquals(CryptoStreams.hex(newEtag), getBlob.getInfo().getHash());
@@ -267,7 +267,7 @@
                   GetOptions.Builder.ifETagMatches(newEtag));
          assertEquals(getBlob.getInfo().getHash(), CryptoStreams.hex(newEtag));
          getBlob = getApi().getObject(containerName, object.getInfo().getName(), GetOptions.Builder.startAt(8));
-         assertEquals(Strings2.toStringAndClose(getBlob.getPayload().getInput()), data.substring(8));
+         assertEquals(Strings2.toString(getBlob.getPayload()), data.substring(8));
 
       } finally {
          returnContainer(containerName);
diff --git a/apis/swift/src/test/java/org/jclouds/openstack/swift/internal/StubSwiftAsyncClient.java b/apis/swift/src/test/java/org/jclouds/openstack/swift/internal/StubSwiftAsyncClient.java
index 00a889a..354ffee 100644
--- a/apis/swift/src/test/java/org/jclouds/openstack/swift/internal/StubSwiftAsyncClient.java
+++ b/apis/swift/src/test/java/org/jclouds/openstack/swift/internal/StubSwiftAsyncClient.java
@@ -33,7 +33,7 @@
 import javax.inject.Singleton;
 
 import org.jclouds.Constants;
-import org.jclouds.blobstore.TransientAsyncBlobStore;
+import org.jclouds.blobstore.LocalAsyncBlobStore;
 import org.jclouds.blobstore.domain.BlobMetadata;
 import org.jclouds.blobstore.domain.PageSet;
 import org.jclouds.blobstore.domain.StorageMetadata;
@@ -68,7 +68,7 @@
 @Singleton
 public class StubSwiftAsyncClient implements CommonSwiftAsyncClient {
    private final HttpGetOptionsListToGetOptions httpGetOptionsConverter;
-   private final TransientAsyncBlobStore blobStore;
+   private final LocalAsyncBlobStore blobStore;
    private final SwiftObject.Factory objectProvider;
    private final ObjectToBlob object2Blob;
    private final BlobToObject blob2Object;
@@ -79,7 +79,7 @@
 
    @Inject
    private StubSwiftAsyncClient(@Named(Constants.PROPERTY_USER_THREADS) ExecutorService service,
-            TransientAsyncBlobStore blobStore,
+            LocalAsyncBlobStore blobStore,
             SwiftObject.Factory objectProvider, HttpGetOptionsListToGetOptions httpGetOptionsConverter,
             ObjectToBlob object2Blob, BlobToObject blob2Object, ResourceToObjectInfo blob2ObjectInfo,
             ListContainerOptionsToBlobStoreListContainerOptions container2ContainerListOptions,
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java
index de290b8..7fb5498 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java
@@ -28,7 +28,7 @@
 import org.jclouds.vcloud.features.VAppTemplateAsyncClient;
 import org.jclouds.vcloud.features.VDCAsyncClient;
 import org.jclouds.vcloud.features.VmAsyncClient;
-import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 /**
  * Provides access to VCloud resources via their REST API.
@@ -38,7 +38,7 @@
  *      />
  * @author Adrian Cole
  */
-@RequestFilters(SetVCloudTokenCookie.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VCloudAsyncClient {
 
    /**
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogAsyncClient.java
index dc1bf0d..0f4b233 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogAsyncClient.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogAsyncClient.java
@@ -42,7 +42,7 @@
 import org.jclouds.vcloud.binders.BindCatalogItemToXmlPayload;
 import org.jclouds.vcloud.domain.Catalog;
 import org.jclouds.vcloud.domain.CatalogItem;
-import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.functions.OrgNameAndCatalogNameToEndpoint;
 import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint;
 import org.jclouds.vcloud.options.CatalogItemOptions;
@@ -57,7 +57,7 @@
  * 
  * @author Adrian Cole
  */
-@RequestFilters(SetVCloudTokenCookie.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface CatalogAsyncClient {
 
    /**
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/NetworkAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/NetworkAsyncClient.java
index 9834f50..e57c1a8 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/NetworkAsyncClient.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/NetworkAsyncClient.java
@@ -32,7 +32,7 @@
 import org.jclouds.rest.annotations.XMLResponseParser;
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.vcloud.domain.network.OrgNetwork;
-import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint;
 import org.jclouds.vcloud.xml.OrgNetworkHandler;
 
@@ -44,7 +44,7 @@
  * 
  * @author Adrian Cole
  */
-@RequestFilters(SetVCloudTokenCookie.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface NetworkAsyncClient {
 
    /**
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/OrgAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/OrgAsyncClient.java
index 688b322..792dc73 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/OrgAsyncClient.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/OrgAsyncClient.java
@@ -37,7 +37,7 @@
 import org.jclouds.vcloud.domain.Org;
 import org.jclouds.vcloud.domain.ReferenceType;
 import org.jclouds.vcloud.endpoints.OrgList;
-import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.functions.OrgNameToEndpoint;
 import org.jclouds.vcloud.xml.OrgHandler;
 import org.jclouds.vcloud.xml.OrgListHandler;
@@ -50,7 +50,7 @@
  * 
  * @author Adrian Cole
  */
-@RequestFilters(SetVCloudTokenCookie.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface OrgAsyncClient {
 
    /**
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/TaskAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/TaskAsyncClient.java
index 3b2d0e5..dbbf5dd 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/TaskAsyncClient.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/TaskAsyncClient.java
@@ -36,7 +36,7 @@
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.vcloud.domain.Task;
 import org.jclouds.vcloud.domain.TasksList;
-import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.functions.OrgNameToTasksListEndpoint;
 import org.jclouds.vcloud.xml.TaskHandler;
 import org.jclouds.vcloud.xml.TasksListHandler;
@@ -49,7 +49,7 @@
  * 
  * @author Adrian Cole
  */
-@RequestFilters(SetVCloudTokenCookie.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface TaskAsyncClient {
 
    /**
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppAsyncClient.java
index fa35cad..523cb8c 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppAsyncClient.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppAsyncClient.java
@@ -49,7 +49,7 @@
 import org.jclouds.vcloud.binders.BindUndeployVAppParamsToXmlPayload;
 import org.jclouds.vcloud.domain.Task;
 import org.jclouds.vcloud.domain.VApp;
-import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint;
 import org.jclouds.vcloud.options.CloneVAppOptions;
 import org.jclouds.vcloud.xml.TaskHandler;
@@ -63,7 +63,7 @@
  * 
  * @author Adrian Cole
  */
-@RequestFilters(SetVCloudTokenCookie.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VAppAsyncClient {
 
    /**
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppTemplateAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppTemplateAsyncClient.java
index 664952e..5859888 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppTemplateAsyncClient.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppTemplateAsyncClient.java
@@ -52,7 +52,7 @@
 import org.jclouds.vcloud.domain.Task;
 import org.jclouds.vcloud.domain.VApp;
 import org.jclouds.vcloud.domain.VAppTemplate;
-import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.functions.OrgNameCatalogNameVAppTemplateNameToEndpoint;
 import org.jclouds.vcloud.options.CaptureVAppOptions;
 import org.jclouds.vcloud.options.CloneVAppTemplateOptions;
@@ -69,7 +69,7 @@
  * 
  * @author Adrian Cole
  */
-@RequestFilters(SetVCloudTokenCookie.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VAppTemplateAsyncClient {
 
    /**
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VDCAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VDCAsyncClient.java
index f2228d8..365455b 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VDCAsyncClient.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VDCAsyncClient.java
@@ -32,7 +32,7 @@
 import org.jclouds.rest.annotations.XMLResponseParser;
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.vcloud.domain.VDC;
-import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint;
 import org.jclouds.vcloud.xml.VDCHandler;
 
@@ -44,7 +44,7 @@
  * 
  * @author Adrian Cole
  */
-@RequestFilters(SetVCloudTokenCookie.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VDCAsyncClient {
 
    /**
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VmAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VmAsyncClient.java
index 9227a69..2239ac8 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VmAsyncClient.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VmAsyncClient.java
@@ -54,7 +54,7 @@
 import org.jclouds.vcloud.domain.NetworkConnectionSection;
 import org.jclouds.vcloud.domain.Task;
 import org.jclouds.vcloud.domain.Vm;
-import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.xml.TaskHandler;
 import org.jclouds.vcloud.xml.VmHandler;
 
@@ -66,7 +66,7 @@
  * 
  * @author Adrian Cole
  */
-@RequestFilters(SetVCloudTokenCookie.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VmAsyncClient {
 
    /**
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/filters/SetVCloudTokenCookie.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/filters/AddVCloudAuthorizationAndCookieToRequest.java
similarity index 72%
rename from apis/vcloud/src/main/java/org/jclouds/vcloud/filters/SetVCloudTokenCookie.java
rename to apis/vcloud/src/main/java/org/jclouds/vcloud/filters/AddVCloudAuthorizationAndCookieToRequest.java
index 18dd5cb..aa4380e 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/filters/SetVCloudTokenCookie.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/filters/AddVCloudAuthorizationAndCookieToRequest.java
@@ -28,6 +28,7 @@
 import org.jclouds.vcloud.VCloudToken;
 
 import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMultimap;
 
 /**
  * Adds the VCloud Token to the request as a cookie
@@ -36,17 +37,21 @@
  * 
  */
 @Singleton
-public class SetVCloudTokenCookie implements HttpRequestFilter {
+public class AddVCloudAuthorizationAndCookieToRequest implements HttpRequestFilter {
    private Supplier<String> vcloudTokenProvider;
 
    @Inject
-   public SetVCloudTokenCookie(@VCloudToken Supplier<String> authTokenProvider) {
+   public AddVCloudAuthorizationAndCookieToRequest(@VCloudToken Supplier<String> authTokenProvider) {
       this.vcloudTokenProvider = authTokenProvider;
    }
 
    @Override
    public HttpRequest filter(HttpRequest request) throws HttpException {
-      return request.toBuilder().replaceHeader(HttpHeaders.COOKIE, "vcloud-token=" + vcloudTokenProvider.get()).build();
+      String token = vcloudTokenProvider.get();
+      return request
+               .toBuilder()
+               .replaceHeaders(
+                        ImmutableMultimap.of("x-vcloud-authorization", token, HttpHeaders.COOKIE, "vcloud-token="
+                                 + token)).build();
    }
-
 }
\ No newline at end of file
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/handlers/ParseVCloudErrorFromHttpResponse.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/handlers/ParseVCloudErrorFromHttpResponse.java
index d67e911..3f20649 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/handlers/ParseVCloudErrorFromHttpResponse.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/handlers/ParseVCloudErrorFromHttpResponse.java
@@ -73,7 +73,7 @@
                   message = error.getMessage();
                   exception = new VCloudResponseException(command, response, error);
                } else {
-                  message = Strings2.toStringAndClose(response.getPayload().getInput());
+                  message = Strings2.toString(response.getPayload());
                   exception = message != null ? new HttpResponseException(command, response, message) : exception;
                }
             } catch (IOException e) {
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/xml/NetworkConnectionSectionHandler.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/xml/NetworkConnectionSectionHandler.java
index a4601c8..487fd87 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/xml/NetworkConnectionSectionHandler.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/xml/NetworkConnectionSectionHandler.java
@@ -85,7 +85,7 @@
       } else if (qName.endsWith("Info")) {
          this.info = currentOrNull();
       } else if (qName.endsWith("PrimaryNetworkConnectionIndex")) {
-         this.primaryNetworkConnectionIndex = new Integer(currentOrNull());
+         this.primaryNetworkConnectionIndex = Integer.valueOf(currentOrNull());
       }
       currentText = new StringBuilder();
    }
diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/BaseVCloudComputeServiceExpectTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/BaseVCloudComputeServiceExpectTest.java
index 73ac7b9..142bdec 100644
--- a/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/BaseVCloudComputeServiceExpectTest.java
+++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/BaseVCloudComputeServiceExpectTest.java
@@ -32,7 +32,6 @@
 import org.jclouds.vcloud.VCloudMediaType;
 
 import com.google.common.base.Function;
-import com.google.common.collect.ImmutableMultimap;
 import com.google.common.net.HttpHeaders;
 import com.google.inject.Module;
 
@@ -52,11 +51,9 @@
             .build();
 
    // initial auth is using basic
-   protected HttpRequest version1_0LoginRequest = HttpRequest.builder().method("POST").endpoint(
-            URI.create(ENDPOINT + "/v1.0/login"))
-            .headers(ImmutableMultimap.<String, String> builder()
-            .put(HttpHeaders.ACCEPT, VCloudMediaType.ORGLIST_XML)
-            .put(HttpHeaders.AUTHORIZATION, "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build()).build();
+   protected HttpRequest version1_0LoginRequest = HttpRequest.builder().method("POST").endpoint(ENDPOINT + "/v1.0/login")
+            .addHeader(HttpHeaders.ACCEPT, VCloudMediaType.ORGLIST_XML)
+            .addHeader(HttpHeaders.AUTHORIZATION, "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==").build();
 
    protected String sessionToken = "AtatAgvJMrwOc9pDQq4RRCRLazThpnTKJDxSVH9oB2I=";
    
@@ -64,18 +61,16 @@
    // NOTE: vCloud Director 1.5 returns ;version=1.0 on responses to requests made in 1.0 format.
    protected HttpResponse successfulVersion1_0LoginResponseFromVCD1_5WithSingleOrg = HttpResponse.builder().statusCode(200)
             .message("HTTP/1.1 200 OK").payload(payloadFromResourceWithContentType("/orgList1.0-vcd15.xml",  VCloudMediaType.ORGLIST_XML +";version=1.0"))
-            .headers(ImmutableMultimap.<String, String> builder()
-            .put("x-vcloud-authorization", sessionToken)
-            .put(HttpHeaders.SET_COOKIE, String.format("vcloud-token=%s; Secure; Path=/", sessionToken)).build()).build();
+            .addHeader("x-vcloud-authorization", sessionToken)
+            .addHeader(HttpHeaders.SET_COOKIE, String.format("vcloud-token=%s; Secure; Path=/", sessionToken)).build();
 
    // objects are looked up by id and the format of the id is hex-hyphen
    protected String orgId = "c076f90a-397a-49fa-89b8-b294c1599cd0";
    
-   protected HttpRequest version1_0GetOrgRequest = HttpRequest.builder().method("GET").endpoint(
-            URI.create(ENDPOINT + "/v1.0/org/" + orgId))
-            .headers(ImmutableMultimap.<String, String> builder()
-            .put(HttpHeaders.ACCEPT, VCloudMediaType.ORG_XML)
-            .put(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build()).build();
+   protected HttpRequest version1_0GetOrgRequest = HttpRequest.builder().method("GET").endpoint(ENDPOINT + "/v1.0/org/" + orgId)
+            .addHeader(HttpHeaders.ACCEPT, VCloudMediaType.ORG_XML)
+            .addHeader("x-vcloud-authorization", sessionToken)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build();
    
    protected HttpResponse successfulVersion1_0GetOrgResponseFromVCD1_5WithSingleTasksListVDCAndNetwork = HttpResponse.builder().statusCode(200)
             .message("HTTP/1.1 200 OK").payload(payloadFromResourceWithContentType("/org1.0-vcd15.xml",  VCloudMediaType.ORG_XML +";version=1.0"))
@@ -84,11 +79,10 @@
    protected String catalogId = "3155f393-1e1d-4572-8c9c-d76f72ddb658";
    protected String vdcId = "e9cd3387-ac57-4d27-a481-9bee75e0690f";
 
-   protected HttpRequest version1_0GetCatalogRequest = HttpRequest.builder().method("GET").endpoint(
-            URI.create(ENDPOINT + "/v1.0/catalog/" + catalogId))
-            .headers(ImmutableMultimap.<String, String> builder()
-            .put(HttpHeaders.ACCEPT, VCloudMediaType.CATALOG_XML)
-            .put(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build()).build();
+   protected HttpRequest version1_0GetCatalogRequest = HttpRequest.builder().method("GET").endpoint(ENDPOINT + "/v1.0/catalog/" + catalogId)
+            .addHeader(HttpHeaders.ACCEPT, VCloudMediaType.CATALOG_XML)
+            .addHeader("x-vcloud-authorization", sessionToken)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build();
    
    protected HttpResponse successfulVersion1_0GetCatalogResponseFromVCD1_5WithSingleTemplate = HttpResponse.builder().statusCode(200)
             .message("HTTP/1.1 200 OK").payload(payloadFromResourceWithContentType("/catalog1.0-vcd15.xml",  VCloudMediaType.CATALOG_XML +";version=1.0"))
@@ -96,11 +90,10 @@
    
    protected String catalogItemId = "ceb369f7-1d07-4e32-9dbd-ebb5aa6ca55c";
    
-   protected HttpRequest version1_0GetCatalogItemRequest = HttpRequest.builder().method("GET").endpoint(
-            URI.create(ENDPOINT + "/v1.0/catalogItem/" + catalogItemId))
-            .headers(ImmutableMultimap.<String, String> builder()
-            .put(HttpHeaders.ACCEPT, VCloudMediaType.CATALOGITEM_XML)
-            .put(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build()).build();
+   protected HttpRequest version1_0GetCatalogItemRequest = HttpRequest.builder().method("GET").endpoint(ENDPOINT + "/v1.0/catalogItem/" + catalogItemId)
+            .addHeader(HttpHeaders.ACCEPT, VCloudMediaType.CATALOGITEM_XML)
+            .addHeader("x-vcloud-authorization", sessionToken)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build();
    
    protected HttpResponse successfulVersion1_0GetCatalogItemResponseFromVCD1_5ForTemplate = HttpResponse.builder().statusCode(200)
             .message("HTTP/1.1 200 OK").payload(payloadFromResourceWithContentType("/catalogItem1.0-vcd15.xml",  VCloudMediaType.CATALOGITEM_XML +";version=1.0"))
@@ -109,23 +102,21 @@
    // note vAppTemplate has a prefix in its id
    protected String templateId = "vappTemplate-51891b97-c5dd-47dc-a687-aabae354f728";
 
-   protected HttpRequest version1_0GetVDCRequest = HttpRequest.builder().method("GET").endpoint(
-            URI.create(ENDPOINT + "/v1.0/vdc/" + vdcId))
-            .headers(ImmutableMultimap.<String, String> builder()
-            .put(HttpHeaders.ACCEPT, VCloudMediaType.VDC_XML)
-            .put(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build()).build();
-   
+   protected HttpRequest version1_0GetVDCRequest = HttpRequest.builder().method("GET").endpoint(ENDPOINT + "/v1.0/vdc/" + vdcId)
+            .addHeader(HttpHeaders.ACCEPT, VCloudMediaType.VDC_XML)
+            .addHeader("x-vcloud-authorization", sessionToken)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build();
+            
    protected HttpResponse successfulVersion1_0GetVDCResponseFromVCD1_5WithSingleTemplateAndNetwork = HttpResponse.builder().statusCode(200)
             .message("HTTP/1.1 200 OK").payload(payloadFromResourceWithContentType("/vdc1.0-vcd15.xml",  VCloudMediaType.VDC_XML +";version=1.0"))
             .build();   
    
    protected String networkId = "b466c0c5-8a5c-4335-b703-a2e2e6b5f3e1";
    
-   protected HttpRequest version1_0GetVAppTemplateRequest = HttpRequest.builder().method("GET").endpoint(
-            URI.create(ENDPOINT + "/v1.0/vAppTemplate/" + templateId))
-            .headers(ImmutableMultimap.<String, String> builder()
-            .put(HttpHeaders.ACCEPT, VCloudMediaType.VAPPTEMPLATE_XML)
-            .put(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build()).build();
+   protected HttpRequest version1_0GetVAppTemplateRequest = HttpRequest.builder().method("GET").endpoint(ENDPOINT + "/v1.0/vAppTemplate/" + templateId)
+            .addHeader(HttpHeaders.ACCEPT, VCloudMediaType.VAPPTEMPLATE_XML)
+            .addHeader("x-vcloud-authorization", sessionToken)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build();
    
    protected HttpResponse successfulVersion1_0GetVAppTemplateResponseFromVCD1_5WithSingleVMAndVDCParent = HttpResponse.builder().statusCode(200)
             .message("HTTP/1.1 200 OK").payload(payloadFromResourceWithContentType("/template1.0-vcd15.xml",  VCloudMediaType.VAPPTEMPLATE_XML +";version=1.0"))
@@ -135,11 +126,10 @@
             .message("HTTP/1.1 200 OK").payload(payloadFromResourceWithContentType("/template1.0-vcd15-multi-vm.xml",  VCloudMediaType.VAPPTEMPLATE_XML +";version=1.0"))
             .build();   
 
-   protected HttpRequest version1_0GetOVFForVAppTemplateRequest = HttpRequest.builder().method("GET").endpoint(
-            URI.create(ENDPOINT + "/v1.0/vAppTemplate/" + templateId + "/ovf"))
-            .headers(ImmutableMultimap.<String, String> builder()
-            .put(HttpHeaders.ACCEPT, MediaType.TEXT_XML)
-            .put(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build()).build();
+   protected HttpRequest version1_0GetOVFForVAppTemplateRequest = HttpRequest.builder().method("GET").endpoint(ENDPOINT + "/v1.0/vAppTemplate/" + templateId + "/ovf")
+            .addHeader(HttpHeaders.ACCEPT, MediaType.TEXT_XML)
+            .addHeader("x-vcloud-authorization", sessionToken)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken).build();
    
    protected HttpResponse successfulVersion1_0GetOVFForVAppTemplateResponseFromVCD1_5WithSingleVM = HttpResponse.builder().statusCode(200)
             .message("HTTP/1.1 200 OK").payload(payloadFromResourceWithContentType("/ovf-ubuntu64.xml",  MediaType.TEXT_XML +";version=1.0"))
diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOnExpectTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOnExpectTest.java
index 42b16bf..176e82a 100644
--- a/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOnExpectTest.java
+++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOnExpectTest.java
@@ -86,10 +86,10 @@
                                         .e("AllEULAsAccepted").t("true").up()
                                         .asString(outputProperties);
      
-      HttpRequest version1_0InstantiateWithNetworkNamedSameAsOrgNetwork = HttpRequest.builder()
-                                                                           .method("POST")
+      HttpRequest version1_0InstantiateWithNetworkNamedSameAsOrgNetwork = HttpRequest.builder().method("POST")
                                                                            .endpoint(ENDPOINT + "/v1.0/vdc/" + vdcId + "/action/instantiateVAppTemplate")
                                                                            .addHeader(HttpHeaders.ACCEPT, "application/vnd.vmware.vcloud.vApp+xml")
+                                                                           .addHeader("x-vcloud-authorization", sessionToken)
                                                                            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken)
                                                                            .payload(payloadFromStringWithContentType(instantiateXML, "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml")).build();
                                                                         
@@ -143,12 +143,12 @@
                                         .e("AllEULAsAccepted").t("true").up()
                                         .asString(outputProperties);
      
-      HttpRequest version1_0InstantiateWithCustomizedNetwork = HttpRequest.builder()
-                                                                           .method("POST")
-                                                                           .endpoint(ENDPOINT + "/v1.0/vdc/" + vdcId + "/action/instantiateVAppTemplate")
-                                                                           .addHeader(HttpHeaders.ACCEPT, "application/vnd.vmware.vcloud.vApp+xml")
-                                                                            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken)
-                                                                           .payload(payloadFromStringWithContentType(instantiateXML, "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml")).build();
+      HttpRequest version1_0InstantiateWithCustomizedNetwork = HttpRequest.builder().method("POST")
+                                                                          .endpoint(ENDPOINT + "/v1.0/vdc/" + vdcId + "/action/instantiateVAppTemplate")
+                                                                          .addHeader(HttpHeaders.ACCEPT, "application/vnd.vmware.vcloud.vApp+xml")
+                                                                          .addHeader("x-vcloud-authorization", sessionToken)
+                                                                          .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + sessionToken)
+                                                                          .payload(payloadFromStringWithContentType(instantiateXML, "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml")).build();
                                                                         
       ComputeService compute = requestsSendResponses(ImmutableMap.<HttpRequest, HttpResponse> builder()
               .put(versionsRequest, versionsResponseFromVCD1_5)
diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/filters/SetVCloudTokenCookieTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/filters/AddVCloudAuthorizationAndCookieToRequestTest.java
similarity index 78%
rename from apis/vcloud/src/test/java/org/jclouds/vcloud/filters/SetVCloudTokenCookieTest.java
rename to apis/vcloud/src/test/java/org/jclouds/vcloud/filters/AddVCloudAuthorizationAndCookieToRequestTest.java
index 818b6a6..298e1ac 100644
--- a/apis/vcloud/src/test/java/org/jclouds/vcloud/filters/SetVCloudTokenCookieTest.java
+++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/filters/AddVCloudAuthorizationAndCookieToRequestTest.java
@@ -31,14 +31,14 @@
 /**
  * @author Adrian Cole
  */
-@Test
-public class SetVCloudTokenCookieTest {
+@Test(testName = "AddVCloudAuthorizationAndCookieToRequestTest")
+public class AddVCloudAuthorizationAndCookieToRequestTest {
 
-   private SetVCloudTokenCookie filter;
+   private AddVCloudAuthorizationAndCookieToRequest filter;
 
    @BeforeTest
    void setUp() {
-      filter = new SetVCloudTokenCookie(new Supplier<String>() {
+      filter = new AddVCloudAuthorizationAndCookieToRequest(new Supplier<String>() {
          public String get() {
             return "token";
          }
@@ -49,9 +49,9 @@
    public void testApply() {
       HttpRequest request = HttpRequest.builder().method("GET").endpoint("http://localhost").build();
       request = filter.filter(request);
-      assertEquals(request.getHeaders().size(), 1);
+      assertEquals(request.getHeaders().size(), 2);
       assertEquals(request.getFirstHeaderOrNull(HttpHeaders.COOKIE), "vcloud-token=token");
-
+      assertEquals(request.getFirstHeaderOrNull("x-vcloud-authorization"), "token");
    }
 
 }
diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/internal/BaseVCloudAsyncClientTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/internal/BaseVCloudAsyncClientTest.java
index 920d5c9..22fb8a0 100644
--- a/apis/vcloud/src/test/java/org/jclouds/vcloud/internal/BaseVCloudAsyncClientTest.java
+++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/internal/BaseVCloudAsyncClientTest.java
@@ -55,7 +55,7 @@
 import org.jclouds.vcloud.domain.internal.OrgImpl;
 import org.jclouds.vcloud.domain.internal.ReferenceTypeImpl;
 import org.jclouds.vcloud.domain.internal.VDCImpl;
-import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.xml.VAppTemplateHandlerTest;
 import org.testng.annotations.Test;
 
@@ -82,7 +82,7 @@
    @Override
    protected void checkFilters(HttpRequest request) {
       assertEquals(request.getFilters().size(), 1);
-      assertEquals(request.getFilters().get(0).getClass(), SetVCloudTokenCookie.class);
+      assertEquals(request.getFilters().get(0).getClass(), AddVCloudAuthorizationAndCookieToRequest.class);
    }
 
    @Override
diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/GuestCustomizationSectionHandlerTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/GuestCustomizationSectionHandlerTest.java
index 073b0c2..977e8f2 100644
--- a/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/GuestCustomizationSectionHandlerTest.java
+++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/GuestCustomizationSectionHandlerTest.java
@@ -55,18 +55,18 @@
       assertEquals(result.getHref(),
             URI.create("https://vcenterprise.bluelock.com/api/v1.0/vApp/vm-2087535248/guestCustomizationSection/"));
       assertEquals(result.getInfo(), "Specifies Guest OS Customization Settings");
-      assertEquals(result.isEnabled(), new Boolean(true));
-      assertEquals(result.shouldChangeSid(), new Boolean(false));
+      assertEquals(result.isEnabled(), Boolean.TRUE);
+      assertEquals(result.shouldChangeSid(), Boolean.FALSE);
       assertEquals(result.getVirtualMachineId(), "2087535248");
-      assertEquals(result.isJoinDomainEnabled(), new Boolean(false));
-      assertEquals(result.useOrgSettings(), new Boolean(false));
+      assertEquals(result.isJoinDomainEnabled(), Boolean.FALSE);
+      assertEquals(result.useOrgSettings(), Boolean.FALSE);
       assertEquals(result.getDomainName(), null);
       assertEquals(result.getDomainUserName(), null);
       assertEquals(result.getDomainUserPassword(), null);
-      assertEquals(result.isAdminPasswordEnabled(), new Boolean(true));
-      assertEquals(result.isAdminPasswordAuto(), new Boolean(true));
+      assertEquals(result.isAdminPasswordEnabled(), Boolean.TRUE);
+      assertEquals(result.isAdminPasswordAuto(), Boolean.TRUE);
       assertEquals(result.getAdminPassword(), null);
-      assertEquals(result.isResetPasswordRequired(), new Boolean(false));
+      assertEquals(result.isResetPasswordRequired(), Boolean.FALSE);
       assertEquals(result.getCustomizationScript(), "cat > /root/foo.txt<<EOF\nI '\"love\"' {asc|!}*&\nEOF\n");
       assertEquals(result.getComputerName(), "RHEL5");
       assertEquals(
diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/NetworkConnectionSectionHandlerTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/NetworkConnectionSectionHandlerTest.java
index ab5a7d9..2a7226a 100644
--- a/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/NetworkConnectionSectionHandlerTest.java
+++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/NetworkConnectionSectionHandlerTest.java
@@ -57,7 +57,7 @@
                .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/vm-2087535248/networkConnectionSection/"));
       assertEquals(result.getType(), VCloudMediaType.NETWORKCONNECTIONSECTION_XML);
       assertEquals(result.getInfo(), "Specifies the available VM network connections");
-      assertEquals(result.getPrimaryNetworkConnectionIndex(), new Integer(0));
+      assertEquals(result.getPrimaryNetworkConnectionIndex(), Integer.valueOf(0));
       assertEquals(result.getEdit(), new ReferenceTypeImpl(null, VCloudMediaType.NETWORKCONNECTIONSECTION_XML, URI
                .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/vm-2087535248/networkConnectionSection/")));
       NetworkConnectionHandlerTest.checkNetworkConnection(Iterables.getOnlyElement(result.getConnections()));
diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/VAppTemplateHandlerTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/VAppTemplateHandlerTest.java
index 9bfe3b8..9bffc70 100644
--- a/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/VAppTemplateHandlerTest.java
+++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/VAppTemplateHandlerTest.java
@@ -86,18 +86,18 @@
                URI
                         .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/vm-172837194/guestCustomizationSection/"));
       assertEquals(guestC.getInfo(), "Specifies Guest OS Customization Settings");
-      assertEquals(guestC.isEnabled(), new Boolean(true));
-      assertEquals(guestC.shouldChangeSid(), new Boolean(false));
+      assertEquals(guestC.isEnabled(), Boolean.TRUE);
+      assertEquals(guestC.shouldChangeSid(), Boolean.FALSE);
       assertEquals(guestC.getVirtualMachineId(), "172837194");
-      assertEquals(guestC.isJoinDomainEnabled(), new Boolean(false));
-      assertEquals(guestC.useOrgSettings(), new Boolean(false));
+      assertEquals(guestC.isJoinDomainEnabled(), Boolean.FALSE);
+      assertEquals(guestC.useOrgSettings(), Boolean.FALSE);
       assertEquals(guestC.getDomainName(), null);
       assertEquals(guestC.getDomainUserName(), null);
       assertEquals(guestC.getDomainUserPassword(), null);
-      assertEquals(guestC.isAdminPasswordEnabled(), new Boolean(true));
-      assertEquals(guestC.isAdminPasswordAuto(), new Boolean(true));
+      assertEquals(guestC.isAdminPasswordEnabled(), Boolean.TRUE);
+      assertEquals(guestC.isAdminPasswordAuto(), Boolean.TRUE);
       assertEquals(guestC.getAdminPassword(), "%3eD%gmF");
-      assertEquals(guestC.isResetPasswordRequired(), new Boolean(false));
+      assertEquals(guestC.isResetPasswordRequired(), Boolean.FALSE);
       assertEquals(
                guestC.getCustomizationScript(),
                "#!/bin/bash if [ \"$1\" = \"postcustomization\" ]; then echo \"post customization\" touch /root/.postcustomization sleep 30 #regenerate keys /bin/rm /etc/ssh/ssh_host_* /usr/sbin/dpkg-reconfigure openssh-server echo \"completed\" fi");
diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/ovf/VCloudOperatingSystemSectionHandlerTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/ovf/VCloudOperatingSystemSectionHandlerTest.java
index 1b9e07b..9420493 100644
--- a/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/ovf/VCloudOperatingSystemSectionHandlerTest.java
+++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/xml/ovf/VCloudOperatingSystemSectionHandlerTest.java
@@ -55,7 +55,7 @@
       assertEquals(result.getEdit(), new ReferenceTypeImpl(null,
                "application/vnd.vmware.vcloud.operatingSystemSection+xml",
                URI.create("https://vcenterprise.bluelock.com/api/v1.0/vApp/vm-2087535248/operatingSystemSection/")));
-      assertEquals(result.getId(), new Integer(80));
+      assertEquals(result.getId(), Integer.valueOf(80));
       assertEquals(result.getVmwOsType(), "rhel5_64Guest");
       assertEquals(result.getType(), "application/vnd.vmware.vcloud.operatingSystemSection+xml");
       assertEquals(result.getInfo(), "Specifies the operating system installed");
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/FilesystemAsyncBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/LocalAsyncBlobStore.java
similarity index 82%
rename from apis/filesystem/src/main/java/org/jclouds/filesystem/FilesystemAsyncBlobStore.java
rename to blobstore/src/main/java/org/jclouds/blobstore/LocalAsyncBlobStore.java
index 813feb7..16fc21b 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/FilesystemAsyncBlobStore.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/LocalAsyncBlobStore.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.filesystem;
+package org.jclouds.blobstore;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
@@ -26,24 +26,15 @@
 import static com.google.common.collect.Iterables.find;
 import static com.google.common.collect.Iterables.size;
 import static com.google.common.collect.Iterables.transform;
-import static com.google.common.collect.Maps.newHashMap;
 import static com.google.common.collect.Sets.filter;
 import static com.google.common.collect.Sets.newTreeSet;
 import static com.google.common.io.ByteStreams.toByteArray;
 import static com.google.common.util.concurrent.Futures.immediateFailedFuture;
 import static com.google.common.util.concurrent.Futures.immediateFuture;
 
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.File;
 import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
 import java.util.Date;
-import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.concurrent.ExecutorService;
@@ -51,13 +42,8 @@
 import javax.annotation.Resource;
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
 
 import org.jclouds.Constants;
-import org.jclouds.blobstore.BlobStoreContext;
-import org.jclouds.blobstore.ContainerNotFoundException;
-import org.jclouds.blobstore.KeyNotFoundException;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.domain.Blob.Factory;
 import org.jclouds.blobstore.domain.BlobMetadata;
@@ -68,21 +54,16 @@
 import org.jclouds.blobstore.domain.StorageType;
 import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
 import org.jclouds.blobstore.domain.internal.PageSetImpl;
-import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions;
 import org.jclouds.blobstore.internal.BaseAsyncBlobStore;
 import org.jclouds.blobstore.options.CreateContainerOptions;
 import org.jclouds.blobstore.options.GetOptions;
 import org.jclouds.blobstore.options.ListContainerOptions;
 import org.jclouds.blobstore.options.PutOptions;
 import org.jclouds.blobstore.strategy.IfDirectoryReturnNameStrategy;
+import org.jclouds.blobstore.util.BlobStoreUtils;
 import org.jclouds.blobstore.util.BlobUtils;
 import org.jclouds.collect.Memoized;
-import org.jclouds.crypto.Crypto;
-import org.jclouds.crypto.CryptoStreams;
-import org.jclouds.date.DateService;
 import org.jclouds.domain.Location;
-import org.jclouds.filesystem.predicates.validators.FilesystemContainerNameValidator;
-import org.jclouds.filesystem.strategy.FilesystemStorageStrategy;
 import org.jclouds.http.HttpCommand;
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
@@ -91,10 +72,7 @@
 import org.jclouds.io.ContentMetadata;
 import org.jclouds.io.ContentMetadataCodec;
 import org.jclouds.io.Payload;
-import org.jclouds.io.Payloads;
-import org.jclouds.io.payloads.BaseMutableContentMetadata;
 import org.jclouds.logging.Logger;
-import org.jclouds.rest.annotations.ParamValidators;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
@@ -105,43 +83,38 @@
 import com.google.common.util.concurrent.ListenableFuture;
 
 /**
- * 
- * Preconditions: Blob name cannot start with / char (or \ under windows)
- * 
+ * Implementation of {@link BaseAsyncBlobStore} which uses a pluggable
+ * LocalStorageStrategy.
+ *
+ * @author Adrian Cole
  * @author Alfredo "Rainbowbreeze" Morresi
+ * @author Andrew Gaul
+ * @author James Murty
  */
-public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore {
+public class LocalAsyncBlobStore extends BaseAsyncBlobStore {
 
    @Resource
    protected Logger logger = Logger.NULL;
 
-   protected final DateService dateService;
-   protected final Crypto crypto;
-   protected final HttpGetOptionsListToGetOptions httpGetOptionsConverter;
    protected final ContentMetadataCodec contentMetadataCodec;
    protected final IfDirectoryReturnNameStrategy ifDirectoryReturnName;
    protected final Factory blobFactory;
-   protected final FilesystemStorageStrategy storageStrategy;
+   protected final LocalStorageStrategy storageStrategy;
 
    @Inject
-   protected FilesystemAsyncBlobStore(BlobStoreContext context,
-         DateService dateService, Crypto crypto,
-         HttpGetOptionsListToGetOptions httpGetOptionsConverter,
-         ContentMetadataCodec contentMetadataCodec,
-         IfDirectoryReturnNameStrategy ifDirectoryReturnName,
+   protected LocalAsyncBlobStore(BlobStoreContext context,
          BlobUtils blobUtils,
          @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service,
          Supplier<Location> defaultLocation,
          @Memoized Supplier<Set<? extends Location>> locations,
-         Factory blobFactory, FilesystemStorageStrategy storageStrategy) {
+         ContentMetadataCodec contentMetadataCodec,
+         IfDirectoryReturnNameStrategy ifDirectoryReturnName,
+         Factory blobFactory, LocalStorageStrategy storageStrategy) {
       super(context, blobUtils, service, defaultLocation, locations);
       this.blobFactory = blobFactory;
-      this.dateService = dateService;
-      this.crypto = crypto;
-      this.httpGetOptionsConverter = httpGetOptionsConverter;
       this.contentMetadataCodec = contentMetadataCodec;
       this.ifDirectoryReturnName = ifDirectoryReturnName;
-      this.storageStrategy = checkNotNull(storageStrategy, "Storage strategy");
+      this.storageStrategy = storageStrategy;
    }
 
    /**
@@ -170,7 +143,7 @@
                   checkState(oldBlob != null, "blob " + key + " is not present although it was in the list of "
                         + container);
                   checkState(oldBlob.getMetadata() != null, "blob " + container + "/" + key + " has no metadata");
-                  MutableBlobMetadata md = copy(oldBlob.getMetadata());
+                  MutableBlobMetadata md = BlobStoreUtils.copy(oldBlob.getMetadata());
                   String directoryName = ifDirectoryReturnName.execute(md);
                   if (directoryName != null) {
                      md.setName(directoryName);
@@ -211,7 +184,7 @@
             }
          }
 
-         final String delimiter = options.isRecursive() ? null : File.separator;
+         final String delimiter = options.isRecursive() ? null : storageStrategy.getSeparator();
          if (delimiter != null) {
             SortedSet<String> commonPrefixes = newTreeSet(
                    transform(contents, new CommonPrefixes(prefix, delimiter)));
@@ -249,37 +222,6 @@
             storageStrategy.getAllContainerNames()));
    }
 
-   public static MutableBlobMetadata copy(MutableBlobMetadata in) {
-      ByteArrayOutputStream bout = new ByteArrayOutputStream();
-      ObjectOutput os;
-      try {
-         os = new ObjectOutputStream(bout);
-         os.writeObject(in);
-         ObjectInput is = new ObjectInputStream(new ByteArrayInputStream(bout.toByteArray()));
-         MutableBlobMetadata metadata = (MutableBlobMetadata) is.readObject();
-         convertUserMetadataKeysToLowercase(metadata);
-         metadata.setContentMetadata(BaseMutableContentMetadata.fromContentMetadata(in.getContentMetadata().toBuilder()
-               .build()));
-         return metadata;
-      } catch (Exception e) {
-         throw propagate(e);
-      }
-   }
-
-   private static void convertUserMetadataKeysToLowercase(MutableBlobMetadata metadata) {
-      Map<String, String> lowerCaseUserMetadata = newHashMap();
-      for (Entry<String, String> entry : metadata.getUserMetadata().entrySet()) {
-         lowerCaseUserMetadata.put(entry.getKey().toLowerCase(), entry.getValue());
-      }
-      metadata.setUserMetadata(lowerCaseUserMetadata);
-   }
-
-   public static MutableBlobMetadata copy(MutableBlobMetadata in, String newKey) {
-      MutableBlobMetadata newMd = copy(in);
-      newMd.setName(newKey);
-      return newMd;
-   }
-
    /**
     * {@inheritDoc}
     */
@@ -290,6 +232,15 @@
    }
 
    /**
+    * {@inheritDoc}
+    */
+   @Override
+   public ListenableFuture<Void> clearContainer(final String container) {
+      storageStrategy.clearContainer(container);
+      return immediateFuture(null);
+   }
+
+   /**
     * Override parent method because it uses strange futures and listenables
     * that creates problem in the test if more than one test that deletes the
     * container is executed
@@ -303,6 +254,22 @@
       return immediateFuture(null);
    }
 
+   public ListenableFuture<Boolean> deleteContainerIfEmpty(final String container) {
+      Boolean returnVal = true;
+      if (storageStrategy.containerExists(container)) {
+         try {
+            if (Iterables.isEmpty(storageStrategy.getBlobKeysInsideContainer(container)))
+               storageStrategy.deleteContainer(container);
+            else
+               returnVal = false;
+         } catch (IOException e) {
+            logger.error(e, "An error occurred loading blobs contained into container %s", container);
+            Throwables.propagate(e);
+         }
+      }
+      return immediateFuture(returnVal);
+   }
+
    /**
     * {@inheritDoc}
     */
@@ -324,6 +291,7 @@
                   MutableStorageMetadata cmd = create();
                   cmd.setName(name);
                   cmd.setType(StorageType.CONTAINER);
+                  cmd.setLocation(storageStrategy.getLocation(name));
                   return cmd;
                }
             }), null));
@@ -336,11 +304,10 @@
    /**
     * {@inheritDoc}
     */
-   @Path("{container}")
    @Override
    public ListenableFuture<Boolean> createContainerInLocation(final Location location,
-         @PathParam("container") @ParamValidators({ FilesystemContainerNameValidator.class }) String name) {
-      boolean result = storageStrategy.createContainer(name);
+         final String name) {
+      boolean result = storageStrategy.createContainerInLocation(name, location);
       return immediateFuture(result);
    }
 
@@ -461,18 +428,12 @@
       }
 
       try {
-         // TODO
-         // must override existing file?
-
-         storageStrategy.putBlob(containerName, blob);
+         return immediateFuture(storageStrategy.putBlob(containerName, blob));
       } catch (IOException e) {
          logger.error(e, "An error occurred storing the new blob with name [%s] to container [%s].", blobKey,
                containerName);
-         Throwables.propagate(e);
+         throw Throwables.propagate(e);
       }
-
-      String eTag = getEtag(blob);
-      return immediateFuture(eTag);
    }
 
    private void copyPayloadHeadersToBlob(Payload payload, Blob blob) {
@@ -573,7 +534,7 @@
             byte[] byteArray = out.toByteArray();
             blob.setPayload(byteArray);
             HttpUtils.copy(cmd, blob.getPayload().getContentMetadata());
-            blob.getPayload().getContentMetadata().setContentLength(new Long(byteArray.length));
+            blob.getPayload().getContentMetadata().setContentLength(Long.valueOf(byteArray.length));
          }
       }
       checkNotNull(blob.getPayload(), "payload " + blob);
@@ -587,7 +548,7 @@
    public ListenableFuture<BlobMetadata> blobMetadata(final String container, final String key) {
       try {
          Blob blob = getBlob(container, key).get();
-         return immediateFuture(blob != null ? (BlobMetadata) copy(blob.getMetadata()) : null);
+         return immediateFuture(blob != null ? (BlobMetadata) BlobStoreUtils.copy(blob.getMetadata()) : null);
       } catch (Exception e) {
          if (size(filter(getCausalChain(e), KeyNotFoundException.class)) >= 1)
             return immediateFuture(null);
@@ -595,26 +556,8 @@
       }
    }
 
-   /**
-    * Calculates the object MD5 and returns it as eTag
-    * 
-    * @param object
-    * @return
-    */
-   private String getEtag(Blob object) {
-      try {
-         Payloads.calculateMD5(object, crypto.md5());
-      } catch (IOException ex) {
-         logger.error(ex, "An error occurred calculating MD5 for object with name %s.", object.getMetadata().getName());
-         Throwables.propagate(ex);
-      }
-
-      String eTag = CryptoStreams.hex(object.getPayload().getContentMetadata().getContentMD5());
-      return eTag;
-   }
-
    private Blob copyBlob(Blob blob) {
-      Blob returnVal = blobFactory.create(copy(blob.getMetadata()));
+      Blob returnVal = blobFactory.create(BlobStoreUtils.copy(blob.getMetadata()));
       returnVal.setPayload(blob.getPayload());
       copyPayloadHeadersToBlob(blob.getPayload(), returnVal);
       return returnVal;
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java b/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
new file mode 100644
index 0000000..a6a6ec7
--- /dev/null
+++ b/blobstore/src/main/java/org/jclouds/blobstore/LocalStorageStrategy.java
@@ -0,0 +1,133 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.blobstore;
+
+import java.io.IOException;
+
+import org.jclouds.blobstore.domain.Blob;
+import org.jclouds.blobstore.options.ListContainerOptions;
+import org.jclouds.domain.Location;
+
+/**
+ * Strategy for local operations related to container and blob
+ *
+ * @author Alfredo "Rainbowbreeze" Morresi
+ */
+public interface LocalStorageStrategy {
+
+    /**
+     * Creates a new container
+     *
+     * @param container
+     * @return
+     */
+    boolean createContainerInLocation(String container, Location location);
+
+    /**
+     * Deletes a container and all its content
+     * @param container
+     */
+    void deleteContainer(String container);
+
+    /**
+     * Checks if a container exists
+     * @param container
+     * @return
+     */
+    boolean containerExists(String container);
+
+    /**
+     * Empty the container of its content (files and subdirectories), but doesn't
+     * delete the container itself
+     * @param container
+     */
+    void clearContainer(String container);
+
+    /**
+     * Like {@link #clearContainer(String)} except you can use options to do things like recursive
+     * deletes, or clear at a different path than root.
+     *
+     * @param container
+     *           what to clear
+     * @param options
+     *           recursion and path to clear
+     */
+    void clearContainer(String container, ListContainerOptions options);
+
+    /**
+     * Return an iterator that reports all the containers under base path
+     * @return
+     */
+    Iterable<String> getAllContainerNames();
+
+    /**
+     * Return true if a blob named by key exists
+     * @param container
+     * @param key
+     * @return
+     */
+    boolean blobExists(String container, String key);
+
+    /**
+     * Load the blob with the given key belonging to the container with the given
+     * name. There must exist a resource on the file system whose complete name
+     * is given concatenating the container name and the key
+     *
+     * @param container
+     *           it's the name of the container the blob belongs to
+     * @param key
+     *           it's the key of the blob
+     *
+     * @return the blob belonging to the given container with the given key
+     */
+    Blob getBlob(String containerName, String blobName);
+
+    /**
+     * Returns all the blobs key inside a container
+     * @param container
+     * @return
+     * @throws IOException
+     */
+    Iterable<String> getBlobKeysInsideContainer(String container) throws IOException;
+
+    /**
+     * Remove blob named by the given key
+     * @param container
+     * @param key
+     */
+    void removeBlob(String container, String key);
+
+    /**
+     * Write a {@link Blob} into a file
+     * @param container
+     * @param blob
+     * @return etag of blob
+     * @throws IOException
+     */
+    String putBlob(String containerName, Blob blob) throws IOException;
+
+    /**
+     * @param containerName name of container
+     * @return Location of container or null
+     */
+    Location getLocation(String containerName);
+
+    /** @return path separator, either / or \ */
+    String getSeparator();
+}
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/TransientAsyncBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/TransientAsyncBlobStore.java
deleted file mode 100644
index 4e6074a..0000000
--- a/blobstore/src/main/java/org/jclouds/blobstore/TransientAsyncBlobStore.java
+++ /dev/null
@@ -1,683 +0,0 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds 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.blobstore;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.base.Throwables.getCausalChain;
-import static com.google.common.base.Throwables.propagate;
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.find;
-import static com.google.common.collect.Iterables.size;
-import static com.google.common.collect.Iterables.transform;
-import static com.google.common.collect.Maps.newHashMap;
-import static com.google.common.collect.Sets.filter;
-import static com.google.common.collect.Sets.newTreeSet;
-import static com.google.common.io.ByteStreams.toByteArray;
-import static com.google.common.util.concurrent.Futures.immediateFailedFuture;
-import static com.google.common.util.concurrent.Futures.immediateFuture;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.concurrent.ExecutorService;
-
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Provider;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.UriBuilder;
-
-import org.jclouds.Constants;
-import org.jclouds.blobstore.domain.Blob;
-import org.jclouds.blobstore.domain.Blob.Factory;
-import org.jclouds.blobstore.domain.BlobMetadata;
-import org.jclouds.blobstore.domain.MutableBlobMetadata;
-import org.jclouds.blobstore.domain.MutableStorageMetadata;
-import org.jclouds.blobstore.domain.PageSet;
-import org.jclouds.blobstore.domain.StorageMetadata;
-import org.jclouds.blobstore.domain.StorageType;
-import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl;
-import org.jclouds.blobstore.domain.internal.PageSetImpl;
-import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions;
-import org.jclouds.blobstore.internal.BaseAsyncBlobStore;
-import org.jclouds.blobstore.options.CreateContainerOptions;
-import org.jclouds.blobstore.options.GetOptions;
-import org.jclouds.blobstore.options.ListContainerOptions;
-import org.jclouds.blobstore.options.PutOptions;
-import org.jclouds.blobstore.strategy.IfDirectoryReturnNameStrategy;
-import org.jclouds.blobstore.util.BlobUtils;
-import org.jclouds.collect.Memoized;
-import org.jclouds.crypto.Crypto;
-import org.jclouds.crypto.CryptoStreams;
-import org.jclouds.date.DateService;
-import org.jclouds.domain.Location;
-import org.jclouds.http.HttpCommand;
-import org.jclouds.http.HttpRequest;
-import org.jclouds.http.HttpResponse;
-import org.jclouds.http.HttpResponseException;
-import org.jclouds.http.HttpUtils;
-import org.jclouds.io.ContentMetadata;
-import org.jclouds.io.ContentMetadataCodec;
-import org.jclouds.io.MutableContentMetadata;
-import org.jclouds.io.Payload;
-import org.jclouds.io.Payloads;
-import org.jclouds.io.payloads.ByteArrayPayload;
-import org.jclouds.io.payloads.DelegatingPayload;
-import org.jclouds.logging.Logger;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-import com.google.common.base.Throwables;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Multimaps;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Implementation of {@link BaseAsyncBlobStore} which keeps all data in a local Map object.
- * 
- * @author Adrian Cole
- * @author James Murty
- */
-public class TransientAsyncBlobStore extends BaseAsyncBlobStore {
-
-   @Resource
-   protected Logger logger = Logger.NULL;
-
-   protected final DateService dateService;
-   protected final Crypto crypto;
-   protected final HttpGetOptionsListToGetOptions httpGetOptionsConverter;
-   protected final ContentMetadataCodec contentMetadataCodec;
-   protected final IfDirectoryReturnNameStrategy ifDirectoryReturnName;
-   protected final Factory blobFactory;
-   protected final TransientStorageStrategy storageStrategy;
-   protected final Provider<UriBuilder> uriBuilders;
-
-   @Inject
-   protected TransientAsyncBlobStore(BlobStoreContext context,
-         DateService dateService, Crypto crypto,
-         HttpGetOptionsListToGetOptions httpGetOptionsConverter,
-         ContentMetadataCodec contentMetadataCodec,
-         IfDirectoryReturnNameStrategy ifDirectoryReturnName,
-         BlobUtils blobUtils,
-         @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service,
-         Supplier<Location> defaultLocation,
-         @Memoized Supplier<Set<? extends Location>> locations,
-         Factory blobFactory, Provider<UriBuilder> uriBuilders) {
-      super(context, blobUtils, service, defaultLocation, locations);
-      this.blobFactory = blobFactory;
-      this.dateService = dateService;
-      this.crypto = crypto;
-      this.httpGetOptionsConverter = httpGetOptionsConverter;
-      this.contentMetadataCodec = contentMetadataCodec;
-      this.ifDirectoryReturnName = ifDirectoryReturnName;
-      this.storageStrategy = new TransientStorageStrategy(defaultLocation);
-      this.uriBuilders = uriBuilders;
-   }
-
-   /**
-    * default maxResults is 1000
-    */
-   @Override
-   public ListenableFuture<PageSet<? extends StorageMetadata>> list(final String container, ListContainerOptions options) {
-
-      // Check if the container exists
-      if (!storageStrategy.containerExists(container))
-         return immediateFailedFuture(cnfe(container));
-
-      // Loading blobs from container
-      Iterable<String> blobBelongingToContainer = storageStrategy.getBlobKeysInsideContainer(container);
-
-      SortedSet<StorageMetadata> contents = newTreeSet(transform(blobBelongingToContainer,
-            new Function<String, StorageMetadata>() {
-               public StorageMetadata apply(String key) {
-                  Blob oldBlob = loadBlob(container, key);
-                  checkState(oldBlob != null, "blob " + key + " is not present although it was in the list of "
-                        + container);
-                  checkState(oldBlob.getMetadata() != null, "blob " + container + "/" + key + " has no metadata");
-                  MutableBlobMetadata md = copy(oldBlob.getMetadata());
-                  String directoryName = ifDirectoryReturnName.execute(md);
-                  if (directoryName != null) {
-                     md.setName(directoryName);
-                     md.setType(StorageType.RELATIVE_PATH);
-                  }
-                  return md;
-               }
-            }));
-
-      String marker = null;
-      if (options != null) {
-         if (options.getMarker() != null) {
-            final String finalMarker = options.getMarker();
-            StorageMetadata lastMarkerMetadata = find(contents, new Predicate<StorageMetadata>() {
-               public boolean apply(StorageMetadata metadata) {
-                  return metadata.getName().compareTo(finalMarker) > 0;
-               }
-            });
-            contents = contents.tailSet(lastMarkerMetadata);
-         }
-
-         final String prefix = options.getDir();
-         if (prefix != null) {
-            contents = newTreeSet(filter(contents, new Predicate<StorageMetadata>() {
-               public boolean apply(StorageMetadata o) {
-                  return (o != null && o.getName().startsWith(prefix) && !o.getName().equals(prefix));
-               }
-            }));
-         }
-
-         int maxResults = options.getMaxResults() != null ? options.getMaxResults() : 1000;
-         if (!contents.isEmpty()) {
-            StorageMetadata lastElement = contents.last();
-            contents = newTreeSet(Iterables.limit(contents, maxResults));
-            if (!contents.contains(lastElement)) {
-               // Partial listing
-               marker = contents.last().getName();
-            }
-         }
-
-         final String delimiter = options.isRecursive() ? null : "/";
-         if (delimiter != null) {
-            SortedSet<String> commonPrefixes = newTreeSet(
-                   transform(contents, new CommonPrefixes(prefix, delimiter)));
-            commonPrefixes.remove(CommonPrefixes.NO_PREFIX);
-
-            contents = newTreeSet(filter(contents, new DelimiterFilter(prefix, delimiter)));
-
-            Iterables.<StorageMetadata> addAll(contents, transform(commonPrefixes,
-                  new Function<String, StorageMetadata>() {
-                     public StorageMetadata apply(String o) {
-                        MutableStorageMetadata md = new MutableStorageMetadataImpl();
-                        md.setType(StorageType.RELATIVE_PATH);
-                        md.setName(o);
-                        return md;
-                     }
-                  }));
-         }
-
-         // trim metadata, if the response isn't supposed to be detailed.
-         if (!options.isDetailed()) {
-            for (StorageMetadata md : contents) {
-               md.getUserMetadata().clear();
-            }
-         }
-      }
-
-      return Futures.<PageSet<? extends StorageMetadata>> immediateFuture(new PageSetImpl<StorageMetadata>(contents,
-            marker));
-
-   }
-
-   private ContainerNotFoundException cnfe(final String name) {
-      return new ContainerNotFoundException(name, String.format(
-            "container %s not in %s", name,
-            storageStrategy.getAllContainerNames()));
-   }
-
-   public static MutableBlobMetadata copy(MutableBlobMetadata in) {
-      ByteArrayOutputStream bout = new ByteArrayOutputStream();
-      ObjectOutput os;
-      try {
-         os = new ObjectOutputStream(bout);
-         os.writeObject(in);
-         ObjectInput is = new ObjectInputStream(new ByteArrayInputStream(bout.toByteArray()));
-         MutableBlobMetadata metadata = (MutableBlobMetadata) is.readObject();
-         convertUserMetadataKeysToLowercase(metadata);
-         HttpUtils.copy(in.getContentMetadata(), metadata.getContentMetadata());
-         return metadata;
-      } catch (Exception e) {
-         throw propagate(e);
-      }
-   }
-
-   private static void convertUserMetadataKeysToLowercase(MutableBlobMetadata metadata) {
-      Map<String, String> lowerCaseUserMetadata = newHashMap();
-      for (Entry<String, String> entry : metadata.getUserMetadata().entrySet()) {
-         lowerCaseUserMetadata.put(entry.getKey().toLowerCase(), entry.getValue());
-      }
-      metadata.setUserMetadata(lowerCaseUserMetadata);
-   }
-
-   public static MutableBlobMetadata copy(MutableBlobMetadata in, String newKey) {
-      MutableBlobMetadata newMd = copy(in);
-      newMd.setName(newKey);
-      return newMd;
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public ListenableFuture<Void> removeBlob(final String container, final String key) {
-      storageStrategy.removeBlob(container, key);
-      return immediateFuture(null);
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public ListenableFuture<Void> clearContainer(final String container) {
-      storageStrategy.clearContainer(container);
-      return immediateFuture(null);
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public ListenableFuture<Void> deleteContainer(final String container) {
-      deleteAndVerifyContainerGone(container);
-      return immediateFuture(null);
-   }
-
-   public ListenableFuture<Boolean> deleteContainerIfEmpty(final String container) {
-      Boolean returnVal = true;
-      if (storageStrategy.containerExists(container)) {
-         if (Iterables.isEmpty(storageStrategy.getBlobKeysInsideContainer(container)))
-            storageStrategy.deleteContainer(container);
-         else
-            returnVal = false;
-      }
-      return immediateFuture(returnVal);
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public ListenableFuture<Boolean> containerExists(final String containerName) {
-      return immediateFuture(storageStrategy.containerExists(containerName));
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public ListenableFuture<PageSet<? extends StorageMetadata>> list() {
-      Iterable<String> containers = storageStrategy.getAllContainerNames();
-
-      return Futures.<PageSet<? extends StorageMetadata>> immediateFuture(new PageSetImpl<StorageMetadata>(transform(
-            containers, new Function<String, StorageMetadata>() {
-               public StorageMetadata apply(String name) {
-                  MutableStorageMetadata cmd = create();
-                  cmd.setName(name);
-                  cmd.setType(StorageType.CONTAINER);
-                  cmd.setLocation(storageStrategy.getLocation(name));
-                  return cmd;
-               }
-            }), null));
-   }
-
-   protected MutableStorageMetadata create() {
-      return new MutableStorageMetadataImpl();
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public ListenableFuture<Boolean> createContainerInLocation(final Location location,
-         final String name) {
-      boolean result = storageStrategy.createContainerInLocation(name, location);
-      return immediateFuture(result);
-   }
-
-   private Blob loadBlob(final String container, final String key) {
-      logger.debug("Opening blob in container: %s - %s", container, key);
-      return storageStrategy.getBlob(container, key);
-   }
-
-   protected static class DelimiterFilter implements Predicate<StorageMetadata> {
-      private final String prefix;
-      private final String delimiter;
-
-      public DelimiterFilter(String prefix, String delimiter) {
-         this.prefix = prefix;
-         this.delimiter = delimiter;
-      }
-
-      public boolean apply(StorageMetadata metadata) {
-         if (prefix == null)
-            return metadata.getName().indexOf(delimiter) == -1;
-         // ensure we don't accidentally append twice
-         String toMatch = prefix.endsWith("/") ? prefix : prefix + delimiter;
-         if (metadata.getName().startsWith(toMatch)) {
-            String unprefixedName = metadata.getName().replaceFirst(toMatch, "");
-            if (unprefixedName.equals("")) {
-               // we are the prefix in this case, return false
-               return false;
-            }
-            return unprefixedName.indexOf(delimiter) == -1;
-         }
-         return false;
-      }
-   }
-
-   protected static class CommonPrefixes implements Function<StorageMetadata, String> {
-      private final String prefix;
-      private final String delimiter;
-      public static final String NO_PREFIX = "NO_PREFIX";
-
-      public CommonPrefixes(String prefix, String delimiter) {
-         this.prefix = prefix;
-         this.delimiter = delimiter;
-      }
-
-      public String apply(StorageMetadata metadata) {
-         String working = metadata.getName();
-         if (prefix != null) {
-            // ensure we don't accidentally append twice
-            String toMatch = prefix.endsWith("/") ? prefix : prefix + delimiter;
-            if (working.startsWith(toMatch)) {
-               working = working.replaceFirst(toMatch, "");
-            }
-         }
-         if (working.contains(delimiter)) {
-            return working.substring(0, working.indexOf(delimiter));
-         }
-         return NO_PREFIX;
-      }
-   }
-
-   public static HttpResponseException returnResponseException(int code) {
-      HttpResponse response = HttpResponse.builder().statusCode(code).build();
-      return new HttpResponseException(new HttpCommand() {
-
-         public int getRedirectCount() {
-            return 0;
-         }
-
-         public int incrementRedirectCount() {
-            return 0;
-         }
-
-         public boolean isReplayable() {
-            return false;
-         }
-
-         public Exception getException() {
-            return null;
-         }
-
-         public int getFailureCount() {
-            return 0;
-         }
-
-         public int incrementFailureCount() {
-            return 0;
-         }
-
-         public void setException(Exception exception) {
-
-         }
-
-         @Override
-         public HttpRequest getCurrentRequest() {
-            return HttpRequest.builder().method("GET").endpoint("http://stub").build();
-         }
-
-         @Override
-         public void setCurrentRequest(HttpRequest request) {
-
-         }
-
-      }, response);
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public ListenableFuture<String> putBlob(String containerName, Blob blob) {
-      checkNotNull(containerName, "containerName must be set");
-      checkNotNull(blob, "blob must be set");
-      String blobKey = blob.getMetadata().getName();
-
-      logger.debug("Put blob with key [%s] to container [%s]", blobKey, containerName);
-      if (!storageStrategy.containerExists(containerName)) {
-         return Futures.immediateFailedFuture(new IllegalStateException("containerName not found: " + containerName));
-      }
-
-      blob = createUpdatedCopyOfBlobInContainer(containerName, blob);
-
-      storageStrategy.putBlob(containerName, blob);
-
-      String eTag = getEtag(blob);
-      return immediateFuture(eTag);
-   }
-
-   private Blob createUpdatedCopyOfBlobInContainer(String containerName, Blob in) {
-      checkNotNull(in, "blob");
-      checkNotNull(in.getPayload(), "blob.payload");
-      ByteArrayPayload payload = (in.getPayload() instanceof ByteArrayPayload) ? ByteArrayPayload.class.cast(in
-               .getPayload()) : null;
-      if (payload == null)
-         payload = (in.getPayload() instanceof DelegatingPayload) ? (DelegatingPayload.class.cast(in.getPayload())
-                  .getDelegate() instanceof ByteArrayPayload) ? ByteArrayPayload.class.cast(DelegatingPayload.class
-                  .cast(in.getPayload()).getDelegate()) : null : null;
-      try {
-         if (payload == null || !(payload instanceof ByteArrayPayload)) {
-            MutableContentMetadata oldMd = in.getPayload().getContentMetadata();
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
-            in.getPayload().writeTo(out);
-            payload = (ByteArrayPayload) Payloads.calculateMD5(Payloads.newPayload(out.toByteArray()));
-            HttpUtils.copy(oldMd, payload.getContentMetadata());
-         } else {
-            if (payload.getContentMetadata().getContentMD5() == null)
-               Payloads.calculateMD5(in, crypto.md5());
-         }
-      } catch (IOException e) {
-         Throwables.propagate(e);
-      }
-      Blob blob = blobFactory.create(copy(in.getMetadata()));
-      blob.setPayload(payload);
-      blob.getMetadata().setContainer(containerName);
-      blob.getMetadata().setUri(
-               uriBuilders.get().scheme("mem").host(containerName).path(in.getMetadata().getName()).build());
-      blob.getMetadata().setLastModified(new Date());
-      String eTag = CryptoStreams.hex(payload.getContentMetadata().getContentMD5());
-      blob.getMetadata().setETag(eTag);
-      // Set HTTP headers to match metadata
-      blob.getAllHeaders().replaceValues(HttpHeaders.LAST_MODIFIED,
-               Collections.singleton(dateService.rfc822DateFormat(blob.getMetadata().getLastModified())));
-      blob.getAllHeaders().replaceValues(HttpHeaders.ETAG, Collections.singleton(eTag));
-      copyPayloadHeadersToBlob(payload, blob);
-      blob.getAllHeaders().putAll(Multimaps.forMap(blob.getMetadata().getUserMetadata()));
-      return blob;
-   }
-
-   private void copyPayloadHeadersToBlob(Payload payload, Blob blob) {
-      blob.getAllHeaders().putAll(contentMetadataCodec.toHeaders(payload.getContentMetadata()));
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public ListenableFuture<Boolean> blobExists(final String containerName, final String key) {
-      if (!storageStrategy.containerExists(containerName))
-         return immediateFailedFuture(cnfe(containerName));
-      return immediateFuture(storageStrategy.blobExists(containerName, key));
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public ListenableFuture<Blob> getBlob(final String containerName, final String key, GetOptions options) {
-      logger.debug("Retrieving blob with key %s from container %s", key, containerName);
-      // If the container doesn't exist, an exception is thrown
-      if (!storageStrategy.containerExists(containerName)) {
-         logger.debug("Container %s does not exist", containerName);
-         return immediateFailedFuture(cnfe(containerName));
-      }
-      // If the blob doesn't exist, a null object is returned
-      if (!storageStrategy.blobExists(containerName, key)) {
-         logger.debug("Item %s does not exist in container %s", key, containerName);
-         return immediateFuture(null);
-      }
-
-      Blob blob = loadBlob(containerName, key);
-
-      if (options != null) {
-         if (options.getIfMatch() != null) {
-            if (!blob.getMetadata().getETag().equals(options.getIfMatch()))
-               return immediateFailedFuture(returnResponseException(412));
-         }
-         if (options.getIfNoneMatch() != null) {
-            if (blob.getMetadata().getETag().equals(options.getIfNoneMatch()))
-               return immediateFailedFuture(returnResponseException(304));
-         }
-         if (options.getIfModifiedSince() != null) {
-            Date modifiedSince = options.getIfModifiedSince();
-            if (blob.getMetadata().getLastModified().before(modifiedSince)) {
-               HttpResponse response = HttpResponse.builder().statusCode(304).build();
-               return immediateFailedFuture(new HttpResponseException(String.format("%1$s is before %2$s", blob
-                     .getMetadata().getLastModified(), modifiedSince), null, response));
-            }
-
-         }
-         if (options.getIfUnmodifiedSince() != null) {
-            Date unmodifiedSince = options.getIfUnmodifiedSince();
-            if (blob.getMetadata().getLastModified().after(unmodifiedSince)) {
-               HttpResponse response = HttpResponse.builder().statusCode(412).build();
-               return immediateFailedFuture(new HttpResponseException(String.format("%1$s is after %2$s", blob
-                     .getMetadata().getLastModified(), unmodifiedSince), null, response));
-            }
-         }
-         blob = copyBlob(blob);
-
-         if (options.getRanges() != null && options.getRanges().size() > 0) {
-            byte[] data;
-            try {
-               data = toByteArray(blob.getPayload());
-            } catch (IOException e) {
-               return immediateFailedFuture(new RuntimeException(e));
-            }
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
-            for (String s : options.getRanges()) {
-               // HTTP uses a closed interval while Java array indexing uses a
-               // half-open interval.
-               int offset = 0;
-               int last = data.length - 1;
-               if (s.startsWith("-")) {
-                  offset = last - Integer.parseInt(s.substring(1)) + 1;
-               } else if (s.endsWith("-")) {
-                  offset = Integer.parseInt(s.substring(0, s.length() - 1));
-               } else if (s.contains("-")) {
-                  String[] firstLast = s.split("\\-");
-                  offset = Integer.parseInt(firstLast[0]);
-                  last = Integer.parseInt(firstLast[1]);
-               } else {
-                  return immediateFailedFuture(new IllegalArgumentException("illegal range: " + s));
-               }
-
-               if (offset > last) {
-                  return immediateFailedFuture(new IllegalArgumentException("illegal range: " + s));
-               }
-               if (last + 1 > data.length) {
-                  last = data.length - 1;
-               }
-               out.write(data, offset, last - offset + 1);
-            }
-            ContentMetadata cmd = blob.getPayload().getContentMetadata();
-            byte[] byteArray = out.toByteArray();
-            blob.setPayload(byteArray);
-            HttpUtils.copy(cmd, blob.getPayload().getContentMetadata());
-            blob.getPayload().getContentMetadata().setContentLength(new Long(byteArray.length));
-         }
-      }
-      checkNotNull(blob.getPayload(), "payload " + blob);
-      return immediateFuture(blob);
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @Override
-   public ListenableFuture<BlobMetadata> blobMetadata(final String container, final String key) {
-      try {
-         Blob blob = getBlob(container, key).get();
-         return immediateFuture(blob != null ? (BlobMetadata) copy(blob.getMetadata()) : null);
-      } catch (Exception e) {
-         if (size(filter(getCausalChain(e), KeyNotFoundException.class)) >= 1)
-            return immediateFuture(null);
-         return immediateFailedFuture(e);
-      }
-   }
-
-   /**
-    * Calculates the object MD5 and returns it as eTag
-    * 
-    * @param object
-    * @return
-    */
-   private String getEtag(Blob object) {
-      try {
-         Payloads.calculateMD5(object, crypto.md5());
-      } catch (IOException ex) {
-         logger.error(ex, "An error occurred calculating MD5 for object with name %s.", object.getMetadata().getName());
-         Throwables.propagate(ex);
-      }
-
-      String eTag = CryptoStreams.hex(object.getPayload().getContentMetadata().getContentMD5());
-      return eTag;
-   }
-
-   private Blob copyBlob(Blob blob) {
-      Blob returnVal = blobFactory.create(copy(blob.getMetadata()));
-      returnVal.setPayload(blob.getPayload());
-      copyPayloadHeadersToBlob(blob.getPayload(), returnVal);
-      return returnVal;
-   }
-
-   @Override
-   protected boolean deleteAndVerifyContainerGone(final String container) {
-      storageStrategy.deleteContainer(container);
-      return storageStrategy.containerExists(container);
-   }
-
-   @Override
-   public ListenableFuture<String> putBlob(String container, Blob blob, PutOptions options) {
-      // TODO implement options
-      return putBlob(container, blob);
-   }
-
-   @Override
-   public ListenableFuture<Boolean> createContainerInLocation(Location location, String container,
-         CreateContainerOptions options) {
-      if (options.isPublicRead())
-         throw new UnsupportedOperationException("publicRead");
-      return createContainerInLocation(location, container);
-   }
-}
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
index 611e93b..54d9067 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
@@ -18,37 +18,87 @@
  */
 package org.jclouds.blobstore;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Date;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import javax.inject.Provider;
+import javax.inject.Inject;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.UriBuilder;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Supplier;
+import com.google.common.base.Throwables;
+import com.google.common.collect.Multimaps;
 
 import org.jclouds.blobstore.domain.Blob;
+import org.jclouds.blobstore.domain.Blob.Factory;
+import org.jclouds.blobstore.domain.MutableBlobMetadata;
+import org.jclouds.blobstore.options.ListContainerOptions;
+import org.jclouds.blobstore.util.BlobStoreUtils;
+import org.jclouds.crypto.Crypto;
+import org.jclouds.crypto.CryptoStreams;
+import org.jclouds.date.DateService;
 import org.jclouds.domain.Location;
+import org.jclouds.http.HttpUtils;
+import org.jclouds.io.ContentMetadataCodec;
+import org.jclouds.io.MutableContentMetadata;
+import org.jclouds.io.Payload;
+import org.jclouds.io.Payloads;
+import org.jclouds.io.payloads.ByteArrayPayload;
+import org.jclouds.io.payloads.DelegatingPayload;
 
-public class TransientStorageStrategy {
+public class TransientStorageStrategy implements LocalStorageStrategy {
    private final ConcurrentMap<String, ConcurrentMap<String, Blob>> containerToBlobs = new ConcurrentHashMap<String, ConcurrentMap<String, Blob>>();
    private final ConcurrentMap<String, Location> containerToLocation = new ConcurrentHashMap<String, Location>();
    private final Supplier<Location> defaultLocation;
+   private final DateService dateService;
+   private final Factory blobFactory;
+   private final Crypto crypto;
+   private final ContentMetadataCodec contentMetadataCodec;
+   private final Provider<UriBuilder> uriBuilders;
 
-   public TransientStorageStrategy(final Supplier<Location> defaultLocation) {
-      this.defaultLocation = Preconditions.checkNotNull(defaultLocation);
+   @Inject
+   TransientStorageStrategy(final Supplier<Location> defaultLocation,
+         DateService dateService, Factory blobFactory, Crypto crypto,
+         ContentMetadataCodec contentMetadataCodec,
+         Provider<UriBuilder> uriBuilders) {
+      this.defaultLocation = defaultLocation;
+      this.dateService = dateService;
+      this.blobFactory = blobFactory;
+      this.crypto = crypto;
+      this.contentMetadataCodec = contentMetadataCodec;
+      this.uriBuilders = uriBuilders;
    }
 
+   @Override
    public Iterable<String> getAllContainerNames() {
       return containerToBlobs.keySet();
    }
 
+   @Override
    public boolean containerExists(final String containerName) {
       return containerToBlobs.containsKey(containerName);
    }
 
+   @Override
    public void clearContainer(final String containerName) {
       containerToBlobs.get(containerName).clear();
    }
 
+   @Override
+   public void clearContainer(String container, ListContainerOptions options) {
+      // TODO implement options
+      clearContainer(container);
+   }
+
+   @Override
    public boolean createContainerInLocation(final String containerName, final Location location) {
       ConcurrentMap<String, Blob> origValue = containerToBlobs.putIfAbsent(
             containerName, new ConcurrentHashMap<String, Blob>());
@@ -59,36 +109,96 @@
       return true;
    }
 
+   @Override
    public void deleteContainer(final String containerName) {
       containerToBlobs.remove(containerName);
    }
 
+   @Override
    public boolean blobExists(final String containerName, final String blobName) {
       Map<String, Blob> map = containerToBlobs.get(containerName);
       return map != null && map.containsKey(blobName);
    }
 
+   @Override
    public Blob getBlob(final String containerName, final String blobName) {
       Map<String, Blob> map = containerToBlobs.get(containerName);
       return map == null ? null : map.get(blobName);
    }
 
-   public void putBlob(final String containerName, final Blob blob) {
+   @Override
+   public String putBlob(final String containerName, final Blob blob) throws IOException {
+      Blob newBlob = createUpdatedCopyOfBlobInContainer(containerName, blob);
       Map<String, Blob> map = containerToBlobs.get(containerName);
-      map.put(blob.getMetadata().getName(), blob);
+      map.put(newBlob.getMetadata().getName(), newBlob);
+      Payloads.calculateMD5(newBlob, crypto.md5());
+      String eTag = CryptoStreams.hex(newBlob.getPayload().getContentMetadata().getContentMD5());
+      return eTag;
    }
 
+   @Override
    public void removeBlob(final String containerName, final String blobName) {
       Map<String, Blob> map = containerToBlobs.get(containerName);
       if (map != null)
          map.remove(blobName);
    }
 
+   @Override
    public Iterable<String> getBlobKeysInsideContainer(final String containerName) {
       return containerToBlobs.get(containerName).keySet();
    }
 
+   @Override
    public Location getLocation(final String containerName) {
       return containerToLocation.get(containerName);
    }
+
+   @Override
+   public String getSeparator() {
+      return "/";
+   }
+
+   private Blob createUpdatedCopyOfBlobInContainer(String containerName, Blob in) {
+      checkNotNull(in, "blob");
+      checkNotNull(in.getPayload(), "blob.payload");
+      ByteArrayPayload payload = (in.getPayload() instanceof ByteArrayPayload) ? ByteArrayPayload.class.cast(in
+               .getPayload()) : null;
+      if (payload == null)
+         payload = (in.getPayload() instanceof DelegatingPayload) ? (DelegatingPayload.class.cast(in.getPayload())
+                  .getDelegate() instanceof ByteArrayPayload) ? ByteArrayPayload.class.cast(DelegatingPayload.class
+                  .cast(in.getPayload()).getDelegate()) : null : null;
+      try {
+         if (payload == null || !(payload instanceof ByteArrayPayload)) {
+            MutableContentMetadata oldMd = in.getPayload().getContentMetadata();
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            in.getPayload().writeTo(out);
+            payload = (ByteArrayPayload) Payloads.calculateMD5(Payloads.newPayload(out.toByteArray()));
+            HttpUtils.copy(oldMd, payload.getContentMetadata());
+         } else {
+            if (payload.getContentMetadata().getContentMD5() == null)
+               Payloads.calculateMD5(in, crypto.md5());
+         }
+      } catch (IOException e) {
+         Throwables.propagate(e);
+      }
+      Blob blob = blobFactory.create(BlobStoreUtils.copy(in.getMetadata()));
+      blob.setPayload(payload);
+      blob.getMetadata().setContainer(containerName);
+      blob.getMetadata().setUri(
+               uriBuilders.get().scheme("mem").host(containerName).path(in.getMetadata().getName()).build());
+      blob.getMetadata().setLastModified(new Date());
+      String eTag = CryptoStreams.hex(payload.getContentMetadata().getContentMD5());
+      blob.getMetadata().setETag(eTag);
+      // Set HTTP headers to match metadata
+      blob.getAllHeaders().replaceValues(HttpHeaders.LAST_MODIFIED,
+               Collections.singleton(dateService.rfc822DateFormat(blob.getMetadata().getLastModified())));
+      blob.getAllHeaders().replaceValues(HttpHeaders.ETAG, Collections.singleton(eTag));
+      copyPayloadHeadersToBlob(payload, blob);
+      blob.getAllHeaders().putAll(Multimaps.forMap(blob.getMetadata().getUserMetadata()));
+      return blob;
+   }
+
+   private void copyPayloadHeadersToBlob(Payload payload, Blob blob) {
+      blob.getAllHeaders().putAll(contentMetadataCodec.toHeaders(payload.getContentMetadata()));
+   }
 }
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
similarity index 94%
rename from blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStore.java
rename to blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
index b088d5f..3c33c23 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStore.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
@@ -24,6 +24,6 @@
 import org.jclouds.concurrent.Timeout;
 
 @Timeout(duration = 2, timeUnit = TimeUnit.MINUTES)
-public interface TransientBlobStore extends BlobStore {
+public interface LocalBlobStore extends BlobStore {
 
-}
\ No newline at end of file
+}
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStoreContextModule.java b/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStoreContextModule.java
index 659d273..e5bdb32 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStoreContextModule.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStoreContextModule.java
@@ -21,8 +21,10 @@
 import org.jclouds.blobstore.AsyncBlobStore;
 import org.jclouds.blobstore.BlobRequestSigner;
 import org.jclouds.blobstore.BlobStore;
-import org.jclouds.blobstore.TransientAsyncBlobStore;
+import org.jclouds.blobstore.LocalAsyncBlobStore;
+import org.jclouds.blobstore.LocalStorageStrategy;
 import org.jclouds.blobstore.TransientBlobRequestSigner;
+import org.jclouds.blobstore.TransientStorageStrategy;
 import org.jclouds.blobstore.attr.ConsistencyModel;
 import org.jclouds.rest.config.BinderUtils;
 
@@ -37,13 +39,14 @@
 public class TransientBlobStoreContextModule extends AbstractModule {
    @Override
    protected void configure() {
-      bind(AsyncBlobStore.class).to(TransientAsyncBlobStore.class).asEagerSingleton();
+      bind(AsyncBlobStore.class).to(LocalAsyncBlobStore.class).asEagerSingleton();
       // forward all requests from TransientBlobStore to TransientAsyncBlobStore.  needs above binding as cannot proxy a class
-      BinderUtils.bindClient(binder(), TransientBlobStore.class, AsyncBlobStore.class, ImmutableMap.<Class<?>, Class<?>>of());
+      BinderUtils.bindClient(binder(), LocalBlobStore.class, AsyncBlobStore.class, ImmutableMap.<Class<?>, Class<?>>of());
       install(new BlobStoreObjectModule());
       install(new BlobStoreMapModule());
-      bind(BlobStore.class).to(TransientBlobStore.class);
+      bind(BlobStore.class).to(LocalBlobStore.class);
       bind(ConsistencyModel.class).toInstance(ConsistencyModel.STRICT);
+      bind(LocalStorageStrategy.class).to(TransientStorageStrategy.class);
       bind(BlobRequestSigner.class).to(TransientBlobRequestSigner.class);
    }
 
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/util/BlobStoreUtils.java b/blobstore/src/main/java/org/jclouds/blobstore/util/BlobStoreUtils.java
index 15e3554..bc1bd98 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/util/BlobStoreUtils.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/util/BlobStoreUtils.java
@@ -20,8 +20,15 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.ObjectInput;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -32,6 +39,7 @@
 import org.jclouds.blobstore.KeyNotFoundException;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.domain.BlobMetadata;
+import org.jclouds.blobstore.domain.MutableBlobMetadata;
 import org.jclouds.blobstore.domain.StorageMetadata;
 import org.jclouds.blobstore.functions.BlobName;
 import org.jclouds.functions.ExceptionToValueOrPropagate;
@@ -41,6 +49,8 @@
 import org.jclouds.rest.internal.GeneratedHttpRequest;
 import org.jclouds.util.Strings2;
 
+import com.google.common.base.Throwables;
+import com.google.common.collect.Maps;
 import com.google.common.reflect.TypeToken;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -159,4 +169,34 @@
    public static Iterable<String> getSupportedProviders() {
       return org.jclouds.rest.Providers.getSupportedProvidersOfType(TypeToken.of(BlobStoreContext.class));
    }
-}
\ No newline at end of file
+
+   public static MutableBlobMetadata copy(MutableBlobMetadata in) {
+      ByteArrayOutputStream bout = new ByteArrayOutputStream();
+      ObjectOutput os;
+      try {
+         os = new ObjectOutputStream(bout);
+         os.writeObject(in);
+         ObjectInput is = new ObjectInputStream(new ByteArrayInputStream(bout.toByteArray()));
+         MutableBlobMetadata metadata = (MutableBlobMetadata) is.readObject();
+         convertUserMetadataKeysToLowercase(metadata);
+         HttpUtils.copy(in.getContentMetadata(), metadata.getContentMetadata());
+         return metadata;
+      } catch (Exception e) {
+         throw Throwables.propagate(e);
+      }
+   }
+
+   public static MutableBlobMetadata copy(MutableBlobMetadata in, String newKey) {
+      MutableBlobMetadata newMd = BlobStoreUtils.copy(in);
+      newMd.setName(newKey);
+      return newMd;
+   }
+
+   private static void convertUserMetadataKeysToLowercase(MutableBlobMetadata metadata) {
+      Map<String, String> lowerCaseUserMetadata = Maps.newHashMap();
+      for (Map.Entry<String, String> entry : metadata.getUserMetadata().entrySet()) {
+         lowerCaseUserMetadata.put(entry.getKey().toLowerCase(), entry.getValue());
+      }
+      metadata.setUserMetadata(lowerCaseUserMetadata);
+   }
+}
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java b/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java
index 39a0679..445accb 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java
@@ -42,7 +42,7 @@
  */
 // NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
 @Test(groups = "unit", testName = "TransientBlobRequestSignerTest")
-public class TransientBlobRequestSignerTest extends BaseAsyncClientTest<TransientAsyncBlobStore> {
+public class TransientBlobRequestSignerTest extends BaseAsyncClientTest<LocalAsyncBlobStore> {
 
    private BlobRequestSigner signer;
    private Provider<BlobBuilder> blobFactory;
@@ -121,8 +121,8 @@
    }
 
    @Override
-   protected TypeLiteral<RestAnnotationProcessor<TransientAsyncBlobStore>> createTypeLiteral() {
-      return new TypeLiteral<RestAnnotationProcessor<TransientAsyncBlobStore>>() {
+   protected TypeLiteral<RestAnnotationProcessor<LocalAsyncBlobStore>> createTypeLiteral() {
+      return new TypeLiteral<RestAnnotationProcessor<LocalAsyncBlobStore>>() {
       };
    }
 
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/binders/BindBlobToMultipartFormTest.java b/blobstore/src/test/java/org/jclouds/blobstore/binders/BindBlobToMultipartFormTest.java
index 94a37fa..f532551 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/binders/BindBlobToMultipartFormTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/binders/BindBlobToMultipartFormTest.java
@@ -65,8 +65,8 @@
       HttpRequest request = HttpRequest.builder().method("GET").endpoint("http://localhost:8001").build();
       binder.bindToRequest(request, TEST_BLOB);
 
-      assertEquals(Strings2.toStringAndClose(request.getPayload().getInput()), EXPECTS);
-      assertEquals(request.getPayload().getContentMetadata().getContentLength(), new Long(113));
+      assertEquals(Strings2.toString(request.getPayload()), EXPECTS);
+      assertEquals(request.getPayload().getContentMetadata().getContentLength(), Long.valueOf(113));
 
       assertEquals(request.getPayload().getContentMetadata().getContentType(), "multipart/form-data; boundary="
             + BOUNDARY);
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/functions/ParseBlobFromHeadersAndHttpContentTest.java b/blobstore/src/test/java/org/jclouds/blobstore/functions/ParseBlobFromHeadersAndHttpContentTest.java
index 1cc15cd..693087b 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/functions/ParseBlobFromHeadersAndHttpContentTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/functions/ParseBlobFromHeadersAndHttpContentTest.java
@@ -85,7 +85,7 @@
       replay(metadataParser);
 
       Blob object = callable.apply(response);
-      assertEquals(object.getPayload().getContentMetadata().getContentLength(), new Long(10485760));
+      assertEquals(object.getPayload().getContentMetadata().getContentLength(), Long.valueOf(10485760));
       assertEquals(object.getAllHeaders().get("Content-Range"), Collections.singletonList("0-10485759/20232760"));
 
    }
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/functions/ReturnFalseOnContainerNotFoundTest.java b/blobstore/src/test/java/org/jclouds/blobstore/functions/ReturnFalseOnContainerNotFoundTest.java
index 8742cc1..ae094c7 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/functions/ReturnFalseOnContainerNotFoundTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/functions/ReturnFalseOnContainerNotFoundTest.java
@@ -33,7 +33,7 @@
 
    @Test
    public void testFoundIsFalse() throws SecurityException, NoSuchMethodException {
-      assertEquals(fn.apply(new ContainerNotFoundException()), new Boolean(false));
+      assertEquals(fn.apply(new ContainerNotFoundException()), Boolean.FALSE);
    }
 
    @Test(expectedExceptions = { RuntimeException.class })
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/functions/ReturnFalseOnKeyNotFoundTest.java b/blobstore/src/test/java/org/jclouds/blobstore/functions/ReturnFalseOnKeyNotFoundTest.java
index efd19bf..a6f02fc 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/functions/ReturnFalseOnKeyNotFoundTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/functions/ReturnFalseOnKeyNotFoundTest.java
@@ -33,7 +33,7 @@
 
    @Test
    public void testFoundIsFalse() throws SecurityException, NoSuchMethodException {
-      assertEquals(fn.apply(new KeyNotFoundException()), new Boolean(false));
+      assertEquals(fn.apply(new KeyNotFoundException()), Boolean.FALSE);
    }
 
    @Test(expectedExceptions = { RuntimeException.class })
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
index 20616a1..68e7cc4 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java
@@ -637,7 +637,7 @@
    protected void validateMetadata(BlobMetadata metadata) throws IOException {
       assert metadata.getContentMetadata().getContentType().startsWith("text/plain") : metadata.getContentMetadata()
                .getContentType();
-      assertEquals(metadata.getContentMetadata().getContentLength(), new Long(TEST_STRING.length()));
+      assertEquals(metadata.getContentMetadata().getContentLength(), Long.valueOf(TEST_STRING.length()));
       assertEquals(metadata.getUserMetadata().get("adrian"), "powderpuff");
       checkMD5(metadata);
    }
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobSignerLiveTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobSignerLiveTest.java
index 9b9a140..200f439 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobSignerLiveTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobSignerLiveTest.java
@@ -67,7 +67,7 @@
          assertConsistencyAwareContainerSize(container, 1);
          HttpRequest request = view.getSigner().signGetBlob(container, name);
          assertEquals(request.getFilters().size(), 0);
-         assertEquals(Strings2.toStringAndClose(view.utils().http().invoke(request).getPayload().getInput()), text);
+         assertEquals(Strings2.toString(view.utils().http().invoke(request).getPayload()), text);
       } finally {
          returnContainer(container);
       }
@@ -85,7 +85,7 @@
          assertConsistencyAwareContainerSize(container, 1);
          HttpRequest request = view.getSigner().signGetBlob(container, name, range(0, 1));
          assertEquals(request.getFilters().size(), 0);
-         assertEquals(Strings2.toStringAndClose(view.utils().http().invoke(request).getPayload().getInput()), "fo");
+         assertEquals(Strings2.toString(view.utils().http().invoke(request).getPayload()), "fo");
       } finally {
          returnContainer(container);
       }
@@ -101,7 +101,7 @@
       try {
          HttpRequest request = view.getSigner().signPutBlob(container, blob);
          assertEquals(request.getFilters().size(), 0);
-         Strings2.toStringAndClose(view.utils().http().invoke(request).getPayload().getInput());
+         Strings2.toString(view.utils().http().invoke(request).getPayload());
          assertConsistencyAwareContainerSize(container, 1);
       } finally {
          returnContainer(container);
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java
index 5ed397c..6a4ec3d 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java
@@ -88,7 +88,7 @@
 
          assert metadata.getContentMetadata().getContentType().startsWith("text/plain") : metadata.getContentMetadata()
                .getContentType();
-         assertEquals(metadata.getContentMetadata().getContentLength(), new Long(TEST_STRING.length()));
+         assertEquals(metadata.getContentMetadata().getContentLength(), Long.valueOf(TEST_STRING.length()));
          assertEquals(metadata.getUserMetadata().get("adrian"), "powderpuff");
          checkMD5(metadata);
       } finally {
diff --git a/blobstore/src/test/java/org/jclouds/blobstore/options/ListOptionsTest.java b/blobstore/src/test/java/org/jclouds/blobstore/options/ListOptionsTest.java
index 7965112..db2e5b0 100644
--- a/blobstore/src/test/java/org/jclouds/blobstore/options/ListOptionsTest.java
+++ b/blobstore/src/test/java/org/jclouds/blobstore/options/ListOptionsTest.java
@@ -64,7 +64,7 @@
       ListContainerOptions options = new ListContainerOptions();
       options.inDirectory("test").maxResults(1);
       assertEquals(options.getDir(), "test");
-      assertEquals(options.getMaxResults(), new Integer(1));
+      assertEquals(options.getMaxResults(), Integer.valueOf(1));
 
    }
 
@@ -108,7 +108,7 @@
    public void testMaxResults() {
       ListContainerOptions options = new ListContainerOptions();
       options.maxResults(1000);
-      assertEquals(options.getMaxResults(), new Integer(1000));
+      assertEquals(options.getMaxResults(), Integer.valueOf(1000));
    }
 
    @Test
@@ -120,7 +120,7 @@
    @Test
    public void testMaxResultsStatic() {
       ListContainerOptions options = maxResults(1000);
-      assertEquals(options.getMaxResults(), new Integer(1000));
+      assertEquals(options.getMaxResults(), Integer.valueOf(1000));
    }
 
    @Test(expectedExceptions = IllegalArgumentException.class)
diff --git a/common/aws/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java b/common/aws/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java
index 615801b..fa4b7da 100644
--- a/common/aws/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java
+++ b/common/aws/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java
@@ -81,7 +81,7 @@
                }
             } else {
                try {
-                  message = Strings2.toStringAndClose(response.getPayload().getInput());
+                  message = Strings2.toString(response.getPayload());
                   exception = new HttpResponseException(command, response, message);
                } catch (IOException e) {
                }
diff --git a/common/azure/src/main/java/org/jclouds/azure/storage/handlers/ParseAzureStorageErrorFromXmlContent.java b/common/azure/src/main/java/org/jclouds/azure/storage/handlers/ParseAzureStorageErrorFromXmlContent.java
index 017d293..6da5961 100644
--- a/common/azure/src/main/java/org/jclouds/azure/storage/handlers/ParseAzureStorageErrorFromXmlContent.java
+++ b/common/azure/src/main/java/org/jclouds/azure/storage/handlers/ParseAzureStorageErrorFromXmlContent.java
@@ -67,7 +67,7 @@
          if (response.getPayload() != null) {
             String contentType = response.getPayload().getContentMetadata().getContentType();
             if (contentType != null && (contentType.indexOf("xml") != -1 || contentType.indexOf("unknown") != -1)
-                     && !new Long(0).equals(response.getPayload().getContentMetadata().getContentLength())) {
+                     && !Long.valueOf(0).equals(response.getPayload().getContentMetadata().getContentLength())) {
                try {
                   error = utils.parseAzureStorageErrorFromContent(command, response, response.getPayload().getInput());
                   if (error != null) {
@@ -76,14 +76,14 @@
                   }
                } catch (RuntimeException e) {
                   try {
-                     message = Strings2.toStringAndClose(response.getPayload().getInput());
+                     message = Strings2.toString(response.getPayload());
                      exception = new HttpResponseException(command, response, message);
                   } catch (IOException e1) {
                   }
                }
             } else {
                try {
-                  message = Strings2.toStringAndClose(response.getPayload().getInput());
+                  message = Strings2.toString(response.getPayload());
                   exception = new HttpResponseException(command, response, message);
                } catch (IOException e) {
                }
diff --git a/common/azure/src/main/java/org/jclouds/azure/storage/options/ListOptions.java b/common/azure/src/main/java/org/jclouds/azure/storage/options/ListOptions.java
index c84edab..d58a868 100644
--- a/common/azure/src/main/java/org/jclouds/azure/storage/options/ListOptions.java
+++ b/common/azure/src/main/java/org/jclouds/azure/storage/options/ListOptions.java
@@ -94,7 +94,7 @@
 
    public Integer getMaxResults() {
       String maxresults = getFirstQueryOrNull("maxresults");
-      return (maxresults != null) ? new Integer(maxresults) : null;
+      return (maxresults != null) ? Integer.valueOf(maxresults) : null;
    }
 
    public static class Builder {
diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/BindVAppConfigurationToXmlPayload.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/BindVAppConfigurationToXmlPayload.java
index 9fdd47a..f551a1e 100644
--- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/BindVAppConfigurationToXmlPayload.java
+++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/BindVAppConfigurationToXmlPayload.java
@@ -137,7 +137,7 @@
    private void addDiskItems(XMLBuilder sectionBuilder, VApp vApp, VAppConfiguration configuration) {
       for (ResourceAllocationSettingData disk : filter(vApp.getResourceAllocations(), CIMPredicates
                .resourceTypeIn(ResourceType.DISK_DRIVE))) {
-         if (!configuration.getDisksToDelete().contains(new Integer(disk.getAddressOnParent()))) {
+         if (!configuration.getDisksToDelete().contains(Integer.valueOf(disk.getAddressOnParent()))) {
             addDiskWithQuantity(sectionBuilder, disk);
          }
       }
diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/handlers/ParseTerremarkVCloudErrorFromHttpResponse.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/handlers/ParseTerremarkVCloudErrorFromHttpResponse.java
index bfacd23..ae8c3bc 100644
--- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/handlers/ParseTerremarkVCloudErrorFromHttpResponse.java
+++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/handlers/ParseTerremarkVCloudErrorFromHttpResponse.java
@@ -101,7 +101,7 @@
    String parseErrorFromContentOrNull(HttpCommand command, HttpResponse response) {
       if (response.getPayload() != null) {
          try {
-            return Strings2.toStringAndClose(response.getPayload().getInput());
+            return Strings2.toString(response.getPayload());
          } catch (IOException e) {
             logger.warn(e, "exception reading error from response", response);
          }
diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/xml/VAppHandler.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/xml/VAppHandler.java
index c4283f1..f896411 100644
--- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/xml/VAppHandler.java
+++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/xml/VAppHandler.java
@@ -91,7 +91,7 @@
          String statusString = attributes.get("status");
          status = Status.fromValue(statusString);
          if (attributes.containsKey("size"))
-            size = new Long(attributes.get("size"));
+            size = Long.valueOf(attributes.get("size"));
       } else if (qName.equals("Link")) { // type should never be missing
          if (attributes.containsKey("type")) {
             if (attributes.get("type").equals(TerremarkVCloudMediaType.VDC_XML)) {
diff --git a/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/options/InstantiateVAppTemplateOptionsTest.java b/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/options/InstantiateVAppTemplateOptionsTest.java
index 3cde149..7dd3f43 100644
--- a/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/options/InstantiateVAppTemplateOptionsTest.java
+++ b/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/options/InstantiateVAppTemplateOptionsTest.java
@@ -52,13 +52,13 @@
    public void testCustomizeOnInstantiate() {
       InstantiateVAppTemplateOptions options = new InstantiateVAppTemplateOptions();
       options.customizeOnInstantiate(true);
-      assertEquals(options.shouldCustomizeOnInstantiate(), new Boolean(true));
+      assertEquals(options.shouldCustomizeOnInstantiate(), Boolean.TRUE);
    }
 
    @Test
    public void testCustomizeOnInstantiateStatic() {
       InstantiateVAppTemplateOptions options = customizeOnInstantiate(true);
-      assertEquals(options.shouldCustomizeOnInstantiate(), new Boolean(true));
+      assertEquals(options.shouldCustomizeOnInstantiate(), Boolean.TRUE);
    }
 
    @Test
diff --git a/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/xml/ovf/VAppHandlerTest.java b/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/xml/ovf/VAppHandlerTest.java
index cabc10e..2495dab 100644
--- a/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/xml/ovf/VAppHandlerTest.java
+++ b/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/xml/ovf/VAppHandlerTest.java
@@ -119,7 +119,7 @@
                         .virtualQuantity(104857l).build());
 
       VApp expects = new VAppImpl("centos53", URI
-               .create("http://10.150.4.49/api/v0.8/vApp/10"), Status.ON, new Long(104857), new ReferenceTypeImpl(null,
+               .create("http://10.150.4.49/api/v0.8/vApp/10"), Status.ON, Long.valueOf(104857), new ReferenceTypeImpl(null,
                "application/vnd.vmware.vcloud.vdc+xml", URI.create("http://10.150.4.49/api/v0.8/vdc/4")),
                networkToAddresses, null, "Other Linux (32-bit)", system, resourceAllocations);
       assertEquals(result.getHref(), expects.getHref());
@@ -167,7 +167,7 @@
                         .virtualQuantity(10485760l).build());
 
       VApp expects = new VAppImpl("m1", URI.create("http://localhost:8000/api/v0.8/vApp/80"),
-               Status.ON, new Long(10485760), new ReferenceTypeImpl(null, "application/vnd.vmware.vcloud.vdc+xml", URI
+               Status.ON, Long.valueOf(10485760), new ReferenceTypeImpl(null, "application/vnd.vmware.vcloud.vdc+xml", URI
                         .create("http://localhost:8000/api/v0.8/vdc/28")), networkToAddresses, null,
                "Microsoft Windows XP Professional (32-bit)", system, resourceAllocations);
       assertEquals(result.getHref(), expects.getHref());
diff --git a/compute/src/main/java/org/jclouds/cim/ResourceAllocationSettingData.java b/compute/src/main/java/org/jclouds/cim/ResourceAllocationSettingData.java
index 082418e..f113f4c 100644
--- a/compute/src/main/java/org/jclouds/cim/ResourceAllocationSettingData.java
+++ b/compute/src/main/java/org/jclouds/cim/ResourceAllocationSettingData.java
@@ -345,7 +345,7 @@
             });
 
       public static ResourceType fromValue(String type) {
-         return RESOURCE_TYPE_BY_ID.get(new Integer(checkNotNull(type, "type")));
+         return RESOURCE_TYPE_BY_ID.get(Integer.valueOf(checkNotNull(type, "type")));
       }
    }
 
@@ -394,7 +394,7 @@
             });
 
       public static ConsumerVisibility fromValue(String behavior) {
-         return MAPPING_BEHAVIOR_BY_ID.get(new Integer(checkNotNull(behavior, "behavior")));
+         return MAPPING_BEHAVIOR_BY_ID.get(Integer.valueOf(checkNotNull(behavior, "behavior")));
       }
    }
 
@@ -428,7 +428,7 @@
             });
 
       public static MappingBehavior fromValue(String behavior) {
-         return MAPPING_BEHAVIOR_BY_ID.get(new Integer(checkNotNull(behavior, "behavior")));
+         return MAPPING_BEHAVIOR_BY_ID.get(Integer.valueOf(checkNotNull(behavior, "behavior")));
       }
    }
 
diff --git a/compute/src/main/java/org/jclouds/cim/VirtualSystemSettingData.java b/compute/src/main/java/org/jclouds/cim/VirtualSystemSettingData.java
index 16ad25d..81e5124 100644
--- a/compute/src/main/java/org/jclouds/cim/VirtualSystemSettingData.java
+++ b/compute/src/main/java/org/jclouds/cim/VirtualSystemSettingData.java
@@ -270,7 +270,7 @@
                });
 
       public static AutomaticRecoveryAction fromValue(String automaticRecoveryAction) {
-         return AUTOMATIC_RECOVERY_ACTION_BY_ID.get(new Integer(checkNotNull(automaticRecoveryAction,
+         return AUTOMATIC_RECOVERY_ACTION_BY_ID.get(Integer.valueOf(checkNotNull(automaticRecoveryAction,
                   "automaticRecoveryAction")));
       }
    }
@@ -307,7 +307,7 @@
                });
 
       public static AutomaticShutdownAction fromValue(String automaticShutdownAction) {
-         return AUTOMATIC_SHUTDOWN_ACTION_BY_ID.get(new Integer(checkNotNull(automaticShutdownAction,
+         return AUTOMATIC_SHUTDOWN_ACTION_BY_ID.get(Integer.valueOf(checkNotNull(automaticShutdownAction,
                   "automaticShutdownAction")));
       }
    }
@@ -344,7 +344,7 @@
                });
 
       public static AutomaticStartupAction fromValue(String automaticStartupAction) {
-         return AUTOMATIC_STARTUP_ACTION_BY_ID.get(new Integer(checkNotNull(automaticStartupAction,
+         return AUTOMATIC_STARTUP_ACTION_BY_ID.get(Integer.valueOf(checkNotNull(automaticStartupAction,
                   "automaticStartupAction")));
       }
    }
diff --git a/compute/src/main/java/org/jclouds/cim/xml/ResourceAllocationSettingDataHandler.java b/compute/src/main/java/org/jclouds/cim/xml/ResourceAllocationSettingDataHandler.java
index 5a28216..70b7dbe 100644
--- a/compute/src/main/java/org/jclouds/cim/xml/ResourceAllocationSettingDataHandler.java
+++ b/compute/src/main/java/org/jclouds/cim/xml/ResourceAllocationSettingDataHandler.java
@@ -67,13 +67,13 @@
          } else if (equalsOrSuffix(qName, "AllocationUnits")) {
             builder.allocationUnits(current);
          } else if (equalsOrSuffix(qName, "AutomaticAllocation")) {
-            builder.automaticAllocation(new Boolean(current));
+            builder.automaticAllocation(Boolean.valueOf(current));
          } else if (equalsOrSuffix(qName, "AutomaticDeallocation")) {
-            builder.automaticDeallocation(new Boolean(current));
+            builder.automaticDeallocation(Boolean.valueOf(current));
          } else if (equalsOrSuffix(qName, "ConsumerVisibility")) {
             builder.consumerVisibility(ConsumerVisibility.fromValue(current));
          } else if (equalsOrSuffix(qName, "Limit")) {
-            builder.limit(new Long(current));
+            builder.limit(Long.valueOf(current));
          } else if (equalsOrSuffix(qName, "MappingBehavior")) {
             builder.mappingBehavior(MappingBehavior.fromValue(current));
          } else if (equalsOrSuffix(qName, "OtherResourceType")) {
@@ -83,17 +83,17 @@
          } else if (equalsOrSuffix(qName, "PoolID")) {
             builder.poolID(current);
          } else if (equalsOrSuffix(qName, "Reservation")) {
-            builder.reservation(new Long(current));
+            builder.reservation(Long.valueOf(current));
          } else if (equalsOrSuffix(qName, "ResourceSubType")) {
             builder.resourceSubType(current);
          } else if (equalsOrSuffix(qName, "ResourceType")) {
             builder.resourceType(ResourceType.fromValue(current));
          } else if (equalsOrSuffix(qName, "VirtualQuantity")) {
-            builder.virtualQuantity(new Long(current));
+            builder.virtualQuantity(Long.valueOf(current));
          } else if (equalsOrSuffix(qName, "VirtualQuantityUnits")) {
             builder.virtualQuantityUnits(current);
          } else if (equalsOrSuffix(qName, "Weight")) {
-            builder.weight(new Integer(current));
+            builder.weight(Integer.valueOf(current));
          } else if (equalsOrSuffix(qName, "Connection")) {
             builder.connection(current);
          } else if (equalsOrSuffix(qName, "HostResource")) {
diff --git a/compute/src/main/java/org/jclouds/cim/xml/VirtualSystemSettingDataHandler.java b/compute/src/main/java/org/jclouds/cim/xml/VirtualSystemSettingDataHandler.java
index 2a05e79..c537722 100644
--- a/compute/src/main/java/org/jclouds/cim/xml/VirtualSystemSettingDataHandler.java
+++ b/compute/src/main/java/org/jclouds/cim/xml/VirtualSystemSettingDataHandler.java
@@ -79,7 +79,7 @@
             // TODO parse the format for intervals: ddddddddhhmmss.mmmmmm:000
             builder.automaticStartupActionDelay(null);
          } else if (equalsOrSuffix(qName, "AutomaticStartupActionSequenceNumber")) {
-            builder.automaticStartupActionSequenceNumber(new Integer(current));
+            builder.automaticStartupActionSequenceNumber(Integer.valueOf(current));
          } else if (equalsOrSuffix(qName, "ConfigurationDataRoot")) {
             builder.configurationDataRoot(URI.create(current));
          } else if (equalsOrSuffix(qName, "ConfigurationFile")) {
diff --git a/compute/src/main/java/org/jclouds/ovf/xml/DiskSectionHandler.java b/compute/src/main/java/org/jclouds/ovf/xml/DiskSectionHandler.java
index 47c863e..e7564f5 100644
--- a/compute/src/main/java/org/jclouds/ovf/xml/DiskSectionHandler.java
+++ b/compute/src/main/java/org/jclouds/ovf/xml/DiskSectionHandler.java
@@ -67,7 +67,7 @@
       Long val = null;
       if (toParse != null) {
          try {
-            val = new Long(toParse);
+            val = Long.valueOf(toParse);
          } catch (NumberFormatException e) {
             logger.warn("%s for disk %s not a number [%s]", key, diskId, toParse);
          }
diff --git a/compute/src/test/java/org/jclouds/cim/xml/VirtualSystemSettingDataHandlerTest.java b/compute/src/test/java/org/jclouds/cim/xml/VirtualSystemSettingDataHandlerTest.java
index d693593..46dca7b 100644
--- a/compute/src/test/java/org/jclouds/cim/xml/VirtualSystemSettingDataHandlerTest.java
+++ b/compute/src/test/java/org/jclouds/cim/xml/VirtualSystemSettingDataHandlerTest.java
@@ -124,7 +124,7 @@
    @Test(enabled = false)
    public static void checkOs(OperatingSystemSection result) {
       assertEquals(result.getDescription(), "Ubuntu Linux (64-bit)");
-      assertEquals(result.getId(), new Integer(94));
+      assertEquals(result.getId(), Integer.valueOf(94));
       assertEquals(result.getInfo(), "Specifies the operating system installed");
    }
 }
diff --git a/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java b/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java
index 6fab8fc..b8e71c6 100644
--- a/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java
+++ b/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java
@@ -422,7 +422,7 @@
             return actual == null;
          }
          try {
-            String real = Strings2.toStringAndClose(((Payload) actual).getInput());
+            String real = Strings2.toString(((Payload) actual));
             assertEquals(real, expected);
             return true;
          } catch (IOException e) {
diff --git a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
index 72d320f..c2cecc0 100644
--- a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
+++ b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
@@ -634,7 +634,7 @@
 
       Matcher matcher = parseReported.matcher(exec.getOutput());
       if (matcher.find())
-         stats.reportedStartupTimeMilliseconds = new Long(matcher.group(1));
+         stats.reportedStartupTimeMilliseconds = Long.valueOf(matcher.group(1));
 
       getAnonymousLogger().info(format("<< %s on node(%s) %s", bgProcess, node.getId(), stats));
       return stats;
diff --git a/compute/src/test/resources/initscript_with_java.sh b/compute/src/test/resources/initscript_with_java.sh
index 936b3ec..01aefb2 100644
--- a/compute/src/test/resources/initscript_with_java.sh
+++ b/compute/src/test/resources/initscript_with_java.sh
@@ -202,7 +202,7 @@
 	chmod 0440 /etc/sudoers
 	mkdir -p /home/users
 	groupadd -f wheel
-	useradd -c defaultAdminUsername -s /bin/bash -g wheel -m  -d /home/users/defaultAdminUsername -p 'crypt(randompassword)' defaultAdminUsername
+	useradd -c 'defaultAdminUsername' -s /bin/bash -g wheel -m  -d /home/users/defaultAdminUsername -p 'crypt(randompassword)' defaultAdminUsername
 	mkdir -p /home/users/defaultAdminUsername/.ssh
 	cat >> /home/users/defaultAdminUsername/.ssh/authorized_keys <<-'END_OF_JCLOUDS_FILE'
 		publicKey
diff --git a/compute/src/test/resources/initscript_with_jboss.sh b/compute/src/test/resources/initscript_with_jboss.sh
index 5101010..786fc9b 100644
--- a/compute/src/test/resources/initscript_with_jboss.sh
+++ b/compute/src/test/resources/initscript_with_jboss.sh
@@ -202,7 +202,7 @@
 	chmod 0440 /etc/sudoers
 	mkdir -p /home/users
 	groupadd -f wheel
-	useradd -c web -s /bin/bash -g wheel -m  -d /home/users/web -p 'crypt(randompassword)' web
+	useradd -c 'web' -s /bin/bash -g wheel -m  -d /home/users/web -p 'crypt(randompassword)' web
 	mkdir -p /home/users/web/.ssh
 	cat >> /home/users/web/.ssh/authorized_keys <<-'END_OF_JCLOUDS_FILE'
 		publicKey
diff --git a/compute/src/test/resources/runscript_adminUpdate.sh b/compute/src/test/resources/runscript_adminUpdate.sh
index c9c7791..f3aa82e 100644
--- a/compute/src/test/resources/runscript_adminUpdate.sh
+++ b/compute/src/test/resources/runscript_adminUpdate.sh
@@ -91,7 +91,7 @@
 	chmod 0440 /etc/sudoers
 	mkdir -p /over/ridden
 	groupadd -f wheel
-	useradd -c foo -s /bin/bash -g wheel -m  -d /over/ridden/foo -p 'crypt(randompassword)' foo
+	useradd -c 'foo' -s /bin/bash -g wheel -m  -d /over/ridden/foo -p 'crypt(randompassword)' foo
 	mkdir -p /over/ridden/foo/.ssh
 	cat >> /over/ridden/foo/.ssh/authorized_keys <<-'END_OF_JCLOUDS_FILE'
 		publicKey
diff --git a/core/src/main/java/org/jclouds/domain/LocationScope.java b/core/src/main/java/org/jclouds/domain/LocationScope.java
index eefbbe3..1ee8836 100644
--- a/core/src/main/java/org/jclouds/domain/LocationScope.java
+++ b/core/src/main/java/org/jclouds/domain/LocationScope.java
@@ -25,6 +25,18 @@
  */
 public enum LocationScope {
 
-   PROVIDER, REGION, ZONE, NETWORK, RACK, HOST;
+    PROVIDER,
+    REGION,
+    ZONE,
+    /**
+     * @see <a href="http://dmtf.org/standards/cloud">cimi system docs</a>
+     */
+    SYSTEM,
+    /**
+     * E.g. the DMZ segment, secure segment. 
+     */
+    NETWORK,
+    RACK,
+    HOST;
 
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/jclouds/domain/LoginCredentials.java b/core/src/main/java/org/jclouds/domain/LoginCredentials.java
index c22f013..68866b9 100644
--- a/core/src/main/java/org/jclouds/domain/LoginCredentials.java
+++ b/core/src/main/java/org/jclouds/domain/LoginCredentials.java
@@ -64,6 +64,8 @@
 
       public Builder password(String password) {
          this.password = Optional.fromNullable(password);
+         if (privateKey == null)
+            noPrivateKey();
          return this;
       }
 
@@ -74,6 +76,8 @@
 
       public Builder privateKey(String privateKey) {
          this.privateKey = Optional.fromNullable(privateKey);
+         if (password == null)
+            noPassword();
          return this;
       }
 
diff --git a/core/src/main/java/org/jclouds/events/config/EventBusModule.java b/core/src/main/java/org/jclouds/events/config/EventBusModule.java
index d7aa3fd..6e215de 100644
--- a/core/src/main/java/org/jclouds/events/config/EventBusModule.java
+++ b/core/src/main/java/org/jclouds/events/config/EventBusModule.java
@@ -33,6 +33,7 @@
 import com.google.common.eventbus.EventBus;
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
+import com.google.inject.Scopes;
 
 /**
  * Configures the {@link EventBus} to be used in the platform.
@@ -79,7 +80,7 @@
      */
     @Override
     protected void configure() {
-        bind(EventBus.class).annotatedWith(AsyncBus.class).to(AsyncEventBus.class);
+        bind(EventBus.class).annotatedWith(AsyncBus.class).to(AsyncEventBus.class).in(Scopes.SINGLETON);
     }
 
 }
diff --git a/core/src/main/java/org/jclouds/http/HttpResponseException.java b/core/src/main/java/org/jclouds/http/HttpResponseException.java
index b1e03d4..f717a6f 100644
--- a/core/src/main/java/org/jclouds/http/HttpResponseException.java
+++ b/core/src/main/java/org/jclouds/http/HttpResponseException.java
@@ -88,7 +88,7 @@
             && request.getPayload().getContentMetadata().getContentLength() < 1024) {
          try {
             return String.format(" [%s] ", request.getPayload() instanceof StringPayload ? request.getPayload()
-                  .getRawContent() : Strings2.toStringAndClose(request.getPayload().getInput()));
+                  .getRawContent() : Strings2.toString(request.getPayload()));
          } catch (IOException e) {
          }
       }
diff --git a/core/src/main/java/org/jclouds/http/functions/ParseURIFromListOrLocationHeaderIf20x.java b/core/src/main/java/org/jclouds/http/functions/ParseURIFromListOrLocationHeaderIf20x.java
index 64199b4..de47f00 100644
--- a/core/src/main/java/org/jclouds/http/functions/ParseURIFromListOrLocationHeaderIf20x.java
+++ b/core/src/main/java/org/jclouds/http/functions/ParseURIFromListOrLocationHeaderIf20x.java
@@ -61,7 +61,7 @@
          try {
             if (from.getPayload().getInput() == null)
                throw new HttpResponseException("no content", null, from);
-            String toParse = Strings2.toStringAndClose(from.getPayload().getInput());
+            String toParse = Strings2.toString(from.getPayload());
             return URI.create(toParse.trim());
          } catch (IOException e) {
             throw new HttpResponseException("couldn't parse uri from content", null, from, e);
diff --git a/core/src/main/java/org/jclouds/http/handlers/CloseContentAndSetExceptionErrorHandler.java b/core/src/main/java/org/jclouds/http/handlers/CloseContentAndSetExceptionErrorHandler.java
index 9dc9d56..2cefb66 100644
--- a/core/src/main/java/org/jclouds/http/handlers/CloseContentAndSetExceptionErrorHandler.java
+++ b/core/src/main/java/org/jclouds/http/handlers/CloseContentAndSetExceptionErrorHandler.java
@@ -40,7 +40,7 @@
    public void handleError(HttpCommand command, HttpResponse from) {
       String content;
       try {
-         content = from.getPayload() != null ? Strings2.toStringAndClose(from.getPayload().getInput()) : null;
+         content = from.getPayload() != null ? Strings2.toString(from.getPayload()) : null;
          command.setException(new HttpResponseException(command, from, content));
       } catch (IOException e) {
          command.setException(new HttpResponseException(command, from));
diff --git a/core/src/main/java/org/jclouds/io/ContentMetadataCodec.java b/core/src/main/java/org/jclouds/io/ContentMetadataCodec.java
index 64faacf..cb13f94 100644
--- a/core/src/main/java/org/jclouds/io/ContentMetadataCodec.java
+++ b/core/src/main/java/org/jclouds/io/ContentMetadataCodec.java
@@ -94,7 +94,7 @@
          });
          for (Entry<String, String> header : headers.entries()) {
             if (!chunked && CONTENT_LENGTH.equalsIgnoreCase(header.getKey())) {
-               contentMetadata.setContentLength(new Long(header.getValue()));
+               contentMetadata.setContentLength(Long.valueOf(header.getValue()));
             } else if ("Content-MD5".equalsIgnoreCase(header.getKey())) {
                contentMetadata.setContentMD5(CryptoStreams.base64(header.getValue()));
             } else if (CONTENT_TYPE.equalsIgnoreCase(header.getKey())) {
diff --git a/core/src/main/java/org/jclouds/io/payloads/ByteArrayPayload.java b/core/src/main/java/org/jclouds/io/payloads/ByteArrayPayload.java
index bd26bbd..3778666 100644
--- a/core/src/main/java/org/jclouds/io/payloads/ByteArrayPayload.java
+++ b/core/src/main/java/org/jclouds/io/payloads/ByteArrayPayload.java
@@ -34,7 +34,7 @@
 
    public ByteArrayPayload(byte[] content, byte[] md5) {
       super(content);
-      getContentMetadata().setContentLength(new Long(checkNotNull(content, "content").length));
+      getContentMetadata().setContentLength(Long.valueOf(checkNotNull(content, "content").length));
       getContentMetadata().setContentMD5(md5);
       checkArgument(content.length >= 0, "length cannot me negative");
    }
diff --git a/core/src/main/java/org/jclouds/io/payloads/StringPayload.java b/core/src/main/java/org/jclouds/io/payloads/StringPayload.java
index 98f03d7..272b480 100644
--- a/core/src/main/java/org/jclouds/io/payloads/StringPayload.java
+++ b/core/src/main/java/org/jclouds/io/payloads/StringPayload.java
@@ -38,7 +38,7 @@
    public StringPayload(String content) {
       super(content);
       this.bytes = content.getBytes(Charsets.UTF_8);
-      getContentMetadata().setContentLength(new Long(bytes.length));
+      getContentMetadata().setContentLength(Long.valueOf(bytes.length));
    }
 
    /**
diff --git a/core/src/main/java/org/jclouds/util/Strings2.java b/core/src/main/java/org/jclouds/util/Strings2.java
index 71dd466..49fd1d6 100644
--- a/core/src/main/java/org/jclouds/util/Strings2.java
+++ b/core/src/main/java/org/jclouds/util/Strings2.java
@@ -46,6 +46,8 @@
 import org.jclouds.logging.Logger;
 
 import com.google.common.base.Charsets;
+import com.google.common.io.CharStreams;
+import com.google.common.io.InputSupplier;
 
 /**
  * 
@@ -123,7 +125,11 @@
       return input;
    }
 
-   public static final String UTF8_ENCODING = "UTF-8";
+   public static String toString(InputSupplier<? extends InputStream> supplier)
+         throws IOException {
+      return CharStreams.toString(CharStreams.newReaderSupplier(supplier,
+         Charsets.UTF_8));
+   }
 
    public static String toStringAndClose(InputStream input) throws IOException {
       checkNotNull(input, "input");
@@ -143,44 +149,10 @@
       return new ByteArrayInputStream(in.getBytes(Charsets.UTF_8));
    }
 
-   /**
-    * Encode the given string with the given encoding, if possible. If the encoding fails with
-    * {@link UnsupportedEncodingException}, log a warning and fall back to the system's default
-    * encoding.
-    * 
-    * @param str
-    *           what to encode
-    * @param charsetName
-    *           the name of a supported {@link java.nio.charset.Charset </code>charset<code>}
-    * @return properly encoded String.
-    */
-   public static byte[] encodeString(String str, String charsetName) {
-      try {
-         return str.getBytes(charsetName);
-      } catch (UnsupportedEncodingException e) {
-         logger.warn(e, "Failed to encode string to bytes with encoding " + charsetName
-               + ". Falling back to system's default encoding");
-         return str.getBytes();
-      }
-   }
-
    @Resource
    private static Logger logger = Logger.NULL;
 
    /**
-    * Encode the given string with the UTF-8 encoding, the sane default. In the very unlikely event
-    * the encoding fails with {@link UnsupportedEncodingException}, log a warning and fall back to
-    * the system's default encoding.
-    * 
-    * @param str
-    *           what to encode
-    * @return properly encoded String.
-    */
-   public static byte[] encodeString(String str) {
-      return encodeString(str, UTF8_ENCODING);
-   }
-
-   /**
     * replaces tokens that are expressed as <code>{token}</code>
     * 
     * <p/>
diff --git a/core/src/test/java/org/jclouds/domain/LoginCredentialsTest.java b/core/src/test/java/org/jclouds/domain/LoginCredentialsTest.java
new file mode 100644
index 0000000..b22e7a4
--- /dev/null
+++ b/core/src/test/java/org/jclouds/domain/LoginCredentialsTest.java
@@ -0,0 +1,56 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.domain;
+
+import static org.testng.Assert.assertEquals;
+
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+
+/**
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "LoginCredentialsTest")
+public class LoginCredentialsTest {
+
+   public void testPasswordSetsPrivateKeyToAbsentWhenUnset() {
+      LoginCredentials toTest = LoginCredentials.builder().user("user").password("password").build();
+      assertEquals(toTest.getOptionalPassword(), Optional.of("password"));
+      assertEquals(toTest.getOptionalPrivateKey(), Optional.absent());
+   }
+
+   public void testPasswordLeavesPrivateKeyAloneWhenSet() {
+      LoginCredentials toTest = LoginCredentials.builder().user("user").privateKey("key").password("password").build();
+      assertEquals(toTest.getOptionalPassword(), Optional.of("password"));
+      assertEquals(toTest.getOptionalPrivateKey(), Optional.of("key"));
+   }
+
+   public void testPrivateKeySetsPasswordToAbsentWhenUnset() {
+      LoginCredentials toTest = LoginCredentials.builder().user("user").privateKey("key").build();
+      assertEquals(toTest.getOptionalPassword(), Optional.absent());
+      assertEquals(toTest.getOptionalPrivateKey(), Optional.of("key"));
+   }
+
+   public void testPrivateKeyLeavesPasswordAloneWhenSet() {
+      LoginCredentials toTest = LoginCredentials.builder().user("user").password("password").privateKey("key").build();
+      assertEquals(toTest.getOptionalPassword(), Optional.of("password"));
+      assertEquals(toTest.getOptionalPrivateKey(), Optional.of("key"));
+   }
+}
diff --git a/core/src/test/java/org/jclouds/io/payloads/MultipartFormTest.java b/core/src/test/java/org/jclouds/io/payloads/MultipartFormTest.java
index 71e3f11..6b6dce1 100644
--- a/core/src/test/java/org/jclouds/io/payloads/MultipartFormTest.java
+++ b/core/src/test/java/org/jclouds/io/payloads/MultipartFormTest.java
@@ -54,8 +54,8 @@
 
       MultipartForm multipartForm = new MultipartForm(boundary, newPart("hello"));
 
-      assertEquals(Strings2.toStringAndClose(multipartForm.getInput()), expects);
-      assertEquals(multipartForm.getContentMetadata().getContentLength(), new Long(199));
+      assertEquals(Strings2.toString(multipartForm), expects);
+      assertEquals(multipartForm.getContentMetadata().getContentLength(), Long.valueOf(199));
    }
 
    public static class MockFilePayload extends FilePayload {
@@ -119,12 +119,12 @@
 
       MultipartForm multipartForm = new MultipartForm(boundary, newPart("hello"), newPart("goodbye"));
 
-      assertEquals(Strings2.toStringAndClose(multipartForm.getInput()), expects);
+      assertEquals(Strings2.toString(multipartForm), expects);
 
       // test repeatable
       assert multipartForm.isRepeatable();
-      assertEquals(Strings2.toStringAndClose(multipartForm.getInput()), expects);
-      assertEquals(multipartForm.getContentMetadata().getContentLength(), new Long(352));
+      assertEquals(Strings2.toString(multipartForm), expects);
+      assertEquals(multipartForm.getContentMetadata().getContentLength(), Long.valueOf(352));
    }
 
 }
diff --git a/core/src/test/java/org/jclouds/io/payloads/StringPayloadTest.java b/core/src/test/java/org/jclouds/io/payloads/StringPayloadTest.java
index ece2faf..1cd3086 100644
--- a/core/src/test/java/org/jclouds/io/payloads/StringPayloadTest.java
+++ b/core/src/test/java/org/jclouds/io/payloads/StringPayloadTest.java
@@ -33,7 +33,7 @@
 public class StringPayloadTest {
    public void testLengthIsCorrectPerUTF8() {
       Payload stringPayload = new StringPayload("unic₪de");
-      assertEquals(stringPayload.getContentMetadata().getContentLength(), new Long(
+      assertEquals(stringPayload.getContentMetadata().getContentLength(), Long.valueOf(
             "unic₪de".getBytes(Charsets.UTF_8).length));
    }
 }
diff --git a/core/src/test/java/org/jclouds/rest/internal/BaseRestApiExpectTest.java b/core/src/test/java/org/jclouds/rest/internal/BaseRestApiExpectTest.java
index b1ad1f0..67afbf7 100644
--- a/core/src/test/java/org/jclouds/rest/internal/BaseRestApiExpectTest.java
+++ b/core/src/test/java/org/jclouds/rest/internal/BaseRestApiExpectTest.java
@@ -386,8 +386,8 @@
  
          switch (compareHttpRequestAsType(a)) {
             case XML: {
-               Diff diff = XMLUnit.compareXML(Strings2.toStringAndClose(a.getPayload().getInput()), Strings2
-                        .toStringAndClose(b.getPayload().getInput()));
+               Diff diff = XMLUnit.compareXML(Strings2.toString(a.getPayload()), Strings2
+                        .toString(b.getPayload()));
 
                // Ignoring whitespace in elements that have other children, xsi:schemaLocation and
                // differences in namespace prefixes
@@ -419,8 +419,8 @@
             }
             case JSON: {               
                JsonParser parser = new JsonParser();
-               JsonElement payloadA = parser.parse(Strings2.toStringAndClose(a.getPayload().getInput()));
-               JsonElement payloadB = parser.parse(Strings2.toStringAndClose(b.getPayload().getInput()));
+               JsonElement payloadA = parser.parse(Strings2.toString(a.getPayload()));
+               JsonElement payloadB = parser.parse(Strings2.toString(b.getPayload()));
                return Objects.equal(payloadA, payloadB);
             }
             default: {
@@ -486,7 +486,7 @@
             builder.append(header.getKey()).append(": ").append(header.getValue()).append('\n');
          }
          try {
-            builder.append('\n').append(Strings2.toStringAndClose(request.getPayload().getInput()));
+            builder.append('\n').append(Strings2.toString(request.getPayload()));
          } catch (IOException e) {
             throw Throwables.propagate(e);
          }
diff --git a/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java b/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java
index ed363f5..82ac89b 100644
--- a/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java
+++ b/core/src/test/java/org/jclouds/rest/internal/BaseRestApiTest.java
@@ -107,12 +107,12 @@
       } else {
          String payload = null;
          try {
-            payload = Strings2.toStringAndClose(request.getPayload().getInput());
+            payload = Strings2.toString(request.getPayload());
          } catch (IOException e) {
             propagate(e);
          }
          assertEquals(payload, toMatch);
-         Long length = new Long(payload.getBytes().length);
+         Long length = Long.valueOf(payload.getBytes().length);
          try {
             assertContentHeadersEqual(request, contentType, contentDispositon, contentEncoding, contentLanguage,
                   length, contentMD5 ? CryptoStreams.md5(request.getPayload()) : null, expires);
diff --git a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java
index 0225820..f14de94 100644
--- a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java
+++ b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java
@@ -1274,7 +1274,7 @@
             .createResponseParser(parserFactory, injector, method, request);
 
       assertEquals(parser.apply(HttpResponse.builder().statusCode(200).message("ok")
-            .payload("{ \"destroyvirtualmachineresponse\" : {\"jobid\":4} }").build()), new Long(4));
+            .payload("{ \"destroyvirtualmachineresponse\" : {\"jobid\":4} }").build()), Long.valueOf(4));
    }
 
    @SuppressWarnings("unchecked")
@@ -1286,7 +1286,7 @@
             .createResponseParser(parserFactory, injector, method, request);
 
       assertEquals(parser.apply(HttpResponse.builder().statusCode(200).message("ok")
-            .payload("{ \"destroyvirtualmachineresponse\" : {\"jobid\":4} }").build()), new Long(5));
+            .payload("{ \"destroyvirtualmachineresponse\" : {\"jobid\":4} }").build()), Long.valueOf(5));
    }
    
    static class TestRequestFilter1 implements HttpRequestFilter {
diff --git a/demos/perftest/src/test/java/org/jclouds/aws/s3/BaseJCloudsPerformanceLiveTest.java b/demos/perftest/src/test/java/org/jclouds/aws/s3/BaseJCloudsPerformanceLiveTest.java
index 0a0b8fb..8d23bbd 100644
--- a/demos/perftest/src/test/java/org/jclouds/aws/s3/BaseJCloudsPerformanceLiveTest.java
+++ b/demos/perftest/src/test/java/org/jclouds/aws/s3/BaseJCloudsPerformanceLiveTest.java
@@ -77,7 +77,7 @@
       S3Object object = newObject(key);
       object.setPayload(data);
       try {
-         object.getPayload().getContentMetadata().setContentLength(new Long(data.available()));
+         object.getPayload().getContentMetadata().setContentLength(Long.valueOf(data.available()));
       } catch (IOException e) {
          Throwables.propagate(e);
       }
diff --git a/demos/tweetstore/cf-tweetstore-spring/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java b/demos/tweetstore/cf-tweetstore-spring/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
index 2a6ea0a..f831b97 100644
--- a/demos/tweetstore/cf-tweetstore-spring/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
+++ b/demos/tweetstore/cf-tweetstore-spring/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
@@ -18,8 +18,6 @@
  */
 package org.jclouds.demo.tweetstore.functions;
 
-import static org.jclouds.util.Strings2.toStringAndClose;
-
 import javax.annotation.Resource;
 
 import org.jclouds.blobstore.BlobMap;
@@ -27,6 +25,7 @@
 import org.jclouds.demo.tweetstore.domain.StoredTweetStatus;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
 import org.jclouds.logging.Logger;
+import org.jclouds.util.Strings2;
 
 import com.google.common.base.Function;
 
@@ -59,7 +58,7 @@
          Blob blob = map.get(id);
          status = ((System.currentTimeMillis() - start) + "ms");
          from = blob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME);
-         tweet = toStringAndClose(blob.getPayload().getInput());
+         tweet = Strings2.toString(blob.getPayload());
       } catch (Exception e) {
          logger.error(e, "Error listing container %s//%s/%s", service, container, id);
          status = (e.getMessage());
diff --git a/demos/tweetstore/cf-tweetstore-spring/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java b/demos/tweetstore/cf-tweetstore-spring/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
index 3d0cbc4..53eb8a9 100644
--- a/demos/tweetstore/cf-tweetstore-spring/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
+++ b/demos/tweetstore/cf-tweetstore-spring/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
@@ -22,7 +22,6 @@
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
-import static org.jclouds.util.Strings2.toStringAndClose;
 import static org.testng.Assert.assertEquals;
 
 import java.io.IOException;
@@ -36,6 +35,7 @@
 import org.jclouds.blobstore.TransientApiMetadata;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
+import org.jclouds.util.Strings2;
 import org.testng.annotations.Test;
 
 import twitter4j.Status;
@@ -107,13 +107,13 @@
          assertEquals(frankBlob.getMetadata().getName(), "1");
          assertEquals(frankBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "frank");
          assertEquals(frankBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(frankBlob.getPayload().getInput()), "I love beans!");
+         assertEquals(Strings2.toString(frankBlob.getPayload()), "I love beans!");
 
          Blob jimmyBlob = map.get("2");
          assertEquals(jimmyBlob.getMetadata().getName(), "2");
          assertEquals(jimmyBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "jimmy");
          assertEquals(jimmyBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(jimmyBlob.getPayload().getInput()), "cloud is king");
+         assertEquals(Strings2.toString(jimmyBlob.getPayload()), "cloud is king");
       }
 
    }
diff --git a/demos/tweetstore/gae-tweetstore-spring/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java b/demos/tweetstore/gae-tweetstore-spring/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
index 2a6ea0a..f831b97 100644
--- a/demos/tweetstore/gae-tweetstore-spring/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
+++ b/demos/tweetstore/gae-tweetstore-spring/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
@@ -18,8 +18,6 @@
  */
 package org.jclouds.demo.tweetstore.functions;
 
-import static org.jclouds.util.Strings2.toStringAndClose;
-
 import javax.annotation.Resource;
 
 import org.jclouds.blobstore.BlobMap;
@@ -27,6 +25,7 @@
 import org.jclouds.demo.tweetstore.domain.StoredTweetStatus;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
 import org.jclouds.logging.Logger;
+import org.jclouds.util.Strings2;
 
 import com.google.common.base.Function;
 
@@ -59,7 +58,7 @@
          Blob blob = map.get(id);
          status = ((System.currentTimeMillis() - start) + "ms");
          from = blob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME);
-         tweet = toStringAndClose(blob.getPayload().getInput());
+         tweet = Strings2.toString(blob.getPayload());
       } catch (Exception e) {
          logger.error(e, "Error listing container %s//%s/%s", service, container, id);
          status = (e.getMessage());
diff --git a/demos/tweetstore/gae-tweetstore-spring/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java b/demos/tweetstore/gae-tweetstore-spring/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
index 3afb3db..084b18a 100644
--- a/demos/tweetstore/gae-tweetstore-spring/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
+++ b/demos/tweetstore/gae-tweetstore-spring/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
@@ -22,7 +22,6 @@
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
-import static org.jclouds.util.Strings2.toStringAndClose;
 import static org.testng.Assert.assertEquals;
 
 import java.io.IOException;
@@ -36,6 +35,7 @@
 import org.jclouds.blobstore.TransientApiMetadata;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
+import org.jclouds.util.Strings2;
 import org.testng.annotations.Test;
 
 import twitter4j.Status;
@@ -107,13 +107,13 @@
          assertEquals(frankBlob.getMetadata().getName(), "1");
          assertEquals(frankBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "frank");
          assertEquals(frankBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(frankBlob.getPayload().getInput()), "I love beans!");
+         assertEquals(Strings2.toString(frankBlob.getPayload()), "I love beans!");
 
          Blob jimmyBlob = map.get("2");
          assertEquals(jimmyBlob.getMetadata().getName(), "2");
          assertEquals(jimmyBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "jimmy");
          assertEquals(jimmyBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(jimmyBlob.getPayload().getInput()), "cloud is king");
+         assertEquals(Strings2.toString(jimmyBlob.getPayload()), "cloud is king");
       }
 
    }
diff --git a/demos/tweetstore/gae-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java b/demos/tweetstore/gae-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
index 2a6ea0a..f831b97 100644
--- a/demos/tweetstore/gae-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
+++ b/demos/tweetstore/gae-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
@@ -18,8 +18,6 @@
  */
 package org.jclouds.demo.tweetstore.functions;
 
-import static org.jclouds.util.Strings2.toStringAndClose;
-
 import javax.annotation.Resource;
 
 import org.jclouds.blobstore.BlobMap;
@@ -27,6 +25,7 @@
 import org.jclouds.demo.tweetstore.domain.StoredTweetStatus;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
 import org.jclouds.logging.Logger;
+import org.jclouds.util.Strings2;
 
 import com.google.common.base.Function;
 
@@ -59,7 +58,7 @@
          Blob blob = map.get(id);
          status = ((System.currentTimeMillis() - start) + "ms");
          from = blob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME);
-         tweet = toStringAndClose(blob.getPayload().getInput());
+         tweet = Strings2.toString(blob.getPayload());
       } catch (Exception e) {
          logger.error(e, "Error listing container %s//%s/%s", service, container, id);
          status = (e.getMessage());
diff --git a/demos/tweetstore/gae-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java b/demos/tweetstore/gae-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
index e592355..0976307 100644
--- a/demos/tweetstore/gae-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
+++ b/demos/tweetstore/gae-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
@@ -22,7 +22,6 @@
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
-import static org.jclouds.util.Strings2.toStringAndClose;
 import static org.testng.Assert.assertEquals;
 
 import java.io.IOException;
@@ -36,6 +35,7 @@
 import org.jclouds.blobstore.TransientApiMetadata;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
+import org.jclouds.util.Strings2;
 import org.testng.annotations.Test;
 
 import twitter4j.Status;
@@ -107,13 +107,13 @@
          assertEquals(frankBlob.getMetadata().getName(), "1");
          assertEquals(frankBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "frank");
          assertEquals(frankBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(frankBlob.getPayload().getInput()), "I love beans!");
+         assertEquals(Strings2.toString(frankBlob.getPayload()), "I love beans!");
 
          Blob jimmyBlob = map.get("2");
          assertEquals(jimmyBlob.getMetadata().getName(), "2");
          assertEquals(jimmyBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "jimmy");
          assertEquals(jimmyBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(jimmyBlob.getPayload().getInput()), "cloud is king");
+         assertEquals(Strings2.toString(jimmyBlob.getPayload()), "cloud is king");
       }
 
    }
diff --git a/demos/tweetstore/heroku-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java b/demos/tweetstore/heroku-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
index 2a6ea0a..f831b97 100644
--- a/demos/tweetstore/heroku-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
+++ b/demos/tweetstore/heroku-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
@@ -18,8 +18,6 @@
  */
 package org.jclouds.demo.tweetstore.functions;
 
-import static org.jclouds.util.Strings2.toStringAndClose;
-
 import javax.annotation.Resource;
 
 import org.jclouds.blobstore.BlobMap;
@@ -27,6 +25,7 @@
 import org.jclouds.demo.tweetstore.domain.StoredTweetStatus;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
 import org.jclouds.logging.Logger;
+import org.jclouds.util.Strings2;
 
 import com.google.common.base.Function;
 
@@ -59,7 +58,7 @@
          Blob blob = map.get(id);
          status = ((System.currentTimeMillis() - start) + "ms");
          from = blob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME);
-         tweet = toStringAndClose(blob.getPayload().getInput());
+         tweet = Strings2.toString(blob.getPayload());
       } catch (Exception e) {
          logger.error(e, "Error listing container %s//%s/%s", service, container, id);
          status = (e.getMessage());
diff --git a/demos/tweetstore/heroku-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java b/demos/tweetstore/heroku-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
index 2d26630..66448df 100644
--- a/demos/tweetstore/heroku-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
+++ b/demos/tweetstore/heroku-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
@@ -22,7 +22,6 @@
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
-import static org.jclouds.util.Strings2.toStringAndClose;
 import static org.testng.Assert.assertEquals;
 
 import java.io.IOException;
@@ -36,6 +35,7 @@
 import org.jclouds.blobstore.TransientApiMetadata;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
+import org.jclouds.util.Strings2;
 import org.testng.annotations.Test;
 
 import twitter4j.Status;
@@ -108,13 +108,13 @@
          assertEquals(frankBlob.getMetadata().getName(), "1");
          assertEquals(frankBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "frank");
          assertEquals(frankBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(frankBlob.getPayload().getInput()), "I love beans!");
+         assertEquals(Strings2.toString(frankBlob.getPayload()), "I love beans!");
 
          Blob jimmyBlob = map.get("2");
          assertEquals(jimmyBlob.getMetadata().getName(), "2");
          assertEquals(jimmyBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "jimmy");
          assertEquals(jimmyBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(jimmyBlob.getPayload().getInput()), "cloud is king");
+         assertEquals(Strings2.toString(jimmyBlob.getPayload()), "cloud is king");
       }
 
    }
diff --git a/demos/tweetstore/rhcloud-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java b/demos/tweetstore/rhcloud-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
index 2a6ea0a..f831b97 100644
--- a/demos/tweetstore/rhcloud-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
+++ b/demos/tweetstore/rhcloud-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
@@ -18,8 +18,6 @@
  */
 package org.jclouds.demo.tweetstore.functions;
 
-import static org.jclouds.util.Strings2.toStringAndClose;
-
 import javax.annotation.Resource;
 
 import org.jclouds.blobstore.BlobMap;
@@ -27,6 +25,7 @@
 import org.jclouds.demo.tweetstore.domain.StoredTweetStatus;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
 import org.jclouds.logging.Logger;
+import org.jclouds.util.Strings2;
 
 import com.google.common.base.Function;
 
@@ -59,7 +58,7 @@
          Blob blob = map.get(id);
          status = ((System.currentTimeMillis() - start) + "ms");
          from = blob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME);
-         tweet = toStringAndClose(blob.getPayload().getInput());
+         tweet = Strings2.toString(blob.getPayload());
       } catch (Exception e) {
          logger.error(e, "Error listing container %s//%s/%s", service, container, id);
          status = (e.getMessage());
diff --git a/demos/tweetstore/rhcloud-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java b/demos/tweetstore/rhcloud-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
index 7afdb30..2ac4481 100644
--- a/demos/tweetstore/rhcloud-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
+++ b/demos/tweetstore/rhcloud-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
@@ -22,7 +22,6 @@
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
-import static org.jclouds.util.Strings2.toStringAndClose;
 import static org.testng.Assert.assertEquals;
 
 import java.io.IOException;
@@ -36,6 +35,7 @@
 import org.jclouds.blobstore.TransientApiMetadata;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
+import org.jclouds.util.Strings2;
 import org.testng.annotations.Test;
 
 import twitter4j.Status;
@@ -107,13 +107,13 @@
          assertEquals(frankBlob.getMetadata().getName(), "1");
          assertEquals(frankBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "frank");
          assertEquals(frankBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(frankBlob.getPayload().getInput()), "I love beans!");
+         assertEquals(Strings2.toString(frankBlob.getPayload()), "I love beans!");
 
          Blob jimmyBlob = map.get("2");
          assertEquals(jimmyBlob.getMetadata().getName(), "2");
          assertEquals(jimmyBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "jimmy");
          assertEquals(jimmyBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(jimmyBlob.getPayload().getInput()), "cloud is king");
+         assertEquals(Strings2.toString(jimmyBlob.getPayload()), "cloud is king");
       }
 
    }
diff --git a/demos/tweetstore/runatcloud-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java b/demos/tweetstore/runatcloud-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
index 2a6ea0a..f831b97 100644
--- a/demos/tweetstore/runatcloud-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
+++ b/demos/tweetstore/runatcloud-tweetstore/src/main/java/org/jclouds/demo/tweetstore/functions/KeyToStoredTweetStatus.java
@@ -18,8 +18,6 @@
  */
 package org.jclouds.demo.tweetstore.functions;
 
-import static org.jclouds.util.Strings2.toStringAndClose;
-
 import javax.annotation.Resource;
 
 import org.jclouds.blobstore.BlobMap;
@@ -27,6 +25,7 @@
 import org.jclouds.demo.tweetstore.domain.StoredTweetStatus;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
 import org.jclouds.logging.Logger;
+import org.jclouds.util.Strings2;
 
 import com.google.common.base.Function;
 
@@ -59,7 +58,7 @@
          Blob blob = map.get(id);
          status = ((System.currentTimeMillis() - start) + "ms");
          from = blob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME);
-         tweet = toStringAndClose(blob.getPayload().getInput());
+         tweet = Strings2.toString(blob.getPayload());
       } catch (Exception e) {
          logger.error(e, "Error listing container %s//%s/%s", service, container, id);
          status = (e.getMessage());
diff --git a/demos/tweetstore/runatcloud-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java b/demos/tweetstore/runatcloud-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
index 9cc5635..2eb7704 100644
--- a/demos/tweetstore/runatcloud-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
+++ b/demos/tweetstore/runatcloud-tweetstore/src/test/java/org/jclouds/demo/tweetstore/controller/StoreTweetsControllerTest.java
@@ -22,7 +22,6 @@
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
-import static org.jclouds.util.Strings2.toStringAndClose;
 import static org.testng.Assert.assertEquals;
 
 import java.io.IOException;
@@ -36,6 +35,7 @@
 import org.jclouds.blobstore.TransientApiMetadata;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.demo.tweetstore.reference.TweetStoreConstants;
+import org.jclouds.util.Strings2;
 import org.testng.annotations.Test;
 
 import twitter4j.Status;
@@ -107,13 +107,13 @@
          assertEquals(frankBlob.getMetadata().getName(), "1");
          assertEquals(frankBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "frank");
          assertEquals(frankBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(frankBlob.getPayload().getInput()), "I love beans!");
+         assertEquals(Strings2.toString(frankBlob.getPayload()), "I love beans!");
 
          Blob jimmyBlob = map.get("2");
          assertEquals(jimmyBlob.getMetadata().getName(), "2");
          assertEquals(jimmyBlob.getMetadata().getUserMetadata().get(TweetStoreConstants.SENDER_NAME), "jimmy");
          assertEquals(jimmyBlob.getMetadata().getContentMetadata().getContentType(), "text/plain");
-         assertEquals(toStringAndClose(jimmyBlob.getPayload().getInput()), "cloud is king");
+         assertEquals(Strings2.toString(jimmyBlob.getPayload()), "cloud is king");
       }
 
    }
diff --git a/drivers/gae/src/test/java/org/jclouds/gae/ConvertToJcloudsResponseTest.java b/drivers/gae/src/test/java/org/jclouds/gae/ConvertToJcloudsResponseTest.java
index 7cab1c3..4a43e8a 100644
--- a/drivers/gae/src/test/java/org/jclouds/gae/ConvertToJcloudsResponseTest.java
+++ b/drivers/gae/src/test/java/org/jclouds/gae/ConvertToJcloudsResponseTest.java
@@ -107,7 +107,7 @@
       replay(gaeResponse);
       HttpResponse response = req.apply(gaeResponse);
       assertEquals(response.getStatusCode(), 200);
-      assertEquals(Strings2.toStringAndClose(response.getPayload().getInput()), "hello");
+      assertEquals(Strings2.toString(response.getPayload()), "hello");
       assertEquals(response.getHeaders().size(), 0);
       assertEquals(response.getPayload().getContentMetadata().getContentType(), "text/xml");
    }
diff --git a/drivers/jsch/src/test/java/org/jclouds/ssh/jsch/JschSshClientLiveTest.java b/drivers/jsch/src/test/java/org/jclouds/ssh/jsch/JschSshClientLiveTest.java
index 027311c..033c01b 100644
--- a/drivers/jsch/src/test/java/org/jclouds/ssh/jsch/JschSshClientLiveTest.java
+++ b/drivers/jsch/src/test/java/org/jclouds/ssh/jsch/JschSshClientLiveTest.java
@@ -165,14 +165,14 @@
       SshClient client = setupClient();
       client.put(temp.getAbsolutePath(), Payloads.newStringPayload("rabbit"));
       Payload input = setupClient().get(temp.getAbsolutePath());
-      String contents = Strings2.toStringAndClose(input.getInput());
+      String contents = Strings2.toString(input);
       assertEquals(contents, "rabbit");
    }
 
    @Test
    public void testGetEtcPassword() throws IOException {
       Payload input = setupClient().get("/etc/passwd");
-      String contents = Strings2.toStringAndClose(input.getInput());
+      String contents = Strings2.toString(input);
       assert contents.indexOf("root") >= 0 : "no root in " + contents;
    }
 
@@ -276,6 +276,6 @@
       } finally {
          Closeables.closeQuietly(response);
       }
-      assertEquals(response.getExitStatus().get(), new Integer(0));
+      assertEquals(response.getExitStatus().get(), Integer.valueOf(0));
    }
 }
\ No newline at end of file
diff --git a/drivers/sshj/src/test/java/org/jclouds/sshj/SshjSshClientLiveTest.java b/drivers/sshj/src/test/java/org/jclouds/sshj/SshjSshClientLiveTest.java
index f0d78dd..7f64209 100644
--- a/drivers/sshj/src/test/java/org/jclouds/sshj/SshjSshClientLiveTest.java
+++ b/drivers/sshj/src/test/java/org/jclouds/sshj/SshjSshClientLiveTest.java
@@ -152,13 +152,13 @@
       SshClient client = setupClient();
       client.put(temp.getAbsolutePath(), Payloads.newStringPayload("rabbit"));
       Payload input = client.get(temp.getAbsolutePath());
-      String contents = Strings2.toStringAndClose(input.getInput());
+      String contents = Strings2.toString(input);
       assertEquals(contents, "rabbit");
    }
 
    public void testGetEtcPassword() throws IOException {
       Payload input = setupClient().get("/etc/passwd");
-      String contents = Strings2.toStringAndClose(input.getInput());
+      String contents = Strings2.toString(input);
       assert contents.indexOf("root") >= 0 : "no root in " + contents;
    }
 
@@ -185,6 +185,6 @@
       } finally {
          Closeables.closeQuietly(response);
       }
-      assertEquals(response.getExitStatus().get(), new Integer(0));
+      assertEquals(response.getExitStatus().get(), Integer.valueOf(0));
    }
 }
diff --git a/labs/cdmi/src/main/java/org/jclouds/snia/cdmi/v1/options/ListContainersOptions.java b/labs/cdmi/src/main/java/org/jclouds/snia/cdmi/v1/options/ListContainersOptions.java
index efa468f..6aa1b48 100644
--- a/labs/cdmi/src/main/java/org/jclouds/snia/cdmi/v1/options/ListContainersOptions.java
+++ b/labs/cdmi/src/main/java/org/jclouds/snia/cdmi/v1/options/ListContainersOptions.java
@@ -53,7 +53,7 @@
 
    public int getLimit() {
       String val = getFirstQueryOrNull("limit");
-      return val != null ? new Integer(val) : 10000;
+      return val != null ? Integer.valueOf(val) : 10000;
    }
 
    public static class Builder {
diff --git a/labs/glesys/src/main/java/org/jclouds/glesys/handlers/GleSYSErrorHandler.java b/labs/glesys/src/main/java/org/jclouds/glesys/handlers/GleSYSErrorHandler.java
index 9f5a37c..82afc0f 100644
--- a/labs/glesys/src/main/java/org/jclouds/glesys/handlers/GleSYSErrorHandler.java
+++ b/labs/glesys/src/main/java/org/jclouds/glesys/handlers/GleSYSErrorHandler.java
@@ -80,7 +80,7 @@
       if (response.getPayload() == null)
          return null;
       try {
-         return Strings2.toStringAndClose(response.getPayload().getInput());
+         return Strings2.toString(response.getPayload());
       } catch (IOException e) {
          throw new RuntimeException(e);
       } finally {
diff --git a/labs/joyent-cloudapi/src/test/java/org/jclouds/joyent/cloudapi/v6_5/compute/loaders/CreateUniqueKeyTest.java b/labs/joyent-cloudapi/src/test/java/org/jclouds/joyent/cloudapi/v6_5/compute/loaders/CreateUniqueKeyTest.java
index c264bcd..1eb3aa4 100644
--- a/labs/joyent-cloudapi/src/test/java/org/jclouds/joyent/cloudapi/v6_5/compute/loaders/CreateUniqueKeyTest.java
+++ b/labs/joyent-cloudapi/src/test/java/org/jclouds/joyent/cloudapi/v6_5/compute/loaders/CreateUniqueKeyTest.java
@@ -64,6 +64,8 @@
  */
 @Test(groups = "unit", testName = "CreateUniqueKeyTest")
 public class CreateUniqueKeyTest {
+   private static final String lineSeparator = System.getProperty("line.separator");
+
    private Factory namingConvention;
    private KeyPair keyPair;
    private String openSshKey;
@@ -111,7 +113,7 @@
       CreateUniqueKey parser = new CreateUniqueKey(cloudApiApi, namingConvention, crypto, Providers.of(secureRandom));
 
       assertEquals(parser.load(DatacenterAndName.fromDatacenterAndName("datacenter", "group")),
-            KeyAndPrivateKey.fromKeyAndPrivateKey(key, PRIVATE_KEY));
+            KeyAndPrivateKey.fromKeyAndPrivateKey(key, PRIVATE_KEY.replaceAll("\n", lineSeparator)));
 
       verify(cloudApiApi, keyApi, crypto, rsaKeyPairGenerator, secureRandom);
    }
diff --git a/labs/nodepool/src/main/java/org/jclouds/nodepool/NodePoolApiMetadata.java b/labs/nodepool/src/main/java/org/jclouds/nodepool/NodePoolApiMetadata.java
index df6296c..98b5357 100644
--- a/labs/nodepool/src/main/java/org/jclouds/nodepool/NodePoolApiMetadata.java
+++ b/labs/nodepool/src/main/java/org/jclouds/nodepool/NodePoolApiMetadata.java
@@ -26,6 +26,7 @@
 import static org.jclouds.nodepool.config.NodePoolProperties.POOL_ADMIN_ACCESS;
 import static org.jclouds.nodepool.config.NodePoolProperties.REMOVE_DESTROYED;
 
+import java.io.File;
 import java.net.URI;
 import java.util.Properties;
 
@@ -62,7 +63,6 @@
 
    public static Properties defaultProperties() {
       Properties properties = BaseRestApiMetadata.defaultProperties();
-      properties.setProperty("nodepool.identity", "nodepool-user");
       properties.setProperty(BACKEND_GROUP, "nodepool");
       properties.setProperty(METADATA_CONTAINER, "nodes");
       properties.setProperty(BACKEND_MODULES,
@@ -70,9 +70,12 @@
       properties.setProperty(MAX_SIZE, 10 + "");
       properties.setProperty(MIN_SIZE, 5 + "");
       properties.setProperty(REMOVE_DESTROYED, "true");
-      // by default use the current user's user and private key
-      properties.setProperty(POOL_ADMIN_ACCESS, "adminUsername=" + System.getProperty("user.name")
-               + ",adminPrivateKeyFile=" + System.getProperty("user.home") + "/.ssh/id_rsa");
+      // by default use the current user's user and private key if one exists, if not the properties
+      // will need to be set (no default passwords)
+      if (new File(System.getProperty("user.home") + "/.ssh/id_rsa").exists()) {
+         properties.setProperty(POOL_ADMIN_ACCESS, "adminUsername=" + System.getProperty("user.name")
+                  + ",adminPrivateKeyFile=" + System.getProperty("user.home") + "/.ssh/id_rsa");
+      }
       return properties;
    }
 
diff --git a/labs/nodepool/src/main/java/org/jclouds/nodepool/config/NodePoolComputeServiceContextModule.java b/labs/nodepool/src/main/java/org/jclouds/nodepool/config/NodePoolComputeServiceContextModule.java
index e2cfc0d..2adb63c 100644
--- a/labs/nodepool/src/main/java/org/jclouds/nodepool/config/NodePoolComputeServiceContextModule.java
+++ b/labs/nodepool/src/main/java/org/jclouds/nodepool/config/NodePoolComputeServiceContextModule.java
@@ -1,3 +1,22 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.nodepool.config;
 
 import javax.annotation.Nullable;
@@ -44,6 +63,7 @@
       bind(ComputeServiceContext.class).to(NodePoolComputeServiceContext.class);
       install(new LocationsFromComputeServiceAdapterModule<NodeMetadata, Hardware, Image, Location>() {
       });
+
    }
 
    @Override
diff --git a/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/BaseNodePoolComputeServiceAdapter.java b/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/BaseNodePoolComputeServiceAdapter.java
index ac3674a..7073d8b 100644
--- a/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/BaseNodePoolComputeServiceAdapter.java
+++ b/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/BaseNodePoolComputeServiceAdapter.java
@@ -61,8 +61,10 @@
    protected final AdminAccess.Builder initialCredentialsBuilder;
 
    public BaseNodePoolComputeServiceAdapter(@Backend Supplier<ComputeService> backendComputeService,
-            @Backend Supplier<Template> backendTemplate, @Named(BACKEND_GROUP) String poolGroupName,
-            NodeMetadataStore metadataStore, @Named(POOL_ADMIN_ACCESS) String poolNodeAdminAccess,
+
+   @Backend Supplier<Template> backendTemplate, @Named(BACKEND_GROUP) String poolGroupName,
+
+   NodeMetadataStore metadataStore, @Named(POOL_ADMIN_ACCESS) String poolNodeAdminAccess,
             AdminAccess.Configuration configuration) {
       this.backendComputeService = backendComputeService;
       this.poolGroupName = poolGroupName;
diff --git a/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/EagerNodePoolComputeServiceAdapter.java b/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/EagerNodePoolComputeServiceAdapter.java
index 8cacf89..2777e55 100644
--- a/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/EagerNodePoolComputeServiceAdapter.java
+++ b/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/EagerNodePoolComputeServiceAdapter.java
@@ -144,10 +144,13 @@
       logger.info(">> destroying node %s", id);
       metadataStore.deleteMapping(id);
       if (removeDestroyed) {
-         logger.info(">> policy is replace detroyed node, replacing node with id %s", id);
          backendComputeService.get().destroyNode(id);
-         Set<? extends NodeMetadata> replacement = addToPool(1);
-         logger.info("<< node %s replaced with %s", id, Iterables.getOnlyElement(replacement));
+         if (currentSize() < minSize) {
+            logger.info(">> policy is remove destroyed node and pool "
+                     + "would fall below minsize, replacing node with id %s", id);
+            Set<? extends NodeMetadata> replacement = addToPool(1);
+            logger.info("<< node %s replaced with %s", id, Iterables.getOnlyElement(replacement));
+         }
       }
       // TODO we should allow the user to hook a way to "clean" the node
       else {
diff --git a/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/JsonNodeMetadataStore.java b/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/JsonNodeMetadataStore.java
index 15eb5e0..9d003cd 100644
--- a/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/JsonNodeMetadataStore.java
+++ b/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/JsonNodeMetadataStore.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.nodepool.internal;
 
 import static com.google.common.base.Preconditions.checkNotNull;
diff --git a/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/NodeMetadataStoreCache.java b/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/NodeMetadataStoreCache.java
index 99db916..af71a93 100644
--- a/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/NodeMetadataStoreCache.java
+++ b/labs/nodepool/src/main/java/org/jclouds/nodepool/internal/NodeMetadataStoreCache.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.nodepool.internal;
 
 import java.util.HashMap;
diff --git a/labs/nodepool/src/test/java/org/jclouds/nodepool/BYONBackendLiveTest.java b/labs/nodepool/src/test/java/org/jclouds/nodepool/BYONBackendLiveTest.java
index e467247..7ae2b20 100644
--- a/labs/nodepool/src/test/java/org/jclouds/nodepool/BYONBackendLiveTest.java
+++ b/labs/nodepool/src/test/java/org/jclouds/nodepool/BYONBackendLiveTest.java
@@ -23,6 +23,7 @@
 import static org.jclouds.nodepool.config.NodePoolProperties.BASEDIR;
 import static org.jclouds.nodepool.config.NodePoolProperties.MAX_SIZE;
 import static org.jclouds.nodepool.config.NodePoolProperties.MIN_SIZE;
+import static org.jclouds.nodepool.config.NodePoolProperties.REMOVE_DESTROYED;
 import static org.jclouds.scriptbuilder.domain.Statements.exec;
 
 import java.io.File;
@@ -41,7 +42,7 @@
 
 /**
  * 
- * @author Adrian Cole
+ * @author Adrian Cole, David Alves
  */
 @Test(groups = "live", testName = "BYONBackendLiveTest")
 public class BYONBackendLiveTest extends BaseComputeServiceContextLiveTest {
@@ -61,6 +62,7 @@
       contextProperties.setProperty(BASEDIR, basedir);
       contextProperties.setProperty(MAX_SIZE, 1 + "");
       contextProperties.setProperty(MIN_SIZE, 1 + "");
+      contextProperties.setProperty(REMOVE_DESTROYED, false + "");
       contextProperties.setProperty("nodepool.identity", System.getProperty("user.name"));
 
       StringBuilder nodes = new StringBuilder();
diff --git a/labs/nodepool/src/test/java/org/jclouds/nodepool/NodeMetadataStoreTestDisabled.java b/labs/nodepool/src/test/java/org/jclouds/nodepool/NodeMetadataStoreTest.java
similarity index 86%
rename from labs/nodepool/src/test/java/org/jclouds/nodepool/NodeMetadataStoreTestDisabled.java
rename to labs/nodepool/src/test/java/org/jclouds/nodepool/NodeMetadataStoreTest.java
index 0079fbb..3500bdf 100644
--- a/labs/nodepool/src/test/java/org/jclouds/nodepool/NodeMetadataStoreTestDisabled.java
+++ b/labs/nodepool/src/test/java/org/jclouds/nodepool/NodeMetadataStoreTest.java
@@ -18,6 +18,7 @@
  */
 package org.jclouds.nodepool;
 
+import static org.jclouds.nodepool.config.NodePoolProperties.POOL_ADMIN_ACCESS;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertSame;
@@ -38,7 +39,6 @@
 import org.jclouds.compute.domain.NodeMetadata.Status;
 import org.jclouds.compute.domain.NodeMetadataBuilder;
 import org.jclouds.compute.options.TemplateOptions;
-import org.jclouds.compute.strategy.PrioritizeCredentialsFromTemplate;
 import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
 import org.jclouds.nodepool.config.NodePoolProperties;
 import org.jclouds.nodepool.internal.NodeMetadataStore;
@@ -53,11 +53,9 @@
 /**
  * @author Adrian Cole, David Alves
  */
-@Test(groups = "unit")
-public class NodeMetadataStoreTestDisabled {
-//   unit tests should have no dependencies, yet this one is failing on cloudbees:
-//   Guice creation errors:  1) Error injecting constructor, java.lang.IllegalArgumentException: key adminPrivateKeyFile value set to /home/hudson/.ssh/id_rsa, must be an existing file   at org.jclouds.nodepool.internal.EagerNodePoolComputeServiceAdapter.<init>(EagerNodePoolComputeServiceAdapter.java:77)   at 
-   
+@Test(groups = "unit", testName = "NodeMetadataStoreTest")
+public class NodeMetadataStoreTest {
+
    @Inject
    NodeMetadataStore store;
 
@@ -84,6 +82,7 @@
       overrides.setProperty(NodePoolProperties.BACKEND_PROVIDER, "stub");
       overrides.setProperty(NodePoolProperties.MIN_SIZE, "0");
       overrides.setProperty(NodePoolProperties.BASEDIR, baseDir);
+      overrides.setProperty(POOL_ADMIN_ACCESS, "adminUsername=pooluser,adminPassword=poolpass");
       // note no ssh module since we are stub and not trying ssh, yet
       overrides.setProperty(NodePoolProperties.BACKEND_MODULES, SLF4JLoggingModule.class.getName());
       Context nodePoolCtx = ContextBuilder.newBuilder("nodepool").credentials("foo", "bar").overrides(overrides)
@@ -103,13 +102,6 @@
    }
 
    @Test(groups = "unit", dependsOnMethods = "testStore")
-   public void testCredentialsFromStoreOverrideBackendCredentials() {
-      // test that node store credentials are not overriden from somewhere else
-      assertNull(createInjector().getBinding(PrioritizeCredentialsFromTemplate.class).getProvider().get()
-               .apply(null, null));
-   }
-
-   @Test(groups = "unit", dependsOnMethods = "testStore")
    public void testLoad() {
       NodeMetadata loaded = store.load(nodeMeta1);
       assertEquals(loaded.getId(), nodeMeta1.getId());
diff --git a/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceContextTest.java b/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceContextTest.java
index f0dd646..29908b3 100644
--- a/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceContextTest.java
+++ b/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceContextTest.java
@@ -18,6 +18,7 @@
  */
 package org.jclouds.nodepool;
 
+import static org.jclouds.nodepool.config.NodePoolProperties.POOL_ADMIN_ACCESS;
 import static org.testng.Assert.assertEquals;
 
 import java.io.File;
@@ -41,27 +42,22 @@
 @Test(groups = "unit", testName = "NodePoolComputeServiceContextTest")
 public class NodePoolComputeServiceContextTest {
 
-
-   //TODO: identity became nodepool-user
-   @Test(enabled = false)
    public void testBinds() {
       final String basedir = "target/" + this.getClass().getSimpleName();
       new File(basedir).delete();
-      
+
       Properties overrides = new Properties();
       overrides.setProperty(NodePoolProperties.BACKEND_PROVIDER, "stub");
       overrides.setProperty(NodePoolProperties.BASEDIR, basedir);
       // note no ssh module since we are stub and not trying ssh, yet
       overrides.setProperty(NodePoolProperties.BACKEND_MODULES, SLF4JLoggingModule.class.getName());
-      
-      ComputeService stub = ContextBuilder.newBuilder("nodepool")
-                                          .credentials("foo", "bar")
-                                          .endpoint("gooend")
-                                          .apiVersion("1.1")
-                                          .buildVersion("1.1-2")
-                                          .overrides(overrides)
-                                          .buildInjector().getInstance(Key.get(new TypeLiteral<Supplier<ComputeService>>(){}, Backend.class)).get();
-      
+      overrides.setProperty(POOL_ADMIN_ACCESS, "adminUsername=pooluser,adminPassword=poolpass");
+
+      ComputeService stub = ContextBuilder.newBuilder("nodepool").credentials("foo", "bar").endpoint("gooend")
+               .apiVersion("1.1").buildVersion("1.1-2").overrides(overrides).buildInjector()
+               .getInstance(Key.get(new TypeLiteral<Supplier<ComputeService>>() {
+               }, Backend.class)).get();
+
       assertEquals(stub.getContext().unwrap().getIdentity(), "foo");
       assertEquals(stub.getContext().utils().injector().getInstance(Key.get(String.class, Credential.class)), "bar");
       assertEquals(stub.getContext().unwrap().getProviderMetadata().getEndpoint(), "gooend");
@@ -73,5 +69,4 @@
 
    }
 
-
 }
\ No newline at end of file
diff --git a/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceLiveTest.java b/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceLiveTest.java
index 40f20f2..7f8d320 100644
--- a/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceLiveTest.java
+++ b/labs/nodepool/src/test/java/org/jclouds/nodepool/NodePoolComputeServiceLiveTest.java
@@ -67,7 +67,8 @@
 import com.google.inject.Module;
 
 public class NodePoolComputeServiceLiveTest extends BaseComputeServiceLiveTest {
-   final String basedir = "target/" + this.getClass().getSimpleName().toLowerCase();
+
+   private final String basedir = "target/" + this.getClass().getSimpleName().toLowerCase();
 
    public NodePoolComputeServiceLiveTest() {
       provider = "nodepool";
@@ -76,6 +77,9 @@
    @Override
    protected Properties setupProperties() {
       Properties contextProperties = super.setupProperties();
+      contextProperties.setProperty(BASEDIR, basedir);
+      contextProperties.setProperty("nodepool.identity", "pooluser");
+      contextProperties.setProperty(POOL_ADMIN_ACCESS, "adminUsername=pooluser,adminPassword=poolpassword");
       contextProperties.setProperty(TIMEOUT_SCRIPT_COMPLETE, (1200 * 1000) + "");
       contextProperties.setProperty(TIMEOUT_PORT_OPEN, (1200 * 1000) + "");
       contextProperties.setProperty(BASEDIR, basedir);
@@ -102,9 +106,8 @@
    }
 
    @Override
-   @Test(enabled = true)
+   @Test(enabled = true, groups = "live")
    public void testCreateAndRunAService() throws Exception {
-      this.group = this.group + "s";
       final String configuration = Strings2.toStringAndClose(RunScriptData.class
                .getResourceAsStream("/standalone-basic.xml"));
 
@@ -125,6 +128,11 @@
 
       watch.reset().start();
 
+      // note this is a dependency on the template resolution so we have the
+      // right process per
+      // operating system. moreover, we wish this to run as root, so that it
+      // can change ip
+      // tables rules and setup our admin user
       client.runScriptOnNode(nodeId, installAdminUserJBossAndOpenPorts(node.getOperatingSystem()),
                nameTask("configure-jboss"));
 
@@ -170,7 +178,7 @@
       }), "jboss", node, JBOSS_PATTERN);
    }
 
-   @Test(enabled = true, dependsOnMethods = "testCreateAndRunAService")
+   @Test(enabled = true, groups = "live", dependsOnMethods = "testCreateAndRunAService")
    public void testRebuildPoolStateFromStore() {
       tearDownContext();
       setupContext();
@@ -178,13 +186,13 @@
       assertEquals(((NodeMetadata) Iterables.get(client.listNodes(), 0)).getGroup(), this.group);
    }
 
-   @Test(enabled = false, dependsOnMethods = "testRebuildPoolStateFromStore")
+   @Test(enabled = true, groups = "live", dependsOnMethods = "testRebuildPoolStateFromStore")
    public void testIncreasePoolAllowed() throws RunNodesException {
       client.createNodesInGroup(this.group, 1);
       assertSame(client.listNodes().size(), 2);
    }
 
-   @Test(enabled = false, dependsOnMethods = "testIncreasePoolAllowed")
+   @Test(enabled = true, groups = "live", dependsOnMethods = "testIncreasePoolAllowed")
    public void testIncreasePoolNotAllowed() throws RunNodesException {
       boolean caughtException = false;
       try {
@@ -195,7 +203,7 @@
       assertTrue(caughtException, "expected an exception to be thrown");
    }
 
-   @Test(enabled = true, dependsOnMethods = "testRebuildPoolStateFromStore")
+   @Test(enabled = true, groups = "live", dependsOnMethods = "testIncreasePoolNotAllowed")
    public void testGetBackendComputeServiceContext() {
       NodePoolComputeServiceContext ctx = context.utils().injector().getInstance(NodePoolComputeServiceContext.class);
       assertNotNull(ctx.getBackendContext());
@@ -204,7 +212,7 @@
                         NodePredicates.inGroup(ctx.getPoolGroupName())).size(), 2);
    }
 
-   @Test(enabled = false, dependsOnMethods = "testGetBackendComputeServiceContext")
+   @Test(enabled = true, groups = "live", dependsOnMethods = "testGetBackendComputeServiceContext")
    public void testDestroyPoolNodes() {
       client.destroyNodesMatching(NodePredicates.inGroup(this.group));
       // after we destroy all nodes we should still have minsize nodes in the pool
@@ -212,7 +220,7 @@
       assertSame(ctx.getPoolStats().currentSize(), 1);
    }
 
-   @Test(enabled = true, dependsOnMethods = "testGetBackendComputeServiceContext")
+   @Test(enabled = true, groups = "live", dependsOnMethods = "testDestroyPoolNodes")
    public void testDestroyPool() {
       // TODO get the ctx without the injector
       NodePoolComputeServiceContext ctx = context.utils().injector().getInstance(NodePoolComputeServiceContext.class);
@@ -223,7 +231,7 @@
    }
 
    @Override
-   @Test(enabled = false, dependsOnMethods = "testCompareSizes")
+   @Test(enabled = false)
    public void testAScriptExecutionAfterBootWithBasicTemplate() throws Exception {
    }
 
@@ -233,7 +241,7 @@
    }
 
    @Override
-   @Test(enabled = false, dependsOnMethods = "testCompareSizes")
+   @Test(enabled = false)
    public void testConcurrentUseOfComputeServiceToCreateNodes() throws Exception {
    }
 
diff --git a/labs/nodepool/src/test/java/org/jclouds/nodepool/config/BindBackendComputeServiceTest.java b/labs/nodepool/src/test/java/org/jclouds/nodepool/config/BindBackendComputeServiceTest.java
index 55bafcb..4b510cf 100644
--- a/labs/nodepool/src/test/java/org/jclouds/nodepool/config/BindBackendComputeServiceTest.java
+++ b/labs/nodepool/src/test/java/org/jclouds/nodepool/config/BindBackendComputeServiceTest.java
@@ -18,6 +18,8 @@
  */
 package org.jclouds.nodepool.config;
 
+import static org.easymock.EasyMock.createNiceMock;
+import static org.jclouds.nodepool.config.NodePoolProperties.POOL_ADMIN_ACCESS;
 import static org.testng.Assert.assertEquals;
 
 import java.io.File;
@@ -25,13 +27,19 @@
 
 import org.jclouds.ContextBuilder;
 import org.jclouds.compute.ComputeService;
+import org.jclouds.domain.Credentials;
+import org.jclouds.domain.LoginCredentials;
 import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
 import org.jclouds.nodepool.Backend;
 import org.jclouds.rest.annotations.Credential;
+import org.jclouds.ssh.SshClient;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Supplier;
+import com.google.common.net.HostAndPort;
+import com.google.inject.AbstractModule;
 import com.google.inject.Key;
+import com.google.inject.Scopes;
 import com.google.inject.TypeLiteral;
 
 /**
@@ -40,26 +48,23 @@
 @Test(groups = "unit", testName = "BindBackendComputeServiceTest")
 public class BindBackendComputeServiceTest {
 
-   //TODO: identity became nodepool-user
-   @Test(enabled = false)
    public void testBinds() {
       final String basedir = "target/" + this.getClass().getSimpleName();
       new File(basedir).delete();
-      
+
       Properties overrides = new Properties();
       overrides.setProperty(NodePoolProperties.BACKEND_PROVIDER, "stub");
       overrides.setProperty(NodePoolProperties.BASEDIR, basedir);
       // note no ssh module since we are stub and not trying ssh, yet
-      overrides.setProperty(NodePoolProperties.BACKEND_MODULES, SLF4JLoggingModule.class.getName());
+      overrides.setProperty(NodePoolProperties.BACKEND_MODULES, SLF4JLoggingModule.class.getName() + ","
+               + StubSshClientModule.class.getName());
+      overrides.setProperty(POOL_ADMIN_ACCESS, "adminUsername=pooluser,adminPassword=poolpass");
 
-      ComputeService stub = ContextBuilder.newBuilder("nodepool")
-                                          .credentials("foo", "bar")
-                                          .endpoint("gooend")
-                                          .apiVersion("1.1")
-                                          .buildVersion("1.1-2")
-                                          .overrides(overrides)
-                                          .buildInjector().getInstance(Key.get(new TypeLiteral<Supplier<ComputeService>>(){}, Backend.class)).get();
-      
+      ComputeService stub = ContextBuilder.newBuilder("nodepool").credentials("foo", "bar").endpoint("gooend")
+               .apiVersion("1.1").buildVersion("1.1-2").overrides(overrides).buildInjector()
+               .getInstance(Key.get(new TypeLiteral<Supplier<ComputeService>>() {
+               }, Backend.class)).get();
+
       assertEquals(stub.getContext().unwrap().getIdentity(), "foo");
       assertEquals(stub.getContext().utils().injector().getInstance(Key.get(String.class, Credential.class)), "bar");
       assertEquals(stub.getContext().unwrap().getProviderMetadata().getEndpoint(), "gooend");
@@ -71,5 +76,23 @@
 
    }
 
+   public static class StubSshClientModule extends AbstractModule {
 
+      protected void configure() {
+         bind(SshClient.Factory.class).to(Factory.class).in(Scopes.SINGLETON);
+      }
+
+      private static class Factory implements SshClient.Factory {
+
+         @Override
+         public SshClient create(HostAndPort socket, LoginCredentials credentials) {
+            return createNiceMock(SshClient.class);
+         }
+
+         @Override
+         public SshClient create(HostAndPort socket, Credentials credentials) {
+            return createNiceMock(SshClient.class);
+         }
+      }
+   }
 }
\ No newline at end of file
diff --git a/labs/nodepool/src/test/java/org/jclouds/nodepool/config/BindInputStreamToFilesystemBlobStoreTest.java b/labs/nodepool/src/test/java/org/jclouds/nodepool/config/BindInputStreamToFilesystemBlobStoreTest.java
index a3283e7..ef6acc0 100644
--- a/labs/nodepool/src/test/java/org/jclouds/nodepool/config/BindInputStreamToFilesystemBlobStoreTest.java
+++ b/labs/nodepool/src/test/java/org/jclouds/nodepool/config/BindInputStreamToFilesystemBlobStoreTest.java
@@ -41,24 +41,23 @@
 @Test(groups = "unit", testName = "BindInputStreamToFilesystemBlobStoreTest")
 public class BindInputStreamToFilesystemBlobStoreTest {
 
-   //TODO: binding error
-   @Test(enabled = false)
    public void testCreatesDir() {
       final String basedir = "target/" + this.getClass().getSimpleName();
       new File(basedir).delete();
-      Map<String, InputStream> file = Guice.createInjector(new AbstractModule() {
-
-         @Override
-         protected void configure() {
-            bindConstant().annotatedWith(Names.named(NodePoolProperties.BASEDIR)).to(basedir);
-            bindConstant().annotatedWith(Names.named(NodePoolProperties.METADATA_CONTAINER)).to("barr");
-            bindConstant().annotatedWith(Names.named(NodePoolProperties.BACKEND_MODULES)).to(
-                  SLF4JLoggingModule.class.getName());
-         }
-
-      }, new BindInputStreamToFilesystemBlobStore()).getInstance(
-            Key.get(new TypeLiteral<Supplier<Map<String, InputStream>>>() {
-            })).get();
+      Map<String, InputStream> file = Guice
+               .createInjector(new AbstractModule() {
+                  @Override
+                  protected void configure() {
+                     bindConstant().annotatedWith(Names.named(NodePoolProperties.BASEDIR)).to(basedir);
+                     bindConstant().annotatedWith(Names.named(NodePoolProperties.METADATA_CONTAINER)).to("barr");
+                     bindConstant().annotatedWith(Names.named(NodePoolProperties.POOL_ADMIN_ACCESS)).to(
+                              "adminUsername=pooluser,adminPassword=poolpass");
+                     bindConstant().annotatedWith(Names.named(NodePoolProperties.BACKEND_MODULES)).to(
+                              SLF4JLoggingModule.class.getName());
+                  }
+               }, new BindInputStreamToFilesystemBlobStore())
+               .getInstance(Key.get(new TypeLiteral<Supplier<Map<String, InputStream>>>() {
+               }, Names.named("METADATA"))).get();
 
       assert (new File(basedir + "/barr").exists());
       assertEquals(file.keySet(), ImmutableSet.of());
diff --git a/labs/nodepool/src/test/resources/logback.xml b/labs/nodepool/src/test/resources/logback.xml
index a74e14e..4f0c2ef 100644
--- a/labs/nodepool/src/test/resources/logback.xml
+++ b/labs/nodepool/src/test/resources/logback.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<configuration scan="false">
+<configuration scan="false">
   <appender name="FILE" class="ch.qos.logback.core.FileAppender">
     <file>target/test-data/jclouds.log</file>
 
diff --git a/labs/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/ListContainersOptions.java b/labs/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/ListContainersOptions.java
index e2afee6..08b3f27 100644
--- a/labs/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/ListContainersOptions.java
+++ b/labs/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/options/ListContainersOptions.java
@@ -53,7 +53,7 @@
 
    public int getLimit() {
       String val = getFirstQueryOrNull("limit");
-      return val != null ? new Integer(val) : 10000;
+      return val != null ? Integer.valueOf(val) : 10000;
    }
 
 
diff --git a/labs/rds/src/main/java/org/jclouds/rds/xml/InstanceHandler.java b/labs/rds/src/main/java/org/jclouds/rds/xml/InstanceHandler.java
index 3a19ffc..e6ee52c 100644
--- a/labs/rds/src/main/java/org/jclouds/rds/xml/InstanceHandler.java
+++ b/labs/rds/src/main/java/org/jclouds/rds/xml/InstanceHandler.java
@@ -110,7 +110,7 @@
       } else if (equalsOrSuffix(qName, "Address")) {
          address = currentOrNull(currentText);
       } else if (equalsOrSuffix(qName, "Port")) {
-         port = new Integer(currentOrNull(currentText));
+         port = Integer.valueOf(currentOrNull(currentText));
       } else if (equalsOrSuffix(qName, "Endpoint")) {
          builder.endpoint(HostAndPort.fromParts(address, port));
          address = null;
diff --git a/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/handlers/VPDCErrorHandler.java b/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/handlers/VPDCErrorHandler.java
index 0c05f5c..5186b00 100644
--- a/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/handlers/VPDCErrorHandler.java
+++ b/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/handlers/VPDCErrorHandler.java
@@ -84,7 +84,7 @@
       if (response.getPayload() == null)
          return null;
       try {
-         return Strings2.toStringAndClose(response.getPayload().getInput());
+         return Strings2.toString(response.getPayload());
       } catch (IOException e) {
          throw new RuntimeException(e);
       } finally {
diff --git a/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/xml/NetworkConfigSectionHandler.java b/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/xml/NetworkConfigSectionHandler.java
index a62fa97..85647f3 100644
--- a/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/xml/NetworkConfigSectionHandler.java
+++ b/labs/savvis-symphonyvpdc/src/main/java/org/jclouds/savvis/vpdc/xml/NetworkConfigSectionHandler.java
@@ -57,7 +57,7 @@
       if (equalsOrSuffix(qName, "FenceMode")) {
          builder.fenceMode(currentOrNull(currentText));
       } else if (equalsOrSuffix(qName, "Dhcp")) {
-         builder.dhcp(new Boolean(currentOrNull(currentText)));
+         builder.dhcp(Boolean.valueOf(currentOrNull(currentText)));
       }
       super.endElement(uri, localName, qName);
    }
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/SmartOSApiMetadata.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/SmartOSApiMetadata.java
index af47bb5..8e29b1e 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/SmartOSApiMetadata.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/SmartOSApiMetadata.java
@@ -13,7 +13,7 @@
  * @author Nigel Magnay
  */
 public class SmartOSApiMetadata extends BaseApiMetadata {
-   
+
    /** The serialVersionUID */
    private static final long serialVersionUID = 3606170564482119304L;
 
@@ -36,16 +36,16 @@
 
    public static class Builder extends BaseApiMetadata.Builder {
 
-      protected Builder(){
+      protected Builder() {
          id("smartos-ssh")
-         .name("SmartOS SSH API")
-         .identityName("Username")
-         .defaultIdentity("root")
-         .defaultCredential("smartos")
-         .defaultEndpoint("http://localhost")
-         .documentation(URI.create("http://http://wiki.smartos.org/display/DOC/How+to+create+a+Virtual+Machine+in+SmartOS"))
-         .view(ComputeServiceContext.class)
-         .defaultModule(SmartOSComputeServiceContextModule.class);
+                  .name("SmartOS SSH API")
+                  .identityName("Username")
+                  .defaultIdentity("root")
+                  .defaultCredential("smartos")
+                  .defaultEndpoint("http://localhost")
+                  .documentation(
+                           URI.create("http://http://wiki.smartos.org/display/DOC/How+to+create+a+Virtual+Machine+in+SmartOS"))
+                  .view(ComputeServiceContext.class).defaultModule(SmartOSComputeServiceContextModule.class);
       }
 
       @Override
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/config/SmartOSComputeServiceContextModule.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/config/SmartOSComputeServiceContextModule.java
index a5fe6c6..124bfc9 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/config/SmartOSComputeServiceContextModule.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/config/SmartOSComputeServiceContextModule.java
@@ -18,23 +18,23 @@
  */
 package org.jclouds.smartos.compute.config;
 
-import com.google.common.base.Function;
-import com.google.inject.TypeLiteral;
-import org.jclouds.smartos.compute.domain.DataSet;
-import org.jclouds.smartos.compute.domain.SmartOSHost;
-import org.jclouds.smartos.compute.domain.VM;
-import org.jclouds.smartos.compute.domain.VmSpecification;
 import org.jclouds.compute.ComputeServiceAdapter;
 import org.jclouds.compute.config.ComputeServiceAdapterContextModule;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.domain.Location;
-
+import org.jclouds.smartos.compute.domain.DataSet;
+import org.jclouds.smartos.compute.domain.SmartOSHost;
+import org.jclouds.smartos.compute.domain.VM;
+import org.jclouds.smartos.compute.domain.VmSpecification;
 import org.jclouds.smartos.compute.functions.DataSetToImage;
 import org.jclouds.smartos.compute.functions.DatacenterToLocation;
 import org.jclouds.smartos.compute.functions.VMToNodeMetadata;
 import org.jclouds.smartos.compute.functions.VmSpecificationToHardware;
 import org.jclouds.smartos.compute.strategy.SmartOSComputeServiceAdapter;
 
+import com.google.common.base.Function;
+import com.google.inject.TypeLiteral;
+
 /**
  * 
  * @author Nigel Magnay
@@ -56,7 +56,8 @@
       bind(new TypeLiteral<Function<SmartOSHost, Location>>() {
       }).to(DatacenterToLocation.class);
       // to have the compute service adapter override default locations
-      //install(new LocationsFromComputeServiceAdapterModule<VM, VmSpecification, DataSet, SmartOSHost>(){});
+      // install(new LocationsFromComputeServiceAdapterModule<VM, VmSpecification, DataSet,
+      // SmartOSHost>(){});
 
    }
 }
\ No newline at end of file
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/DataSet.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/DataSet.java
index 0b766af..be05766 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/DataSet.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/DataSet.java
@@ -1,141 +1,131 @@
 package org.jclouds.smartos.compute.domain;
 
-import com.google.common.base.Objects;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
 import java.util.UUID;
 
+import com.google.common.base.Objects;
+
 /**
  * Dataset is a pre-built image ready to be cloned.
  */
 public class DataSet {
-    private final UUID uuid;
-    private final String os;
-    private final String published;
-    private final String urn;
+   private final UUID uuid;
+   private final String os;
+   private final String published;
+   private final String urn;
 
-    public static Builder builder() {
-        return new Builder();
-    }
+   public static Builder builder() {
+      return new Builder();
+   }
 
-    public Builder toBuilder() {
-        return builder().fromDataSet(this);
-    }
+   public Builder toBuilder() {
+      return builder().fromDataSet(this);
+   }
 
-    public static class Builder {
+   public static class Builder {
 
-        public UUID uuid;
-        public String os;
-        public String published;
-        public String urn;
+      public UUID uuid;
+      public String os;
+      public String published;
+      public String urn;
 
-        public Builder uuid(UUID uuid) {
-            this.uuid = uuid;
-            return this;
-        }
+      public Builder uuid(UUID uuid) {
+         this.uuid = uuid;
+         return this;
+      }
 
-        public Builder uuid(String uuid) {
-            this.uuid = UUID.fromString(uuid);
-            return this;
-        }
+      public Builder uuid(String uuid) {
+         this.uuid = UUID.fromString(uuid);
+         return this;
+      }
 
-        public Builder os(String os) {
-            this.os = os;
-            return this;
-        }
+      public Builder os(String os) {
+         this.os = os;
+         return this;
+      }
 
-        public Builder published(String published) {
-            this.published = published;
-            return this;
-        }
+      public Builder published(String published) {
+         this.published = published;
+         return this;
+      }
 
-        public Builder urn(String urn) {
-            this.urn = urn;
-            return this;
-        }
+      public Builder urn(String urn) {
+         this.urn = urn;
+         return this;
+      }
 
-        public Builder fromDsadmString(String string) {
-            String [] sections = string.split(" ");
+      public Builder fromDsadmString(String string) {
+         String[] sections = string.split(" ");
 
-            uuid      ( sections[0] );
-            os        ( sections[1] );
-            published ( sections[2] );
-            urn       ( sections[3] );
+         uuid(sections[0]);
+         os(sections[1]);
+         published(sections[2]);
+         urn(sections[3]);
 
-            return this;
-        }
+         return this;
+      }
 
+      public DataSet build() {
+         return new DataSet(uuid, os, published, urn);
+      }
 
-        public DataSet build() {
-            return new DataSet(uuid, os, published, urn);
-        }
+      public Builder fromDataSet(DataSet in) {
+         return uuid(in.getUuid()).os(in.getOs()).published(in.getPublished()).urn(in.getUrn());
+      }
+   }
 
-        public Builder fromDataSet(DataSet in) {
-            return uuid(in.getUuid())
-                    .os(in.getOs())
-                    .published(in.getPublished())
-                    .urn(in.getUrn());
-        }
-    }
+   protected DataSet(UUID uuid, String os, String published, String urn) {
+      this.uuid = uuid;
+      this.os = os;
+      this.published = published;
+      this.urn = urn;
+   }
 
-    protected DataSet(UUID uuid, String os, String published, String urn) {
-        this.uuid = uuid;
-        this.os = os;
-        this.published = published;
-        this.urn = urn;
-    }
+   public UUID getUuid() {
+      return uuid;
+   }
 
-    public UUID getUuid() {
-        return uuid;
-    }
+   public String getOs() {
+      return os;
+   }
 
-    public String getOs() {
-        return os;
-    }
+   public String getPublished() {
+      return published;
+   }
 
-    public String getPublished() {
-        return published;
-    }
+   public String getUrn() {
+      return urn;
+   }
 
-    public String getUrn() {
-        return urn;
-    }
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public int hashCode() {
+      // UUID is primary key
+      return uuid.hashCode();
+   }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int hashCode() {
-        // UUID is primary key
-        return uuid.hashCode();
-    }
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      return uuid.equals(((DataSet) obj).uuid);
+   }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        return uuid.equals(((DataSet)obj).uuid);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this).omitNullValues()
-                .add("uuid", uuid)
-                .add("os", os)
-                .add("published", published)
-                .add("urn", urn).toString();
-    }
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).omitNullValues().add("uuid", uuid).add("os", os).add("published", published)
+               .add("urn", urn).toString();
+   }
 
 }
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/SmartOSHost.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/SmartOSHost.java
index 7feb88a..248f42f 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/SmartOSHost.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/SmartOSHost.java
@@ -1,19 +1,5 @@
 package org.jclouds.smartos.compute.domain;
 
-import com.google.common.base.Splitter;
-import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.net.HostAndPort;
-import org.jclouds.domain.LoginCredentials;
-import org.jclouds.location.Provider;
-import org.jclouds.rest.annotations.Credential;
-import org.jclouds.rest.annotations.Identity;
-import org.jclouds.ssh.SshClient;
-
-import javax.annotation.Nullable;
-import javax.inject.Inject;
-import javax.inject.Singleton;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.StringReader;
@@ -23,274 +9,276 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import javax.annotation.Nullable;
+import javax.inject.Inject;
+
+import org.jclouds.domain.LoginCredentials;
+import org.jclouds.location.Provider;
+import org.jclouds.rest.annotations.Credential;
+import org.jclouds.rest.annotations.Identity;
+import org.jclouds.ssh.SshClient;
+
+import com.google.common.base.Splitter;
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.net.HostAndPort;
+
 /**
  * A host machine that runs smartOS
  */
-@Singleton
 public class SmartOSHost {
-    protected final String hostname;
-    protected final String username;
-    protected final String password;
+   protected final String hostname;
+   protected final String username;
+   protected final String password;
 
-    protected SshClient.Factory sshClientFactory;
+   protected SshClient.Factory sshClientFactory;
 
-    private SshClient _connection;
+   private SshClient _connection;
 
-    public static class HostException extends RuntimeException {
-        public HostException(String s, Throwable throwable) {
-            super(s, throwable);
-        }
+   public static class HostException extends RuntimeException {
+      private static final long serialVersionUID = -2247796213703641847L;
 
-        public HostException(String s) {
-            super(s);
-        }
-    }
+      public HostException(String s, Throwable throwable) {
+         super(s, throwable);
+      }
 
-    public static class NoResponseException extends Exception {
-        public NoResponseException() {
-        }
-    }
+      public HostException(String s) {
+         super(s);
+      }
+   }
 
-    public static Builder builder() {
-        return new Builder();
-    }
+   public static class NoResponseException extends Exception {
+      private static final long serialVersionUID = -2247796213703641847L;
 
-    public Builder toBuilder() {
-        return builder().fromSmartOSHost(this);
-    }
+      public NoResponseException() {
+      }
+   }
 
-    public static class Builder {
-        protected String hostname;
-        protected String username;
-        protected String password;
-        protected SshClient.Factory sshFactory;
+   public static Builder builder() {
+      return new Builder();
+   }
 
-        public Builder hostname(String hostname) {
-            this.hostname = hostname;
-            return this;
-        }
+   public Builder toBuilder() {
+      return builder().fromSmartOSHost(this);
+   }
 
-        public Builder username(String username) {
-            this.username = username;
-            return this;
-        }
+   public static class Builder {
+      protected String hostname;
+      protected String username;
+      protected String password;
+      protected SshClient.Factory sshFactory;
 
-        public Builder password(String password) {
-            this.password = password;
-            return this;
-        }
+      public Builder hostname(String hostname) {
+         this.hostname = hostname;
+         return this;
+      }
 
-        public Builder sshFactory(SshClient.Factory sshFactory) {
-            this.sshFactory = sshFactory;
-            return this;
-        }
+      public Builder username(String username) {
+         this.username = username;
+         return this;
+      }
 
-        public SmartOSHost build() {
-            return new SmartOSHost(hostname, username, password, sshFactory);
-        }
+      public Builder password(String password) {
+         this.password = password;
+         return this;
+      }
 
-        public Builder fromSmartOSHost(SmartOSHost in) {
-            return this.hostname  ( in.getHostname() )
-                       .username  ( in.getHostname() )
-                       .password  ( in.getPassword() )
-                       .sshFactory( in.getSshClientFactory() );
-        }
-    }
+      public Builder sshFactory(SshClient.Factory sshFactory) {
+         this.sshFactory = sshFactory;
+         return this;
+      }
 
-    @Inject
-    protected SmartOSHost(@Provider Supplier<URI> provider,
-                          @Nullable @Identity String identity,
-                          @Nullable @Credential String credential,
-                          SshClient.Factory sshFactory) {
+      public SmartOSHost build() {
+         return new SmartOSHost(hostname, username, password, sshFactory);
+      }
 
-        this.hostname = provider.get().getHost();
-        this.username = identity;
-        this.password = credential;
-        this.sshClientFactory = sshFactory;
-    }
+      public Builder fromSmartOSHost(SmartOSHost in) {
+         return this.hostname(in.getHostname()).username(in.getHostname()).password(in.getPassword())
+                  .sshFactory(in.getSshClientFactory());
+      }
+   }
 
-    protected SmartOSHost(String hostname, String username, String password, SshClient.Factory sshClientFactory) {
-        this.hostname = hostname;
-        this.username = username;
-        this.password = password;
-        this.sshClientFactory = sshClientFactory;
-    }
+   @Inject
+   protected SmartOSHost(@Provider Supplier<URI> provider, @Nullable @Identity String identity,
+            @Nullable @Credential String credential, SshClient.Factory sshFactory) {
 
-    public String getDescription() {
-        return "SmartOS@" + hostname;
-    }
+      this.hostname = provider.get().getHost();
+      this.username = identity;
+      this.password = credential;
+      this.sshClientFactory = sshFactory;
+   }
 
-    public String getHostname() {
-        return hostname;
-    }
+   protected SmartOSHost(String hostname, String username, String password, SshClient.Factory sshClientFactory) {
+      this.hostname = hostname;
+      this.username = username;
+      this.password = password;
+      this.sshClientFactory = sshClientFactory;
+   }
 
-    public String getUsername() {
-        return username;
-    }
+   public String getDescription() {
+      return "SmartOS@" + hostname;
+   }
 
-    public String getPassword() {
-        return password;
-    }
+   public String getHostname() {
+      return hostname;
+   }
 
-    public SshClient.Factory getSshClientFactory() {
-        return sshClientFactory;
-    }
+   public String getUsername() {
+      return username;
+   }
 
-    protected SshClient getConnection() {
-        if (_connection == null) {
+   public String getPassword() {
+      return password;
+   }
 
-            LoginCredentials credentials = new LoginCredentials.Builder()
-                    .user(username)
-                    .password(password)
-                    .build();
+   public SshClient.Factory getSshClientFactory() {
+      return sshClientFactory;
+   }
 
-            _connection = getSshClientFactory().create(
-                    HostAndPort.fromParts(hostname, 22),
-                    credentials
-            );
+   protected SshClient getConnection() {
+      if (_connection == null) {
 
-            _connection.connect();
+         LoginCredentials credentials = new LoginCredentials.Builder().user(username).password(password).build();
 
-        }
-        return _connection;
-    }
+         _connection = getSshClientFactory().create(HostAndPort.fromParts(hostname, 22), credentials);
 
+         _connection.connect();
 
-    public String exec(String cmd) {
-        return getConnection().exec(cmd).getOutput();
-    }
+      }
+      return _connection;
+   }
 
-    public String vmList()  {
-        return exec("vmadm list -p");
-    }
+   public String exec(String cmd) {
+      return getConnection().exec(cmd).getOutput();
+   }
 
+   public String vmList() {
+      return exec("vmadm list -p");
+   }
 
-    public Map<String, String> getVMIpAddresses(UUID vmId)
-    {
-        ImmutableMap.Builder<String, String> netMapBuilder = ImmutableMap.builder();
+   public Map<String, String> getVMIpAddresses(UUID vmId) {
+      ImmutableMap.Builder<String, String> netMapBuilder = ImmutableMap.builder();
 
-        String response = getConnection().exec("zlogin " + vmId.toString() + " ifconfig -a4").getOutput();
+      String response = getConnection().exec("zlogin " + vmId.toString() + " ifconfig -a4").getOutput();
 
-        if( response.length() == 0)
-            return ImmutableMap.of();
+      if (response.length() == 0)
+         return ImmutableMap.of();
 
-        Iterable<String> strings = Splitter.on("\n").split(response);
-        Pattern inetMatcher = Pattern.compile("inet [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}");
+      Iterable<String> strings = Splitter.on("\n").split(response);
+      Pattern inetMatcher = Pattern.compile("inet [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}");
 
-        String iface = "";
-        for(String line : strings )
-        {
-            if( line.length() > 0 && Character.isLetterOrDigit(line.charAt(0)) )
-            {
-                iface = line.substring(0, line.indexOf(":") );
-            }
-            else
-            {
-                Matcher matcher = inetMatcher.matcher(line);
-                if( matcher.find() )
-                    netMapBuilder.put(iface, matcher.group().substring(5));
-            }
-        }
+      String iface = "";
+      for (String line : strings) {
+         if (line.length() > 0 && Character.isLetterOrDigit(line.charAt(0))) {
+            iface = line.substring(0, line.indexOf(":"));
+         } else {
+            Matcher matcher = inetMatcher.matcher(line);
+            if (matcher.find())
+               netMapBuilder.put(iface, matcher.group().substring(5));
+         }
+      }
 
-        return netMapBuilder.build();
+      return netMapBuilder.build();
 
-    }
+   }
 
-    /**
-     * What remotely available images are there in the cloud?
-     *
-     * @return Collection of datasets
-     */
-    public Iterable<DataSet> getAvailableImages() {
-        return toSpecList(exec("dsadm avail"));
-    }
+   /**
+    * What remotely available images are there in the cloud?
+    * 
+    * @return Collection of datasets
+    */
+   public Iterable<DataSet> getAvailableImages() {
+      return toSpecList(exec("dsadm avail"));
+   }
 
-    public Iterable<DataSet> getLocalDatasets() {
-        return toSpecList(exec("dsadm list"));
-    }
+   public Iterable<DataSet> getLocalDatasets() {
+      return toSpecList(exec("dsadm list"));
+   }
 
-    public Iterable<VM> getVMs() {
-        return toVMList(exec("vmadm list -p"));
-    }
+   public Iterable<VM> getVMs() {
+      return toVMList(exec("vmadm list -p"));
+   }
 
-    public VM createVM(VmSpecification specification) {
+   public VM createVM(VmSpecification specification) {
 
-        String response = getConnection().exec("(cat <<END\n" +
-                specification.toJSONSpecification() + "\nEND\n) | vmadm create").getOutput();
+      String response = getConnection().exec(
+               "(cat <<END\n" + specification.toJSONSpecification() + "\nEND\n) | vmadm create").getOutput();
 
-        Pattern uuidPattern = Pattern.compile("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}");
-        Matcher matcher = uuidPattern.matcher(response);
-        if (matcher.find()) {
-            String uuid = matcher.group();
-            return getVM( UUID.fromString(uuid) );
-        } else {
-            throw new HostException("Error creating Host: response = " + response + "\n source = " + specification.toJSONSpecification());
-        }
+      Pattern uuidPattern = Pattern.compile("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}");
+      Matcher matcher = uuidPattern.matcher(response);
+      if (matcher.find()) {
+         String uuid = matcher.group();
+         return getVM(UUID.fromString(uuid));
+      } else {
+         throw new HostException("Error creating Host: response = " + response + "\n source = "
+                  + specification.toJSONSpecification());
+      }
 
-    }
+   }
 
-    private Iterable<DataSet> toSpecList(String string) {
+   private Iterable<DataSet> toSpecList(String string) {
 
-        try {
-            BufferedReader r = new BufferedReader(new StringReader(string));
-            r.readLine(); // Skip
-            String line;
-            ImmutableList.Builder resultBuilder = ImmutableList.builder();
-            while ((line = r.readLine()) != null) {
-                DataSet dataset = DataSet.builder().fromDsadmString(line).build();
+      try {
+         BufferedReader r = new BufferedReader(new StringReader(string));
+         r.readLine(); // Skip
+         String line;
+         ImmutableList.Builder<DataSet> resultBuilder = ImmutableList.builder();
+         while ((line = r.readLine()) != null) {
+            DataSet dataset = DataSet.builder().fromDsadmString(line).build();
 
-                resultBuilder.add(dataset);
-            }
-            return resultBuilder.build();
-        } catch (IOException e) {
-            throw new HostException("Error parsing response when building spec list", e);
-        }
-    }
+            resultBuilder.add(dataset);
+         }
+         return resultBuilder.build();
+      } catch (IOException e) {
+         throw new HostException("Error parsing response when building spec list", e);
+      }
+   }
 
-    private Iterable<VM> toVMList(String string) {
-        try {
-            BufferedReader r = new BufferedReader(new StringReader(string));
-            String line;
-            ImmutableList.Builder resultBuilder = ImmutableList.builder();
-            while ((line = r.readLine()) != null) {
-                VM vm = VM.builder().host(this).fromVmadmString(line).build();
+   private Iterable<VM> toVMList(String string) {
+      try {
+         BufferedReader r = new BufferedReader(new StringReader(string));
+         String line;
+         ImmutableList.Builder<VM> resultBuilder = ImmutableList.builder();
+         while ((line = r.readLine()) != null) {
+            VM vm = VM.builder().host(this).fromVmadmString(line).build();
 
-                resultBuilder.add(vm);
-            }
-            return resultBuilder.build();
-        } catch (IOException e) {
-            throw new HostException("Error parsing response when building VM list", e);
-        }
-    }
+            resultBuilder.add(vm);
+         }
+         return resultBuilder.build();
+      } catch (IOException e) {
+         throw new HostException("Error parsing response when building VM list", e);
+      }
+   }
 
-    public VM getVM(UUID serverId) {
-        for (VM vm : getVMs())
-            if (vm.uuid.equals(serverId))
-                return vm;
-        return null;
-    }
+   public VM getVM(UUID serverId) {
+      for (VM vm : getVMs())
+         if (vm.uuid.equals(serverId))
+            return vm;
+      return null;
+   }
 
-    public DataSet getDataSet(UUID imageId) {
-        for (DataSet ds : getLocalDatasets()) {
-            if (ds.getUuid().equals(imageId))
-                return ds;
-        }
-        return null;
-    }
+   public DataSet getDataSet(UUID imageId) {
+      for (DataSet ds : getLocalDatasets()) {
+         if (ds.getUuid().equals(imageId))
+            return ds;
+      }
+      return null;
+   }
 
-    public void destroyHost(UUID uuid) {
-        exec("vmadm delete " + uuid.toString());
-    }
+   public void destroyHost(UUID uuid) {
+      exec("vmadm delete " + uuid.toString());
+   }
 
-    public void rebootHost(UUID uuid) {
-        exec("vmadm reboot " + uuid.toString());
-    }
+   public void rebootHost(UUID uuid) {
+      exec("vmadm reboot " + uuid.toString());
+   }
 
-    public void stopHost(UUID uuid) {
-        exec("vmadm stop -p");
-    }
+   public void stopHost(UUID uuid) {
+      exec("vmadm stop -p");
+   }
 
-    public void startHost(UUID uuid) {
-        exec("vmadm start " + uuid.toString());
-    }
+   public void startHost(UUID uuid) {
+      exec("vmadm start " + uuid.toString());
+   }
 }
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VM.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VM.java
index ec9e6e9..988fd23 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VM.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VM.java
@@ -1,222 +1,205 @@
 package org.jclouds.smartos.compute.domain;
 
-import com.google.common.base.Objects;
-import com.google.common.base.Optional;
-
-import java.io.IOException;
-import java.util.Collection;
 import java.util.Map;
 import java.util.UUID;
 
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+
 /**
  * Representing a Virtual Machine (Zone / KVM )
  **/
 public class VM {
 
-    public enum State
-    {
-        RUNNING,
-        STOPPED,
-        INCOMPLETE
-    }
+   public enum State {
+      RUNNING, STOPPED, INCOMPLETE
+   }
 
-    public static Builder builder() {
-        return new Builder();
-    }
+   public static Builder builder() {
+      return new Builder();
+   }
 
-    public Builder toBuilder() {
-        return builder().fromVM(this);
-    }
+   public Builder toBuilder() {
+      return builder().fromVM(this);
+   }
 
-    public static class Builder {
+   public static class Builder {
 
-        protected SmartOSHost host;
-        protected UUID uuid;
-        protected String type;
-        protected String ram;
-        protected State state = State.STOPPED;
-        protected String alias;
+      protected SmartOSHost host;
+      protected UUID uuid;
+      protected String type;
+      protected String ram;
+      protected State state = State.STOPPED;
+      protected String alias;
 
-        public Builder uuid(UUID uuid) {
-            this.uuid = uuid;
-            return this;
-        }
+      public Builder uuid(UUID uuid) {
+         this.uuid = uuid;
+         return this;
+      }
 
-        public Builder uuid(String uuid) {
-            this.uuid = UUID.fromString(uuid);
-            return this;
-        }
+      public Builder uuid(String uuid) {
+         this.uuid = UUID.fromString(uuid);
+         return this;
+      }
 
-        public Builder host(SmartOSHost host) {
-            this.host = host;
-            return this;
-        }
+      public Builder host(SmartOSHost host) {
+         this.host = host;
+         return this;
+      }
 
-        public Builder type(String type) {
-            this.type = type;
-            return this;
-        }
+      public Builder type(String type) {
+         this.type = type;
+         return this;
+      }
 
-        public Builder ram(String ram) {
-            this.ram = ram;
-            return this;
-        }
+      public Builder ram(String ram) {
+         this.ram = ram;
+         return this;
+      }
 
-        public Builder state(String state) {
-            this.state = State.valueOf(state.toUpperCase());
-            return this;
-        }
+      public Builder state(String state) {
+         this.state = State.valueOf(state.toUpperCase());
+         return this;
+      }
 
-        public Builder state(State state) {
-            this.state = state;
-            return this;
-        }
+      public Builder state(State state) {
+         this.state = state;
+         return this;
+      }
 
-        public Builder alias(String alias) {
-            this.alias = alias;
-            return this;
-        }
+      public Builder alias(String alias) {
+         this.alias = alias;
+         return this;
+      }
 
-        public Builder fromVmadmString(String string) {
-            String[] sections = string.split(":");
+      public Builder fromVmadmString(String string) {
+         String[] sections = string.split(":");
 
-            uuid(sections[0]);
+         uuid(sections[0]);
 
-            type(sections[1]);
-            ram(sections[2]);
-            state(sections[3]);
+         type(sections[1]);
+         ram(sections[2]);
+         state(sections[3]);
 
-            if (sections.length > 4)
-                alias(sections[4]);
+         if (sections.length > 4)
+            alias(sections[4]);
 
-            return this;
-        }
+         return this;
+      }
 
+      public VM build() {
+         return new VM(host, uuid, type, ram, state, alias);
+      }
 
-        public VM build() {
-            return new VM(host,uuid,type,ram,state,alias);
-        }
+      public Builder fromVM(VM in) {
+         return host(in.getHost()).uuid(in.getUuid()).type(in.getType()).ram(in.getRam()).state(in.getState())
+                  .alias(in.getAlias());
+      }
+   }
 
-        public Builder fromVM(VM in) {
-            return host(in.getHost())
-                    .uuid(in.getUuid())
-                    .type(in.getType())
-                    .ram(in.getRam())
-                    .state(in.getState())
-                    .alias(in.getAlias());
-        }
-    }
+   protected SmartOSHost host;
+   protected final UUID uuid;
+   protected String type;
+   protected String ram;
+   protected State state;
+   protected String alias;
 
+   public VM(SmartOSHost host, UUID uuid, String type, String ram, State state, String alias) {
+      this.host = host;
+      this.uuid = uuid;
+      this.type = type;
+      this.ram = ram;
+      this.state = state;
+      this.alias = alias;
+   }
 
-    protected SmartOSHost host;
-    protected final UUID uuid;
-    protected String type;
-    protected String ram;
-    protected State state;
-    protected String alias;
+   public State getState() {
+      return state;
+   }
 
+   public void destroy() {
+      host.destroyHost(uuid);
+   }
 
-    public VM(SmartOSHost host, UUID uuid, String type, String ram, State state, String alias) {
-        this.host = host;
-        this.uuid = uuid;
-        this.type = type;
-        this.ram = ram;
-        this.state = state;
-        this.alias = alias;
-    }
+   public void reboot() {
+      host.rebootHost(uuid);
+   }
 
-    public State getState() {
-       return state;
-    }
+   public void stop() {
+      host.stopHost(uuid);
+   }
 
-    public void destroy() {
-        host.destroyHost(uuid);
-    }
+   public void start() {
+      host.startHost(uuid);
+   }
 
-    public void reboot() {
-        host.rebootHost(uuid);
-    }
+   public Optional<String> getPublicAddress() throws InterruptedException {
+      Map<String, String> ipAddresses;
 
-    public void stop()  {
-        host.stopHost(uuid);
-    }
+      for (int i = 0; i < 30; i++) {
+         ipAddresses = host.getVMIpAddresses(uuid);
+         if (ipAddresses.isEmpty()) {
+            // Got some
+            String ip = ipAddresses.get("net0");
+            if (ip != null && !ip.equals("0.0.0.0"))
+               return Optional.of(ip);
+         }
 
-    public void start()  {
-        host.startHost(uuid);
-    }
+         Thread.sleep(1000);
+      }
 
-    public Optional<String> getPublicAddress() throws InterruptedException {
-        Map<String, String> ipAddresses;
+      return Optional.absent();
+   }
 
-        for( int i=0; i<30; i++ )
-        {
-            ipAddresses = host.getVMIpAddresses(uuid);
-            if( ipAddresses.isEmpty() )
-            {
-                // Got some
-                String ip = ipAddresses.get("net0");
-                if( ip != null && !ip.equals("0.0.0.0"))
-                    return Optional.of(ip);
-            }
+   public SmartOSHost getHost() {
+      return host;
+   }
 
-            Thread.sleep(1000);
-        }
+   public UUID getUuid() {
+      return uuid;
+   }
 
-        return Optional.absent();
-    }
+   public String getType() {
+      return type;
+   }
 
-    public SmartOSHost getHost() {
-        return host;
-    }
+   public String getRam() {
+      return ram;
+   }
 
-    public UUID getUuid() {
-        return uuid;
-    }
+   public String getAlias() {
+      return alias;
+   }
 
-    public String getType() {
-        return type;
-    }
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public int hashCode() {
+      // UUID is primary key
+      return uuid.hashCode();
+   }
 
-    public String getRam() {
-        return ram;
-    }
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      return uuid.equals(((DataSet) obj).getUuid());
+   }
 
-    public String getAlias() {
-        return alias;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int hashCode() {
-        // UUID is primary key
-        return uuid.hashCode();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        return uuid.equals(((DataSet)obj).getUuid());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this).omitNullValues()
-                .add("uuid", uuid)
-                .add("type", type)
-                .add("ram", ram)
-                .add("alias", alias).toString();
-    }
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).omitNullValues().add("uuid", uuid).add("type", type).add("ram", ram)
+               .add("alias", alias).toString();
+   }
 }
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VmNIC.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VmNIC.java
index e8caa3a..3a92064 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VmNIC.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VmNIC.java
@@ -2,109 +2,97 @@
 
 import com.google.common.base.Objects;
 import com.google.gson.annotations.SerializedName;
-import com.google.inject.name.Named;
-
-import java.util.UUID;
-
 
 /**
  * Specification of a network card.
  */
 public class VmNIC {
 
-    @SerializedName("nic_tag")
-    protected final String tag;
-    protected final String ip;
-    protected final String netmask;
-    protected final String gateway;
+   @SerializedName("nic_tag")
+   protected final String tag;
+   protected final String ip;
+   protected final String netmask;
+   protected final String gateway;
 
-    public static Builder builder() {
-        return new Builder();
-    }
+   public static Builder builder() {
+      return new Builder();
+   }
 
-    public Builder toBuilder() {
-        return builder().fromVmNIC(this);
-    }
+   public Builder toBuilder() {
+      return builder().fromVmNIC(this);
+   }
 
-    public static class Builder {
+   public static class Builder {
 
-        public String tag = "admin";
-        public String ip;
-        public String netmask;
-        public String gateway;
+      public String tag = "admin";
+      public String ip;
+      public String netmask;
+      public String gateway;
 
+      public Builder simpleDCHPNic() {
+         tag = "admin";
+         ip = "dhcp";
+         return this;
+      }
 
-        public Builder simpleDCHPNic() {
-            tag = "admin";
-            ip = "dhcp";
-            return this;
-        }
+      public Builder tag(String tag) {
+         this.tag = tag;
+         return this;
+      }
 
-        public Builder tag(String tag) {
-            this.tag = tag;
-            return this;
-        }
+      public Builder ip(String ip) {
+         this.ip = ip;
+         return this;
+      }
 
-        public Builder ip(String ip) {
-            this.ip = ip;
-            return this;
-        }
+      public Builder netmask(String netmask) {
+         this.netmask = netmask;
+         return this;
+      }
 
-        public Builder netmask(String netmask) {
-            this.netmask = netmask;
-            return this;
-        }
+      public Builder gateway(String gateway) {
+         this.gateway = gateway;
+         return this;
+      }
 
-        public Builder gateway(String gateway) {
-            this.gateway = gateway;
-            return this;
-        }
+      public VmNIC build() {
+         return new VmNIC(tag, ip, netmask, gateway);
+      }
 
-        public VmNIC build() {
-            return new VmNIC(tag,ip,netmask,gateway);
-        }
+      public Builder fromVmNIC(VmNIC in) {
+         return tag(in.getTag()).ip(in.getIp()).netmask(in.getNetmask()).gateway(in.getGateway());
+      }
+   }
 
-        public Builder fromVmNIC(VmNIC in) {
-            return tag      ( in.getTag())
-                    .ip     ( in.getIp() )
-                    .netmask( in.getNetmask() )
-                    .gateway( in.getGateway() );
-        }
-    }
+   public VmNIC(String tag, String ip, String netmask, String gateway) {
+      this.tag = tag;
+      this.ip = ip;
+      this.netmask = netmask;
+      this.gateway = gateway;
+   }
 
+   public String getTag() {
+      return tag;
+   }
 
-    public VmNIC(String tag, String ip, String netmask, String gateway) {
-        this.tag = tag;
-        this.ip = ip;
-        this.netmask = netmask;
-        this.gateway = gateway;
-    }
+   public String getIp() {
+      return ip;
+   }
 
-    public String getTag() {
-        return tag;
-    }
+   public String getNetmask() {
+      return netmask;
+   }
 
-    public String getIp() {
-        return ip;
-    }
+   public String getGateway() {
+      return gateway;
+   }
 
-    public String getNetmask() {
-        return netmask;
-    }
-
-    public String getGateway() {
-        return gateway;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String toString() {
-        return Objects.toStringHelper(this).omitNullValues()
-                .add("tag", tag)
-                .add("ip", ip)
-                .add("netmask", netmask)
-                .add("gateway", gateway).toString();
-    }
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this).omitNullValues().add("tag", tag).add("ip", ip).add("netmask", netmask)
+               .add("gateway", gateway).toString();
+   }
 }
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VmSpecification.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VmSpecification.java
index e793816..9771714 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VmSpecification.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/domain/VmSpecification.java
@@ -1,142 +1,142 @@
 package org.jclouds.smartos.compute.domain;
 
-
-import com.google.common.collect.ImmutableList;
-import com.google.gson.*;
-import com.google.gson.annotations.SerializedName;
-
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import com.google.common.collect.ImmutableList;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import com.google.gson.annotations.SerializedName;
+
 /**
  * Specification of a VM to build, based on a dataset.
  */
 public class VmSpecification {
-    protected final String alias;
-    protected final String brand;
+   protected final String alias;
+   protected final String brand;
 
-    @SerializedName("dataset_uuid")
-    protected final DataSet dataset;
-    protected final String dnsDomain;
-    protected final String quota;
+   @SerializedName("dataset_uuid")
+   protected final DataSet dataset;
+   protected final String dnsDomain;
+   protected final String quota;
 
-    protected final List<VmNIC> nics;
+   protected final List<VmNIC> nics;
 
-    public static Builder builder() {
-        return new Builder();
-    }
+   public static Builder builder() {
+      return new Builder();
+   }
 
-    public Builder toBuilder() {
-        return builder().fromVmSpecification(this);
-    }
+   public Builder toBuilder() {
+      return builder().fromVmSpecification(this);
+   }
 
-    public static class Builder {
+   public static class Builder {
 
-        protected String alias;
-        protected String brand = "joyent";
-        protected DataSet dataset;
-        protected String dnsDomain = "local";
-        protected String quota = "10";
+      protected String alias;
+      protected String brand = "joyent";
+      protected DataSet dataset;
+      protected String dnsDomain = "local";
+      protected String quota = "10";
 
-        protected List<VmNIC> nics = new ArrayList<VmNIC>();
+      protected List<VmNIC> nics = new ArrayList<VmNIC>();
 
-        public Builder alias(String alias) {
-            this.alias = alias;
-            return this;
-        }
+      public Builder alias(String alias) {
+         this.alias = alias;
+         return this;
+      }
 
-        public Builder brand(String brand) {
-            this.brand = brand;
-            return this;
-        }
+      public Builder brand(String brand) {
+         this.brand = brand;
+         return this;
+      }
 
-        public Builder dataset(DataSet dataset) {
-            this.dataset = dataset;
-            return this;
-        }
+      public Builder dataset(DataSet dataset) {
+         this.dataset = dataset;
+         return this;
+      }
 
-        public Builder dnsDomain(String dnsDomain) {
-            this.dnsDomain = dnsDomain;
-            return this;
-        }
+      public Builder dnsDomain(String dnsDomain) {
+         this.dnsDomain = dnsDomain;
+         return this;
+      }
 
-        public Builder quota(String quota) {
-            this.quota = quota;
-            return this;
-        }
+      public Builder quota(String quota) {
+         this.quota = quota;
+         return this;
+      }
 
-        public Builder nics(Collection<VmNIC> nic) {
-            this.nics.addAll(nics);
-            return this;
-        }
+      public Builder nics(Collection<VmNIC> nic) {
+         this.nics.addAll(nics);
+         return this;
+      }
 
-        public Builder nic(VmNIC nic) {
-            this.nics.add(nic);
-            return this;
-        }
+      public Builder nic(VmNIC nic) {
+         this.nics.add(nic);
+         return this;
+      }
 
-        public VmSpecification build() {
-            return new VmSpecification(alias, brand, dataset, dnsDomain, quota, nics);
-        }
+      public VmSpecification build() {
+         return new VmSpecification(alias, brand, dataset, dnsDomain, quota, nics);
+      }
 
-        public Builder fromVmSpecification(VmSpecification in) {
-            return alias     (in.getAlias())
-                   .brand    (in.getBrand())
-                   .dataset  (in.getDataset())
-                   .dnsDomain(in.getDnsDomain())
-                   .quota    (in.getQuota())
-                   .nics(in.getNics());
-        }
-    }
+      public Builder fromVmSpecification(VmSpecification in) {
+         return alias(in.getAlias()).brand(in.getBrand()).dataset(in.getDataset()).dnsDomain(in.getDnsDomain())
+                  .quota(in.getQuota()).nics(in.getNics());
+      }
+   }
 
-    protected VmSpecification(String alias, String brand, DataSet dataset, String dnsDomain, String quota, List<VmNIC> nics) {
-        this.alias = alias;
-        this.brand = brand;
-        this.dataset = dataset;
-        this.dnsDomain = dnsDomain;
-        this.quota = quota;
-        this.nics = nics;
-    }
+   protected VmSpecification(String alias, String brand, DataSet dataset, String dnsDomain, String quota,
+            List<VmNIC> nics) {
+      this.alias = alias;
+      this.brand = brand;
+      this.dataset = dataset;
+      this.dnsDomain = dnsDomain;
+      this.quota = quota;
+      this.nics = nics;
+   }
 
-    public String getAlias() {
-        return alias;
-    }
+   public String getAlias() {
+      return alias;
+   }
 
-    public String getBrand() {
-        return brand;
-    }
+   public String getBrand() {
+      return brand;
+   }
 
-    public DataSet getDataset() {
-        return dataset;
-    }
+   public DataSet getDataset() {
+      return dataset;
+   }
 
-    public String getDnsDomain() {
-        return dnsDomain;
-    }
+   public String getDnsDomain() {
+      return dnsDomain;
+   }
 
-    public String getQuota() {
-        return quota;
-    }
+   public String getQuota() {
+      return quota;
+   }
 
-    public List<VmNIC> getNics() {
-        return ImmutableList.copyOf(nics);
-    }
+   public List<VmNIC> getNics() {
+      return ImmutableList.copyOf(nics);
+   }
 
-    public String toJSONSpecification() {
-        GsonBuilder gson = new GsonBuilder();
-        gson.registerTypeAdapter(DataSet.class, new FlattenDataset() );
-        Gson g = gson.create();
+   public String toJSONSpecification() {
+      GsonBuilder gson = new GsonBuilder();
+      gson.registerTypeAdapter(DataSet.class, new FlattenDataset());
+      Gson g = gson.create();
 
-        return g.toJson(this);
-    }
+      return g.toJson(this);
+   }
 
-    public class FlattenDataset implements JsonSerializer<DataSet>
-    {
-        @Override
-        public JsonElement serialize(DataSet vmSpecification, Type type, JsonSerializationContext jsonSerializationContext) {
-            return new JsonPrimitive(dataset.getUuid().toString());
-        }
-    }
+   public class FlattenDataset implements JsonSerializer<DataSet> {
+      @Override
+      public JsonElement serialize(DataSet vmSpecification, Type type, JsonSerializationContext jsonSerializationContext) {
+         return new JsonPrimitive(dataset.getUuid().toString());
+      }
+   }
 }
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/DataSetToImage.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/DataSetToImage.java
index ee90c86..df4b866 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/DataSetToImage.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/DataSetToImage.java
@@ -22,13 +22,13 @@
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.jclouds.smartos.compute.domain.DataSet;
 import org.jclouds.compute.domain.Image;
 import org.jclouds.compute.domain.ImageBuilder;
 import org.jclouds.compute.domain.OperatingSystem;
 import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.reference.ComputeServiceConstants;
 import org.jclouds.logging.Logger;
+import org.jclouds.smartos.compute.domain.DataSet;
 
 import com.google.common.base.Function;
 
@@ -53,7 +53,8 @@
       OsFamily family;
       try {
          family = OsFamily.SOLARIS;
-         builder.operatingSystem(new OperatingSystem.Builder().name(from.getUrn()).description(from.getUrn()).family(family).build());
+         builder.operatingSystem(new OperatingSystem.Builder().name(from.getUrn()).description(from.getUrn())
+                  .family(family).build());
       } catch (IllegalArgumentException e) {
          logger.debug("<< didn't match os(%s)", from);
       }
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/DatacenterToLocation.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/DatacenterToLocation.java
index ea0984c..b03709d 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/DatacenterToLocation.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/DatacenterToLocation.java
@@ -18,18 +18,19 @@
  */
 package org.jclouds.smartos.compute.functions;
 
-import com.google.common.base.Function;
-import com.google.common.base.Supplier;
-import org.jclouds.smartos.compute.domain.SmartOSHost;
-import org.jclouds.domain.Location;
-import org.jclouds.domain.LocationBuilder;
-import org.jclouds.domain.LocationScope;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.inject.Singleton;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.jclouds.smartos.compute.domain.SmartOSHost;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
 
 /**
  * @author Nigel Magnay
@@ -46,8 +47,8 @@
 
    @Override
    public Location apply(SmartOSHost from) {
-      return new LocationBuilder().scope(LocationScope.ZONE).id(from.getHostname() + "").description(from.getDescription()).parent(
-               provider.get().get()).build();
+      return new LocationBuilder().scope(LocationScope.ZONE).id(from.getHostname() + "")
+               .description(from.getDescription()).parent(provider.get().get()).build();
    }
 
 }
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/VMToNodeMetadata.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/VMToNodeMetadata.java
index 2780c2d..b32c32e 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/VMToNodeMetadata.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/VMToNodeMetadata.java
@@ -18,30 +18,31 @@
  */
 package org.jclouds.smartos.compute.functions;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.collect.FindResourceInSet;
+import org.jclouds.collect.Memoized;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.NodeMetadataBuilder;
+import org.jclouds.compute.functions.GroupNamingConvention;
+import org.jclouds.domain.Credentials;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LoginCredentials;
+import org.jclouds.smartos.compute.domain.VM;
+
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
-import com.sun.corba.se.spi.activation.Server;
-import org.jclouds.smartos.compute.domain.VM;
-import org.jclouds.collect.FindResourceInSet;
-import org.jclouds.collect.Memoized;
-import org.jclouds.compute.domain.*;
-import org.jclouds.compute.functions.GroupNamingConvention;
-import org.jclouds.domain.Credentials;
-import org.jclouds.domain.Location;
-import org.jclouds.domain.LoginCredentials;
-import org.omg.PortableInterceptor.ACTIVE;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * @author Nigel Magnay
@@ -49,9 +50,8 @@
 @Singleton
 public class VMToNodeMetadata implements Function<VM, NodeMetadata> {
 
-    public static final Map<VM.State, NodeMetadata.Status> serverStatusToNodeStatus = ImmutableMap
-            .<VM.State, NodeMetadata.Status> builder()
-            .put(VM.State.RUNNING, NodeMetadata.Status.RUNNING)//
+   public static final Map<VM.State, NodeMetadata.Status> serverStatusToNodeStatus = ImmutableMap
+            .<VM.State, NodeMetadata.Status> builder().put(VM.State.RUNNING, NodeMetadata.Status.RUNNING)//
             .put(VM.State.STOPPED, NodeMetadata.Status.SUSPENDED)//
             .put(VM.State.INCOMPLETE, NodeMetadata.Status.PENDING)//
             .build();
@@ -64,8 +64,8 @@
 
    @Inject
    VMToNodeMetadata(Map<String, Credentials> credentialStore, FindHardwareForServer findHardwareForServer,
-                    FindLocationForServer findLocationForServer, FindImageForServer findImageForServer,
-                    GroupNamingConvention.Factory namingConvention) {
+            FindLocationForServer findLocationForServer, FindImageForServer findImageForServer,
+            GroupNamingConvention.Factory namingConvention) {
       this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
       this.credentialStore = checkNotNull(credentialStore, "credentialStore");
       this.findHardwareForServer = checkNotNull(findHardwareForServer, "findHardwareForServer");
@@ -87,21 +87,18 @@
          builder.operatingSystem(image.getOperatingSystem());
       builder.hardware(findHardwareForServer.apply(from));
       builder.status(serverStatusToNodeStatus.get(from.getState()));
-       try {
-           if( from.getState() == VM.State.RUNNING )
-           {
-               Optional<String> ip = from.getPublicAddress();
-               if( ip.isPresent() ) {
-                    builder.publicAddresses(ImmutableSet.<String> of(ip.get()));
-                    builder.privateAddresses(ImmutableSet.<String> of(ip.get()));
-               }
-           }
-       }
-       catch(Exception ex)
-       {
-           // None?
-       }
-       //builder.privateAddresses(ImmutableSet.<String> of(from.privateAddress));
+      try {
+         if (from.getState() == VM.State.RUNNING) {
+            Optional<String> ip = from.getPublicAddress();
+            if (ip.isPresent()) {
+               builder.publicAddresses(ImmutableSet.<String> of(ip.get()));
+               builder.privateAddresses(ImmutableSet.<String> of(ip.get()));
+            }
+         }
+      } catch (Exception ex) {
+         // None?
+      }
+      // builder.privateAddresses(ImmutableSet.<String> of(from.privateAddress));
       builder.credentials(LoginCredentials.fromCredentials(credentialStore.get(from.getUuid() + "")));
       return builder.build();
    }
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/VmSpecificationToHardware.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/VmSpecificationToHardware.java
index e789367..d8121c0 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/VmSpecificationToHardware.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/functions/VmSpecificationToHardware.java
@@ -20,10 +20,10 @@
 
 import javax.inject.Singleton;
 
-import org.jclouds.smartos.compute.domain.VmSpecification;
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.HardwareBuilder;
 import org.jclouds.compute.domain.Processor;
+import org.jclouds.smartos.compute.domain.VmSpecification;
 
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
@@ -41,7 +41,7 @@
       builder.name(from.getAlias());
       builder.processors(ImmutableList.of(new Processor(1, 1.0)));
       builder.ram(256);
-      //builder.volumes(ImmutableList.<Volume> of(new VolumeImpl(from.disk, true, false)));
+      // builder.volumes(ImmutableList.<Volume> of(new VolumeImpl(from.disk, true, false)));
       return builder.build();
    }
 
diff --git a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/strategy/SmartOSComputeServiceAdapter.java b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/strategy/SmartOSComputeServiceAdapter.java
index 094ad8c..541620c 100644
--- a/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/strategy/SmartOSComputeServiceAdapter.java
+++ b/labs/smartos-ssh/src/main/java/org/jclouds/smartos/compute/strategy/SmartOSComputeServiceAdapter.java
@@ -20,24 +20,28 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import org.jclouds.smartos.compute.domain.*;
-import org.jclouds.compute.ComputeService;
-import org.jclouds.compute.ComputeServiceAdapter;
-import org.jclouds.compute.domain.Template;
-import org.jclouds.domain.LoginCredentials;
-
-import com.google.common.collect.ImmutableSet;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.compute.ComputeService;
+import org.jclouds.compute.ComputeServiceAdapter;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.domain.LoginCredentials;
+import org.jclouds.smartos.compute.domain.DataSet;
+import org.jclouds.smartos.compute.domain.SmartOSHost;
+import org.jclouds.smartos.compute.domain.VM;
+import org.jclouds.smartos.compute.domain.VmNIC;
+import org.jclouds.smartos.compute.domain.VmSpecification;
+
+import com.google.common.collect.ImmutableSet;
+
 /**
- * defines the connection between the {@link org.jclouds.smartos.compute.domain.SmartOSHost} implementation and the jclouds
- * {@link ComputeService}
+ * defines the connection between the {@link org.jclouds.smartos.compute.domain.SmartOSHost}
+ * implementation and the jclouds {@link ComputeService}
  * 
  */
 @Singleton
@@ -50,35 +54,31 @@
    }
 
    private SmartOSHost getHost() {
-       return host;
+      return host;
    }
 
    @Override
    public NodeAndInitialCredentials<VM> createNodeWithGroupEncodedIntoName(String tag, String name, Template template) {
-       VmSpecification specification = VmSpecification.builder()
-               .alias(name)
+      VmSpecification specification = VmSpecification.builder().alias(name)
                .dataset(getHost().getDataSet(UUID.fromString(template.getImage().getProviderId())))
-               .nic(VmNIC.builder().simpleDCHPNic().build())
-               .build();
+               .nic(VmNIC.builder().simpleDCHPNic().build()).build();
 
-       VM from = getHost().createVM(specification);
+      VM from = getHost().createVM(specification);
 
-       return new NodeAndInitialCredentials<VM>(from, from.getUuid() + "", LoginCredentials.builder().user("smartos")
+      return new NodeAndInitialCredentials<VM>(from, from.getUuid() + "", LoginCredentials.builder().user("smartos")
                .password("smartos").build());
    }
 
    @Override
    public Iterable<VmSpecification> listHardwareProfiles() {
-       List<VmSpecification> specificationList = new ArrayList<VmSpecification>();
+      List<VmSpecification> specificationList = new ArrayList<VmSpecification>();
 
-       VmSpecification vs = VmSpecification.builder()
-               .alias("Standard Joyent VM")
-               .nic(VmNIC.builder().simpleDCHPNic().build())
-               .build();
+      VmSpecification vs = VmSpecification.builder().alias("Standard Joyent VM")
+               .nic(VmNIC.builder().simpleDCHPNic().build()).build();
 
-       specificationList.add(vs);
+      specificationList.add(vs);
 
-       return specificationList;
+      return specificationList;
    }
 
    @Override
@@ -88,17 +88,17 @@
 
    @Override
    public DataSet getImage(String id) {
-       return getHost().getDataSet(UUID.fromString(id));
+      return getHost().getDataSet(UUID.fromString(id));
    }
 
-    @Override
+   @Override
    public Iterable<VM> listNodes() {
       return getHost().getVMs();
    }
-   
+
    @Override
    public Iterable<SmartOSHost> listLocations() {
-       return ImmutableSet.of();
+      return ImmutableSet.of();
    }
 
    @Override
@@ -108,21 +108,21 @@
 
    @Override
    public void destroyNode(String id) {
-       getHost().getVM(UUID.fromString(id)).destroy();
+      getHost().getVM(UUID.fromString(id)).destroy();
    }
 
    @Override
    public void rebootNode(String id) {
-       getHost().getVM(UUID.fromString(id)).reboot();
+      getHost().getVM(UUID.fromString(id)).reboot();
    }
 
    @Override
    public void resumeNode(String id) {
-       getHost().getVM(UUID.fromString(id)).start();
+      getHost().getVM(UUID.fromString(id)).start();
    }
 
    @Override
    public void suspendNode(String id) {
-       getHost().getVM(UUID.fromString(id)).stop();
+      getHost().getVM(UUID.fromString(id)).stop();
    }
 }
\ No newline at end of file
diff --git a/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/SmartOSManagerComputeServiceContextBuilderTest.java b/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/SmartOSManagerComputeServiceContextBuilderTest.java
index fe91d42..7451998 100644
--- a/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/SmartOSManagerComputeServiceContextBuilderTest.java
+++ b/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/SmartOSManagerComputeServiceContextBuilderTest.java
@@ -22,16 +22,16 @@
 
 import java.util.Properties;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
 import org.jclouds.ContextBuilder;
 import org.jclouds.compute.ComputeServiceContext;
 import org.jclouds.internal.ContextImpl;
-import org.jclouds.rest.internal.BaseRestClientTest;
 import org.jclouds.smartos.SmartOSApiMetadata;
 import org.jclouds.sshj.config.SshjSshClientModule;
 import org.testng.annotations.Test;
 
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
+
 /**
  * 
  * @author Adrian Cole
@@ -40,21 +40,17 @@
 @Test(groups = "unit", testName = "ServerManagerContextBuilderTest")
 public class SmartOSManagerComputeServiceContextBuilderTest {
 
-
    @Test
    public void testCanBuildWithApiMetadata() {
-      ComputeServiceContext context = ContextBuilder.newBuilder(
-              new SmartOSApiMetadata())
-              .modules(ImmutableSet.<Module>of(getSshModule()))
-              .build(ComputeServiceContext.class);
+      ComputeServiceContext context = ContextBuilder.newBuilder(new SmartOSApiMetadata())
+               .modules(ImmutableSet.<Module> of(getSshModule())).build(ComputeServiceContext.class);
       context.close();
    }
 
    @Test
    public void testCanBuildById() {
       ComputeServiceContext context = ContextBuilder.newBuilder("smartos-ssh")
-              .modules(ImmutableSet.<Module>of(getSshModule()))
-              .build(ComputeServiceContext.class);
+               .modules(ImmutableSet.<Module> of(getSshModule())).build(ComputeServiceContext.class);
       context.close();
    }
 
@@ -65,8 +61,8 @@
       overrides.setProperty("smartos-ssh.api-version", "1");
 
       ComputeServiceContext context = ContextBuilder.newBuilder("smartos-ssh")
-              .modules(ImmutableSet.<Module>of(getSshModule()))
-              .overrides(overrides).build(ComputeServiceContext.class);
+               .modules(ImmutableSet.<Module> of(getSshModule())).overrides(overrides)
+               .build(ComputeServiceContext.class);
 
       context.close();
    }
@@ -74,15 +70,14 @@
    @Test
    public void testUnwrapIsCorrectType() {
       ComputeServiceContext context = ContextBuilder.newBuilder("smartos-ssh")
-              .modules(ImmutableSet.<Module>of(getSshModule()))
-              .build(ComputeServiceContext.class);
+               .modules(ImmutableSet.<Module> of(getSshModule())).build(ComputeServiceContext.class);
 
       assertEquals(context.unwrap().getClass(), ContextImpl.class);
 
       context.close();
    }
 
-    protected Module getSshModule() {
-        return new SshjSshClientModule();
-    }
+   protected Module getSshModule() {
+      return new SshjSshClientModule();
+   }
 }
diff --git a/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/SmartOSManagerComputeServiceLiveTest.java b/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/SmartOSManagerComputeServiceLiveTest.java
index df29de6..8cbc337 100644
--- a/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/SmartOSManagerComputeServiceLiveTest.java
+++ b/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/SmartOSManagerComputeServiceLiveTest.java
@@ -49,12 +49,11 @@
       assertEquals(getCores(defaultTemplate.getHardware()), 0.5d);
    }
 
-
    // smartos-ssh does not support metadata
    @Override
    protected void checkUserMetadataInNodeEquals(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
       assert node.getUserMetadata().equals(ImmutableMap.<String, String> of()) : String.format(
-            "node userMetadata did not match %s %s", userMetadata, node);
+               "node userMetadata did not match %s %s", userMetadata, node);
    }
-   
+
 }
diff --git a/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/domain/DataSetTest.java b/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/domain/DataSetTest.java
index a64e92c..6699c6b 100644
--- a/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/domain/DataSetTest.java
+++ b/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/domain/DataSetTest.java
@@ -1,36 +1,39 @@
 package org.jclouds.smartos.compute.domain;
 
-import com.google.common.collect.ImmutableList;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.List;
+import java.util.UUID;
+
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import java.io.*;
-import java.util.List;
-import java.util.UUID;
+import com.google.common.collect.ImmutableList;
 
 @Test(groups = "unit", testName = "DataSetTest")
 public class DataSetTest {
 
-    @Test
-    public void testParse() throws IOException {
-        // Response from console from a 'dsadm list'
-        InputStream is = getClass().getResourceAsStream("dsadm-list-response.txt");
+   @Test
+   public void testParse() throws IOException {
+      // Response from console from a 'dsadm list'
+      InputStream is = getClass().getResourceAsStream("dsadm-list-response.txt");
 
-        BufferedReader r = new BufferedReader(new InputStreamReader(is));
-        String line = r.readLine(); // skip line
-        ImmutableList.Builder resultBuilder = ImmutableList.builder();
-        while ((line = r.readLine()) != null) {
-            DataSet ds = DataSet.builder().fromDsadmString(line).build();
+      BufferedReader r = new BufferedReader(new InputStreamReader(is));
+      String line = r.readLine(); // skip line
+      ImmutableList.Builder<DataSet> resultBuilder = ImmutableList.builder();
+      while ((line = r.readLine()) != null) {
+         DataSet ds = DataSet.builder().fromDsadmString(line).build();
 
-            resultBuilder.add(ds);
-        }
-        List<DataSet> dataSetList = resultBuilder.build();
+         resultBuilder.add(ds);
+      }
+      List<DataSet> dataSetList = resultBuilder.build();
 
-        Assert.assertEquals(10, dataSetList.size());
+      Assert.assertEquals(10, dataSetList.size());
 
-        Assert.assertEquals(UUID.fromString("c0ffee88-883e-47cf-80d1-ad71cc872180"), dataSetList.get(0).getUuid());
-        Assert.assertEquals("nrm:nrm:realtime-jenkins:1.7", dataSetList.get(0).getUrn());
+      Assert.assertEquals(UUID.fromString("c0ffee88-883e-47cf-80d1-ad71cc872180"), dataSetList.get(0).getUuid());
+      Assert.assertEquals("nrm:nrm:realtime-jenkins:1.7", dataSetList.get(0).getUrn());
 
-
-    }
+   }
 }
diff --git a/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/domain/VMTest.java b/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/domain/VMTest.java
index 3397c48..5cfa06a 100644
--- a/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/domain/VMTest.java
+++ b/labs/smartos-ssh/src/test/java/org/jclouds/smartos/compute/domain/VMTest.java
@@ -1,9 +1,5 @@
 package org.jclouds.smartos.compute.domain;
 
-import com.google.common.collect.ImmutableList;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
@@ -11,28 +7,33 @@
 import java.util.List;
 import java.util.UUID;
 
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
 @Test(groups = "unit", testName = "VMTest")
 public class VMTest {
 
-    @Test
-    public void testParse() throws IOException {
-        // Response from console from a 'vmadm list -p'
-        InputStream is = getClass().getResourceAsStream("vmadm-list-response.txt");
+   @Test
+   public void testParse() throws IOException {
+      // Response from console from a 'vmadm list -p'
+      InputStream is = getClass().getResourceAsStream("vmadm-list-response.txt");
 
-        BufferedReader r = new BufferedReader(new InputStreamReader(is));
-        String line = null;
-        ImmutableList.Builder resultBuilder = ImmutableList.builder();
-        while ((line = r.readLine()) != null) {
-            VM vm = VM.builder().fromVmadmString(line).build();
+      BufferedReader r = new BufferedReader(new InputStreamReader(is));
+      String line = null;
+      ImmutableList.Builder<VM> resultBuilder = ImmutableList.builder();
+      while ((line = r.readLine()) != null) {
+         VM vm = VM.builder().fromVmadmString(line).build();
 
-            resultBuilder.add(vm);
-        }
-        List<VM> vmList = resultBuilder.build();
+         resultBuilder.add(vm);
+      }
+      List<VM> vmList = resultBuilder.build();
 
-        Assert.assertEquals(2, vmList.size());
+      Assert.assertEquals(2, vmList.size());
 
-        Assert.assertEquals(UUID.fromString("60bd2ae5-4e4d-4952-88f9-1b850259d914"), vmList.get(0).getUuid());
-        Assert.assertEquals(VM.State.STOPPED, vmList.get(0).getState());
+      Assert.assertEquals(UUID.fromString("60bd2ae5-4e4d-4952-88f9-1b850259d914"), vmList.get(0).getUuid());
+      Assert.assertEquals(VM.State.STOPPED, vmList.get(0).getState());
 
-    }
+   }
 }
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java
index 93dce1d..c7e39b7 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java
@@ -39,7 +39,7 @@
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.Catalog;
 import org.jclouds.vcloud.director.v1_5.domain.CatalogItem;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -47,7 +47,7 @@
  * @see CatalogApi
  * @author grkvlt@apache.org
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface CatalogAsyncApi {
 
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java
index 3fbec87..92490bf 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java
@@ -41,7 +41,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.Owner;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.params.CloneMediaParams;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -49,7 +49,7 @@
  * @see MediaApi
  * @author danikov
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface MediaAsyncApi {
 
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java
index df5b028..cd1d98e 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java
@@ -40,7 +40,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -50,7 +50,7 @@
  */
 public interface MetadataAsyncApi {
 
-   @RequestFilters(AddVCloudAuthorizationToRequest.class)
+   @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
    public static interface Readable extends MetadataAsyncApi {
 
       /**
@@ -74,7 +74,7 @@
       ListenableFuture<MetadataValue> getMetadataValue(@EndpointParam URI metaDataUri, @PathParam("key") String key);
    }
    
-   @RequestFilters(AddVCloudAuthorizationToRequest.class)
+   @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
    public static interface Writeable extends Readable {
 
       /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java
index 65bbd3c..49de11a 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java
@@ -30,7 +30,7 @@
 import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.vcloud.director.v1_5.domain.network.Network;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -38,7 +38,7 @@
  * @see NetworkApi
  * @author danikov
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface NetworkAsyncApi {
 
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java
index 3295367..eb776ac 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java
@@ -40,7 +40,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.org.Org;
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgList;
 import org.jclouds.vcloud.director.v1_5.domain.params.ControlAccessParams;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -48,7 +48,7 @@
  * @see OrgApi
  * @author Adrian Cole
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface OrgAsyncApi {
 
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryAsyncApi.java
index 6daf91d..235de87 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryAsyncApi.java
@@ -36,7 +36,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.query.QueryList;
 import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultRecords;
 import org.jclouds.vcloud.director.v1_5.domain.query.VAppReferences;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -44,7 +44,7 @@
  * @see QueryApi
  * @author grkvlt@apache.org
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 @SkipEncoding({ '=' })
 public interface QueryAsyncApi {
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncApi.java
index e61634a..ee112d5 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncApi.java
@@ -32,7 +32,7 @@
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.TasksList;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.director.v1_5.functions.OrgReferenceToTaskListEndpoint;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -41,7 +41,7 @@
  * @see TaskApi
  * @author grkvlt@apache.org
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface TaskAsyncApi {
 
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadAsyncApi.java
index 8f62253..8419143 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadAsyncApi.java
@@ -25,7 +25,7 @@
 import org.jclouds.io.Payload;
 import org.jclouds.rest.annotations.EndpointParam;
 import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -33,7 +33,7 @@
  * @see UploadApi
  * @author danikov
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface UploadAsyncApi {
 
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppAsyncApi.java
index 60854aa..ac3c112 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppAsyncApi.java
@@ -60,7 +60,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.params.UndeployVAppParams;
 import org.jclouds.vcloud.director.v1_5.domain.section.LeaseSettingsSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConfigSection;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -68,7 +68,7 @@
  * @author grkvlt@apache.org
  * @see VAppApi
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VAppAsyncApi {
 
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java
index 5fedc5e..0e0826a 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java
@@ -61,7 +61,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.section.LeaseSettingsSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConfigSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConnectionSection;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -69,7 +69,7 @@
  * @author Adam Lowe
  * @see org.jclouds.vcloud.director.v1_5.features.VAppTemplateApi
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VAppTemplateAsyncApi {
 
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncApi.java
index 9cab4c6..9e0cdaa 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncApi.java
@@ -46,7 +46,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.params.ComposeVAppParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.InstantiateVAppParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.UploadVAppTemplateParams;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
  
@@ -54,7 +54,7 @@
  * @see VdcApi
  * @author danikov
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VdcAsyncApi {
  
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmAsyncApi.java
index e2aea6b..0e958a1 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmAsyncApi.java
@@ -70,7 +70,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.section.OperatingSystemSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.RuntimeInfoSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.VirtualHardwareSection;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.director.v1_5.functions.ReturnPayloadBytes;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -79,7 +79,7 @@
  * @author grkvlt@apache.org
  * @see VmApi
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VmAsyncApi {
 
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogAsyncApi.java
index 7efb63a..239a6a1 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogAsyncApi.java
@@ -42,7 +42,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.params.PublishCatalogParams;
 import org.jclouds.vcloud.director.v1_5.features.CatalogAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncApi;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -50,7 +50,7 @@
  * @see AdminCatalogApi
  * @author danikov
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface AdminCatalogAsyncApi extends CatalogAsyncApi {
    
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkAsyncApi.java
index f3f9922..76afd03 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkAsyncApi.java
@@ -41,7 +41,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgNetwork;
 import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.NetworkAsyncApi;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -49,7 +49,7 @@
  * @see AdminNetworkApi
  * @author danikov
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface AdminNetworkAsyncApi extends NetworkAsyncApi {
    
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgAsyncApi.java
index 3a77710..2cdc111 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgAsyncApi.java
@@ -45,7 +45,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgVAppTemplateLeaseSettings;
 import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.OrgAsyncApi;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -53,7 +53,7 @@
  * @see AdminOrgApi
  * @author danikov
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface AdminOrgAsyncApi extends OrgAsyncApi {
    
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminQueryAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminQueryAsyncApi.java
index 2ce2251..c333c1d 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminQueryAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminQueryAsyncApi.java
@@ -32,7 +32,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.RoleReferences;
 import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultRecords;
 import org.jclouds.vcloud.director.v1_5.features.QueryAsyncApi;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -42,7 +42,7 @@
  * @see AdminQueryApi
  * @author Aled Sage
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface AdminQueryAsyncApi extends QueryAsyncApi {
    
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcAsyncApi.java
index b7726ec..1d3778b 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcAsyncApi.java
@@ -39,7 +39,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.VdcAsyncApi;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -47,7 +47,7 @@
  * @see AdminVdcApi
  * @author danikov
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface AdminVdcAsyncApi extends VdcAsyncApi {
    
    @Override
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java
index 52e2a9d..f9653c7 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java
@@ -37,7 +37,7 @@
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.Group;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
    
@@ -45,7 +45,7 @@
  * @see GroupApi
  * @author danikov
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface GroupAsyncApi {
    
    @POST
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserAsyncApi.java
index a49c310..c59c8b7 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserAsyncApi.java
@@ -37,7 +37,7 @@
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.User;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
 import com.google.common.util.concurrent.ListenableFuture;
    
@@ -45,7 +45,7 @@
  * @see UserApi
  * @author danikov
  */
-@RequestFilters(AddVCloudAuthorizationToRequest.class)
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface UserAsyncApi {
 
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/filters/AddVCloudAuthorizationAndCookieToRequest.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/filters/AddVCloudAuthorizationAndCookieToRequest.java
new file mode 100644
index 0000000..2f52c3d
--- /dev/null
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/filters/AddVCloudAuthorizationAndCookieToRequest.java
@@ -0,0 +1,39 @@
+package org.jclouds.vcloud.director.v1_5.filters;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import javax.ws.rs.core.HttpHeaders;
+
+import org.jclouds.http.HttpException;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpRequestFilter;
+import org.jclouds.vcloud.director.v1_5.annotations.Session;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMultimap;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Singleton
+public class AddVCloudAuthorizationAndCookieToRequest implements HttpRequestFilter {
+
+   private final Supplier<String> sessionSupplier;
+
+   @Inject
+   public AddVCloudAuthorizationAndCookieToRequest(@Session Supplier<String> sessionSupplier) {
+      this.sessionSupplier = sessionSupplier;
+   }
+
+   @Override
+   public HttpRequest filter(HttpRequest request) throws HttpException {
+      String token = sessionSupplier.get();
+      return request
+               .toBuilder()
+               .replaceHeaders(
+                        ImmutableMultimap.of("x-vcloud-authorization", token, HttpHeaders.COOKIE, "vcloud-token="
+                                 + token)).build();
+   }
+
+}
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/filters/AddVCloudAuthorizationToRequest.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/filters/AddVCloudAuthorizationToRequest.java
deleted file mode 100644
index 45bc37f..0000000
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/filters/AddVCloudAuthorizationToRequest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.jclouds.vcloud.director.v1_5.filters;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import org.jclouds.http.HttpException;
-import org.jclouds.http.HttpRequest;
-import org.jclouds.http.HttpRequestFilter;
-import org.jclouds.vcloud.director.v1_5.annotations.Session;
-
-import com.google.common.base.Supplier;
-
-/**
- * 
- * @author Adrian Cole
- */
-@Singleton
-public class AddVCloudAuthorizationToRequest implements HttpRequestFilter {
-
-   private final Supplier<String> sessionSupplier;
-
-   @Inject
-   public AddVCloudAuthorizationToRequest(@Session Supplier<String> sessionSupplier) {
-      this.sessionSupplier = sessionSupplier;
-   }
-
-   @Override
-   public HttpRequest filter(HttpRequest request) throws HttpException {
-      return request.toBuilder().replaceHeader("x-vcloud-authorization", sessionSupplier.get()).build();
-   }
-
-}
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/HttpClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/HttpClientLiveTest.java
index 3153f16..b7d66ea 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/HttpClientLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/HttpClientLiveTest.java
@@ -83,7 +83,7 @@
       assertTrue(sessionWithToken.getSession().getLinks().size() > 0);
       assertNotNull(sessionWithToken.getToken());
 
-      OrgList orgList = parser.fromXML(Strings2.toStringAndClose(response.getPayload().getInput()), OrgList.class);
+      OrgList orgList = parser.fromXML(Strings2.toString(response.getPayload()), OrgList.class);
 
       assertTrue(orgList.getOrgs().size() > 0, "must have orgs");
 
@@ -99,7 +99,7 @@
             .addHeader("x-vcloud-authorization", sessionWithToken.getToken())
             .addHeader("Accept", "*/*").build());
 
-      String schema = Strings2.toStringAndClose(response.getPayload().getInput());
+      String schema = Strings2.toString(response.getPayload());
 
       // TODO: asserting something about the schema
    }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiExpectTest.java
index cac805a..d5a9718 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiExpectTest.java
@@ -38,6 +38,7 @@
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.common.net.HttpHeaders;
 
 /**
  * Test the {@link CatalogApi} by observing its side effects.
@@ -53,7 +54,9 @@
               .method("GET")
               .endpoint(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4")
               .addHeader("Accept", "*/*")
-              .addHeader("x-vcloud-authorization", token).build();
+              .addHeader("x-vcloud-authorization", token)
+              .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+              .build();
 
       HttpResponse catalogResponse = HttpResponse.builder()
               .statusCode(200)
@@ -75,6 +78,7 @@
             .endpoint(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/catalogItems")
             .addHeader("Accept", "application/vnd.vmware.vcloud.catalogItem+xml")
             .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
             .payload(payloadFromResourceWithContentType("/catalog/newCatalogItem.xml", VCloudDirectorMediaType.CATALOG_ITEM))
             .build();
 
@@ -105,7 +109,7 @@
             .endpoint(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
-            .build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse catalogResponse = HttpResponse.builder()
               .statusCode(200)
@@ -137,7 +141,7 @@
             .endpoint(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata/KEY")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
-            .build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse catalogResponse = HttpResponse.builder()
               .statusCode(200)
@@ -160,7 +164,7 @@
             .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
-            .build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse catalogItemResponse = HttpResponse.builder()
               .statusCode(200)
@@ -183,6 +187,7 @@
             .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df")
             .addHeader("Accept", "application/vnd.vmware.vcloud.catalogItem+xml")
             .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
             .payload(payloadFromResourceWithContentType("/catalog/updateCatalogItem.xml", VCloudDirectorMediaType.CATALOG_ITEM))
             .build();
 
@@ -206,7 +211,7 @@
             .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
-            .build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse catalogItemResponse = HttpResponse.builder()
             .statusCode(200)
@@ -226,7 +231,7 @@
             .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
-            .build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse catalogItemResponse = HttpResponse.builder()
               .statusCode(200)
@@ -258,6 +263,7 @@
             .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata")
             .addHeader("Accept", "application/vnd.vmware.vcloud.task+xml")
             .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
             .payload(payloadFromResourceWithContentType("/catalog/mergeCatalogItemMetadata.xml", VCloudDirectorMediaType.METADATA))
             .build();
 
@@ -284,7 +290,7 @@
             .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata/KEY")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
-            .build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse catalogItemResponse = HttpResponse.builder()
               .statusCode(200)
@@ -307,6 +313,7 @@
             .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata/KEY")
             .addHeader("Accept", "application/vnd.vmware.vcloud.task+xml")
             .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
             .payload(payloadFromResourceWithContentType("/catalog/setCatalogItemMetadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE))
             .build();
 
@@ -333,7 +340,7 @@
             .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata/KEY")
             .addHeader("Accept", "application/vnd.vmware.vcloud.task+xml")
             .addHeader("x-vcloud-authorization", token)
-            .build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse catalogItemResponse = HttpResponse.builder()
             .statusCode(200)
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java
index a525023..7bc33c6 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java
@@ -151,7 +151,7 @@
       assertTrue(media.getFiles().size() == 1, String.format(OBJ_FIELD_LIST_SIZE_EQ, MEDIA, "files", 1, media.getFiles().size()));
       File uploadFile = getFirst(media.getFiles(), null);
       assertNotNull(uploadFile, String.format(OBJ_FIELD_REQ, MEDIA, "files.first"));
-      assertEquals(uploadFile.getSize(), new Long(iso.length));
+      assertEquals(uploadFile.getSize(), Long.valueOf(iso.length));
       assertEquals(uploadFile.getSize().longValue(), sourceMedia.getSize(),
             String.format(OBJ_FIELD_EQ, MEDIA, "uploadFile.size()", sourceMedia.getSize(), uploadFile.getSize()));
       
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiExpectTest.java
index 50e732c..dad3778 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiExpectTest.java
@@ -22,6 +22,8 @@
 
 import java.net.URI;
 
+import javax.ws.rs.core.HttpHeaders;
+
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
@@ -48,8 +50,8 @@
               .method("GET")
               .endpoint(endpoint + "/catalogs/query")
               .addHeader("Accept", "*/*")
-            .addHeader("x-vcloud-authorization", token)
-
+              .addHeader("x-vcloud-authorization", token)
+              .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
               .build();
 
       HttpResponse queryResponse= HttpResponse.builder()
@@ -123,7 +125,9 @@
               .method("GET")
               .endpoint(endpoint + "/catalogs/query?format=references")
               .addHeader("Accept", "*/*")
-              .addHeader("x-vcloud-authorization", token).build();
+              .addHeader("x-vcloud-authorization", token)
+              .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+              .build();
 
       HttpResponse queryResponse= HttpResponse.builder()
               .statusCode(200)
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiExpectTest.java
index e435c2c..26e3143 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiExpectTest.java
@@ -24,6 +24,8 @@
 
 import java.net.URI;
 
+import javax.ws.rs.core.HttpHeaders;
+
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
@@ -51,7 +53,7 @@
               .endpoint(endpoint + "/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0")
               .addHeader("Accept", "*/*")
               .addHeader("x-vcloud-authorization", token)
-              .build();
+              .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse taskResponse = HttpResponse.builder()
               .statusCode(200)
@@ -62,7 +64,7 @@
             .endpoint(endpoint + "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
-            .build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
 		HttpResponse orgResponse = HttpResponse.builder()
             .statusCode(200)
@@ -95,7 +97,7 @@
             .endpoint(endpoint + "/org/NOTAUUID")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
-            .build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse orgResponse = HttpResponse.builder()
             .statusCode(400)
@@ -126,7 +128,7 @@
             .endpoint(endpoint + "/tasksList/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
-            .build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse taskResponse = HttpResponse.builder().build();
       
@@ -134,7 +136,7 @@
             .endpoint(endpoint + "/org/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
-            .build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse orgResponse = HttpResponse.builder()
             .statusCode(403)
@@ -152,7 +154,8 @@
               .method("GET")
               .endpoint(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b")
               .addHeader("Accept", "*/*")
-              .addHeader("x-vcloud-authorization", token).build();
+              .addHeader("x-vcloud-authorization", token)
+              .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse taskResponse = HttpResponse.builder()
               .statusCode(200)
@@ -175,7 +178,8 @@
             .method("POST")
             .endpoint(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b/action/cancel")
             .addHeader("Accept", "*/*")
-            .addHeader("x-vcloud-authorization", token).build();
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse taskResponse = HttpResponse.builder()
             .statusCode(200)
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminQueryApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminQueryApiExpectTest.java
index fc0f277..b3ca529 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminQueryApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminQueryApiExpectTest.java
@@ -22,6 +22,8 @@
 
 import java.net.URI;
 
+import javax.ws.rs.core.HttpHeaders;
+
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
@@ -52,6 +54,7 @@
               .endpoint(endpoint + "/admin/groups/query")
               .addHeader("Accept", "*/*")
               .addHeader("x-vcloud-authorization", token)
+              .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
               .build();
 
       HttpResponse queryResponse= HttpResponse.builder()
@@ -98,7 +101,7 @@
               .endpoint(endpoint + "/admin/roles/query")
               .addHeader("Accept", "*/*")
               .addHeader("x-vcloud-authorization", token)
-              .build();
+              .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
       HttpResponse queryResponse= HttpResponse.builder()
               .statusCode(200)
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java
index a37e700..08c1422 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java
@@ -36,6 +36,7 @@
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Multimap;
+import com.google.common.net.HttpHeaders;
 import com.google.inject.Guice;
 
 /**
@@ -132,6 +133,7 @@
             .headers(ImmutableMultimap.<String, String> builder()
                   .put("Accept", mediaType)
                   .put("x-vcloud-authorization", token)
+                  .put(HttpHeaders.COOKIE, "vcloud-token=" + token)
                   .build())
             .build();
    }
@@ -160,6 +162,7 @@
             .headers(ImmutableMultimap.<String, String> builder()
                   .put("Accept", acceptType)
                   .put("x-vcloud-authorization", token)
+                  .put(HttpHeaders.COOKIE, "vcloud-token=" + token)
                   .build())
             .payload(payloadFromResourceWithContentType(relativeFilePath, mediaType))
             .build();
@@ -221,6 +224,7 @@
       
       public HttpRequest.Builder<?> httpRequestBuilder() {
          header("x-vcloud-authorization", token);
+         header(HttpHeaders.COOKIE, "vcloud-token=" + token);
          builder.headers(headers);
          return builder;
       }
diff --git a/labs/virtualbox/src/test/java/org/jclouds/virtualbox/PreseedCfgServerTest.java b/labs/virtualbox/src/test/java/org/jclouds/virtualbox/PreseedCfgServerTest.java
index 659c1f8..28c6001 100644
--- a/labs/virtualbox/src/test/java/org/jclouds/virtualbox/PreseedCfgServerTest.java
+++ b/labs/virtualbox/src/test/java/org/jclouds/virtualbox/PreseedCfgServerTest.java
@@ -20,6 +20,7 @@
 
 import static org.testng.Assert.assertEquals;
 
+import java.io.File;
 import java.net.URI;
 import java.net.URL;
 import java.util.Map;
@@ -44,9 +45,9 @@
  * @author dralves
  * 
  */
-@Test(groups = "live", singleThreaded = true, testName = "StartJettyIfNotAlreadyRunningLiveTest")
+@Test(groups = "live", singleThreaded = true, testName = "PreseedCfgServerTest")
 public class PreseedCfgServerTest {
-
+   private static final String lineSeparator = System.getProperty("line.separator");
    @Test
    public void testJettyServerServesPreseedFile() throws Exception {
       Properties props = VirtualBoxApiMetadata.defaultProperties();
@@ -60,7 +61,7 @@
       starter.start(preconfigurationUrl, getDefaultImage().preseed_cfg);
 
       String preseedFileFromJetty = IOUtils.toString(new URL("http://127.0.0.1:" + port + "/preseed.cfg").openStream());
-      String preseedFileFromFile = getDefaultImage().preseed_cfg + "\n";
+      String preseedFileFromFile = getDefaultImage().preseed_cfg + lineSeparator;
       assertEquals(preseedFileFromFile, preseedFileFromJetty);
 
       starter.stop();
diff --git a/project/pom.xml b/project/pom.xml
index 7a108df..37bf201 100644
--- a/project/pom.xml
+++ b/project/pom.xml
@@ -605,7 +605,7 @@
                                 <configuration>
                                     <encoding>${project.build.sourceEncoding}</encoding>
                                     <quiet>true</quiet>
-                                    <additionalJOption>-J-Xmx256m</additionalJOption>
+                                    <maxmemory>256m</maxmemory>
                                 </configuration>
                                 <reportSets>
                                     <reportSet>
@@ -709,7 +709,7 @@
                   <artifactId>maven-javadoc-plugin</artifactId>
                   <version>2.8.1</version>
                   <configuration>
-                    <additionalJOption>-J-Xmx256m</additionalJOption>
+                    <maxmemory>256m</maxmemory>
                     <encoding>${project.build.sourceEncoding}</encoding>
                     <quiet>true</quiet>
                     <links>
diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/LaunchSpecificationHandler.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/LaunchSpecificationHandler.java
index 40ac014..5944b74 100644
--- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/LaunchSpecificationHandler.java
+++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/LaunchSpecificationHandler.java
@@ -115,7 +115,7 @@
       } else if (qName.equals("enabled")) {
          String monitoringEnabled = currentOrNull();
          if (monitoringEnabled != null)
-            builder.monitoringEnabled(new Boolean(monitoringEnabled));
+            builder.monitoringEnabled(Boolean.valueOf(monitoringEnabled));
       }
       currentText = new StringBuilder();
    }
diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/internal/ParallelMultipartUploadStrategy.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/internal/ParallelMultipartUploadStrategy.java
index e946df6..03868af 100644
--- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/internal/ParallelMultipartUploadStrategy.java
+++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/internal/ParallelMultipartUploadStrategy.java
@@ -190,14 +190,14 @@
                         CountDownLatch latch = new CountDownLatch(effectiveParts);
                         int part;
                         while ((part = algorithm.getNextPart()) <= parts) {
-                           Integer partKey = new Integer(part);
+                           Integer partKey = Integer.valueOf(part);
                            activeParts.put(partKey);
                            prepareUploadPart(container, key, uploadId, partKey, payload, 
                                  algorithm.getNextChunkOffset(), chunkSize, etags, 
                                  activeParts, futureParts, errors, maxRetries, errorMap, toRetry, latch);
                         }
                         if (remaining > 0) {
-                           Integer partKey = new Integer(part);
+                           Integer partKey = Integer.valueOf(part);
                            activeParts.put(partKey);
                            prepareUploadPart(container, key, uploadId, partKey, payload, 
                                  algorithm.getNextChunkOffset(), remaining, etags, 
@@ -210,7 +210,7 @@
                            CountDownLatch retryLatch = new CountDownLatch(atOnce);
                            for (int i = 0; i < atOnce; i++) {
                               Part failedPart = toRetry.poll();
-                              Integer partKey = new Integer(failedPart.getPart());
+                              Integer partKey = Integer.valueOf(failedPart.getPart());
                               activeParts.put(partKey);
                               prepareUploadPart(container, key, uploadId, partKey, payload, 
                                     failedPart.getOffset(), failedPart.getSize(), etags, 
diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/internal/SequentialMultipartUploadStrategy.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/internal/SequentialMultipartUploadStrategy.java
index e262186..22529b7 100644
--- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/internal/SequentialMultipartUploadStrategy.java
+++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/blobstore/strategy/internal/SequentialMultipartUploadStrategy.java
@@ -75,7 +75,7 @@
       String eTag = null;
       try {
          eTag = client.uploadPart(container, key, part, uploadId, chunkedPart);
-         etags.put(new Integer(part), eTag);
+         etags.put(Integer.valueOf(part), eTag);
       } catch (KeyNotFoundException e) {
          // note that because of eventual consistency, the upload id may not be present yet
          // we may wish to add this condition to the retry handler
@@ -83,7 +83,7 @@
          // we may also choose to implement ListParts and wait for the uploadId to become
          // available there.
          eTag = client.uploadPart(container, key, part, uploadId, chunkedPart);
-         etags.put(new Integer(part), eTag);
+         etags.put(Integer.valueOf(part), eTag);
       }
    }
 
diff --git a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/strategy/internal/SequentialMultipartUploadStrategyTest.java b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/strategy/internal/SequentialMultipartUploadStrategyTest.java
index 6cb969b..5303de5 100644
--- a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/strategy/internal/SequentialMultipartUploadStrategyTest.java
+++ b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/strategy/internal/SequentialMultipartUploadStrategyTest.java
@@ -75,14 +75,14 @@
       long chunkSize = MultipartUploadSlicingAlgorithm.DEFAULT_PART_SIZE;
       long remaining = 100L;
       SortedMap<Integer, String> etags = Maps.newTreeMap();
-      etags.put(new Integer(1), "eTag1");
-      etags.put(new Integer(2), "eTag2");
+      etags.put(Integer.valueOf(1), "eTag1");
+      etags.put(Integer.valueOf(2), "eTag2");
       
       expect(blob.getMetadata()).andReturn(blobMeta).atLeastOnce();
       expect(blobMeta.getName()).andReturn(key).atLeastOnce();
       expect(blob.getPayload()).andReturn(payload).atLeastOnce();
       expect(payload.getContentMetadata()).andReturn(contentMeta).atLeastOnce();
-      expect(contentMeta.getContentLength()).andReturn(new Long(chunkSize + remaining));
+      expect(contentMeta.getContentLength()).andReturn(Long.valueOf(chunkSize + remaining));
       expect(ablobStore.getContext()).andReturn(context).atLeastOnce();
       expect(context.unwrap(AWSS3ApiMetadata.CONTEXT_TOKEN)).andReturn(psc).atLeastOnce();
       expect(psc.getApi()).andReturn(client).atLeastOnce();
@@ -138,14 +138,14 @@
       long chunkSize = MultipartUploadSlicingAlgorithm.DEFAULT_PART_SIZE;
       long remaining = 100L;
       SortedMap<Integer, String> etags = Maps.newTreeMap();
-      etags.put(new Integer(1), "eTag1");
-      etags.put(new Integer(2), "eTag2");
+      etags.put(Integer.valueOf(1), "eTag1");
+      etags.put(Integer.valueOf(2), "eTag2");
       
       expect(blob.getMetadata()).andReturn(blobMeta).atLeastOnce();
       expect(blobMeta.getName()).andReturn(key).atLeastOnce();
       expect(blob.getPayload()).andReturn(payload).atLeastOnce();
       expect(payload.getContentMetadata()).andReturn(contentMeta).atLeastOnce();
-      expect(contentMeta.getContentLength()).andReturn(new Long(chunkSize + remaining));
+      expect(contentMeta.getContentLength()).andReturn(Long.valueOf(chunkSize + remaining));
       expect(ablobStore.getContext()).andReturn(context).atLeastOnce();
       expect(context.unwrap(AWSS3ApiMetadata.CONTEXT_TOKEN)).andReturn(psc).atLeastOnce();
       expect(psc.getApi()).andReturn(client).atLeastOnce();
diff --git a/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java b/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java
index 0c1dc5f..e2a7ffc 100644
--- a/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java
+++ b/providers/azureblob/src/test/java/org/jclouds/azureblob/AzureBlobClientLiveTest.java
@@ -265,9 +265,9 @@
 
       // Test GET of object (including updated metadata)
       AzureBlob getBlob = getApi().getBlob(privateContainer, object.getProperties().getName());
-      assertEquals(Strings2.toStringAndClose(getBlob.getPayload().getInput()), data);
+      assertEquals(Strings2.toString(getBlob.getPayload()), data);
       // TODO assertEquals(getBlob.getName(), object.getProperties().getName());
-      assertEquals(getBlob.getPayload().getContentMetadata().getContentLength(), new Long(data.length()));
+      assertEquals(getBlob.getPayload().getContentMetadata().getContentLength(), Long.valueOf(data.length()));
       assertEquals(getBlob.getProperties().getContentMetadata().getContentType(), "text/plain");
       assertEquals(CryptoStreams.hex(md5),
             CryptoStreams.hex(getBlob.getProperties().getContentMetadata().getContentMD5()));
@@ -310,7 +310,7 @@
       object = getApi().newBlob();
       object.getProperties().setName("chunked-object");
       object.setPayload(bais);
-      object.getPayload().getContentMetadata().setContentLength(new Long(data.getBytes().length));
+      object.getPayload().getContentMetadata().setContentLength(Long.valueOf(data.getBytes().length));
       newEtag = getApi().putBlob(privateContainer, object);
       assertEquals(CryptoStreams.hex(md5),
             CryptoStreams.hex(getBlob.getProperties().getContentMetadata().getContentMD5()));
diff --git a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridComputeServiceAdapter.java b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridComputeServiceAdapter.java
index cda9ba5..7f0b17f 100644
--- a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridComputeServiceAdapter.java
+++ b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridComputeServiceAdapter.java
@@ -154,19 +154,19 @@
    
    @Override
    public void destroyNode(String id) {
-      client.getServerServices().deleteById(new Long(id));
+      client.getServerServices().deleteById(Long.valueOf(id));
    }
 
    @Override
    public void rebootNode(String id) {
       executeCommandOnServer(PowerCommand.RESTART, id);
-      Server server = Iterables.getOnlyElement(client.getServerServices().getServersById(new Long(id)));
+      Server server = Iterables.getOnlyElement(client.getServerServices().getServersById(Long.valueOf(id)));
       client.getServerServices().power(server.getName(), PowerCommand.START);
       serverLatestJobCompletedShort.apply(server);
    }
 
    private boolean executeCommandOnServer(PowerCommand command, String id) {
-      Server server = Iterables.getOnlyElement(client.getServerServices().getServersById(new Long(id)));
+      Server server = Iterables.getOnlyElement(client.getServerServices().getServersById(Long.valueOf(id)));
       client.getServerServices().power(server.getName(), command);
       return serverLatestJobCompleted.apply(server);
    }
diff --git a/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/GoGridComputeServiceLiveTest.java b/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/GoGridComputeServiceLiveTest.java
index 2aba331..7cdffe2 100644
--- a/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/GoGridComputeServiceLiveTest.java
+++ b/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/GoGridComputeServiceLiveTest.java
@@ -84,12 +84,12 @@
       try {
          NodeMetadata node = getOnlyElement(client.createNodesInGroup(group, 1));
 
-         Server updatedServer = providerContext.getApi().getServerServices().editServerRam(new Long(node.getId()), ram);
+         Server updatedServer = providerContext.getApi().getServerServices().editServerRam(Long.valueOf(node.getId()), ram);
          assertNotNull(updatedServer);
          assert serverLatestJobCompleted.apply(updatedServer);
 
          assertEquals(
-               Iterables.getLast(providerContext.getApi().getServerServices().getServersById(new Long(node.getId())))
+               Iterables.getLast(providerContext.getApi().getServerServices().getServersById(Long.valueOf(node.getId())))
                      .getRam().getName(), ram);
 
       } finally {
diff --git a/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/functions/ParseContainerMetadataFromHeaders.java b/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/functions/ParseContainerMetadataFromHeaders.java
index fc977e2..a31d123 100644
--- a/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/functions/ParseContainerMetadataFromHeaders.java
+++ b/providers/hpcloud-objectstorage/src/main/java/org/jclouds/hpcloud/objectstorage/functions/ParseContainerMetadataFromHeaders.java
@@ -49,8 +49,8 @@
       
       to.setReadACL(from.getFirstHeaderOrNull(SwiftHeaders.CONTAINER_READ));
  
-      to.setBytes(new Long(from.getFirstHeaderOrNull(SwiftHeaders.CONTAINER_BYTES_USED)));
-      to.setCount(new Long(from.getFirstHeaderOrNull(SwiftHeaders.CONTAINER_OBJECT_COUNT)));
+      to.setBytes(Long.valueOf(from.getFirstHeaderOrNull(SwiftHeaders.CONTAINER_BYTES_USED)));
+      to.setCount(Long.valueOf(from.getFirstHeaderOrNull(SwiftHeaders.CONTAINER_OBJECT_COUNT)));
       
       addUserMetadataTo(from, to);
       
diff --git a/providers/slicehost/src/main/java/org/jclouds/slicehost/handlers/ParseSlicehostErrorFromHttpResponse.java b/providers/slicehost/src/main/java/org/jclouds/slicehost/handlers/ParseSlicehostErrorFromHttpResponse.java
index acaf21e..d013eb6 100644
--- a/providers/slicehost/src/main/java/org/jclouds/slicehost/handlers/ParseSlicehostErrorFromHttpResponse.java
+++ b/providers/slicehost/src/main/java/org/jclouds/slicehost/handlers/ParseSlicehostErrorFromHttpResponse.java
@@ -118,7 +118,7 @@
       // slicehost returns " " which is unparsable
       if (response.getPayload() != null) {
          try {
-            String payload = Strings2.toStringAndClose(response.getPayload().getInput()).trim();
+            String payload = Strings2.toString(response.getPayload()).trim();
             return payload.indexOf("xml") != -1 ? errorParser.parse(payload) : payload;
          } catch (IOException e) {
          }
diff --git a/providers/slicehost/src/test/java/org/jclouds/slicehost/SlicehostClientLiveTest.java b/providers/slicehost/src/test/java/org/jclouds/slicehost/SlicehostClientLiveTest.java
index 44d00b9..f82c1e2 100644
--- a/providers/slicehost/src/test/java/org/jclouds/slicehost/SlicehostClientLiveTest.java
+++ b/providers/slicehost/src/test/java/org/jclouds/slicehost/SlicehostClientLiveTest.java
@@ -234,7 +234,7 @@
       Slice slice = client.getSlice(sliceId);
       assertEquals(slice.getStatus(), Slice.Status.ACTIVE);
       assert slice.getProgress() >= 0 : "newDetails.getProgress()" + slice.getProgress();
-      assertEquals(new Integer(14362), slice.getImageId());
+      assertEquals(Integer.valueOf(14362), slice.getImageId());
       assertEquals(1, slice.getFlavorId());
       assertNotNull(slice.getAddresses());
       checkPassOk(slice, rootPassword);
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Address.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Address.java
index 2994cf1..13ca1b5 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Address.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Address.java
@@ -89,7 +89,7 @@
 
    @Override
    public int compareTo(Address arg0) {
-      return new Integer(id).compareTo(arg0.getId());
+      return Integer.valueOf(id).compareTo(arg0.getId());
    }
 
    /**
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Datacenter.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Datacenter.java
index c35d372..77f321c 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Datacenter.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Datacenter.java
@@ -104,7 +104,7 @@
 
    @Override
    public int compareTo(Datacenter arg0) {
-      return new Integer(id).compareTo(arg0.getId());
+      return Integer.valueOf(id).compareTo(arg0.getId());
    }
 
    /**
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/OperatingSystem.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/OperatingSystem.java
index 00a5927..4533ac7 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/OperatingSystem.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/OperatingSystem.java
@@ -86,7 +86,7 @@
 
    @Override
    public int compareTo(OperatingSystem arg0) {
-      return new Integer(id).compareTo(arg0.getId());
+      return Integer.valueOf(id).compareTo(arg0.getId());
    }
 
    /**
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Password.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Password.java
index bb28d29..0601ab5 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Password.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Password.java
@@ -82,7 +82,7 @@
 
     @Override
    public int compareTo(Password arg0) {
-      return new Integer(id).compareTo(arg0.getId());
+      return Integer.valueOf(id).compareTo(arg0.getId());
    }
 
    /**
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItem.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItem.java
index a6bb0b9..2d3b5e6 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItem.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItem.java
@@ -130,7 +130,7 @@
 
    @Override
    public int compareTo(ProductItem arg0) {
-      return new Integer(id).compareTo(arg0.getId());
+      return Integer.valueOf(id).compareTo(arg0.getId());
    }
 
    /**
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItemCategory.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItemCategory.java
index b525878..3b78ea5 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItemCategory.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItemCategory.java
@@ -83,7 +83,7 @@
 
    @Override
    public int compareTo(ProductItemCategory arg0) {
-      return new Integer(id).compareTo(arg0.getId());
+      return Integer.valueOf(id).compareTo(arg0.getId());
    }
 
    /**
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItemPrice.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItemPrice.java
index 36ae4b1..1ed4809 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItemPrice.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductItemPrice.java
@@ -122,7 +122,7 @@
 
    @Override
    public int compareTo(ProductItemPrice arg0) {
-      return new Integer(id).compareTo(arg0.getId());
+      return Integer.valueOf(id).compareTo(arg0.getId());
    }
 
    /**
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductOrderReceipt.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductOrderReceipt.java
index 64b3456..a93bce8 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductOrderReceipt.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductOrderReceipt.java
@@ -67,7 +67,7 @@
 
    @Override
    public int compareTo(ProductOrderReceipt arg0) {
-      return new Integer(orderId).compareTo(arg0.getOrderId());
+      return Integer.valueOf(orderId).compareTo(arg0.getOrderId());
    }
 
    /**
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductPackage.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductPackage.java
index f44ac60..953b1ec 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductPackage.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductPackage.java
@@ -110,7 +110,7 @@
 
    @Override
    public int compareTo(ProductPackage arg0) {
-      return new Integer(id).compareTo(arg0.getId());
+      return Integer.valueOf(id).compareTo(arg0.getId());
    }
 
    /**
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Region.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Region.java
index c2536b1..611682e 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Region.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/Region.java
@@ -76,7 +76,7 @@
 
    @Override
    public int compareTo(Region arg0) {
-      return new Integer(sortOrder).compareTo(arg0.sortOrder);
+      return Integer.valueOf(sortOrder).compareTo(arg0.sortOrder);
    }
 
    /**
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/VirtualGuest.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/VirtualGuest.java
index a35a209..1127a3e 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/VirtualGuest.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/VirtualGuest.java
@@ -326,7 +326,7 @@
 
    @Override
    public int compareTo(VirtualGuest arg0) {
-      return new Integer(id).compareTo(arg0.getId());
+      return Integer.valueOf(id).compareTo(arg0.getId());
    }
 
    /**
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/handlers/SoftLayerErrorHandler.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/handlers/SoftLayerErrorHandler.java
index d67d41a..a8d8254 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/handlers/SoftLayerErrorHandler.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/handlers/SoftLayerErrorHandler.java
@@ -80,7 +80,7 @@
       if (response.getPayload() == null)
          return null;
       try {
-         return Strings2.toStringAndClose(response.getPayload().getInput());
+         return Strings2.toString(response.getPayload());
       } catch (IOException e) {
          throw new RuntimeException(e);
       } finally {
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemToImageTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemToImageTest.java
index 33da528..a29827e 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemToImageTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemToImageTest.java
@@ -231,12 +231,12 @@
 
    @Test
    public void testOsBitsWithSpace() {
-      assertEquals(osBits().apply("a (32 bit) os"),new Integer(32));
+      assertEquals(osBits().apply("a (32 bit) os"),Integer.valueOf(32));
    }
 
    @Test
    public void testOsBitsNoSpace() {
-      assertEquals(osBits().apply("a (64bit) os"),new Integer(64));
+      assertEquals(osBits().apply("a (64bit) os"),Integer.valueOf(64));
    }
 
    @Test
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/ProductPackageClientLiveTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/ProductPackageClientLiveTest.java
index e77b5d8..7f0e748 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/ProductPackageClientLiveTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/ProductPackageClientLiveTest.java
@@ -138,7 +138,7 @@
       Map<Float, ProductItem> ramToProductItem = Maps.uniqueIndex(ramItems, ProductItems.capacity());
 
       ProductItemPrice price = ProductItems.price().apply(ramToProductItem.get(1.0f));
-      assert new Integer(1644).equals(price.getId());
+      assert Integer.valueOf(1644).equals(price.getId());
    }
 
    @Test
@@ -153,7 +153,7 @@
       Map<Float, ProductItem> coresToProductItem = Maps.uniqueIndex(cpuItems, ProductItems.capacity());
 
       ProductItemPrice price = ProductItems.price().apply(coresToProductItem.get(2.0f));
-      assert new Integer(1963).equals(price.getId());
+      assert Integer.valueOf(1963).equals(price.getId());
    }
 
    @Test
@@ -165,7 +165,7 @@
 
       ProductItemPrice price = ProductItems.price().apply(
             osToProductItem.get("Ubuntu Linux 8 LTS Hardy Heron - Minimal Install (64 bit)"));
-      assert new Integer(1693).equals(price.getId());
+      assert Integer.valueOf(1693).equals(price.getId());
    }
 
    private void checkProductItem(ProductItem item) {
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/xml/TagNameToUsageCountHandler.java b/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/xml/TagNameToUsageCountHandler.java
index 139a64f..2c10893 100644
--- a/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/xml/TagNameToUsageCountHandler.java
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/xml/TagNameToUsageCountHandler.java
@@ -50,7 +50,7 @@
       if (equalsOrSuffix(qName, "Name")) {
          name = currentOrNull(currentText);
       } else if (equalsOrSuffix(qName, "UsageCount")) {
-         builder.put(name, new Integer(currentOrNull(currentText)));
+         builder.put(name, Integer.valueOf(currentOrNull(currentText)));
       }
       currentText = new StringBuilder();
    }
diff --git a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToHardware.java b/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToHardware.java
index 7599672..7044321 100644
--- a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToHardware.java
+++ b/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToHardware.java
@@ -78,7 +78,7 @@
 			for (int i = 0; i < nodes.getLength(); i++) {
 				StorageVol storageVol = from.getConnect().storageVolLookupByPath(diskFileName);
 				String id = storageVol.getKey();
-				float size = new Long(storageVol.getInfo().capacity).floatValue();
+				float size = Long.valueOf(storageVol.getInfo().capacity).floatValue();
 				volumes.add(new VolumeImpl(id, Volume.Type.LOCAL, size, null, true, false));
 			}
 			builder.volumes((List<Volume>) volumes);
diff --git a/sandbox-apis/pcs/src/test/java/org/jclouds/mezeo/pcs/PCSClientLiveTest.java b/sandbox-apis/pcs/src/test/java/org/jclouds/mezeo/pcs/PCSClientLiveTest.java
index 337f47b..aa36dd1 100644
--- a/sandbox-apis/pcs/src/test/java/org/jclouds/mezeo/pcs/PCSClientLiveTest.java
+++ b/sandbox-apis/pcs/src/test/java/org/jclouds/mezeo/pcs/PCSClientLiveTest.java
@@ -215,7 +215,7 @@
       // Test GET of object (including updated metadata)
       InputStream file = connection.downloadFile(objectURI);
       assertEquals(Strings2.toStringAndClose(file), data);
-      validateFileInfoAndNameIsInMetadata(container, objectURI, "object", new Long(data.length()));
+      validateFileInfoAndNameIsInMetadata(container, objectURI, "object", Long.valueOf(data.length()));
 
       try {
          connection.uploadFile(container, object);
@@ -235,15 +235,15 @@
       // try sending it in 2 parts
       object.getMetadata().setName(name);
       objectURI = connection.createFile(container, object);
-      validateFileInfoAndNameIsInMetadata(container, objectURI, name, new Long(0));
+      validateFileInfoAndNameIsInMetadata(container, objectURI, name, Long.valueOf(0));
 
       object.setPayload(data.substring(0, 2));
       connection.uploadBlock(objectURI, object, range(0, 2));
-      validateFileInfoAndNameIsInMetadata(container, objectURI, name, new Long(2));
+      validateFileInfoAndNameIsInMetadata(container, objectURI, name, Long.valueOf(2));
 
       object.setPayload(data.substring(2));
       connection.uploadBlock(objectURI, object, range(2, data.getBytes().length));
-      validateFileInfoAndNameIsInMetadata(container, objectURI, name, new Long(data.length()));
+      validateFileInfoAndNameIsInMetadata(container, objectURI, name, Long.valueOf(data.length()));
 
       file = connection.downloadFile(objectURI);
       assertEquals(Strings2.toStringAndClose(file), data);
@@ -252,7 +252,7 @@
       data = "Here is my datum";
       object.setPayload(data.substring(2));
       connection.uploadBlock(objectURI, object, range(2, data.getBytes().length));
-      validateFileInfoAndNameIsInMetadata(container, objectURI, name, new Long(data.length()));
+      validateFileInfoAndNameIsInMetadata(container, objectURI, name, Long.valueOf(data.length()));
 
       file = connection.downloadFile(objectURI);
       assertEquals(Strings2.toStringAndClose(file), data);
diff --git a/sandbox-apis/pcs/src/test/java/org/jclouds/mezeo/pcs/binders/BindContainerNameToXmlPayloadTest.java b/sandbox-apis/pcs/src/test/java/org/jclouds/mezeo/pcs/binders/BindContainerNameToXmlPayloadTest.java
index 43832ee..59583e6 100644
--- a/sandbox-apis/pcs/src/test/java/org/jclouds/mezeo/pcs/binders/BindContainerNameToXmlPayloadTest.java
+++ b/sandbox-apis/pcs/src/test/java/org/jclouds/mezeo/pcs/binders/BindContainerNameToXmlPayloadTest.java
@@ -40,7 +40,7 @@
       binder.bindToRequest(request, "foo");
 
       assertEquals(request.getPayload().getRawContent(), "<container><name>foo</name></container>");
-      assertEquals(request.getPayload().getContentMetadata().getContentLength(), new Long(
+      assertEquals(request.getPayload().getContentMetadata().getContentLength(), Long.valueOf(
                "<container><name>foo</name></container>".getBytes().length));
       assertEquals(request.getPayload().getContentMetadata().getContentType(), "application/unknown");
 
diff --git a/sandbox-providers/boxdotnet/src/main/java/org/jclouds/boxdotnet/handlers/BoxDotNetErrorHandler.java b/sandbox-providers/boxdotnet/src/main/java/org/jclouds/boxdotnet/handlers/BoxDotNetErrorHandler.java
index aaf4484..e6e90a0 100644
--- a/sandbox-providers/boxdotnet/src/main/java/org/jclouds/boxdotnet/handlers/BoxDotNetErrorHandler.java
+++ b/sandbox-providers/boxdotnet/src/main/java/org/jclouds/boxdotnet/handlers/BoxDotNetErrorHandler.java
@@ -76,7 +76,7 @@
       if (response.getPayload() == null)
          return null;
       try {
-         return Strings2.toStringAndClose(response.getPayload().getInput());
+         return Strings2.toString(response.getPayload());
       } catch (IOException e) {
          throw new RuntimeException(e);
       } finally {
diff --git a/sandbox-providers/ibm-smartcloud/src/main/java/org/jclouds/ibm/smartcloud/handlers/IBMSmartCloudErrorHandler.java b/sandbox-providers/ibm-smartcloud/src/main/java/org/jclouds/ibm/smartcloud/handlers/IBMSmartCloudErrorHandler.java
index 93e5884..b95416f 100644
--- a/sandbox-providers/ibm-smartcloud/src/main/java/org/jclouds/ibm/smartcloud/handlers/IBMSmartCloudErrorHandler.java
+++ b/sandbox-providers/ibm-smartcloud/src/main/java/org/jclouds/ibm/smartcloud/handlers/IBMSmartCloudErrorHandler.java
@@ -86,6 +86,6 @@
    public String parseMessage(HttpResponse response) throws IOException {
       if (response.getPayload() == null)
          return null;
-      return Strings2.toStringAndClose(response.getPayload().getInput());
+      return Strings2.toString(response.getPayload());
    }
 }
diff --git a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/AdminAccess.java b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/AdminAccess.java
index 5b2b143..9b8425f 100644
--- a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/AdminAccess.java
+++ b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/AdminAccess.java
@@ -109,6 +109,7 @@
       }
 
       private String adminUsername;
+      private String adminFullName;
       private String adminHome;
       private String adminPublicKey;
       private File adminPublicKeyFile;
@@ -127,6 +128,12 @@
          return this;
       }
 
+      public AdminAccess.Builder adminFullName(String adminFullName) {
+         this.adminFullName = adminFullName;
+         return this;
+      }
+
+
       public AdminAccess.Builder adminHome(String adminHome) {
          this.adminHome = adminHome;
          return this;
@@ -211,7 +218,7 @@
             String adminPrivateKey = this.adminPrivateKey;
             if (adminPrivateKey == null && adminPrivateKeyFile != null)
                adminPrivateKey = Files.toString(adminPrivateKeyFile, UTF_8);
-            return new Config(adminUsername, adminHome, adminPublicKey, adminPrivateKey, adminPassword, loginPassword, 
+            return new Config(adminUsername, adminFullName, adminHome, adminPublicKey, adminPrivateKey, adminPassword, loginPassword,
                      lockSsh, grantSudoToAdminUser, authorizeAdminPublicKey, installAdminPrivateKey, resetLoginPassword,
                      cryptFunction);
          } catch (IOException e) {
@@ -222,6 +229,7 @@
 
    protected static class Config {
       private final String adminUsername;
+      private final String adminFullName;
       private final String adminHome;
       private final String adminPublicKey;
       private final String adminPrivateKey;
@@ -235,11 +243,12 @@
       private boolean authorizeAdminPublicKey;
       private boolean lockSsh;
 
-      protected Config(@Nullable String adminUsername, @Nullable String adminHome, @Nullable String adminPublicKey,
+      protected Config(@Nullable String adminUsername, @Nullable String adminFullName, @Nullable String adminHome, @Nullable String adminPublicKey,
                @Nullable String adminPrivateKey, @Nullable String adminPassword, @Nullable String loginPassword,
                boolean lockSsh, boolean grantSudoToAdminUser, boolean authorizeAdminPublicKey,
                boolean installAdminPrivateKey, boolean resetLoginPassword, Function<String, String> cryptFunction) {
          this.adminUsername = adminUsername;
+         this.adminFullName = adminFullName;
          this.adminHome = adminHome;
          this.adminPublicKey = adminPublicKey;
          this.adminPrivateKey = adminPrivateKey;
@@ -267,6 +276,10 @@
          return adminUsername;
       }
 
+      public String getAdminFullName() {
+         return adminFullName;
+      }
+
       public String getAdminHome() {
          return adminHome;
       }
@@ -318,7 +331,8 @@
       @Override
       public String toString() {
          StringBuilder builder = new StringBuilder();
-         builder.append("Config [adminUsername=").append(adminUsername).append(", adminHome=").append(adminHome)
+         builder.append("Config [adminUsername=").append(adminUsername).append(", adminFullName=").append(adminFullName)
+                  .append(", adminHome=").append(adminHome)
                   .append(", adminPublicKey=").append(adminPublicKey == null ? "null" : "present")
                   .append(", adminPrivateKey=").append(adminPrivateKey == null ? "null" : "present")
                   .append(", adminPassword=").append(adminPassword == null ? "null" : "present")
@@ -368,6 +382,7 @@
       Builder builder = AdminAccess.builder(configuration.cryptFunction());
       builder.adminUsername(config.getAdminUsername() != null ? config.getAdminUsername() : configuration
                .defaultAdminUsername().get());
+      builder.adminFullName(config.getAdminFullName() != null ? config.getAdminFullName() : builder.adminUsername);
       builder.adminHome(config.getAdminHome());
       builder.adminPassword(config.getAdminPassword() != null ? config.getAdminPassword() : configuration
                .passwordGenerator().get());
@@ -408,6 +423,7 @@
       ImmutableList.Builder<Statement> statements = ImmutableList.builder();
       UserAdd.Builder userBuilder = UserAdd.builder();
       userBuilder.login(config.getAdminUsername());
+      userBuilder.fullName(config.getAdminFullName());
       if (config.getAdminHome() != null)
          userBuilder.home(config.getAdminHome());
       if (config.shouldAuthorizeAdminPublicKey())
diff --git a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/AdminAccessBuilderSpec.java b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/AdminAccessBuilderSpec.java
index 2530108..3de0bf1 100644
--- a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/AdminAccessBuilderSpec.java
+++ b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/AdminAccessBuilderSpec.java
@@ -10,6 +10,8 @@
 
 import org.jclouds.javax.annotation.Nullable;
 
+import clojure.main;
+
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
 import com.google.common.base.Splitter;
@@ -64,6 +66,8 @@
 
 public class AdminAccessBuilderSpec {
 
+   private static final long serialVersionUID = -379469670373111569L;
+
    /** Parses a single value. */
    protected static interface ValueParser {
       void parse(AdminAccessBuilderSpec spec, String key, @Nullable String value);
diff --git a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/UserAdd.java b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/UserAdd.java
index b6a76b0..357a7a8 100644
--- a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/UserAdd.java
+++ b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/UserAdd.java
@@ -18,13 +18,16 @@
  */
 package org.jclouds.scriptbuilder.statements.login;
 
-import static com.google.common.base.Objects.equal;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-
-import javax.inject.Named;
-
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
 import org.jclouds.crypto.Sha512Crypt;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.scriptbuilder.domain.OsFamily;
@@ -34,25 +37,21 @@
 import org.jclouds.scriptbuilder.statements.ssh.AuthorizeRSAPublicKeys;
 import org.jclouds.scriptbuilder.statements.ssh.InstallRSAPrivateKey;
 
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.base.Objects;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
+import javax.inject.Named;
+import java.util.List;
+
+import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
- * Creates a statement that will add a given user to a machine ("login"), with optional 
+ * Creates a statement that will add a given user to a machine ("login"), with optional
  * password, groups, private key, and authorized keys.
  * <p>
  * This is supported on most *nix environments. Not currently supported on Windows.
  * <p>
  * Note that some places where this is used may have stricter requirements on the parameters
- * (for example {@link AdminAccess} requires password and keys).  
- * 
+ * (for example {@link AdminAccess} requires password and keys).
+ *
  * @author Adrian Cole
  */
 public class UserAdd implements Statement {
@@ -69,9 +68,10 @@
       private List<String> groups = Lists.newArrayList();
       private List<String> authorizeRSAPublicKeys = Lists.newArrayList();
       private String shell = "/bin/bash";
+      private String fullName;
 
       /**
-       * See --home in `man useradd`. 
+       * See --home in `man useradd`.
        */
       public UserAdd.Builder home(String home) {
          this.home = home;
@@ -79,7 +79,7 @@
       }
 
       /**
-       * See --base-dir in `man useradd`. 
+       * See --base-dir in `man useradd`.
        */
       public UserAdd.Builder defaultHome(String defaultHome) {
          this.defaultHome = defaultHome;
@@ -128,18 +128,22 @@
          return this;
       }
 
+      public UserAdd.Builder fullName(String fullName) {
+         this.fullName = fullName;
+         return this;
+      }
       public UserAdd build() {
-         return new UserAdd(login, groups, password, RSAPrivateKey, authorizeRSAPublicKeys, home, defaultHome, shell);
+         return new UserAdd(login, groups, password, RSAPrivateKey, authorizeRSAPublicKeys, home, defaultHome, shell, fullName);
       }
    }
 
    public UserAdd(String login, List<String> groups, @Nullable String password, @Nullable String installRSAPrivateKey,
          List<String> authorizeRSAPublicKeys, String defaultHome, String shell) {
-      this(login, groups, password, installRSAPrivateKey, authorizeRSAPublicKeys, null, defaultHome, shell);
+      this(login, groups, password, installRSAPrivateKey, authorizeRSAPublicKeys, null, defaultHome, shell, login);
    }
-   
+
    public UserAdd(String login, List<String> groups, @Nullable String password, @Nullable String installRSAPrivateKey,
-         List<String> authorizeRSAPublicKeys, @Nullable String home, String defaultHome, String shell) {
+         List<String> authorizeRSAPublicKeys, @Nullable String home, String defaultHome, String shell, String fullName) {
       this.login = checkNotNull(login, "login");
       this.password = password;
       this.groups = ImmutableList.copyOf(checkNotNull(groups, "groups"));
@@ -149,6 +153,7 @@
       this.home = home;
       this.defaultHome = checkNotNull(defaultHome, "defaultHome");
       this.shell = checkNotNull(shell, "shell");
+      this.fullName = fullName;
    }
 
    private final String home;
@@ -159,6 +164,7 @@
    private final String installRSAPrivateKey;
    private final List<String> authorizeRSAPublicKeys;
    private final String shell;
+   private final String fullName;
 
    private Function<String, String> cryptFunction = Sha512Crypt.function();
 
@@ -187,8 +193,13 @@
 
       ImmutableMap.Builder<String, String> userAddOptions = ImmutableMap.builder();
       // Include the username as the full name for now.
-      userAddOptions.put("-c", login);
-      
+
+      if (Strings.isNullOrEmpty(fullName)) {
+         userAddOptions.put("-c", login);
+      } else {
+         userAddOptions.put("-c", "'" + fullName + "'");
+      }
+
       userAddOptions.put("-s", shell);
       if (groups.size() > 0) {
          for (String group : groups)
diff --git a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/AdminAccessBuilderSpecTest.java b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/AdminAccessBuilderSpecTest.java
index cc60c91..d2c0f31 100644
--- a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/AdminAccessBuilderSpecTest.java
+++ b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/AdminAccessBuilderSpecTest.java
@@ -19,11 +19,13 @@
 
 package org.jclouds.scriptbuilder.statements.login;
 
+import static java.lang.String.format;
 import static org.jclouds.scriptbuilder.statements.login.AdminAccessBuilderSpec.parse;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.fail;
 
+import java.io.File;
 import java.lang.reflect.Field;
 
 import javax.inject.Provider;
@@ -104,7 +106,7 @@
 
    public void testParsePrivateKeyFile() {
       AdminAccessBuilderSpec spec = parse("adminPrivateKeyFile=target/test-classes/test");
-      assertEquals(spec.getAdminPrivateKeyFile().getPath(), "target/test-classes/test");
+      assertEquals(spec.getAdminPrivateKeyFile().getPath(), format("target%stest-classes%stest", File.separator, File.separator));
       assertNull(spec.adminHome);
       assertNull(spec.adminPassword);
       assertNull(spec.adminPublicKeyFile);
diff --git a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/AdminAccessTest.java b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/AdminAccessTest.java
index 5c95ed3..64d0fbe 100644
--- a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/AdminAccessTest.java
+++ b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/AdminAccessTest.java
@@ -52,15 +52,34 @@
       try {
          assertEquals(
                AdminAccess.builder().adminPassword("bar").adminPrivateKey("fooPrivateKey")
-                     .adminPublicKey("fooPublicKey").adminUsername("foo").adminHome("/over/ridden/foo").build()
+                     .adminPublicKey("fooPublicKey").adminUsername("foo")
+                     .adminHome("/over/ridden/foo").build()
                      .init(TestConfiguration.INSTANCE).render(OsFamily.UNIX), 
                      CharStreams.toString(Resources.newReaderSupplier(
                      Resources.getResource("test_adminaccess_params.sh"), Charsets.UTF_8)));
+
       } finally {
          TestConfiguration.INSTANCE.reset();
       }
    }
 
+   public void testWithParamsAndFullNameUNIX() throws IOException {
+      TestConfiguration.INSTANCE.reset();
+      try {
+         assertEquals(
+               AdminAccess.builder().adminPassword("bar").adminPrivateKey("fooPrivateKey")
+                     .adminPublicKey("fooPublicKey").adminUsername("foo").adminFullName("JClouds Foo")
+                     .adminHome("/over/ridden/foo").build()
+                     .init(TestConfiguration.INSTANCE).render(OsFamily.UNIX),
+               CharStreams.toString(Resources.newReaderSupplier(
+                     Resources.getResource("test_adminaccess_params_and_fullname.sh"), Charsets.UTF_8)));
+
+      } finally {
+         TestConfiguration.INSTANCE.reset();
+      }
+   }
+
+
    public void testOnlyInstallUserUNIX() throws IOException {
       TestConfiguration.INSTANCE.reset();
       try {
diff --git a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/UserAddTest.java b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/UserAddTest.java
index 27e2ac1..69b2c1b 100644
--- a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/UserAddTest.java
+++ b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/UserAddTest.java
@@ -36,6 +36,12 @@
                "mkdir -p /home/users\nuseradd -c me -s /bin/bash -m  -d /home/users/me me\nchown -R me /home/users/me\n");
    }
 
+   public void testWithFullNameUNIX() {
+      assertEquals(UserAdd.builder().login("me").fullName("JClouds Guy").build().render(OsFamily.UNIX),
+            "mkdir -p /home/users\nuseradd -c 'JClouds Guy' -s /bin/bash -m  -d /home/users/me me\nchown -R me /home/users/me\n");
+
+   }
+
    public void testWithBaseUNIX() {
       assertEquals(UserAdd.builder().login("me").defaultHome("/export/home").build().render(OsFamily.UNIX),
                "mkdir -p /export/home\nuseradd -c me -s /bin/bash -m  -d /export/home/me me\nchown -R me /export/home/me\n");
diff --git a/scriptbuilder/src/test/resources/test_adminaccess_params.sh b/scriptbuilder/src/test/resources/test_adminaccess_params.sh
index 123be32..f867d1f 100644
--- a/scriptbuilder/src/test/resources/test_adminaccess_params.sh
+++ b/scriptbuilder/src/test/resources/test_adminaccess_params.sh
@@ -5,7 +5,7 @@
 chmod 0440 /etc/sudoers
 mkdir -p /over/ridden
 groupadd -f wheel
-useradd -c foo -s /bin/bash -g wheel -m  -d /over/ridden/foo -p 'crypt(bar)' foo
+useradd -c 'foo' -s /bin/bash -g wheel -m  -d /over/ridden/foo -p 'crypt(bar)' foo
 mkdir -p /over/ridden/foo/.ssh
 cat >> /over/ridden/foo/.ssh/authorized_keys <<-'END_OF_JCLOUDS_FILE'
 	fooPublicKey
diff --git a/scriptbuilder/src/test/resources/test_adminaccess_params_and_fullname.sh b/scriptbuilder/src/test/resources/test_adminaccess_params_and_fullname.sh
new file mode 100644
index 0000000..e01028f
--- /dev/null
+++ b/scriptbuilder/src/test/resources/test_adminaccess_params_and_fullname.sh
@@ -0,0 +1,20 @@
+cat > /etc/sudoers <<-'END_OF_JCLOUDS_FILE'
+	root ALL = (ALL) ALL
+	%wheel ALL = (ALL) NOPASSWD:ALL
+END_OF_JCLOUDS_FILE
+chmod 0440 /etc/sudoers
+mkdir -p /over/ridden
+groupadd -f wheel
+useradd -c 'JClouds Foo' -s /bin/bash -g wheel -m  -d /over/ridden/foo -p 'crypt(bar)' foo
+mkdir -p /over/ridden/foo/.ssh
+cat >> /over/ridden/foo/.ssh/authorized_keys <<-'END_OF_JCLOUDS_FILE'
+	fooPublicKey
+END_OF_JCLOUDS_FILE
+chmod 600 /over/ridden/foo/.ssh/authorized_keys
+chown -R foo /over/ridden/foo
+exec 3<> /etc/ssh/sshd_config && awk -v TEXT="PasswordAuthentication no
+PermitRootLogin no
+" 'BEGIN {print TEXT}{print}' /etc/ssh/sshd_config >&3
+hash service 2>&- && service ssh reload 2>&- || /etc/init.d/ssh* reload
+awk -v user=^${SUDO_USER:=${USER}}: -v password='crypt(0)' 'BEGIN { FS=OFS=":" } $0 ~ user { $2 = password } 1' /etc/shadow >/etc/shadow.${SUDO_USER:=${USER}}
+test -f /etc/shadow.${SUDO_USER:=${USER}} && mv /etc/shadow.${SUDO_USER:=${USER}} /etc/shadow
diff --git a/scriptbuilder/src/test/resources/test_adminaccess_plainuser.sh b/scriptbuilder/src/test/resources/test_adminaccess_plainuser.sh
index f954fa8..3939006 100644
--- a/scriptbuilder/src/test/resources/test_adminaccess_plainuser.sh
+++ b/scriptbuilder/src/test/resources/test_adminaccess_plainuser.sh
@@ -1,5 +1,5 @@
 mkdir -p /home/users
-useradd -c defaultAdminUsername -s /bin/bash -m  -d /home/users/defaultAdminUsername -p 'crypt(0)' defaultAdminUsername
+useradd -c 'defaultAdminUsername' -s /bin/bash -m  -d /home/users/defaultAdminUsername -p 'crypt(0)' defaultAdminUsername
 mkdir -p /home/users/defaultAdminUsername/.ssh
 cat >> /home/users/defaultAdminUsername/.ssh/authorized_keys <<-'END_OF_JCLOUDS_FILE'
 	publicKey
diff --git a/scriptbuilder/src/test/resources/test_adminaccess_standard.sh b/scriptbuilder/src/test/resources/test_adminaccess_standard.sh
index 5430a4e..34319c6 100644
--- a/scriptbuilder/src/test/resources/test_adminaccess_standard.sh
+++ b/scriptbuilder/src/test/resources/test_adminaccess_standard.sh
@@ -5,7 +5,7 @@
 chmod 0440 /etc/sudoers
 mkdir -p /home/users
 groupadd -f wheel
-useradd -c defaultAdminUsername -s /bin/bash -g wheel -m  -d /home/users/defaultAdminUsername -p 'crypt(0)' defaultAdminUsername
+useradd -c 'defaultAdminUsername' -s /bin/bash -g wheel -m  -d /home/users/defaultAdminUsername -p 'crypt(0)' defaultAdminUsername
 mkdir -p /home/users/defaultAdminUsername/.ssh
 cat >> /home/users/defaultAdminUsername/.ssh/authorized_keys <<-'END_OF_JCLOUDS_FILE'
 	publicKey
