You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by de...@apache.org on 2016/02/19 16:33:20 UTC

[10/35] jclouds git commit: JCLOUDS-702: JClouds ProfitBricks provider - Storage API

JCLOUDS-702: JClouds ProfitBricks provider - Storage API


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/2a219a99
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/2a219a99
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/2a219a99

Branch: refs/heads/master
Commit: 2a219a994869ebf6012371d4188f23bbdebd3bcf
Parents: ee24ddb
Author: Reijhanniel Jearl Campos <de...@gmail.com>
Authored: Thu Feb 5 21:45:03 2015 +0800
Committer: Ignasi Barrera <na...@apache.org>
Committed: Thu Feb 5 14:53:10 2015 +0100

----------------------------------------------------------------------
 .../jclouds/profitbricks/ProfitBricksApi.java   |   4 +
 .../profitbricks/ProfitBricksApiMetadata.java   |  30 +-
 .../ProfitBricksProviderMetadata.java           |  18 +-
 .../binder/BaseProfitBricksRequestBinder.java   |   6 +-
 .../CreateDataCenterRequestBinder.java          |  10 +-
 .../server/CreateServerRequestBinder.java       |  46 +--
 .../server/UpdateServerRequestBinder.java       |  42 +--
 .../ConnectStorageToServerRequestBinder.java    |  45 +++
 .../storage/CreateStorageRequestBinder.java     |  46 +++
 .../storage/UpdateStorageRequestBinder.java     |  47 +++
 .../internal/ProvisioningStatusAware.java       |   2 +-
 .../ProvisioningStatusPollingPredicate.java     |   9 +-
 .../config/ProfitBricksHttpApiModule.java       |   8 +-
 .../profitbricks/domain/AvailabilityZone.java   |   6 +-
 .../jclouds/profitbricks/domain/DataCenter.java |  94 +++--
 .../jclouds/profitbricks/domain/Location.java   |   8 +-
 .../profitbricks/domain/ProvisioningState.java  |   4 +-
 .../org/jclouds/profitbricks/domain/Server.java | 160 +++++----
 .../profitbricks/domain/ServiceFault.java       |  28 +-
 .../jclouds/profitbricks/domain/Storage.java    | 355 +++++++++++++++++++
 .../profitbricks/features/DataCenterApi.java    |  12 +-
 .../profitbricks/features/ServerApi.java        |  74 ++--
 .../profitbricks/features/StorageApi.java       | 136 +++++++
 .../handlers/ProfitBricksHttpErrorHandler.java  |  53 +--
 ...usFromPayloadHttpCommandExecutorService.java |  94 +++--
 .../ProfitBricksSoapMessageEnvelope.java        |   6 +-
 .../parser/BaseProfitBricksResponseHandler.java |  21 +-
 .../parser/RequestIdOnlyResponseHandler.java    |  14 +-
 .../parser/ServiceFaultResponseHandler.java     |  19 +-
 .../BaseDataCenterResponseHandler.java          |  11 +-
 .../DataCenterInfoResponseHandler.java          |  74 +++-
 .../DataCenterListResponseHandler.java          |  16 +-
 .../parser/image/BaseImageResponseHandler.java  |   7 +-
 .../parser/image/ImageInfoResponseHandler.java  |   6 +-
 .../parser/image/ImageListResponseHandler.java  |   8 +-
 .../server/BaseServerResponseHandler.java       |  85 +++--
 .../server/ServerIdOnlyResponseHandler.java     |  14 +-
 .../server/ServerInfoResponseHandler.java       |  12 +-
 .../server/ServerListResponseHandler.java       |  12 +-
 .../GetProvisioningStateResponseHandler.java    |   9 +-
 .../storage/BaseStorageResponseHandler.java     |  83 +++++
 .../storage/StorageIdOnlyResponseHandler.java   |  46 +++
 .../storage/StorageInfoResponseHandler.java     |  50 +++
 .../storage/StorageListResponseHandler.java     |  54 +++
 .../profitbricks/BaseProfitBricksLiveTest.java  |   4 +-
 .../CreateDataCenterRequestBinderTest.java      |  12 +-
 .../UpdateDataCenterRequestBinderTest.java      |  12 +-
 .../server/CreateServerRequestBinderTest.java   |  46 +--
 .../server/UpdateServerRequestBinderTest.java   |  40 +--
 ...ConnectStorageToServerRequestBinderTest.java |  55 +++
 .../storage/CreateStorageRequestBinderTest.java |  56 +++
 .../storage/UpdateStorageRequestBinderTest.java |  53 +++
 .../ProvisioningStatusPollingPredicateTest.java |  68 +++-
 .../profitbricks/domain/ServerBuilderTest.java  | 190 +++++-----
 .../features/DataCenterApiMockTest.java         |  19 +-
 .../profitbricks/features/ImageApiMockTest.java |   2 +-
 .../features/ServerApiLiveTest.java             |  90 ++---
 .../features/ServerApiMockTest.java             | 209 ++++++-----
 .../features/StorageApiLiveTest.java            | 167 +++++++++
 .../features/StorageApiMockTest.java            | 285 +++++++++++++++
 ...omPayloadHttpCommandExecutorServiceTest.java |  45 +++
 .../ProfitBricksSoapMessageEnvelopeTest.java    |   6 +-
 .../http/parser/BaseResponseHandlerTest.java    |   4 +-
 .../RequestIdOnlyResponseHandlerTest.java       |  24 +-
 .../parser/ServiceFaultResponseHandlerTest.java |  10 +-
 .../DataCenterInfoResponseHandlerTest.java      |  61 +++-
 .../DataCenterListResponseHandlerTest.java      |   4 +-
 .../image/ImageInfoResponseHandlerTest.java     |  44 +--
 .../image/ImageListResponseHandlerTest.java     | 248 ++++++-------
 .../server/ServerIdOnlyResponseHandlerTest.java |   8 +-
 .../server/ServerInfoResponseHandlerTest.java   |  55 +--
 .../server/ServerListResponseHandlerTest.java   |  80 ++---
 ...GetProvisioningStateResponseHandlerTest.java | 114 +++---
 .../StorageIdOnlyResponseHandlerTest.java       |  42 +++
 .../storage/StorageInfoResponseHandlerTest.java |  66 ++++
 .../storage/StorageListResponseHandlerTest.java |  80 +++++
 .../internal/BaseProfitBricksMockTest.java      |  24 +-
 .../test/resources/datacenter/datacenter.xml    |   2 +-
 .../src/test/resources/fault-404.xml            |   2 +-
 .../src/test/resources/fault-413.xml            |  17 +
 .../src/test/resources/maintenance-503.html     |  67 ++++
 .../resources/server/server-state-inprocess.xml |  28 ++
 .../test/resources/storage/storage-connect.xml  |  13 +
 .../test/resources/storage/storage-create.xml   |  14 +
 .../test/resources/storage/storage-delete.xml   |  13 +
 .../resources/storage/storage-disconnect.xml    |  13 +
 .../storage/storage-state-inprocess.xml         |  23 ++
 .../test/resources/storage/storage-update.xml   |  13 +
 .../src/test/resources/storage/storage.xml      |  23 ++
 .../src/test/resources/storage/storages.xml     |  37 ++
 90 files changed, 3279 insertions(+), 1093 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
index 7ab121a..4cfe6e8 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
@@ -21,6 +21,7 @@ import java.io.Closeable;
 import org.jclouds.profitbricks.features.DataCenterApi;
 import org.jclouds.profitbricks.features.ImageApi;
 import org.jclouds.profitbricks.features.ServerApi;
+import org.jclouds.profitbricks.features.StorageApi;
 import org.jclouds.rest.annotations.Delegate;
 
 public interface ProfitBricksApi extends Closeable {
@@ -33,4 +34,7 @@ public interface ProfitBricksApi extends Closeable {
 
    @Delegate
    ServerApi serverApi();
+
+   @Delegate
+   StorageApi storageApi();
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
index f51dc5b..205b246 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
@@ -53,29 +53,29 @@ public class ProfitBricksApiMetadata extends BaseHttpApiMetadata<ProfitBricksApi
    public static class Builder extends BaseHttpApiMetadata.Builder<ProfitBricksApi, Builder> {
 
       protected Builder() {
-	 id("profitbricks")
-		 .name("ProfitBricks API")
-		 .identityName("API Username")
-		 .credentialName("API Password")
-		 .documentation(URI.create("https://www.profitbricks.com/sites/default/files/profitbricks_api_1_3.pdf"))
-		 .defaultEndpoint("https://api.profitbricks.com/1.3")
-		 .version("1.3")
-		 // .view(ComputeServiceContext.class)
-		 .defaultProperties(ProfitBricksApiMetadata.defaultProperties())
-		 .defaultModules(ImmutableSet.<Class<? extends Module>>of(
-				 ProfitBricksHttpApiModule.class,
-				 ProfitBricksHttpCommandExecutorServiceModule.class
-			 ));
+         id("profitbricks")
+                 .name("ProfitBricks API")
+                 .identityName("API Username")
+                 .credentialName("API Password")
+                 .documentation(URI.create("https://www.profitbricks.com/sites/default/files/profitbricks_api_1_3.pdf"))
+                 .defaultEndpoint("https://api.profitbricks.com/1.3")
+                 .version("1.3")
+                 // .view(ComputeServiceContext.class)
+                 .defaultProperties(ProfitBricksApiMetadata.defaultProperties())
+                 .defaultModules(ImmutableSet.<Class<? extends Module>>of(
+                                 ProfitBricksHttpApiModule.class,
+                                 ProfitBricksHttpCommandExecutorServiceModule.class
+                         ));
       }
 
       @Override
       public ProfitBricksApiMetadata build() {
-	 return new ProfitBricksApiMetadata(this);
+         return new ProfitBricksApiMetadata(this);
       }
 
       @Override
       protected Builder self() {
-	 return this;
+         return this;
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
index d66ed15..9ecfbc1 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
@@ -44,23 +44,23 @@ public class ProfitBricksProviderMetadata extends BaseProviderMetadata {
    public static class Builder extends BaseProviderMetadata.Builder {
 
       protected Builder() {
-	 id("profitbricks")
-		 .name("ProfitBricks Cloud Compute 2.0")
-		 .homepage(URI.create("http://www.profitbricks.com"))
-		 .console(URI.create("https://my.profitbricks.com/dashboard/dcdr2/"))
-		 .linkedServices("profitbricks")
-		 .apiMetadata(new ProfitBricksApiMetadata());
+         id("profitbricks")
+                 .name("ProfitBricks Cloud Compute 2.0")
+                 .homepage(URI.create("http://www.profitbricks.com"))
+                 .console(URI.create("https://my.profitbricks.com/dashboard/dcdr2/"))
+                 .linkedServices("profitbricks")
+                 .apiMetadata(new ProfitBricksApiMetadata());
       }
 
       @Override
       public ProfitBricksProviderMetadata build() {
-	 return new ProfitBricksProviderMetadata(this);
+         return new ProfitBricksProviderMetadata(this);
       }
 
       @Override
       public Builder fromProviderMetadata(ProviderMetadata in) {
-	 super.fromProviderMetadata(in);
-	 return this;
+         super.fromProviderMetadata(in);
+         return this;
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
index 8c2d36b..2b842ff 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
@@ -55,11 +55,11 @@ public abstract class BaseProfitBricksRequestBinder<T> implements MapBinder {
 
    protected abstract String createPayload(T payload);
 
-   protected String formatIfNotEmpty(String pattern, Object param) {
-      return Strings.isNullOrEmpty(nullableToString( param )) ? "" : String.format(pattern, param);
+   protected static String formatIfNotEmpty(String pattern, Object param) {
+      return Strings.isNullOrEmpty(nullableToString(param)) ? "" : String.format(pattern, param);
    }
 
-   protected String nullableToString(Object object) {
+   protected static String nullableToString(Object object) {
       return object == null ? "" : object.toString();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
index 8696c0e..8a07b0a 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
@@ -33,11 +33,11 @@ public class CreateDataCenterRequestBinder extends BaseProfitBricksRequestBinder
    @Override
    protected String createPayload(DataCenter.Request.CreatePayload payload) {
       requestBuilder.append("<ws:createDataCenter>")
-	      .append("<request>")
-	      .append(format("<dataCenterName>%s</dataCenterName>", payload.name()))
-	      .append(format("<location>%s</location>", payload.location().value()))
-	      .append("</request>")
-	      .append("</ws:createDataCenter>");
+              .append("<request>")
+              .append(format("<dataCenterName>%s</dataCenterName>", payload.name()))
+              .append(format("<location>%s</location>", payload.location().value()))
+              .append("</request>")
+              .append("</ws:createDataCenter>");
       return requestBuilder.toString();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
index 4acf33b..b836ceb 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
@@ -25,32 +25,32 @@ public class CreateServerRequestBinder extends BaseProfitBricksRequestBinder<Ser
    protected final StringBuilder requestBuilder;
 
    CreateServerRequestBinder() {
-      super( "server" );
-      this.requestBuilder = new StringBuilder( 128 * 4 );
+      super("server");
+      this.requestBuilder = new StringBuilder(128 * 4);
    }
 
    @Override
-   protected String createPayload( Server.Request.CreatePayload payload ) {
-      requestBuilder.append( "<ws:createServer>" )
-              .append( "<request>" )
-              .append( format( "<dataCenterId>%s</dataCenterId>", payload.dataCenterId() ) )
-              .append( format( "<cores>%s</cores>", payload.cores() ) )
-              .append( format( "<ram>%s</ram>", payload.ram() ) )
-              .append( formatIfNotEmpty( "<serverName>%s</serverName>", payload.name() ) )
-              .append( formatIfNotEmpty( "<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId() ) )
-              .append( formatIfNotEmpty( "<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId() ) )
-              .append( formatIfNotEmpty( "<internetAccess>%s</internetAccess>", payload.hasInternetAccess() ) )
-              .append( formatIfNotEmpty( "<lanId>%s</lanId>", payload.lanId() ) )
-              .append( formatIfNotEmpty( "<osType>%s</osType>", payload.osType() ) )
-              .append( formatIfNotEmpty( "<availabilityZone>%s</availabilityZone>", payload.availabilityZone() ) )
-              .append( formatIfNotEmpty( "<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug() ) )
-              .append( formatIfNotEmpty( "<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug() ) )
-              .append( formatIfNotEmpty( "<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug() ) )
-              .append( formatIfNotEmpty( "<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug() ) )
-              .append( formatIfNotEmpty( "<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug() ) )
-              .append( formatIfNotEmpty( "<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug() ) )
-              .append( "</request>" )
-              .append( "</ws:createServer>" );
+   protected String createPayload(Server.Request.CreatePayload payload) {
+      requestBuilder.append("<ws:createServer>")
+              .append("<request>")
+              .append(format("<dataCenterId>%s</dataCenterId>", payload.dataCenterId()))
+              .append(format("<cores>%s</cores>", payload.cores()))
+              .append(format("<ram>%s</ram>", payload.ram()))
+              .append(formatIfNotEmpty("<serverName>%s</serverName>", payload.name()))
+              .append(formatIfNotEmpty("<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId()))
+              .append(formatIfNotEmpty("<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId()))
+              .append(formatIfNotEmpty("<internetAccess>%s</internetAccess>", payload.hasInternetAccess()))
+              .append(formatIfNotEmpty("<lanId>%s</lanId>", payload.lanId()))
+              .append(formatIfNotEmpty("<osType>%s</osType>", payload.osType()))
+              .append(formatIfNotEmpty("<availabilityZone>%s</availabilityZone>", payload.availabilityZone()))
+              .append(formatIfNotEmpty("<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug()))
+              .append(formatIfNotEmpty("<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug()))
+              .append(formatIfNotEmpty("<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug()))
+              .append(formatIfNotEmpty("<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug()))
+              .append(formatIfNotEmpty("<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug()))
+              .append(formatIfNotEmpty("<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug()))
+              .append("</request>")
+              .append("</ws:createServer>");
       return requestBuilder.toString();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
index d051b88..c12ae21 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
@@ -25,31 +25,31 @@ public class UpdateServerRequestBinder extends BaseProfitBricksRequestBinder<Ser
    protected final StringBuilder requestBuilder;
 
    UpdateServerRequestBinder() {
-      super( "server" );
-      this.requestBuilder = new StringBuilder( 128 * 4 );
+      super("server");
+      this.requestBuilder = new StringBuilder(128 * 4);
 
    }
 
    @Override
-   protected String createPayload( Server.Request.UpdatePayload payload ) {
-      requestBuilder.append( "<ws:updateServer>" )
-              .append( "<request>" )
-              .append( format( "<serverId>%s</serverId>", payload.id() ) )
-              .append( format( "<cores>%s</cores>", payload.cores() ) )
-              .append( format( "<ram>%s</ram>", payload.ram() ) )
-              .append( formatIfNotEmpty( "<serverName>%s</serverName>", payload.name() ) )
-              .append( formatIfNotEmpty( "<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId() ) )
-              .append( formatIfNotEmpty( "<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId() ) )
-              .append( formatIfNotEmpty( "<osType>%s</osType>", payload.osType() ) )
-              .append( formatIfNotEmpty( "<availabilityZone>%s</availabilityZone>", payload.availabilityZone() ) )
-              .append( formatIfNotEmpty( "<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug() ) )
-              .append( formatIfNotEmpty( "<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug() ) )
-              .append( formatIfNotEmpty( "<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug() ) )
-              .append( formatIfNotEmpty( "<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug() ) )
-              .append( formatIfNotEmpty( "<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug() ) )
-              .append( formatIfNotEmpty( "<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug() ) )
-              .append( "</request>" )
-              .append( "</ws:updateServer>" );
+   protected String createPayload(Server.Request.UpdatePayload payload) {
+      requestBuilder.append("<ws:updateServer>")
+              .append("<request>")
+              .append(format("<serverId>%s</serverId>", payload.id()))
+              .append(format("<cores>%s</cores>", payload.cores()))
+              .append(format("<ram>%s</ram>", payload.ram()))
+              .append(formatIfNotEmpty("<serverName>%s</serverName>", payload.name()))
+              .append(formatIfNotEmpty("<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId()))
+              .append(formatIfNotEmpty("<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId()))
+              .append(formatIfNotEmpty("<osType>%s</osType>", payload.osType()))
+              .append(formatIfNotEmpty("<availabilityZone>%s</availabilityZone>", payload.availabilityZone()))
+              .append(formatIfNotEmpty("<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug()))
+              .append(formatIfNotEmpty("<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug()))
+              .append(formatIfNotEmpty("<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug()))
+              .append(formatIfNotEmpty("<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug()))
+              .append(formatIfNotEmpty("<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug()))
+              .append(formatIfNotEmpty("<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug()))
+              .append("</request>")
+              .append("</ws:updateServer>");
       return requestBuilder.toString();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java
new file mode 100644
index 0000000..2c2e08d
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.binder.storage;
+
+import static java.lang.String.format;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Storage;
+
+public class ConnectStorageToServerRequestBinder extends BaseProfitBricksRequestBinder<Storage.Request.ConnectPayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   ConnectStorageToServerRequestBinder() {
+      super("storage");
+      this.requestBuilder = new StringBuilder(128 * 2);
+   }
+
+   @Override
+   protected String createPayload(Storage.Request.ConnectPayload payload) {
+      requestBuilder.append("<ws:connectStorageToServer>")
+              .append("<request>")
+              .append(format("<storageId>%s</storageId>", payload.storageId()))
+              .append(format("<serverId>%s</serverId>", payload.serverId()))
+              .append(formatIfNotEmpty("<busType>%s</busType>", payload.busType()))
+              .append(formatIfNotEmpty("<deviceNumber>%s</deviceNumber>", payload.deviceNumber()))
+              .append("</request>")
+              .append("</ws:connectStorageToServer>");
+      return requestBuilder.toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
new file mode 100644
index 0000000..acfb6f3
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.binder.storage;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Storage;
+
+public class CreateStorageRequestBinder extends BaseProfitBricksRequestBinder<Storage.Request.CreatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   CreateStorageRequestBinder() {
+      super("storage");
+      this.requestBuilder = new StringBuilder(128 * 2);
+   }
+
+   @Override
+   protected String createPayload(Storage.Request.CreatePayload payload) {
+      requestBuilder.append("<ws:createStorage>")
+              .append("<request>")
+              .append(format("<dataCenterId>%s</dataCenterId>", payload.dataCenterId()))
+              .append(formatIfNotEmpty("<storageName>%s</storageName>", payload.name()))
+              .append(format("<size>%.0f</size>", payload.size()))
+              .append(formatIfNotEmpty("<mountImageId>%s</mountImageId>", payload.mountImageId()))
+              .append(formatIfNotEmpty("<profitBricksImagePassword>%s</profitBricksImagePassword>", payload.profitBricksImagePassword()))
+              .append("</request>")
+              .append("</ws:createStorage>");
+      return requestBuilder.toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java
new file mode 100644
index 0000000..9a80b83
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.binder.storage;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Storage;
+
+public class UpdateStorageRequestBinder extends BaseProfitBricksRequestBinder<Storage.Request.UpdatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   UpdateStorageRequestBinder() {
+      super("storage");
+      this.requestBuilder = new StringBuilder(128 * 2);
+   }
+
+   @Override
+   protected String createPayload(Storage.Request.UpdatePayload payload) {
+      requestBuilder
+              .append("<ws:updateStorage>")
+              .append("<request>")
+              .append(format("<storageId>%s</storageId>", payload.id()))
+              .append(formatIfNotEmpty("<size>%.0f</size>", payload.size()))
+              .append(formatIfNotEmpty("<storageName>%s</storageName>", payload.name()))
+              .append(formatIfNotEmpty("<mountImageId>%s</mountImageId>", payload.mountImageId()))
+              .append("</request>")
+              .append("</ws:updateStorage>");
+
+      return requestBuilder.toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
index 5056243..f573eb0 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
@@ -23,5 +23,5 @@ package org.jclouds.profitbricks.compute.internal;
  */
 public enum ProvisioningStatusAware {
 
-   DATACENTER, SERVER;
+   DATACENTER, SERVER, STORAGE;
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
index 73db33f..8a8a787 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
@@ -26,9 +26,8 @@ import com.google.common.base.Predicate;
 /**
  * A custom predicate for waiting until a virtual resource satisfies the given expected status
  * <p>
- * Performing api requests on a datacenter that is not {@link ProvisioningState#AVAILABLE} is not allowed. On some
- * cases, the API user gets blocked from further requests, and will then need to contact tech support for api lock
- * release.
+ * Performing api requests on a datacenter that is not {@link ProvisioningState#AVAILABLE} is not allowed. On some cases, the API user gets
+ * blocked from further requests, and will then need to contact tech support for api lock release.
  */
 public class ProvisioningStatusPollingPredicate implements Predicate<String> {
 
@@ -49,7 +48,9 @@ public class ProvisioningStatusPollingPredicate implements Predicate<String> {
          case DATACENTER:
             return expect == api.dataCenterApi().getDataCenterState(input);
          case SERVER:
-            return expect == api.serverApi().getServer( input ).state();
+            return expect == api.serverApi().getServer(input).state();
+         case STORAGE:
+            return expect == api.storageApi().getStorage(input).state();
          default:
             throw new IllegalArgumentException("Unknown domain '" + domain + "'");
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
index 57728be..f95b1b3 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
@@ -55,14 +55,14 @@ public class ProfitBricksHttpApiModule extends HttpApiModule<ProfitBricksApi> {
 
       @Override
       protected void configure() {
-	 install(new SSLModule());
-	 bind(HttpCommandExecutorService.class).to(ResponseStatusFromPayloadHttpCommandExecutorService.class)
-		 .in(Scopes.SINGLETON);
+         install(new SSLModule());
+         bind(HttpCommandExecutorService.class).to(ResponseStatusFromPayloadHttpCommandExecutorService.class)
+                 .in(Scopes.SINGLETON);
       }
 
       @Provides
       public ParseSax<ServiceFault> serviceFaultParser(ParseSax.Factory factory, Injector injector) {
-	 return factory.create(injector.getInstance(ServiceFaultResponseHandler.class));
+         return factory.create(injector.getInstance(ServiceFaultResponseHandler.class));
       }
 
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
index b582d69..97cac69 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
@@ -24,10 +24,10 @@ public enum AvailabilityZone {
       return name();
    }
 
-   public static AvailabilityZone fromValue( String v ) {
+   public static AvailabilityZone fromValue(String v) {
       try {
-         return valueOf( v );
-      } catch ( Exception ex ) {
+         return valueOf(v);
+      } catch (Exception ex) {
          return UNRECOGNIZED;
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
index d5f9893..a24d84b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
@@ -19,30 +19,43 @@ package org.jclouds.profitbricks.domain;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Strings.isNullOrEmpty;
 
+import java.util.List;
 import java.util.regex.Pattern;
 
 import org.jclouds.javax.annotation.Nullable;
 
 import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 
 @AutoValue
 public abstract class DataCenter {
 
    public abstract String id();
 
-   @Nullable public abstract String name();
+   @Nullable
+   public abstract String name();
 
    public abstract int version();
 
-   @Nullable public abstract ProvisioningState state();
+   @Nullable
+   public abstract ProvisioningState state();
 
-   @Nullable public abstract Location location();
+   @Nullable
+   public abstract Location location();
 
-//   @Nullable public abstract List<Server> servers();
-//   @Nullable public abstract List<Storage> storages();
+   @Nullable
+   public abstract List<Server> servers();
+
+   @Nullable
+   public abstract List<Storage> storages();
 //   @Nullable public abstract List<LoadBalancer> loadBalancers();
-   public static DataCenter create(String id, String name, int version, ProvisioningState state, Location location) {
-      return new AutoValue_DataCenter(id, name, version, state, location);
+
+   public static DataCenter create(String id, String name, int version, ProvisioningState state, Location location, List<Server> servers,
+           List<Storage> storages) {
+      return new AutoValue_DataCenter(id, name, version, state, location,
+              servers != null ? ImmutableList.copyOf(servers) : Lists.<Server>newArrayList(),
+              storages != null ? ImmutableList.copyOf(storages) : Lists.<Storage>newArrayList());
    }
 
    public static Builder builder() {
@@ -60,76 +73,87 @@ public abstract class DataCenter {
       private ProvisioningState state;
       private Location location;
       private int version;
-//      private List<Server> servers;
-//      private List<Storage> storage;
+      private List<Server> servers;
+      private List<Storage> storages;
 //      private List<LoadBalancer> loadBalancer;
 
       public Builder id(String id) {
-	 this.id = id;
-	 return this;
+         this.id = id;
+         return this;
       }
 
       public Builder name(String name) {
-	 this.name = name;
-	 return this;
+         this.name = name;
+         return this;
       }
 
       public Builder state(ProvisioningState state) {
-	 this.state = state;
-	 return this;
+         this.state = state;
+         return this;
       }
 
       public Builder location(Location location) {
-	 this.location = location;
-	 return this;
+         this.location = location;
+         return this;
       }
 
       public Builder version(int version) {
-	 this.version = version;
-	 return this;
+         this.version = version;
+         return this;
+      }
+
+      public Builder servers(List<Server> servers) {
+         this.servers = servers;
+         return this;
+      }
+
+      public Builder storages(List<Storage> storages) {
+         this.storages = storages;
+         return this;
       }
 
       public DataCenter build() {
-	 return DataCenter.create(id, name, version, state, location);
+         return DataCenter.create(id, name, version, state, location, servers, storages);
       }
 
       public Builder fromDataCenter(DataCenter in) {
-	 return this.id(in.id()).name(in.name()).version(in.version()).state(in.state()).location(in.location());
+         return this.id(in.id()).name(in.name()).version(in.version()).state(in.state()).location(in.location()).servers(in.servers())
+                 .storages(in.storages());
       }
    }
 
    public static final class Request {
-      
+
       @AutoValue
       public abstract static class CreatePayload {
 
-	 public abstract String name();
+         public abstract String name();
 
-	 public abstract Location location();
+         public abstract Location location();
 
-	 public static CreatePayload create(String name, Location location) {
+         public static CreatePayload create(String name, Location location) {
             checkInvalidChars(name);
-	    return new AutoValue_DataCenter_Request_CreatePayload(name, location);
-	 }
+            return new AutoValue_DataCenter_Request_CreatePayload(name, location);
+         }
 
       }
 
       @AutoValue
       public abstract static class UpdatePayload {
 
-	 public abstract String id();
+         public abstract String id();
 
-	 public abstract String name();
+         public abstract String name();
 
-	 public static UpdatePayload create(String id, String name) {
+         public static UpdatePayload create(String id, String name) {
             checkInvalidChars(name);
-	    return new AutoValue_DataCenter_Request_UpdatePayload(id, name);
-	 }
+            return new AutoValue_DataCenter_Request_UpdatePayload(id, name);
+         }
       }
-      
+
       private static final Pattern INVALID_CHARS = Pattern.compile("^.*[@/\\|'`’^].*$");
-      
-      private static void checkInvalidChars(String name){
+
+      private static void checkInvalidChars(String name) {
          checkArgument(!isNullOrEmpty(name), "Name is required.");
          checkArgument(!INVALID_CHARS.matcher(name).matches(), "Name must not contain any of: @ / \\ | ' ` ’ ^");
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
index 969629a..0354bf4 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
@@ -35,16 +35,16 @@ public enum Location {
 
    public static Location fromValue(String v) {
       try {
-	 return valueOf(v);
+         return valueOf(v);
       } catch (IllegalArgumentException ex) {
-	 return UNRECOGNIZED;
+         return UNRECOGNIZED;
       }
    }
 
    public static Location fromId(String id) {
       for (Location location : values())
-	 if (location.id.equals(id))
-	    return location;
+         if (location.id.equals(id))
+            return location;
       return UNRECOGNIZED;
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
index 2a9e0b6..833e979 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
@@ -22,9 +22,9 @@ public enum ProvisioningState {
 
    public static ProvisioningState fromValue(String value) {
       try {
-	 return valueOf(value);
+         return valueOf(value);
       } catch (IllegalArgumentException e) {
-	 return UNRECOGNIZED;
+         return UNRECOGNIZED;
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
index 703eb59..6149cfd 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
@@ -17,12 +17,20 @@
 package org.jclouds.profitbricks.domain;
 
 import org.jclouds.profitbricks.domain.internal.ServerCommonProperties;
+
 import com.google.auto.value.AutoValue;
+
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+
 import java.util.Date;
+import java.util.List;
+
 import org.jclouds.javax.annotation.Nullable;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+
 @AutoValue
 public abstract class Server implements ServerCommonProperties {
 
@@ -34,10 +42,10 @@ public abstract class Server implements ServerCommonProperties {
          return name();
       }
 
-      public static Status fromValue( String v ) {
+      public static Status fromValue(String v) {
          try {
-            return valueOf( v );
-         } catch ( IllegalArgumentException ex ) {
+            return valueOf(v);
+         } catch (IllegalArgumentException ex) {
             return UNRECOGNIZED;
          }
       }
@@ -70,13 +78,17 @@ public abstract class Server implements ServerCommonProperties {
    @Nullable
    public abstract Date lastModificationTime();
 
-//   public abstract List<Storage> storages();
-//   public abstract List<Nic> storages();
-   public static Server create( String id, String name, int cores, int ram, Boolean hasInternetAccess, ProvisioningState state,
-           Status status, OsType osType, AvailabilityZone availabilityZone, Date creationTime, Date lastModificationTime, Boolean isCpuHotPlug,
-           Boolean isRamHotPlug, Boolean isNicHotPlug, Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
-      return new AutoValue_Server( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug,
-              cores, ram, id, name, hasInternetAccess, state, status, osType, availabilityZone, creationTime, lastModificationTime );
+   @Nullable
+   public abstract List<Storage> storages();
+
+//   public abstract List<Nic> nics();
+   public static Server create(String id, String name, int cores, int ram, Boolean hasInternetAccess, ProvisioningState state,
+           Status status, OsType osType, AvailabilityZone availabilityZone, Date creationTime, Date lastModificationTime,
+           List<Storage> storages, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug, Boolean isNicHotUnPlug,
+           Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
+      return new AutoValue_Server(isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug,
+              cores, ram, id, name, hasInternetAccess, state, status, osType, availabilityZone, creationTime, lastModificationTime,
+              storages != null ? ImmutableList.copyOf(storages) : Lists.<Storage>newArrayList());
 
    }
 
@@ -85,7 +97,7 @@ public abstract class Server implements ServerCommonProperties {
    }
 
    public DescribingBuilder toBuilder() {
-      return builder().fromServer( this );
+      return builder().fromServer(this);
    }
 
    public abstract static class Builder<B extends Builder, D extends ServerCommonProperties> {
@@ -100,48 +112,48 @@ public abstract class Server implements ServerCommonProperties {
       protected Boolean discVirtioHotPlug;
       protected Boolean discVirtioHotUnPlug;
 
-      public B name( String name ) {
+      public B name(String name) {
          this.name = name;
          return self();
       }
 
-      public B cores( int cores ) {
+      public B cores(int cores) {
          this.cores = cores;
          return self();
       }
 
-      public B ram( int ram ) {
+      public B ram(int ram) {
          this.ram = ram;
          return self();
       }
 
-      public B isCpuHotPlug( Boolean cpuHotPlug ) {
+      public B isCpuHotPlug(Boolean cpuHotPlug) {
          this.cpuHotPlug = cpuHotPlug;
          return self();
       }
 
-      public B isRamHotPlug( Boolean ramHotPlug ) {
+      public B isRamHotPlug(Boolean ramHotPlug) {
          this.ramHotPlug = ramHotPlug;
          return self();
 
       }
 
-      public B isNicHotPlug( Boolean nicHotPlug ) {
+      public B isNicHotPlug(Boolean nicHotPlug) {
          this.nicHotPlug = nicHotPlug;
          return self();
       }
 
-      public B isNicHotUnPlug( Boolean nicHotUnPlug ) {
+      public B isNicHotUnPlug(Boolean nicHotUnPlug) {
          this.nicHotUnPlug = nicHotUnPlug;
          return self();
       }
 
-      public B isDiscVirtioHotPlug( Boolean discVirtioHotPlug ) {
+      public B isDiscVirtioHotPlug(Boolean discVirtioHotPlug) {
          this.discVirtioHotPlug = discVirtioHotPlug;
          return self();
       }
 
-      public B isDiscVirtioHotUnPlug( Boolean discVirtioHotUnPlug ) {
+      public B isDiscVirtioHotUnPlug(Boolean discVirtioHotUnPlug) {
          this.discVirtioHotUnPlug = discVirtioHotUnPlug;
          return self();
       }
@@ -161,59 +173,65 @@ public abstract class Server implements ServerCommonProperties {
       private Date creationTime;
       private Date lastModificationTime;
       private Boolean hasInternetAccess;
+      private List<Storage> storages;
 
-      public DescribingBuilder id( String id ) {
+      public DescribingBuilder id(String id) {
          this.id = id;
          return this;
       }
 
-      public DescribingBuilder state( ProvisioningState state ) {
+      public DescribingBuilder state(ProvisioningState state) {
          this.state = state;
          return this;
       }
 
-      public DescribingBuilder status( Status status ) {
+      public DescribingBuilder status(Status status) {
          this.status = status;
          return this;
       }
 
-      public DescribingBuilder osType( OsType osType ) {
+      public DescribingBuilder osType(OsType osType) {
          this.osType = osType;
          return this;
       }
 
-      public DescribingBuilder availabilityZone( AvailabilityZone zone ) {
+      public DescribingBuilder availabilityZone(AvailabilityZone zone) {
          this.zone = zone;
          return this;
       }
 
-      public DescribingBuilder creationTime( Date creationTime ) {
+      public DescribingBuilder creationTime(Date creationTime) {
          this.creationTime = creationTime;
          return this;
       }
 
-      public DescribingBuilder lastModificationTime( Date lastModificationTime ) {
+      public DescribingBuilder lastModificationTime(Date lastModificationTime) {
          this.lastModificationTime = lastModificationTime;
          return this;
       }
 
-      public DescribingBuilder hasInternetAccess( Boolean hasInternetAccess ) {
+      public DescribingBuilder hasInternetAccess(Boolean hasInternetAccess) {
          this.hasInternetAccess = hasInternetAccess;
          return this;
       }
 
+      public DescribingBuilder storages(List<Storage> storages) {
+         this.storages = storages;
+         return this;
+      }
+
       @Override
       public Server build() {
-         return Server.create( id, name, cores, ram, hasInternetAccess, state, status, osType, zone, creationTime,
-                 lastModificationTime, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+         return Server.create(id, name, cores, ram, hasInternetAccess, state, status, osType, zone, creationTime,
+                 lastModificationTime, storages, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
       }
 
-      private DescribingBuilder fromServer( Server in ) {
-         return this.id( in.id() ).cores( in.cores() ).creationTime( in.creationTime() ).hasInternetAccess( in.hasInternetAccess() )
-                 .isCpuHotPlug( in.isCpuHotPlug() ).isDiscVirtioHotPlug( in.isDiscVirtioHotPlug() ).isDiscVirtioHotUnPlug( in.isDiscVirtioHotUnPlug() )
-                 .isNicHotPlug( in.isNicHotPlug() ).isNicHotUnPlug( in.isNicHotUnPlug() ).isRamHotPlug( in.isRamHotPlug() )
-                 .lastModificationTime( in.lastModificationTime() ).name( in.name() ).osType( in.osType() ).ram( in.ram() ).state( in.state() )
-                 .status( in.status() );
+      private DescribingBuilder fromServer(Server in) {
+         return this.id(in.id()).cores(in.cores()).creationTime(in.creationTime()).hasInternetAccess(in.hasInternetAccess())
+                 .isCpuHotPlug(in.isCpuHotPlug()).isDiscVirtioHotPlug(in.isDiscVirtioHotPlug()).isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug())
+                 .isNicHotPlug(in.isNicHotPlug()).isNicHotUnPlug(in.isNicHotUnPlug()).isRamHotPlug(in.isRamHotPlug())
+                 .lastModificationTime(in.lastModificationTime()).name(in.name()).osType(in.osType()).ram(in.ram()).state(in.state())
+                 .status(in.status()).storages(in.storages());
       }
 
       @Override
@@ -256,18 +274,18 @@ public abstract class Server implements ServerCommonProperties {
          @Nullable
          public abstract OsType osType();
 
-         public static CreatePayload create( String dataCenterId, String name, int core, int ram ) {
-            return create( dataCenterId, name, core, ram, "", "", null, false, null, null, null, null, null, null, null, null );
+         public static CreatePayload create(String dataCenterId, String name, int core, int ram) {
+            return create(dataCenterId, name, core, ram, "", "", null, false, null, null, null, null, null, null, null, null);
          }
 
-         public static CreatePayload create( String dataCenterId, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
+         public static CreatePayload create(String dataCenterId, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
                  Integer lanId, Boolean hasInternetAccess, AvailabilityZone availabilityZone, OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug,
-                 Boolean isNicHotPlug, Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
-            validateCores( cores );
-            validateRam( ram, isRamHotPlug );
-            return new AutoValue_Server_Request_CreatePayload( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
+                 Boolean isNicHotPlug, Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
+            validateCores(cores);
+            validateRam(ram, isRamHotPlug);
+            return new AutoValue_Server_Request_CreatePayload(isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
                     isDiscVirtioHotUnPlug, name, cores, ram, dataCenterId, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
-                    availabilityZone, osType );
+                    availabilityZone, osType);
          }
 
          public static class Builder extends Server.Builder<Builder, CreatePayload> {
@@ -280,42 +298,42 @@ public abstract class Server implements ServerCommonProperties {
             private AvailabilityZone availabilityZone;
             private OsType osType;
 
-            public Builder dataCenterId( String dataCenterId ) {
+            public Builder dataCenterId(String dataCenterId) {
                this.dataCenterId = dataCenterId;
                return this;
             }
 
-            public Builder dataCenterId( DataCenter dataCenter ) {
-               this.dataCenterId = checkNotNull( dataCenter, "Cannot pass null datacenter" ).id();
+            public Builder dataCenterId(DataCenter dataCenter) {
+               this.dataCenterId = checkNotNull(dataCenter, "Cannot pass null datacenter").id();
                return this;
             }
 
-            public Builder bootFromStorageId( String storageId ) {
+            public Builder bootFromStorageId(String storageId) {
                this.bootFromStorageId = storageId;
                return this;
             }
 
-            public Builder bootFromImageId( String image ) {
+            public Builder bootFromImageId(String image) {
                this.bootFromImageId = image;
                return this;
             }
 
-            public Builder lanId( Integer lanId ) {
+            public Builder lanId(Integer lanId) {
                this.lanId = lanId;
                return this;
             }
 
-            public Builder availabilityZone( AvailabilityZone zone ) {
+            public Builder availabilityZone(AvailabilityZone zone) {
                this.availabilityZone = zone;
                return this;
             }
 
-            public Builder osType( OsType osType ) {
+            public Builder osType(OsType osType) {
                this.osType = osType;
                return this;
             }
 
-            public Builder hasInternetAccess( Boolean hasInternetAccess ) {
+            public Builder hasInternetAccess(Boolean hasInternetAccess) {
                this.hasInternetAccess = hasInternetAccess;
                return this;
             }
@@ -327,8 +345,8 @@ public abstract class Server implements ServerCommonProperties {
 
             @Override
             public CreatePayload build() {
-               return CreatePayload.create( dataCenterId, name, cores, ram, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
-                       availabilityZone, osType, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+               return CreatePayload.create(dataCenterId, name, cores, ram, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
+                       availabilityZone, osType, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
             }
 
          }
@@ -355,11 +373,11 @@ public abstract class Server implements ServerCommonProperties {
          @Nullable
          public abstract OsType osType();
 
-         public static UpdatePayload create( String id, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
+         public static UpdatePayload create(String id, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
                  AvailabilityZone availabilityZone, OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug,
-                 Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
-            return new AutoValue_Server_Request_UpdatePayload( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
-                    isDiscVirtioHotUnPlug, cores, ram, name, id, bootFromStorageId, bootFromImageId, availabilityZone, osType );
+                 Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
+            return new AutoValue_Server_Request_UpdatePayload(isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
+                    isDiscVirtioHotUnPlug, cores, ram, name, id, bootFromStorageId, bootFromImageId, availabilityZone, osType);
          }
 
          public static class Builder extends Server.Builder<Builder, UpdatePayload> {
@@ -370,27 +388,27 @@ public abstract class Server implements ServerCommonProperties {
             private AvailabilityZone availabilityZone;
             private OsType osType;
 
-            public Builder id( String id ) {
+            public Builder id(String id) {
                this.id = id;
                return this;
             }
 
-            public Builder bootFromStorageId( String storageId ) {
+            public Builder bootFromStorageId(String storageId) {
                this.bootFromStorageId = storageId;
                return this;
             }
 
-            public Builder bootFromImageId( String image ) {
+            public Builder bootFromImageId(String image) {
                this.bootFromImageId = image;
                return this;
             }
 
-            public Builder availabilityZone( AvailabilityZone zone ) {
+            public Builder availabilityZone(AvailabilityZone zone) {
                this.availabilityZone = zone;
                return this;
             }
 
-            public Builder osType( OsType osType ) {
+            public Builder osType(OsType osType) {
                this.osType = osType;
                return this;
             }
@@ -402,8 +420,8 @@ public abstract class Server implements ServerCommonProperties {
 
             @Override
             public UpdatePayload build() {
-               return UpdatePayload.create( id, name, cores, ram, bootFromStorageId, bootFromImageId, availabilityZone, osType,
-                       cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+               return UpdatePayload.create(id, name, cores, ram, bootFromStorageId, bootFromImageId, availabilityZone, osType,
+                       cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
 
             }
 
@@ -412,13 +430,13 @@ public abstract class Server implements ServerCommonProperties {
 
    }
 
-   private static void validateCores( int cores ) {
-      checkArgument( cores > 0, "Core must be atleast 1." );
+   private static void validateCores(int cores) {
+      checkArgument(cores > 0, "Core must be atleast 1.");
    }
 
-   private static void validateRam( int ram, Boolean isRamHotPlug ) {
-      int minRam = ( isRamHotPlug == null || !isRamHotPlug ) ? 256 : 1024;
-      checkArgument( ram >= minRam && ram % 256 == 0, "RAM must be multiples of 256 with minimum of 256 MB (1024 MB if ramHotPlug is enabled)" );
+   private static void validateRam(int ram, Boolean isRamHotPlug) {
+      int minRam = (isRamHotPlug == null || !isRamHotPlug) ? 256 : 1024;
+      checkArgument(ram >= minRam && ram % 256 == 0, "RAM must be multiples of 256 with minimum of 256 MB (1024 MB if ramHotPlug is enabled)");
 
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
index 0e1303e..dac8f0b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
@@ -36,11 +36,11 @@ public abstract class ServiceFault {
       UNRECOGNIZED;
 
       public static FaultCode fromValue(String v) {
-	 try {
-	    return valueOf(v);
-	 } catch (IllegalArgumentException ex) {
-	    return UNRECOGNIZED;
-	 }
+         try {
+            return valueOf(v);
+         } catch (IllegalArgumentException ex) {
+            return UNRECOGNIZED;
+         }
       }
    }
 
@@ -68,27 +68,27 @@ public abstract class ServiceFault {
       private int requestId;
 
       public Builder faultCode(FaultCode code) {
-	 this.faultCode = code;
-	 return this;
+         this.faultCode = code;
+         return this;
       }
 
       public Builder httpCode(int httpCode) {
-	 this.httpCode = httpCode;
-	 return this;
+         this.httpCode = httpCode;
+         return this;
       }
 
       public Builder message(String message) {
-	 this.message = message;
-	 return this;
+         this.message = message;
+         return this;
       }
 
       public Builder requestId(int requestId) {
-	 this.requestId = requestId;
-	 return this;
+         this.requestId = requestId;
+         return this;
       }
 
       public ServiceFault build() {
-	 return create(faultCode, httpCode, message, requestId);
+         return create(faultCode, httpCode, message, requestId);
       }
 
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
new file mode 100644
index 0000000..6dcaf25
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
@@ -0,0 +1,355 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.domain;
+
+import com.google.auto.value.AutoValue;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Date;
+import java.util.List;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+
+@AutoValue
+public abstract class Storage {
+
+   public enum BusType {
+
+      IDE, SCSI, VIRTIO, UNRECOGNIZED;
+
+      public static BusType fromValue(String value) {
+         try {
+            return valueOf(value);
+         } catch (IllegalArgumentException ex) {
+            return UNRECOGNIZED;
+         }
+      }
+   }
+
+   public abstract String id();
+
+   @Nullable
+   public abstract String name();
+
+   public abstract float size(); // GB
+
+   @Nullable
+   public abstract Date creationTime();
+
+   @Nullable
+   public abstract Date lastModificationTime();
+
+   public abstract ProvisioningState state();
+
+   @Nullable
+   public abstract List<String> serverIds();
+
+   @Nullable
+   public abstract Boolean bootDevice();
+
+   @Nullable
+   public abstract BusType busType();
+
+   @Nullable
+   public abstract Integer deviceNumber();
+
+   public static Storage create(String id, String name, float size, Date creationTime, Date lastModificationTime,
+           ProvisioningState state, List<String> serverIds, Boolean bootDevice, BusType busType, Integer deviceNumber) {
+      return new AutoValue_Storage(id, name, size, creationTime, lastModificationTime, state,
+              serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList(),
+              bootDevice, busType, deviceNumber);
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return builder().fromStorage(this);
+   }
+
+   public static class Builder {
+
+      private String id;
+      private String name;
+      private float size;
+      private Date creationTime;
+      private Date lastModificationTime;
+      private ProvisioningState state;
+      private List<String> serverIds;
+      private Boolean bootDevice;
+      private BusType busType;
+      private Integer deviceNumber;
+
+      public Builder id(String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder name(String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder size(float size) {
+         this.size = size;
+         return this;
+      }
+
+      public Builder creationTime(Date creationTime) {
+         this.creationTime = creationTime;
+         return this;
+      }
+
+      public Builder lastModificationTime(Date lastModificationTime) {
+         this.lastModificationTime = lastModificationTime;
+         return this;
+      }
+
+      public Builder state(ProvisioningState state) {
+         this.state = state;
+         return this;
+      }
+
+      public Builder serverIds(List<String> serverIds) {
+         this.serverIds = serverIds;
+         return this;
+      }
+
+      public Builder bootDevice(Boolean bootDevice) {
+         this.bootDevice = bootDevice;
+         return this;
+      }
+
+      public Builder busType(BusType busType) {
+         this.busType = busType;
+         return this;
+      }
+
+      public Builder deviceNumber(Integer deviceNumber) {
+         this.deviceNumber = deviceNumber;
+         return this;
+      }
+
+      private Builder fromStorage(Storage in) {
+         return this.id(in.id()).name(in.name()).size(in.size()).creationTime(in.creationTime())
+                 .lastModificationTime(in.lastModificationTime()).state(in.state()).serverIds(in.serverIds())
+                 .bootDevice(in.bootDevice()).busType(in.busType()).deviceNumber(in.deviceNumber());
+      }
+
+      public Storage build() {
+         return Storage.create(id, name, size, creationTime, lastModificationTime, state, serverIds, bootDevice, busType, deviceNumber);
+      }
+
+   }
+
+   public static final class Request {
+
+      public static CreatePayload.Builder creatingBuilder() {
+         return new CreatePayload.Builder();
+      }
+
+      public static UpdatePayload.Builder updatingBuilder() {
+         return new UpdatePayload.Builder();
+      }
+
+      public static ConnectPayload.Builder connectingBuilder() {
+         return new ConnectPayload.Builder();
+      }
+
+      @AutoValue
+      public abstract static class CreatePayload {
+
+         public abstract String dataCenterId();
+
+         public abstract float size();
+
+         @Nullable
+         public abstract String name();
+
+         @Nullable
+         public abstract String mountImageId();
+
+         @Nullable
+         public abstract String profitBricksImagePassword();
+
+         public static CreatePayload create(String dataCenterId, float size, String name, String mountImageId, String imagePassword) {
+            validateSize(size);
+            return new AutoValue_Storage_Request_CreatePayload(dataCenterId, size, name, mountImageId, imagePassword);
+         }
+
+         public static class Builder {
+
+            private String dataCenterId;
+            private float size;
+            private String name;
+            private String mountImageId;
+            private String profitBricksImagePassword;
+
+            public Builder dataCenterId(String dataCenterId) {
+               this.dataCenterId = dataCenterId;
+               return this;
+            }
+
+            public Builder dataCenterId(DataCenter dataCenter) {
+               this.dataCenterId = checkNotNull(dataCenter, "Cannot pass null datacenter").id();
+               return this;
+            }
+
+            public Builder size(float size) {
+               this.size = size;
+               return this;
+            }
+
+            public Builder mountImageId(String mountImageId) {
+               this.mountImageId = mountImageId;
+               return this;
+            }
+
+            public Builder name(String name) {
+               this.name = name;
+               return this;
+            }
+
+            public Builder imagePassword(String password) {
+               this.profitBricksImagePassword = password;
+               return this;
+            }
+
+            public CreatePayload build() {
+               return CreatePayload.create(dataCenterId, size, name, mountImageId, profitBricksImagePassword);
+            }
+         }
+
+      }
+
+      @AutoValue
+      public abstract static class UpdatePayload {
+
+         public abstract String id();
+
+         @Nullable
+         public abstract Float size();
+
+         @Nullable
+         public abstract String name();
+
+         @Nullable
+         public abstract String mountImageId();
+
+         public static UpdatePayload create(String id, Float size, String name, String mountImageId) {
+            validateSize(size);
+            return new AutoValue_Storage_Request_UpdatePayload(id, size, name, mountImageId);
+         }
+
+         public static class Builder {
+
+            private String id;
+            private Float size;
+            private String name;
+            private String mountImageId;
+
+            public Builder id(String id) {
+               this.id = id;
+               return this;
+            }
+
+            public Builder size(float size) {
+               this.size = size;
+               return this;
+            }
+
+            public Builder name(String name) {
+               this.name = name;
+               return this;
+            }
+
+            public Builder mountImageId(String mountImageId) {
+               this.mountImageId = mountImageId;
+               return this;
+            }
+
+            public UpdatePayload build() {
+               return UpdatePayload.create(id, size, name, mountImageId);
+            }
+         }
+      }
+
+      @AutoValue
+      public abstract static class ConnectPayload {
+
+         public abstract String storageId();
+
+         public abstract String serverId();
+
+         @Nullable
+         public abstract BusType busType();
+
+         @Nullable
+         public abstract Integer deviceNumber();
+
+         public static ConnectPayload create(String storageId, String serverId, BusType busType, Integer deviceNumber) {
+            return new AutoValue_Storage_Request_ConnectPayload(storageId, serverId, busType, deviceNumber);
+         }
+
+         public static class Builder {
+
+            private String storageId;
+            private String serverId;
+            private BusType busType;
+            private Integer deviceNumber;
+
+            public Builder storageId(String storageId) {
+               this.storageId = storageId;
+               return this;
+            }
+
+            public Builder serverId(String serverId) {
+               this.serverId = serverId;
+               return this;
+            }
+
+            public Builder busType(BusType busType) {
+               this.busType = busType;
+               return this;
+            }
+
+            public Builder deviceNumber(Integer deviceNumber) {
+               this.deviceNumber = deviceNumber;
+               return this;
+            }
+
+            public ConnectPayload build() {
+               return ConnectPayload.create(storageId, serverId, busType, deviceNumber);
+            }
+
+         }
+      }
+
+      private static void validateSize(Float size) {
+         if (size != null)
+            checkArgument(size > 1, "Storage size must be > 1GB");
+
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
index f660730..a9c6143 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
@@ -58,8 +58,7 @@ public interface DataCenterApi {
 
    /**
     * @param identifier Data Center identifier
-    * @return Returns information about an existing virtual data center's state and configuration or <code>null</code>
-    * if it doesn't exist.
+    * @return Returns information about an existing virtual data center's state and configuration or <code>null</code> if it doesn't exist.
     */
    @POST
    @Named("datacenter:get")
@@ -69,8 +68,8 @@ public interface DataCenterApi {
    DataCenter getDataCenter(@PayloadParam("id") String identifier);
 
    /**
-    * This is a lightweight function for polling the current provisioning state of the Virtual Data Center. It is
-    * recommended to use this function for large Virtual Data Centers to query request results.
+    * This is a lightweight function for polling the current provisioning state of the Virtual Data Center. It is recommended to use this
+    * function for large Virtual Data Centers to query request results.
     * <p>
     * @param identifier Data Center identifier
     */
@@ -119,9 +118,8 @@ public interface DataCenterApi {
    DataCenter clearDataCenter(@PayloadParam("id") String identifier);
 
    /**
-    * Deletes an Virtual Data Center. If a previous request on the target data center is still in progress, the data
-    * center is going to be deleted after this request has been completed. Once a Data Center has been deleted, no
-    * further request can be performed on it.
+    * Deletes an Virtual Data Center. If a previous request on the target data center is still in progress, the data center is going to be
+    * deleted after this request has been completed. Once a Data Center has been deleted, no further request can be performed on it.
     * <p>
     * @param identifier Identifier of the virtual data center
     * @return Returns a boolean indicating whether delete operation was made

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
index 1fa89b3..34445da 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
@@ -39,19 +39,19 @@ import org.jclouds.rest.annotations.PayloadParam;
 import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.rest.annotations.XMLResponseParser;
 
-@RequestFilters( { BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class } )
-@Consumes( MediaType.TEXT_XML )
-@Produces( MediaType.TEXT_XML )
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
 public interface ServerApi {
 
    /**
     * @return Returns information about all virtual server, such as configuration, provisioning status, power status, etc.
     */
    @POST
-   @Named( "server:getall" )
-   @Payload( "<ws:getAllServers/>" )
-   @XMLResponseParser( ServerListResponseHandler.class )
-   @Fallback( Fallbacks.EmptyListOnNotFoundOr404.class )
+   @Named("server:getall")
+   @Payload("<ws:getAllServers/>")
+   @XMLResponseParser(ServerListResponseHandler.class)
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
    List<Server> getAllServers();
 
    /**
@@ -59,11 +59,11 @@ public interface ServerApi {
     * @return Returns information about a virtual server, such as configuration, provisioning status, power status, etc.
     */
    @POST
-   @Named( "server:get" )
-   @Payload( "<ws:getServer><serverId>{id}</serverId></ws:getServer>" )
-   @XMLResponseParser( ServerInfoResponseHandler.class )
-   @Fallback( Fallbacks.NullOnNotFoundOr404.class )
-   Server getServer( @PayloadParam( "id" ) String identifier );
+   @Named("server:get")
+   @Payload("<ws:getServer><serverId>{id}</serverId></ws:getServer>")
+   @XMLResponseParser(ServerInfoResponseHandler.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Server getServer(@PayloadParam("id") String identifier);
 
    /**
     * Starts an existing virtual server
@@ -77,10 +77,10 @@ public interface ServerApi {
     * @return Identifier of current request
     */
    @POST
-   @Named( "server:start" )
-   @Payload( "<ws:startServer><serverId>{id}</serverId></ws:startServer>" )
-   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
-   String startServer( @PayloadParam( "id" ) String id );
+   @Named("server:start")
+   @Payload("<ws:startServer><serverId>{id}</serverId></ws:startServer>")
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String startServer(@PayloadParam("id") String id);
 
    /**
     *
@@ -99,10 +99,10 @@ public interface ServerApi {
     * @return Identifier of current request
     */
    @POST
-   @Named( "server:stop" )
-   @Payload( "<ws:stopServer><serverId>{id}</serverId></ws:stopServer>" )
-   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
-   String stopServer( @PayloadParam( "id" ) String id );
+   @Named("server:stop")
+   @Payload("<ws:stopServer><serverId>{id}</serverId></ws:stopServer>")
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String stopServer(@PayloadParam("id") String id);
 
    /**
     * Resets an existing virtual server (POWER CYCLE).
@@ -119,10 +119,10 @@ public interface ServerApi {
     * @return Identifier of current request
     */
    @POST
-   @Named( "server:reset" )
-   @Payload( "<ws:resetServer><serverId>{id}</serverId></ws:resetServer>" )
-   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
-   String resetServer( @PayloadParam( "id" ) String id );
+   @Named("server:reset")
+   @Payload("<ws:resetServer><serverId>{id}</serverId></ws:resetServer>")
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String resetServer(@PayloadParam("id") String id);
 
    /**
     * Creates a Virtual Server within an existing data center. Parameters can be specified to set up a boot device and connect the server to
@@ -132,22 +132,22 @@ public interface ServerApi {
     * @return serverId of the created server
     */
    @POST
-   @Named( "server:create" )
-   @MapBinder( CreateServerRequestBinder.class )
-   @XMLResponseParser( ServerIdOnlyResponseHandler.class )
-   String createServer( @PayloadParam( "server" ) Server.Request.CreatePayload payload );
+   @Named("server:create")
+   @MapBinder(CreateServerRequestBinder.class)
+   @XMLResponseParser(ServerIdOnlyResponseHandler.class)
+   String createServer(@PayloadParam("server") Server.Request.CreatePayload payload);
 
    /**
     * Updates parameters of an existing virtual server device.
     *
-    * @param payload Paylaod
+    * @param payload Payload
     * @return Identifier of current request
     */
    @POST
-   @Named( "server:update" )
-   @MapBinder( UpdateServerRequestBinder.class )
-   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
-   String updateServer( @PayloadParam( "server" ) Server.Request.UpdatePayload payload );
+   @Named("server:update")
+   @MapBinder(UpdateServerRequestBinder.class)
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String updateServer(@PayloadParam("server") Server.Request.UpdatePayload payload);
 
    /**
     * Deletes an existing Virtual Server.
@@ -156,9 +156,9 @@ public interface ServerApi {
     * @return Identifier of current request
     */
    @POST
-   @Named( "server:delete" )
-   @Payload( "<ws:deleteServer><serverId>{id}</serverId></ws:deleteServer>" )
-   @Fallback( Fallbacks.FalseOnNotFoundOr404.class )
-   boolean deleteServer( @PayloadParam( "id" ) String id );
+   @Named("server:delete")
+   @Payload("<ws:deleteServer><serverId>{id}</serverId></ws:deleteServer>")
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deleteServer(@PayloadParam("id") String id);
 
 }