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:39 UTC

[29/35] jclouds git commit: JCLOUDS-951: Remove inheritance in ProfitBrick's AutoValue classes

JCLOUDS-951: Remove inheritance in ProfitBrick's AutoValue classes


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

Branch: refs/heads/master
Commit: 5e82bbfa462cf3a537fef4d6a42eba7bed87de55
Parents: ed247e7
Author: Reijhanniel Jearl Campos <de...@gmail.com>
Authored: Wed Oct 21 22:55:39 2015 +0800
Committer: Zack Shoylev <za...@rackspace.com>
Committed: Tue Oct 27 13:12:23 2015 -0500

----------------------------------------------------------------------
 .../AddFirewallRuleToNicRequestBinder.java      |   2 +-
 .../CreateLoadBalancerRequestBinder.java        |   4 +-
 .../UpdateLoadBalancerRequestBinder.java        |   2 +-
 .../snapshot/UpdateSnapshotRequestBinder.java   |   2 +-
 .../storage/CreateStorageRequestBinder.java     |   2 +-
 .../ProfitBricksComputeServiceAdapter.java      |   2 +-
 ...ProfitBricksComputeServiceContextModule.java |   2 +-
 .../compute/function/ProvisionableToImage.java  |   2 +-
 .../profitbricks/domain/AvailabilityZone.java   |   9 +-
 .../jclouds/profitbricks/domain/DataCenter.java | 112 ++---
 .../org/jclouds/profitbricks/domain/Drive.java  |  37 +-
 .../jclouds/profitbricks/domain/Firewall.java   | 332 +++----------
 .../org/jclouds/profitbricks/domain/Image.java  | 134 +++---
 .../jclouds/profitbricks/domain/IpBlock.java    |  90 ++--
 .../profitbricks/domain/LoadBalancer.java       | 321 ++++---------
 .../jclouds/profitbricks/domain/Location.java   |   8 +-
 .../org/jclouds/profitbricks/domain/Nic.java    | 303 ++++--------
 .../org/jclouds/profitbricks/domain/OsType.java |   8 +-
 .../profitbricks/domain/Provisionable.java      |  25 +
 .../profitbricks/domain/ProvisioningState.java  |   8 +-
 .../org/jclouds/profitbricks/domain/Server.java | 480 +++++++++----------
 .../profitbricks/domain/ServiceFault.java       |  45 +-
 .../jclouds/profitbricks/domain/Snapshot.java   | 290 +++++------
 .../jclouds/profitbricks/domain/Storage.java    | 259 +++-------
 .../ipblock/BaseIpBlockResponseHandler.java     |   7 +-
 .../parser/ipblock/IpBlockResponseHandler.java  |   4 +-
 .../BaseLoadBalancerResponseHandler.java        |   2 +-
 .../http/parser/nic/BaseNicResponseHandler.java |   7 +-
 .../http/parser/nic/NicListResponseHandler.java |   6 +
 .../http/parser/nic/NicResponseHandler.java     |   7 +-
 .../publicip/PublicIpListResponseHandler.java   |   4 +-
 .../server/BaseServerResponseHandler.java       |   2 +-
 .../server/ServerListResponseHandler.java       |   4 +-
 .../profitbricks/util/Preconditions.java        | 100 ++++
 .../CreateDataCenterRequestBinderTest.java      |   2 +-
 .../UpdateDataCenterRequestBinderTest.java      |   2 +-
 .../AddRomDriveToServerRequestBinderTest.java   |   2 +-
 .../AddFirewallRuleToNicRequestBinderTest.java  |  27 +-
 .../CreateLoadBalancerRequestBinderTest.java    |  28 +-
 ...DeregisterLoadBalancerRequestBinderTest.java |   2 +-
 .../RegisterLoadBalancerRequestBinderTest.java  |   2 +-
 .../UpdateLoadBalancerRequestBinderTest.java    |  19 +-
 .../CreateSnapshotRequestBinderTest.java        |  10 +-
 .../RollbackSnapshotRequestBinderTest.java      |   5 +-
 .../UpdateSnapshotRequestBinderTest.java        |  16 +-
 .../function/ServerToNodeMetadataTest.java      |   2 +-
 .../domain/FirewallRuleBuilderTest.java         |   2 +-
 .../profitbricks/domain/ServerBuilderTest.java  |   8 +-
 .../features/DataCenterApiLiveTest.java         |   4 +-
 .../features/DataCenterApiMockTest.java         |   6 +-
 .../features/DrivesApiLiveTest.java             |   2 +-
 .../features/DrivesApiMockTest.java             |   2 +-
 .../features/FirewallApiLiveTest.java           |  14 +-
 .../features/FirewallApiMockTest.java           |  24 +-
 .../features/LoadBalancerApiLiveTest.java       | 134 ++++++
 .../features/LoadBalancerApiMockTest.java       | 290 +++++++++++
 .../features/LoadbalancerApiLiveTest.java       | 135 ------
 .../features/LoadbalancerApiMockTest.java       | 285 -----------
 .../profitbricks/features/NicApiMockTest.java   |  18 +-
 .../features/ServerApiLiveTest.java             |   7 +-
 .../features/SnapshotApiLiveTest.java           |  10 +-
 .../features/SnapshotApiMockTest.java           |  10 +-
 .../features/StorageApiLiveTest.java            |   6 +-
 ...omPayloadHttpCommandExecutorServiceTest.java |  10 +-
 .../DataCenterInfoResponseHandlerTest.java      |   2 +-
 .../ipblock/IpBlockListResponseHandlerTest.java |  19 +-
 .../ipblock/IpBlockResponseHandlerTest.java     |   5 +-
 .../LoadBalancerListResponseHandlerTest.java    |   4 +-
 .../LoadBalancerResponseHandlerTest.java        |   2 +-
 .../parser/nic/NicListResponseHandlerTest.java  |   6 +-
 .../http/parser/nic/NicResponseHandlerTest.java |   8 +-
 .../server/ServerInfoResponseHandlerTest.java   |   2 +-
 .../server/ServerListResponseHandlerTest.java   |   4 +-
 .../SnapshotListResponseHandlerTest.java        |   4 +-
 .../snapshot/SnapshotResponseHandlerTest.java   |   2 +-
 .../test/resources/ipblock/ipblock-reserve.xml  |   2 +-
 .../src/test/resources/ipblock/ipblock.xml      |   4 +-
 .../src/test/resources/ipblock/ipblocks.xml     |  18 +-
 .../loadbalancer/loadbalancer-create.xml        |   2 +-
 .../loadbalancer/loadbalancer-delete.xml        |   2 +-
 .../resources/loadbalancer/loadbalancer.xml     |   2 +-
 .../resources/loadbalancer/loadbalancers.xml    |   4 +-
 .../profitbricks/src/test/resources/nic/nic.xml |   4 +-
 .../src/test/resources/nic/nics.xml             |   4 +-
 84 files changed, 1629 insertions(+), 2177 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java
index 9bdbf76..8f4db03 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java
@@ -33,7 +33,7 @@ public class AddFirewallRuleToNicRequestBinder extends BaseProfitBricksRequestBi
    protected String createPayload(Firewall.Request.AddRulePayload payload) {
       requestBuilder.append("<ws:addFirewallRulesToNic>")
               .append(format("<nicId>%s</nicId>", payload.nicId()));
-      for (Firewall.RuleWithIcmp rule : payload.rules())
+      for (Firewall.Rule rule : payload.rules())
          requestBuilder
                  .append("<request>")
                  .append(formatIfNotEmpty("<icmpCode>%s</icmpCode>", rule.icmpCode()))

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
index 90eb93f..e3d13a1 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
@@ -35,8 +35,8 @@ public class CreateLoadBalancerRequestBinder extends BaseProfitBricksRequestBind
       requestBuilder.append("<ws:createLoadBalancer>")
               .append("<request>")
               .append(format("<dataCenterId>%s</dataCenterId>", payload.dataCenterId()))
-              .append(format("<loadBalancerName>%s</loadBalancerName>", payload.loadBalancerName()))
-              .append(format("<loadBalancerAlgorithm>%s</loadBalancerAlgorithm>", payload.loadBalancerAlgorithm()))
+              .append(format("<loadBalancerName>%s</loadBalancerName>", payload.name()))
+              .append(format("<loadBalancerAlgorithm>%s</loadBalancerAlgorithm>", payload.algorithm()))
               .append(format("<ip>%s</ip>", payload.ip()))
               .append(format("<lanId>%s</lanId>", payload.lanId()));
       for (String serverId : payload.serverIds())

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java
index 0496655..c093f23 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java
@@ -36,7 +36,7 @@ public class UpdateLoadBalancerRequestBinder extends BaseProfitBricksRequestBind
               .append("<request>")
               .append(format("<loadBalancerId>%s</loadBalancerId>", payload.id()))
               .append(formatIfNotEmpty("<loadBalancerName>%s</loadBalancerName>", payload.name()))
-              .append(formatIfNotEmpty("<loadBalancerAlgorithm>%s</loadBalancerAlgorithm>", payload.loadBalancerAlgorithm()))
+              .append(formatIfNotEmpty("<loadBalancerAlgorithm>%s</loadBalancerAlgorithm>", payload.algorithm()))
               .append(formatIfNotEmpty("<ip>%s</ip>", payload.ip()))
               .append("</request>")
               .append("</ws:updateLoadBalancer>").toString();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
index df1b7cd..1414c69 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
@@ -33,7 +33,7 @@ public class UpdateSnapshotRequestBinder extends BaseProfitBricksRequestBinder<S
    protected String createPayload(Snapshot.Request.UpdatePayload payload) {
       requestBuilder.append("<ws:updateSnapshot>")
               .append("<request>")
-              .append(format("<snapshotId>%s</snapshotId>", payload.snapshotId()))
+              .append(format("<snapshotId>%s</snapshotId>", payload.id()))
               .append(format("<description>%s</description>", payload.description()))
               .append(format("<snapshotName>%s</snapshotName>", payload.name()))
               .append(formatIfNotEmpty("<bootable>%s</bootable>", payload.bootable()))

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/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
index acfb6f3..9681b64 100644
--- 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
@@ -37,7 +37,7 @@ public class CreateStorageRequestBinder extends BaseProfitBricksRequestBinder<St
               .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(formatIfNotEmpty("<profitBricksImagePassword>%s</profitBricksImagePassword>", payload.imagePassword()))
               .append("</request>")
               .append("</ws:createStorage>");
       return requestBuilder.toString();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
index add3fb9..4f6548e 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
@@ -54,7 +54,7 @@ import org.jclouds.profitbricks.features.ServerApi;
 import org.jclouds.profitbricks.compute.concurrent.ProvisioningJob;
 import org.jclouds.profitbricks.compute.concurrent.ProvisioningManager;
 import org.jclouds.profitbricks.domain.Snapshot;
-import org.jclouds.profitbricks.domain.internal.Provisionable;
+import org.jclouds.profitbricks.domain.Provisionable;
 import org.jclouds.profitbricks.util.Passwords;
 import org.jclouds.rest.ResourceNotFoundException;
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
index d260caf..2b45d18 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
@@ -52,7 +52,7 @@ import org.jclouds.profitbricks.compute.function.StorageToVolume;
 import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
 import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
 import org.jclouds.profitbricks.domain.ProvisioningState;
-import org.jclouds.profitbricks.domain.internal.Provisionable;
+import org.jclouds.profitbricks.domain.Provisionable;
 import org.jclouds.util.Predicates2;
 
 import com.google.common.base.Function;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
index c5fcd78..c5c7f5e 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
@@ -29,7 +29,7 @@ import org.jclouds.domain.Location;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Snapshot;
-import org.jclouds.profitbricks.domain.internal.Provisionable;
+import org.jclouds.profitbricks.domain.Provisionable;
 
 import com.google.common.base.Function;
 import com.google.common.base.Strings;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/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 97cac69..a3c50ae 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
@@ -16,6 +16,8 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import com.google.common.base.Enums;
+
 public enum AvailabilityZone {
 
    AUTO, ZONE_1, ZONE_2, UNRECOGNIZED;
@@ -25,11 +27,6 @@ public enum AvailabilityZone {
    }
 
    public static AvailabilityZone fromValue(String v) {
-      try {
-         return valueOf(v);
-      } catch (Exception ex) {
-         return UNRECOGNIZED;
-      }
+      return Enums.getIfPresent(AvailabilityZone.class, v).or(UNRECOGNIZED);
    }
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/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 a24d84b..9bb09ab 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
@@ -16,17 +16,14 @@
  */
 package org.jclouds.profitbricks.domain;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.jclouds.profitbricks.util.Preconditions.checkInvalidChars;
 
 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 {
@@ -49,81 +46,60 @@ public abstract class DataCenter {
 
    @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, 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() {
-      return new Builder();
+      return new AutoValue_DataCenter.Builder()
+              .servers(ImmutableList.<Server>of())
+              .storages(ImmutableList.<Storage>of());
    }
 
-   public Builder toBuilder() {
-      return builder().fromDataCenter(this);
-   }
+   public abstract Builder toBuilder();
 
-   public static final class Builder {
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      private String id;
-      private String name;
-      private ProvisioningState state;
-      private Location location;
-      private int version;
-      private List<Server> servers;
-      private List<Storage> storages;
-//      private List<LoadBalancer> loadBalancer;
+      public abstract Builder id(String id);
 
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
+      public abstract Builder name(String name);
 
-      public Builder name(String name) {
-         this.name = name;
-         return this;
-      }
+      public abstract Builder version(int version);
 
-      public Builder state(ProvisioningState state) {
-         this.state = state;
-         return this;
-      }
+      public abstract Builder state(ProvisioningState state);
 
-      public Builder location(Location location) {
-         this.location = location;
-         return this;
-      }
+      public abstract Builder location(Location location);
 
-      public Builder version(int version) {
-         this.version = version;
-         return this;
-      }
+      public abstract Builder servers(List<Server> servers);
 
-      public Builder servers(List<Server> servers) {
-         this.servers = servers;
-         return this;
-      }
-
-      public Builder storages(List<Storage> storages) {
-         this.storages = storages;
-         return this;
-      }
+      public abstract Builder storages(List<Storage> storages);
 
-      public DataCenter build() {
-         return DataCenter.create(id, name, version, state, location, servers, storages);
+      abstract DataCenter autoBuild();
+      
+      public DataCenter build(){
+         DataCenter built = autoBuild();
+         return built.toBuilder()
+                 .servers(ImmutableList.copyOf(built.servers()))
+                 .storages(ImmutableList.copyOf(built.storages()))
+                 .autoBuild();
       }
 
-      public Builder fromDataCenter(DataCenter in) {
-         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 {
 
+      public static CreatePayload creatingPayload(String name, Location location) {
+         CreatePayload payload = new AutoValue_DataCenter_Request_CreatePayload(name, location);
+         checkInvalidChars(payload.name());
+
+         return payload;
+      }
+
+      public static UpdatePayload updatingPayload(String id, String name) {
+         UpdatePayload payload = new AutoValue_DataCenter_Request_UpdatePayload(id, name);
+         checkInvalidChars(payload.name());
+
+         return payload;
+      }
+
       @AutoValue
       public abstract static class CreatePayload {
 
@@ -131,11 +107,6 @@ public abstract class DataCenter {
 
          public abstract Location location();
 
-         public static CreatePayload create(String name, Location location) {
-            checkInvalidChars(name);
-            return new AutoValue_DataCenter_Request_CreatePayload(name, location);
-         }
-
       }
 
       @AutoValue
@@ -145,17 +116,6 @@ public abstract class DataCenter {
 
          public abstract String name();
 
-         public static UpdatePayload create(String id, String name) {
-            checkInvalidChars(name);
-            return new AutoValue_DataCenter_Request_UpdatePayload(id, name);
-         }
-      }
-
-      private static final Pattern INVALID_CHARS = Pattern.compile("^.*[@/\\|'`’^].*$");
-
-      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/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java
index 08add2a..c2efe09 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java
@@ -18,10 +18,12 @@ package org.jclouds.profitbricks.domain;
 
 import com.google.auto.value.AutoValue;
 
+import org.jclouds.javax.annotation.Nullable;
+
 @AutoValue
 public abstract class Drive {
 
-   public static final class Request {
+   public abstract static class Request {
 
       @AutoValue
       public abstract static class AddRomDriveToServerPayload {
@@ -30,40 +32,23 @@ public abstract class Drive {
 
          public abstract String imageId();
 
+         @Nullable
          public abstract String deviceNumber();
 
-         public static AddRomDriveToServerPayload create(String serverId, String storageId, String deviceNumber) {
-            return new AutoValue_Drive_Request_AddRomDriveToServerPayload(serverId, storageId, deviceNumber);
-         }
-
          public static Builder builder() {
-            return new Builder();
+            return new AutoValue_Drive_Request_AddRomDriveToServerPayload.Builder();
          }
 
-         public static class Builder {
-
-            private String serverId;
-            private String imageId;
-            private String deviceNumber;
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-            public Builder serverId(String serverId) {
-               this.serverId = serverId;
-               return this;
-            }
+            public abstract Builder serverId(String serverId);
 
-            public Builder storageId(String storageId) {
-               this.imageId = storageId;
-               return this;
-            }
+            public abstract Builder imageId(String imageId);
 
-            public Builder deviceNumber(String deviceNumber) {
-               this.deviceNumber = deviceNumber;
-               return this;
-            }
+            public abstract Builder deviceNumber(String deviceNumber);
 
-            public AddRomDriveToServerPayload build() {
-               return AddRomDriveToServerPayload.create(serverId, imageId, deviceNumber);
-            }
+            public abstract AddRomDriveToServerPayload build();
          }
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
index 2108bc4..78b30c1 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
@@ -16,18 +16,18 @@
  */
 package org.jclouds.profitbricks.domain;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.net.InetAddresses.isInetAddress;
-import static org.jclouds.profitbricks.util.MacAddresses.isMacAddress;
+import static org.jclouds.profitbricks.util.Preconditions.checkIcmp;
+import static org.jclouds.profitbricks.util.Preconditions.checkIp;
+import static org.jclouds.profitbricks.util.Preconditions.checkMacAddress;
+import static org.jclouds.profitbricks.util.Preconditions.checkPortRange;
 
 import java.util.List;
 
 import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.profitbricks.domain.internal.FirewallRuleCommonProperties;
 
 import com.google.auto.value.AutoValue;
+import com.google.common.base.Enums;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
 
 @AutoValue
 public abstract class Firewall {
@@ -37,11 +37,7 @@ public abstract class Firewall {
       TCP, UDP, ICMP, ANY, UNRECOGNIZED;
 
       public static Protocol fromValue(String value) {
-         try {
-            return valueOf(value);
-         } catch (IllegalArgumentException e) {
-            return UNRECOGNIZED;
-         }
+         return Enums.getIfPresent(Protocol.class, value).or(UNRECOGNIZED);
       }
    }
 
@@ -51,7 +47,8 @@ public abstract class Firewall {
    @Nullable
    public abstract String nicId();
 
-   public abstract boolean active();
+   @Nullable
+   public abstract Boolean active();
 
    @Nullable
    public abstract ProvisioningState state();
@@ -59,228 +56,79 @@ public abstract class Firewall {
    @Nullable
    public abstract List<Rule> rules();
 
-   public static Firewall create(String id, String nicId, boolean active, ProvisioningState provisioningState,
-           List<Rule> rules) {
-      return new AutoValue_Firewall(id, nicId, active, provisioningState,
-              rules != null ? ImmutableList.copyOf(rules) : ImmutableList.<Rule>of());
-   }
-
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_Firewall.Builder()
+              .rules(ImmutableList.<Rule>of());
    }
 
-   public static final class Request {
-
-      public static AddRulePayload.Builder ruleAddingBuilder() {
-         return new AddRulePayload.Builder();
-      }
-
-      @AutoValue
-      public abstract static class AddRulePayload {
+   public abstract Builder toBuilder();
 
-         public abstract String nicId();
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-         public abstract List<RuleWithIcmp> rules();
+      public abstract Builder id(String id);
 
-         public static AddRulePayload create(String nicId, List<RuleWithIcmp> rules) {
-            return new AutoValue_Firewall_Request_AddRulePayload(nicId, rules);
-         }
+      public abstract Builder nicId(String nicId);
 
-         public static class Builder {
+      public abstract Builder active(Boolean active);
 
-            private String nicId;
-            private List<RuleWithIcmp> rules = Lists.newArrayList();
+      public abstract Builder state(ProvisioningState state);
 
-            public Builder nicId(String nicId) {
-               this.nicId = nicId;
-               return this;
-            }
+      public abstract Builder rules(List<Rule> rules);
 
-            public Builder rules(List<RuleWithIcmp> rules) {
-               this.rules = rules;
-               return this;
-            }
-
-            public RuleWithIcmp.Builder newRule() {
-               return new RuleWithIcmp.Builder(this);
-            }
-
-            public Builder addRule(RuleWithIcmp rule) {
-               this.rules.add(rule);
-               return this;
-            }
-
-            public AddRulePayload build() {
-               return AddRulePayload.create(nicId, rules);
-            }
-         }
+      abstract Firewall autoBuild();
+      
+      public Firewall build(){
+         Firewall built = autoBuild();
+         
+         return built.toBuilder()
+                 .rules(ImmutableList.copyOf(built.rules()))
+                 .autoBuild();
       }
    }
 
-   public static class Builder {
-
-      private String id;
-      private String nicId;
-      private boolean active;
-
-      private ProvisioningState state;
-      private List<Rule> rules;
-
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
-
-      public Builder nicId(String nicId) {
-         this.nicId = nicId;
-         return this;
-      }
-
-      public Builder active(boolean active) {
-         this.active = active;
-         return this;
-      }
-
-      public Builder state(ProvisioningState state) {
-         this.state = state;
-         return this;
-      }
-
-      public Builder rules(List<Rule> firewallRules) {
-         this.rules = firewallRules;
-         return this;
-      }
-
-      public Builder fromFirewall(Firewall in) {
-         return this.id(in.id()).nicId(in.nicId()).active(in.active()).state(in.state())
-                 .rules(in.rules());
-      }
-
-      public Firewall build() {
-         return Firewall.create(id, nicId, active, state, rules);
-      }
-   }
-
-   public abstract static class RuleBuilder<B extends RuleBuilder, D extends FirewallRuleCommonProperties> {
-
-      protected String name;
-      protected Integer portRangeEnd;
-      protected Integer portRangeStart;
-      protected Protocol protocol;
-      protected String sourceIp;
-      protected String sourceMac;
-      protected String targetIp;
-
-      public B name(String name) {
-         this.name = name;
-         return self();
-      }
-
-      public B portRangeEnd(Integer portRangeEnd) {
-         this.portRangeEnd = portRangeEnd;
-         return self();
-      }
-
-      public B portRangeStart(Integer portRangeStart) {
-         this.portRangeStart = portRangeStart;
-         return self();
-      }
-
-      public B protocol(Protocol protocol) {
-         this.protocol = protocol;
-         return self();
-      }
-
-      public B sourceIp(String sourceIp) {
-         this.sourceIp = sourceIp;
-         return self();
-      }
-
-      public B sourceMac(String sourceMac) {
-         this.sourceMac = sourceMac;
-         return self();
-      }
+   public static final class Request {
 
-      public B targetIp(String targetIp) {
-         this.targetIp = targetIp;
-         return self();
+      public static AddRulePayload createAddRulePayload(String nicId, List<Rule> rules) {
+         return new AutoValue_Firewall_Request_AddRulePayload(nicId, ImmutableList.copyOf(rules));
       }
 
-      public abstract B self();
-
-      public abstract D build();
-
-      protected void checkPortRange() {
-         checkArgument(!(portRangeEnd == null ^ portRangeStart == null), "Port range must be both present or null");
-         if (portRangeEnd != null) {
-            checkArgument(protocol == Protocol.TCP || protocol == Protocol.UDP, "Port range can only be set for TCP or UDP");
-            checkArgument(portRangeEnd > portRangeStart, "portRangeEnd must be greater than portRangeStart");
-            checkArgument(portRangeEnd >= 1 && portRangeEnd <= 65534, "Port range end must be 1 to 65534");
-            checkArgument(portRangeStart >= 1 && portRangeStart <= 65534, "Port range start must be 1 to 65534");
-         }
-      }
+      @AutoValue
+      public abstract static class AddRulePayload {
 
-      protected void checkMac() {
-         if (sourceMac != null)
-            checkArgument(isMacAddress(sourceMac), "Source MAC must match pattern 'aa:bb:cc:dd:ee:ff'");
-      }
+         public abstract String nicId();
 
-      protected void checkIp() {
-         if (sourceIp != null)
-            checkArgument(isInetAddress(sourceIp), "Source IP is invalid");
-         if (targetIp != null)
-            checkArgument(isInetAddress(targetIp), "Target IP is invalid");
-      }
+         public abstract List<Rule> rules();
 
-      protected void checkFields() {
-         checkMac();
-         checkPortRange();
-         checkIp();
       }
-
    }
 
    @AutoValue
-   public abstract static class Rule implements FirewallRuleCommonProperties {
+   public abstract static class Rule {
 
       @Nullable
       public abstract String id();
 
-      public static Rule create(String id, String name, Integer portRangeEnd, Integer portRangeStart,
-              Protocol protocol, String sourceIp, String sourceMac, String targetIp) {
-         return new AutoValue_Firewall_Rule(name, portRangeEnd, portRangeStart, protocol, sourceIp, sourceMac,
-                 targetIp, id);
-      }
-
-      public static Builder builder() {
-         return new Builder();
-      }
-
-      public static class Builder extends RuleBuilder<Builder, Rule> {
+      @Nullable
+      public abstract String name();
 
-         private String id;
+      @Nullable
+      public abstract Integer portRangeEnd();
 
-         public Builder id(String id) {
-            this.id = id;
-            return self();
-         }
+      @Nullable
+      public abstract Integer portRangeStart();
 
-         @Override
-         public Builder self() {
-            return this;
-         }
+      @Nullable
+      public abstract Protocol protocol();
 
-         @Override
-         public Rule build() {
-            checkFields();
-            return Rule.create(id, name, portRangeEnd, portRangeStart, protocol, sourceIp, sourceMac, targetIp);
-         }
+      @Nullable
+      public abstract String sourceIp();
 
-      }
-   }
+      @Nullable
+      public abstract String sourceMac();
 
-   @AutoValue
-   public abstract static class RuleWithIcmp implements FirewallRuleCommonProperties {
+      @Nullable
+      public abstract String targetIp();
 
       @Nullable
       public abstract Integer icmpCode();
@@ -288,76 +136,52 @@ public abstract class Firewall {
       @Nullable
       public abstract Integer icmpType();
 
-      public static RuleWithIcmp create(Integer icmpCode, Integer icmpType, String name, Integer portRangeEnd,
-              Integer portRangeStart, Protocol protocol, String sourceIp, String sourceMac, String targetIp) {
-         return new AutoValue_Firewall_RuleWithIcmp(name, portRangeEnd, portRangeStart, protocol, sourceIp, sourceMac,
-                 targetIp, icmpCode, icmpType);
-      }
-
       public static Builder builder() {
-         return new Builder();
+         return new AutoValue_Firewall_Rule.Builder()
+                 .protocol(Protocol.ANY);
       }
 
-      public static class Builder extends RuleBuilder<Builder, RuleWithIcmp> {
+      public Builder toBuilder() {
+         return new AutoValue_Firewall_Rule.Builder(this);
+      }
 
-         private Request.AddRulePayload.Builder parentBuilder;
+      @AutoValue.Builder
+      public abstract static class Builder {
 
-         private Integer icmpCode;
-         private Integer icmpType;
+         public abstract Builder id(String id);
 
-         public Builder() {
+         public abstract Builder name(String name);
 
-         }
+         public abstract Builder portRangeEnd(Integer portRangeEnd);
 
-         private Builder(Request.AddRulePayload.Builder parentBuilder) {
-            this.parentBuilder = parentBuilder;
-         }
+         public abstract Builder portRangeStart(Integer portRangeStart);
 
-         public Builder nextRule() {
-            this.parentBuilder.addRule(build());
-            return new Builder(parentBuilder);
-         }
+         public abstract Builder protocol(Protocol protocol);
 
-         public Request.AddRulePayload.Builder endRule() {
-            this.parentBuilder.addRule(build());
-            return parentBuilder;
-         }
+         public abstract Builder sourceIp(String sourceIp);
 
-         public Builder icmpCode(Integer icmpCode) {
-            this.icmpCode = icmpCode;
-            return this;
-         }
+         public abstract Builder sourceMac(String sourceMac);
 
-         public Builder icmpType(Integer icmpType) {
-            this.icmpType = icmpType;
-            return this;
-         }
+         public abstract Builder targetIp(String targetIp);
 
-         @Override
-         public Builder self() {
-            return this;
-         }
+         public abstract Builder icmpCode(Integer icmpCode);
 
-         @Override
-         public RuleWithIcmp build() {
-            checkFields();
-            return RuleWithIcmp.create(icmpCode, icmpType, name, portRangeEnd, portRangeStart, protocol,
-                    sourceIp, sourceMac, targetIp);
-         }
+         public abstract Builder icmpType(Integer icmpType);
 
-         @Override
-         protected void checkFields() {
-            super.checkFields();
-            checkIcmp();
-         }
+         abstract Rule autoBuild();
 
-         private void checkIcmp() {
-            if (icmpCode != null)
-               checkArgument(icmpCode >= 1 && icmpCode <= 254, "ICMP code must be 1 to 254");
-            if (icmpType != null)
-               checkArgument(icmpType >= 1 && icmpType <= 254, "ICMP type must be 1 to 254");
-            if (icmpCode != null || icmpType != null)
-               checkArgument(protocol == Protocol.ICMP, "ICMP code and types can only be set for ICMP protocol");
+         public Rule build() {
+            Rule rule = autoBuild();
+            if (rule.sourceIp() != null)
+               checkIp(rule.sourceIp());
+            if (rule.targetIp() != null)
+               checkIp(rule.targetIp());
+            if (rule.sourceMac() != null)
+               checkMacAddress(rule.sourceMac());
+            checkPortRange(rule.portRangeStart(), rule.portRangeEnd(), rule.protocol());
+            checkIcmp(rule.icmpType(), rule.icmpCode(), rule.protocol());
+
+            return rule;
          }
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
index 0987324..383a744 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
@@ -16,9 +16,10 @@
  */
 package org.jclouds.profitbricks.domain;
 
-import org.jclouds.profitbricks.domain.internal.Provisionable;
-
 import com.google.auto.value.AutoValue;
+import com.google.common.base.Enums;
+
+import org.jclouds.javax.annotation.Nullable;
 
 @AutoValue
 public abstract class Image implements Provisionable {
@@ -28,84 +29,99 @@ public abstract class Image implements Provisionable {
       HDD, CDROM, UNRECOGNIZED;
 
       public static Type fromValue(String v) {
-         try {
-            return valueOf(v);
-         } catch (IllegalArgumentException ex) {
-            return UNRECOGNIZED;
-         }
+         return Enums.getIfPresent(Type.class, v).or(UNRECOGNIZED);
       }
    }
 
+   public abstract String id();
+
+   public abstract String name();
+
+   public abstract float size(); // MB
+
+   public abstract Location location();
+
+   public abstract OsType osType();
+
    public abstract Type type();
 
-   public abstract boolean isPublic();
+   @Nullable
+   public abstract Boolean isPublic();
 
-   public abstract boolean isWriteable();
+   @Nullable
+   public abstract Boolean isWriteable();
 
-   public abstract boolean isBootable();
+   @Nullable
+   public abstract Boolean isBootable();
 
-   public static Image create(String id, String name, float size, Type type, Location location, OsType osType,
-           boolean isPublic, Boolean isWriteable, Boolean isBootable, Boolean cpuHotPlug, Boolean cpuHotUnPlug,
-           Boolean ramHotPlug, Boolean ramHotUnPlug, Boolean nicHotPlug, Boolean nicHotUnPlug,
-           Boolean discVirtioHotPlug, Boolean discVirtioHotUnPlug) {
-      return new AutoValue_Image(cpuHotPlug, cpuHotUnPlug, ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug,
-              discVirtioHotPlug, discVirtioHotUnPlug, id, name, size, location, osType, type, isPublic, isWriteable,
-              isBootable);
-   }
+   @Nullable
+   public abstract Boolean isCpuHotPlug();
+
+   @Nullable
+   public abstract Boolean isCpuHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isRamHotPlug();
+
+   @Nullable
+   public abstract Boolean isRamHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isNicHotPlug();
+
+   @Nullable
+   public abstract Boolean isNicHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isDiscVirtioHotPlug();
+
+   @Nullable
+   public abstract Boolean isDiscVirtioHotUnPlug();
 
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_Image.Builder();
    }
 
-   public Builder toBuilder() {
-      return builder().fromImage(this);
-   }
+   public abstract Builder toBuilder();
 
-   public static class Builder extends Provisionable.Builder<Builder, Image> {
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      private Type type;
-      private boolean isPublic;
-      private boolean isWriteable;
-      private boolean isBootable;
+      public abstract Builder id(String id);
 
-      public Builder type(Type type) {
-         this.type = type;
-         return this;
-      }
+      public abstract Builder name(String name);
 
-      public Builder isPublic(boolean isPublic) {
-         this.isPublic = isPublic;
-         return this;
-      }
+      public abstract Builder size(float size);
 
-      public Builder isWriteable(boolean isWriteable) {
-         this.isWriteable = isWriteable;
-         return this;
-      }
+      public abstract Builder location(Location location);
 
-      public Builder isBootable(boolean isBootable) {
-         this.isBootable = isBootable;
-         return this;
-      }
+      public abstract Builder osType(OsType osType);
 
-      @Override
-      public Image build() {
-         return Image.create(id, name, size, type, location, osType, isPublic, isWriteable, isBootable, cpuHotPlug, cpuHotUnPlug,
-                 ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
-      }
+      public abstract Builder type(Type type);
 
-      public Builder fromImage(Image in) {
-         return this.id(in.id()).isBootable(in.isBootable()).isCpuHotPlug(in.isCpuHotPlug()).isCpuHotUnPlug(in.isCpuHotUnPlug())
-                 .isDiscVirtioHotPlug(in.isDiscVirtioHotPlug()).isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug())
-                 .isNicHotPlug(in.isNicHotPlug()).isNicHotUnPlug(in.isNicHotUnPlug()).isPublic(in.isPublic())
-                 .isRamHotPlug(in.isRamHotPlug()).isRamHotUnPlug(in.isRamHotUnPlug()).isWriteable(in.isWriteable())
-                 .location(in.location()).name(in.name()).osType(in.osType()).size(in.size()).type(in.type());
-      }
+      public abstract Builder isPublic(Boolean isPublic);
 
-      @Override
-      public Builder self() {
-         return this;
-      }
+      public abstract Builder isWriteable(Boolean isWriteable);
+
+      public abstract Builder isBootable(Boolean isBootable);
+
+      public abstract Builder isCpuHotPlug(Boolean isCpuHotPlug);
+
+      public abstract Builder isCpuHotUnPlug(Boolean isCpuHotUnPlug);
+
+      public abstract Builder isRamHotPlug(Boolean isRamHotPlug);
+
+      public abstract Builder isRamHotUnPlug(Boolean isRamHotUnPlug);
+
+      public abstract Builder isNicHotPlug(Boolean isNicHotPlug);
+
+      public abstract Builder isNicHotUnPlug(Boolean isNicHotUnPlug);
+
+      public abstract Builder isDiscVirtioHotPlug(Boolean isDiscVirtioHotPlug);
+
+      public abstract Builder isDiscVirtioHotUnPlug(Boolean isDiscVirtioHotUnPlug);
+
+      public abstract Image build();
 
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java
index 47741ff..cc2c999 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java
@@ -16,9 +16,14 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import static org.jclouds.profitbricks.util.Preconditions.checkIp;
+import static org.jclouds.profitbricks.util.Preconditions.checkIps;
+
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
+
 import java.util.List;
+
 import org.jclouds.javax.annotation.Nullable;
 
 @AutoValue
@@ -30,51 +35,39 @@ public abstract class IpBlock {
 
    public abstract List<PublicIp> publicIps();
 
+   @Nullable
    public abstract List<String> ips();
 
-   public static IpBlock create(String id, Location location, List<PublicIp> publicIps, List<String> ips) {
-      return new AutoValue_IpBlock(id, location, publicIps, ips != null ? ImmutableList.copyOf(ips) : ImmutableList.<String>of());
-   }
-
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_IpBlock.Builder()
+              .publicIps(ImmutableList.<PublicIp>of())
+              .ips(ImmutableList.<String>of());
    }
 
-   public static final class Builder {
+   public abstract Builder toBuilder();
 
-      private String id;
-      private Location location;
-      private List<PublicIp> publicIps;
-      private List<String> ips;
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
+      public abstract Builder id(String id);
 
-      public Builder location(Location location) {
-         this.location = location;
-         return this;
-      }
+      public abstract Builder location(Location location);
 
-      public Builder publicIps(List<PublicIp> publicIps) {
-         this.publicIps = publicIps;
-         return this;
-      }
+      public abstract Builder publicIps(List<PublicIp> publicIps);
 
-      public Builder ips(List<String> ips) {
-         this.ips = ips;
-         return this;
-      }
+      public abstract Builder ips(List<String> ips);
+
+      abstract IpBlock autoBuild();
 
       public IpBlock build() {
-         return IpBlock.create(id, location, publicIps, ips);
-      }
+         IpBlock ipBlock = autoBuild();
+         checkIps(ipBlock.ips());
 
-      public Builder fromIpBlock(IpBlock in) {
-         return this.id(in.id()).location(in.location()).publicIps(in.publicIps()).ips(in.ips());
+         return ipBlock.toBuilder()
+                 .publicIps(ImmutableList.copyOf(ipBlock.publicIps()))
+                 .ips(ImmutableList.copyOf(ipBlock.ips()))
+                 .autoBuild();
       }
-
    }
 
    @AutoValue
@@ -85,41 +78,26 @@ public abstract class IpBlock {
       @Nullable
       public abstract String nicId();
 
-      public static PublicIp create(String ip, String nicId) {
-         return new AutoValue_IpBlock_PublicIp(ip, nicId);
-      }
-
       public static Builder builder() {
-         return new Builder();
-      }
-
-      public Builder toBuilder() {
-         return builder().fromPublicIp(this);
+         return new AutoValue_IpBlock_PublicIp.Builder();
       }
 
-      public static final class Builder {
+      @AutoValue.Builder
+      public abstract static class Builder {
 
-         private String ip;
-         private String nicId;
+         public abstract Builder ip(String ip);
 
-         public Builder ip(String ip) {
-            this.ip = ip;
-            return this;
-         }
+         public abstract Builder nicId(String nicId);
 
-         public Builder nicId(String nicId) {
-            this.nicId = nicId;
-            return this;
-         }
+         abstract PublicIp autoBuild();
 
          public PublicIp build() {
-            return PublicIp.create(ip, nicId);
-         }
+            PublicIp publicIp = autoBuild();
+            checkIp(publicIp.ip());
 
-         public Builder fromPublicIp(PublicIp in) {
-            return this.ip(in.ip()).nicId(in.nicId());
+            return publicIp;
          }
       }
-   }
 
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
index 843999d..863890b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
@@ -16,16 +16,17 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import static org.jclouds.profitbricks.util.Preconditions.checkIp;
+import static org.jclouds.profitbricks.util.Preconditions.checkLanId;
+
+import java.util.Date;
+import java.util.List;
+
 import com.google.auto.value.AutoValue;
 import com.google.common.base.Enums;
-import static com.google.common.base.Preconditions.checkArgument;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import static com.google.common.net.InetAddresses.isInetAddress;
-import org.jclouds.javax.annotation.Nullable;
 
-import java.util.Date;
-import java.util.List;
+import org.jclouds.javax.annotation.Nullable;
 
 @AutoValue
 public abstract class LoadBalancer {
@@ -59,7 +60,7 @@ public abstract class LoadBalancer {
    public abstract String ip();
 
    @Nullable
-   public abstract String lanId();
+   public abstract Integer lanId();
 
    @Nullable
    public abstract ProvisioningState state();
@@ -76,141 +77,76 @@ public abstract class LoadBalancer {
    @Nullable
    public abstract List<Firewall> firewalls();
 
-   public static LoadBalancer create(String id, String name, Algorithm algorithm, DataCenter dataCenter,
-           boolean internetAccess, String ip, String lanId, ProvisioningState state, Date creationTime,
-           Date lastModificationTime, List<Server> balancedServers, List<Firewall> firewalls) {
-      return new AutoValue_LoadBalancer(id, name, algorithm, dataCenter,
-              internetAccess, ip, lanId, state, creationTime, lastModificationTime,
-              balancedServers != null ? ImmutableList.copyOf(balancedServers) : ImmutableList.<Server>of(),
-              firewalls != null ? ImmutableList.copyOf(firewalls) : ImmutableList.<Firewall>of());
-   }
-
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_LoadBalancer.Builder()
+              .balancedServers(ImmutableList.<Server>of())
+              .firewalls(ImmutableList.<Firewall>of());
    }
 
-   private static void checkIp(String ip) {
-      if (ip != null)
-         checkArgument(isInetAddress(ip), "Invalid IP");
-   }
-
-   public static class Builder {
-
-      private String id;
-
-      private String name;
-
-      private Algorithm algorithm;
-
-      private DataCenter dataCenter;
-
-      private boolean internetAccess;
-
-      private String ip;
-
-      private String lanId;
-
-      private ProvisioningState state;
+   public abstract Builder toBuilder();
 
-      private Date creationTime;
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      private Date lastModificationTime;
+      public abstract Builder id(String id);
 
-      public List<Server> balancedServers;
+      public abstract Builder name(String name);
 
-      private List<Firewall> firewalls;
+      public abstract Builder algorithm(Algorithm algorithm);
 
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
-
-      public Builder name(String name) {
-         this.name = name;
-         return this;
-      }
-
-      public Builder algorithm(Algorithm algorithm) {
-         this.algorithm = algorithm;
-         return this;
-      }
+      public abstract Builder dataCenter(DataCenter dataCenter);
 
-      public Builder dataCenter(DataCenter dataCenter) {
-         this.dataCenter = dataCenter;
-         return this;
-      }
+      public abstract Builder internetAccess(Boolean internetAccess);
 
-      public Builder internetAccess(boolean internetAccess) {
-         this.internetAccess = internetAccess;
-         return this;
-      }
+      public abstract Builder ip(String ip);
 
-      public Builder ip(String ip) {
-         this.ip = ip;
-         return this;
-      }
+      public abstract Builder lanId(Integer lanId);
 
-      public Builder lanId(String lanId) {
-         this.lanId = lanId;
-         return this;
-      }
+      public abstract Builder creationTime(Date creationTime);
 
-      public Builder creationTime(Date creationTime) {
-         this.creationTime = creationTime;
-         return this;
-      }
+      public abstract Builder state(ProvisioningState state);
 
-      public Builder state(ProvisioningState state) {
-         this.state = state;
-         return this;
-      }
+      public abstract Builder lastModificationTime(Date lastModificationTime);
 
-      public Builder lastModificationTime(Date lastModificationTime) {
-         this.lastModificationTime = lastModificationTime;
-         return this;
-      }
+      public abstract Builder balancedServers(List<Server> balancedServers);
 
-      public Builder balancedServers(List<Server> balancedServers) {
-         this.balancedServers = balancedServers;
-         return this;
-      }
+      public abstract Builder firewalls(List<Firewall> firewalls);
 
-      public Builder firewalls(List<Firewall> firewalls) {
-         this.firewalls = firewalls;
-         return this;
-      }
+      abstract LoadBalancer autoBuild();
 
       public LoadBalancer build() {
-         checkIp(ip);
-         return LoadBalancer.create(id, name, algorithm, dataCenter, internetAccess,
-                 ip, lanId, state, creationTime, lastModificationTime, balancedServers, firewalls);
-      }
-
-      public Builder fromLoadBalancer(LoadBalancer in) {
-         return this.id(in.id()).name(in.name()).algorithm(in.algorithm())
-                 .dataCenter(in.dataCenter()).internetAccess(in.internetAccess())
-                 .ip(in.ip()).lanId(in.lanId()).state(in.state()).creationTime(in.creationTime())
-                 .lastModificationTime(in.lastModificationTime()).balancedServers(in.balancedServers())
-                 .firewalls(in.firewalls());
+         LoadBalancer loadBalancer = autoBuild();
+         if (loadBalancer.ip() != null)
+            checkIp(loadBalancer.ip());
+         if (loadBalancer.lanId() != null)
+            checkLanId(loadBalancer.lanId());
+
+         return loadBalancer.toBuilder()
+                 .balancedServers(ImmutableList.copyOf(loadBalancer.balancedServers()))
+                 .firewalls(ImmutableList.copyOf(loadBalancer.firewalls()))
+                 .autoBuild();
       }
    }
 
    public static final class Request {
 
       public static CreatePayload.Builder creatingBuilder() {
-         return new CreatePayload.Builder();
+         return new AutoValue_LoadBalancer_Request_CreatePayload.Builder()
+                 .serverIds(ImmutableList.<String>of())
+                 .algorithm(Algorithm.ROUND_ROBIN);
       }
 
       public static UpdatePayload.Builder updatingBuilder() {
-         return new UpdatePayload.Builder();
+         return new AutoValue_LoadBalancer_Request_UpdatePayload.Builder()
+                 .algorithm(Algorithm.ROUND_ROBIN);
       }
 
-      public static RegisterPayload.Builder registerBuilder() {
-         return new RegisterPayload.Builder();
+      public static RegisterPayload createRegisteringPaylod(String loadBalancerId, List<String> serverIds) {
+         return new AutoValue_LoadBalancer_Request_RegisterPayload(loadBalancerId, ImmutableList.copyOf(serverIds));
       }
 
-      public static DeregisterPayload.Builder deregisterBuilder() {
-         return new DeregisterPayload.Builder();
+      public static DeregisterPayload createDeregisteringPayload(String loadBalancerId, List<String> serverIds) {
+         return new AutoValue_LoadBalancer_Request_DeregisterPayload(loadBalancerId, ImmutableList.copyOf(serverIds));
       }
 
       @AutoValue
@@ -218,63 +154,48 @@ public abstract class LoadBalancer {
 
          public abstract String dataCenterId();
 
-         public abstract String loadBalancerName();
+         @Nullable
+         public abstract String name();
 
-         public abstract Algorithm loadBalancerAlgorithm();
+         public abstract Algorithm algorithm();
 
+         @Nullable
          public abstract String ip();
 
-         public abstract String lanId();
+         @Nullable
+         public abstract Integer lanId();
 
          public abstract List<String> serverIds();
+         
+         public abstract Builder toBuilder();
 
-         public static CreatePayload create(String dataCenterId, String loadBalancerName, Algorithm loadBalancerAlgorithm, String ip, String lanId, List<String> serverIds) {
-            return new AutoValue_LoadBalancer_Request_CreatePayload(dataCenterId, loadBalancerName, loadBalancerAlgorithm, ip, lanId,
-                    serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList());
-         }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public static class Builder {
+            public abstract Builder dataCenterId(String dataCenterId);
 
-            public String dataCenterId;
-            public String loadBalancerName;
-            public Algorithm loadBalancerAlgorithm;
-            public String ip;
-            public String lanId;
-            public List<String> serverIds;
+            public abstract Builder name(String name);
 
-            public Builder dataCenterId(String dataCenterId) {
-               this.dataCenterId = dataCenterId;
-               return this;
-            }
+            public abstract Builder algorithm(Algorithm algorithm);
 
-            public Builder loadBalancerName(String loadBalancerName) {
-               this.loadBalancerName = loadBalancerName;
-               return this;
-            }
+            public abstract Builder ip(String ip);
 
-            public Builder loadBalancerAlgorithm(Algorithm loadBalancerAlgorithm) {
-               this.loadBalancerAlgorithm = loadBalancerAlgorithm;
-               return this;
-            }
+            public abstract Builder lanId(Integer lanId);
 
-            public Builder ip(String ip) {
-               this.ip = ip;
-               return this;
-            }
+            public abstract Builder serverIds(List<String> serverIds);
 
-            public Builder lanId(String lanId) {
-               this.lanId = lanId;
-               return this;
-            }
-
-            public Builder serverIds(List<String> serverIds) {
-               this.serverIds = serverIds;
-               return this;
-            }
+            abstract CreatePayload autoBuild();
 
             public CreatePayload build() {
-               checkIp(ip);
-               return CreatePayload.create(dataCenterId, loadBalancerName, loadBalancerAlgorithm, ip, lanId, serverIds);
+               CreatePayload payload = autoBuild();
+               if (payload.ip() != null)
+                  checkIp(payload.ip());
+               if (payload.lanId() != null)
+                  checkLanId(payload.lanId());
+
+               return payload.toBuilder()
+                       .serverIds(ImmutableList.copyOf(payload.serverIds()))
+                       .autoBuild();
             }
          }
       }
@@ -282,67 +203,19 @@ public abstract class LoadBalancer {
       @AutoValue
       public abstract static class RegisterPayload {
 
-         public abstract List<String> serverIds();
-
          public abstract String id();
 
-         public static RegisterPayload create(List<String> serverIds, String id) {
-            return new AutoValue_LoadBalancer_Request_RegisterPayload(
-                    serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList(), id);
-         }
-
-         public static class Builder {
-
-            public List<String> serverIds;
-            public String id;
-
-            public Builder serverIds(List<String> serverIds) {
-               this.serverIds = serverIds;
-               return this;
-            }
-
-            public Builder id(String id) {
-               this.id = id;
-               return this;
-            }
+         public abstract List<String> serverIds();
 
-            public RegisterPayload build() {
-               return RegisterPayload.create(serverIds, id);
-            }
-         }
       }
 
       @AutoValue
       public abstract static class DeregisterPayload {
 
-         public abstract List<String> serverIds();
-
          public abstract String id();
 
-         public static DeregisterPayload create(List<String> serverIds, String id) {
-            return new AutoValue_LoadBalancer_Request_DeregisterPayload(
-                    serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList(), id);
-         }
-
-         public static class Builder {
-
-            public List<String> serverIds;
-            public String id;
-
-            public Builder serverIds(List<String> serverIds) {
-               this.serverIds = serverIds;
-               return this;
-            }
-
-            public Builder id(String id) {
-               this.id = id;
-               return this;
-            }
+         public abstract List<String> serverIds();
 
-            public DeregisterPayload build() {
-               return DeregisterPayload.create(serverIds, id);
-            }
-         }
       }
 
       @AutoValue
@@ -350,49 +223,33 @@ public abstract class LoadBalancer {
 
          public abstract String id();
 
+         @Nullable
          public abstract String name();
 
-         public abstract Algorithm loadBalancerAlgorithm();
+         public abstract Algorithm algorithm();
 
+         @Nullable
          public abstract String ip();
 
-         public static UpdatePayload create(String id, String name, Algorithm loadBalancerAlgorithm, String ip) {
-            return new AutoValue_LoadBalancer_Request_UpdatePayload(id, name, loadBalancerAlgorithm, ip);
-         }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public static class Builder {
+            public abstract Builder id(String id);
 
-            public String id;
+            public abstract Builder name(String name);
 
-            public String name;
+            public abstract Builder algorithm(Algorithm algorithm);
 
-            public Algorithm loadBalancerAlgorithm;
+            public abstract Builder ip(String ip);
 
-            public String ip;
-
-            public Builder id(String id) {
-               this.id = id;
-               return this;
-            }
-
-            public Builder loadBalancerName(String loadBalancerName) {
-               this.name = loadBalancerName;
-               return this;
-            }
-
-            public Builder loadBalancerAlgorithm(Algorithm loadBalancerAlgorithm) {
-               this.loadBalancerAlgorithm = loadBalancerAlgorithm;
-               return this;
-            }
-
-            public Builder ip(String ip) {
-               this.ip = ip;
-               return this;
-            }
+            abstract UpdatePayload autoBuild();
 
             public UpdatePayload build() {
-               checkIp(ip);
-               return UpdatePayload.create(id, name, loadBalancerAlgorithm, ip);
+               UpdatePayload payload = autoBuild();
+               if (payload.ip() != null)
+                  checkIp(payload.ip());
+
+               return payload;
             }
          }
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/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 52acaf2..6102a42 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
@@ -16,6 +16,8 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import com.google.common.base.Enums;
+
 public enum Location {
 
    DE_FKB("de/fkb", "Germany, Karlsruhe"),
@@ -41,11 +43,7 @@ public enum Location {
    }
 
    public static Location fromValue(String v) {
-      try {
-         return valueOf(v);
-      } catch (IllegalArgumentException ex) {
-         return UNRECOGNIZED;
-      }
+      return Enums.getIfPresent(Location.class, v).or(UNRECOGNIZED);
    }
 
    public static Location fromId(String id) {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
index 0f7427c..a7e421d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
@@ -16,14 +16,15 @@
  */
 package org.jclouds.profitbricks.domain;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.net.InetAddresses.isInetAddress;
+import static org.jclouds.profitbricks.util.Preconditions.checkIp;
+import static org.jclouds.profitbricks.util.Preconditions.checkIps;
+import static org.jclouds.profitbricks.util.Preconditions.checkLanId;
+import static org.jclouds.profitbricks.util.Preconditions.checkMacAddress;
 
 import java.util.List;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
 
 import org.jclouds.javax.annotation.Nullable;
 
@@ -39,9 +40,11 @@ public abstract class Nic {
    @Nullable
    public abstract String dataCenterId();
 
-   public abstract int lanId();
+   @Nullable
+   public abstract Integer lanId();
 
-   public abstract boolean internetAccess();
+   @Nullable
+   public abstract Boolean internetAccess();
 
    @Nullable
    public abstract String serverId();
@@ -53,9 +56,10 @@ public abstract class Nic {
    public abstract String macAddress();
 
    @Nullable
-   public abstract Firewall firewalls();
+   public abstract Firewall firewall();
 
-   public abstract boolean dhcpActive();
+   @Nullable
+   public abstract Boolean dhcpActive();
 
    @Nullable
    public abstract String gatewayIp();
@@ -63,158 +67,81 @@ public abstract class Nic {
    @Nullable
    public abstract ProvisioningState state();
 
-   public static Nic create(String id, String name, String dataCenterId, int lanId, boolean internetAccess,
-           String serverId, List<String> ips, String macAddress, Firewall firewall, boolean dhcpActive,
-           String gatewayIp, ProvisioningState state) {
-      return new AutoValue_Nic(id, name, dataCenterId, lanId, internetAccess, serverId,
-              ips != null ? ImmutableList.copyOf(ips) : ImmutableList.<String>of(), macAddress,
-              firewall, dhcpActive, gatewayIp, state);
-   }
-
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_Nic.Builder()
+              .ips(ImmutableList.<String>of());
    }
 
-   public Builder toBuilder() {
-      return builder().fromNic(this);
-   }
-
-   private static void checkIp(String ip) {
-      if (ip != null)
-         checkArgument(isInetAddress(ip), "Invalid IP");
-   }
-
-   private static void checkIps(List<String> ips) {
-      for (String ip : ips)
-         checkIp(ip);
-   }
+   public abstract Builder toBuilder();
 
-   public static class Builder {
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      public String id;
+      public abstract Builder id(String id);
 
-      public String name;
+      public abstract Builder name(String name);
 
-      public String dataCenterId;
+      public abstract Builder dataCenterId(String dataCenterId);
 
-      public int lanId;
+      public abstract Builder lanId(Integer lanId);
 
-      public boolean internetAccess;
+      public abstract Builder internetAccess(Boolean internetAccess);
 
-      public String serverId;
+      public abstract Builder serverId(String serverId);
 
-      @Nullable
-      public List<String> ips;
+      public abstract Builder ips(List<String> ips);
 
-      public String macAddress;
+      public abstract Builder macAddress(String macAddress);
 
-      public Firewall firewall;
+      public abstract Builder firewall(Firewall firewall);
 
-      public boolean dhcpActive;
+      public abstract Builder dhcpActive(Boolean dhcpActive);
 
-      public String gatewayIp;
+      public abstract Builder gatewayIp(String gatewayIp);
 
-      public ProvisioningState state;
+      public abstract Builder state(ProvisioningState state);
 
-      public Builder() {
-         this.ips = Lists.newArrayList();
-      }
-
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
-
-      public Builder name(String name) {
-         this.name = name;
-         return this;
-      }
-
-      public Builder dataCenterId(String dataCenterId) {
-         this.dataCenterId = dataCenterId;
-         return this;
-      }
-
-      public Builder lanId(int lanId) {
-         this.lanId = lanId;
-         return this;
-      }
-
-      public Builder internetAccess(boolean internetAccess) {
-         this.internetAccess = internetAccess;
-         return this;
-      }
-
-      public Builder serverId(String serverId) {
-         this.serverId = serverId;
-         return this;
-      }
-
-      public Builder ips(List<String> ips) {
-         this.ips = ips;
-         return this;
-      }
-
-      public Builder ip(String ip) {
-         this.ips.add(ip);
-         return this;
-      }
-
-      public Builder macAddress(String macAddress) {
-         this.macAddress = macAddress;
-         return this;
-      }
-
-      public Builder dhcpActive(boolean dhcpActive) {
-         this.dhcpActive = dhcpActive;
-         return this;
-      }
-
-      public Builder gatewayIp(String gatewayIp) {
-         this.gatewayIp = gatewayIp;
-         return this;
-      }
-
-      public Builder state(ProvisioningState state) {
-         this.state = state;
-         return this;
-      }
-
-      public Builder firewall(Firewall firewall) {
-         this.firewall = firewall;
-         return this;
-      }
+      abstract Nic autoBuild();
 
       public Nic build() {
-         checkIps(ips);
-         return Nic.create(id, name, dataCenterId, lanId, internetAccess, serverId, ips,
-                 macAddress, firewall, dhcpActive, gatewayIp, state);
-      }
+         Nic nic = autoBuild();
+         if (nic.ips() != null)
+            checkIps(nic.ips());
+         if (nic.gatewayIp() != null)
+            checkIp(nic.gatewayIp());
+         if (nic.lanId() != null)
+            checkLanId(nic.lanId());
+         if (nic.macAddress() != null)
+            checkMacAddress(nic.macAddress());
 
-      private Builder fromNic(Nic in) {
-         return this.id(in.id()).name(in.name()).lanId(in.lanId()).internetAccess(in.internetAccess())
-                 .serverId(in.serverId()).ips(in.ips()).macAddress(in.macAddress()).dhcpActive(in.dhcpActive())
-                 .gatewayIp(in.gatewayIp()).dataCenterId(dataCenterId);
+         return nic.toBuilder()
+                 .ips(ImmutableList.copyOf(nic.ips()))
+                 .autoBuild();
       }
+
    }
 
    public static final class Request {
 
       public static CreatePayload.Builder creatingBuilder() {
-         return new CreatePayload.Builder();
+         return new AutoValue_Nic_Request_CreatePayload.Builder();
       }
 
       public static UpdatePayload.Builder updatingBuilder() {
-         return new UpdatePayload.Builder();
+         return new AutoValue_Nic_Request_UpdatePayload.Builder();
       }
 
       public static SetInternetAccessPayload.Builder setInternetAccessBuilder() {
-         return new SetInternetAccessPayload.Builder();
+         return new AutoValue_Nic_Request_SetInternetAccessPayload.Builder();
       }
 
       @AutoValue
       public abstract static class CreatePayload {
 
+         public abstract String serverId();
+
+         public abstract int lanId();
+
          @Nullable
          public abstract String ip();
 
@@ -224,54 +151,30 @@ public abstract class Nic {
          @Nullable
          public abstract Boolean dhcpActive();
 
-         public abstract String serverId();
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public abstract int lanId();
+            public abstract Builder serverId(String serverId);
 
-         public static CreatePayload create(String ip, String name, Boolean dhcpActive, String serverId, int lanId) {
-            return new AutoValue_Nic_Request_CreatePayload(ip, name, dhcpActive, serverId, lanId);
-         }
+            public abstract Builder lanId(int lanId);
 
-         public static class Builder {
+            public abstract Builder ip(String ip);
 
-            private String ip;
-            private String name;
-            private Boolean dhcpActive;
-            private String serverId;
-            private int lanId;
+            public abstract Builder name(String name);
 
-            public Builder ip(String ip) {
-               this.ip = ip;
-               return this;
-            }
+            public abstract Builder dhcpActive(Boolean dhcpActive);
 
-            public Builder name(String name) {
-               this.name = name;
-               return this;
-            }
-
-            public Builder dhcpActive(Boolean dhcpActive) {
-               this.dhcpActive = dhcpActive;
-               return this;
-            }
-
-            public Builder serverId(String serverId) {
-               this.serverId = serverId;
-               return this;
-            }
-
-            public Builder lanId(int lanId) {
-               this.lanId = lanId;
-               return this;
-            }
+            abstract CreatePayload autoBuild();
 
             public CreatePayload build() {
-               checkIp(ip);
-               return CreatePayload.create(ip, name, dhcpActive, serverId, lanId);
-            }
+               CreatePayload payload = autoBuild();
+               if (payload.ip() != null)
+                  checkIp(payload.ip());
+               checkLanId(payload.lanId());
 
+               return payload;
+            }
          }
-
       }
 
       @AutoValue
@@ -288,48 +191,32 @@ public abstract class Nic {
          @Nullable
          public abstract Boolean dhcpActive();
 
-         public abstract int lanId();
+         @Nullable
+         public abstract Integer lanId();
 
-         public static UpdatePayload create(String id, String ip, String name, Boolean dhcpActive, int lanId) {
-            return new AutoValue_Nic_Request_UpdatePayload(id, ip, name, dhcpActive, lanId);
-         }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public static class Builder {
+            public abstract Builder id(String id);
 
-            private String id;
-            private String ip;
-            private String name;
-            private Boolean dhcpActive;
-            private int lanId;
+            public abstract Builder ip(String ip);
 
-            public Builder ip(String ip) {
-               this.ip = ip;
-               return this;
-            }
+            public abstract Builder name(String name);
 
-            public Builder name(String name) {
-               this.name = name;
-               return this;
-            }
-
-            public Builder dhcpActive(Boolean dhcpActive) {
-               this.dhcpActive = dhcpActive;
-               return this;
-            }
+            public abstract Builder dhcpActive(Boolean dhcpActive);
 
-            public Builder lanId(int lanId) {
-               this.lanId = lanId;
-               return this;
-            }
+            public abstract Builder lanId(Integer lanId);
 
-            public Builder id(String id) {
-               this.id = id;
-               return this;
-            }
+            abstract UpdatePayload autoBuild();
 
             public UpdatePayload build() {
-               checkIp(ip);
-               return UpdatePayload.create(id, ip, name, dhcpActive, lanId);
+               UpdatePayload payload = autoBuild();
+               if (payload.ip() != null)
+                  checkIp(payload.ip());
+               if (payload.lanId() != null)
+                  checkLanId(payload.lanId());
+
+               return payload;
             }
          }
       }
@@ -343,35 +230,19 @@ public abstract class Nic {
 
          public abstract boolean internetAccess();
 
-         public static SetInternetAccessPayload create(String dataCenterId, int lanId, boolean internetAccess) {
-            return new AutoValue_Nic_Request_SetInternetAccessPayload(dataCenterId, lanId, internetAccess);
-         }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public static class Builder {
+            public abstract Builder dataCenterId(String dataCenterId);
 
-            public String dataCenterId;
-            public int lanId;
-            public boolean internetAccess;
+            public abstract Builder lanId(int lanId);
 
-            public Builder dataCenterId(String dataCenterId) {
-               this.dataCenterId = dataCenterId;
-               return this;
-            }
+            public abstract Builder internetAccess(boolean internetAccess);
 
-            public Builder lanId(int lanId) {
-               this.lanId = lanId;
-               return this;
-            }
+            public abstract SetInternetAccessPayload build();
 
-            public Builder internetAccess(boolean internetAccess) {
-               this.internetAccess = internetAccess;
-               return this;
-            }
-
-            public SetInternetAccessPayload build() {
-               return SetInternetAccessPayload.create(dataCenterId, lanId, internetAccess);
-            }
          }
       }
    }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
index c21f1c4..25bc70b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
@@ -16,15 +16,13 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import com.google.common.base.Enums;
+
 public enum OsType {
 
    WINDOWS, LINUX, OTHER, UNRECOGNIZED;
 
    public static OsType fromValue(String v) {
-      try {
-         return valueOf(v);
-      } catch (IllegalArgumentException ex) {
-         return UNRECOGNIZED;
-      }
+      return Enums.getIfPresent(OsType.class, v).or(UNRECOGNIZED);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Provisionable.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Provisionable.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Provisionable.java
new file mode 100644
index 0000000..101f154
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Provisionable.java
@@ -0,0 +1,25 @@
+/*
+ * 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;
+
+/**
+ * Marker interface for {@link org.jclouds.profitbricks.domain.Image} and 
+ * {@link org.jclouds.profitbricks.domain.Snapshot}
+ */
+public interface Provisionable {
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/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 833e979..d00342e 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
@@ -16,15 +16,13 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import com.google.common.base.Enums;
+
 public enum ProvisioningState {
 
    INACTIVE, INPROCESS, AVAILABLE, DELETED, ERROR, UNRECOGNIZED;
 
    public static ProvisioningState fromValue(String value) {
-      try {
-         return valueOf(value);
-      } catch (IllegalArgumentException e) {
-         return UNRECOGNIZED;
-      }
+      return Enums.getIfPresent(ProvisioningState.class, value).or(UNRECOGNIZED);
    }
 }