added static ip and vlan collections to cloudsigma
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaAsyncClient.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaAsyncClient.java
index 5e683d6..9df39be 100644
--- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaAsyncClient.java
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaAsyncClient.java
@@ -31,6 +31,7 @@
 import org.jclouds.cloudsigma.binders.BindCloneDriveOptionsToPlainTextString;
 import org.jclouds.cloudsigma.binders.BindDriveDataToPlainTextString;
 import org.jclouds.cloudsigma.binders.BindDriveToPlainTextString;
+import org.jclouds.cloudsigma.binders.BindNameToPayload;
 import org.jclouds.cloudsigma.binders.BindServerToPlainTextString;
 import org.jclouds.cloudsigma.domain.Drive;
 import org.jclouds.cloudsigma.domain.DriveData;
@@ -38,12 +39,19 @@
 import org.jclouds.cloudsigma.domain.ProfileInfo;
 import org.jclouds.cloudsigma.domain.Server;
 import org.jclouds.cloudsigma.domain.ServerInfo;
+import org.jclouds.cloudsigma.domain.StaticIPInfo;
+import org.jclouds.cloudsigma.domain.VLANInfo;
 import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToDriveInfo;
 import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToProfileInfo;
 import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToServerInfo;
+import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToStaticIPInfo;
+import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToVLANInfo;
 import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet;
 import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToServerInfoSet;
+import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet;
+import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet;
 import org.jclouds.cloudsigma.functions.SplitNewlines;
+import org.jclouds.cloudsigma.functions.SplitNewlinesAndReturnSecondField;
 import org.jclouds.cloudsigma.options.CloneDriveOptions;
 import org.jclouds.http.filters.BasicAuthentication;
 import org.jclouds.rest.annotations.BinderParam;
@@ -242,4 +250,98 @@
    @Path("/drives/{uuid}/destroy")
    @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
    ListenableFuture<Void> destroyDrive(@PathParam("uuid") String uuid);
+
+   /**
+    * @see CloudSigmaClient#createVLAN
+    */
+   @POST
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   @ResponseParser(KeyValuesDelimitedByBlankLinesToVLANInfo.class)
+   @Path("/resources/vlan/create")
+   ListenableFuture<VLANInfo> createVLAN(@BinderParam(BindNameToPayload.class) String name);
+
+   /**
+    * @see CloudSigmaClient#listVLANInfo
+    */
+   @GET
+   @Path("/resources/vlan/info")
+   @ResponseParser(ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.class)
+   ListenableFuture<Set<VLANInfo>> listVLANInfo();
+
+   /**
+    * @see CloudSigmaClient#getVLANInfo
+    */
+   @GET
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   @ResponseParser(KeyValuesDelimitedByBlankLinesToVLANInfo.class)
+   @Path("/resources/vlan/{uuid}/info")
+   ListenableFuture<VLANInfo> getVLANInfo(@PathParam("uuid") String uuid);
+
+   /**
+    * @see CloudSigmaClient#setVLANConfiguration
+    */
+   @POST
+   @ResponseParser(KeyValuesDelimitedByBlankLinesToVLANInfo.class)
+   @Path("/resources/vlan/{uuid}/set")
+   ListenableFuture<VLANInfo> renameVLAN(@PathParam("uuid") String uuid,
+         @BinderParam(BindNameToPayload.class) String name);
+
+   /**
+    * @see CloudSigmaClient#listVLANs
+    */
+   @GET
+   @Path("/resources/vlan/list")
+   @ResponseParser(SplitNewlinesAndReturnSecondField.class)
+   ListenableFuture<Set<String>> listVLANs();
+
+   /**
+    * @see CloudSigmaClient#destroyVLAN
+    */
+   @POST
+   @Path("/resources/vlan/{uuid}/destroy")
+   @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
+   ListenableFuture<Void> destroyVLAN(@PathParam("uuid") String uuid);
+
+   /**
+    * @see CloudSigmaClient#createStaticIP
+    */
+   @POST
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   @ResponseParser(KeyValuesDelimitedByBlankLinesToStaticIPInfo.class)
+   @Path("/resources/ip/create")
+   ListenableFuture<StaticIPInfo> createStaticIP();
+
+   /**
+    * @see CloudSigmaClient#listStaticIPInfo
+    */
+   @GET
+   @Path("/resources/ip/info")
+   @ResponseParser(ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet.class)
+   ListenableFuture<Set<StaticIPInfo>> listStaticIPInfo();
+
+   /**
+    * @see CloudSigmaClient#getStaticIPInfo
+    */
+   @GET
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   @ResponseParser(KeyValuesDelimitedByBlankLinesToStaticIPInfo.class)
+   @Path("/resources/ip/{uuid}/info")
+   ListenableFuture<StaticIPInfo> getStaticIPInfo(@PathParam("uuid") String uuid);
+
+   /**
+    * @see CloudSigmaClient#listStaticIPs
+    */
+   @GET
+   @Path("/resources/ip/list")
+   @ResponseParser(SplitNewlinesAndReturnSecondField.class)
+   ListenableFuture<Set<String>> listStaticIPs();
+
+   /**
+    * @see CloudSigmaClient#destroyStaticIP
+    */
+   @POST
+   @Path("/resources/ip/{uuid}/destroy")
+   @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
+   ListenableFuture<Void> destroyStaticIP(@PathParam("uuid") String uuid);
+
 }
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaClient.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaClient.java
index 7540990..715dba0 100644
--- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaClient.java
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaClient.java
@@ -28,6 +28,8 @@
 import org.jclouds.cloudsigma.domain.ProfileInfo;
 import org.jclouds.cloudsigma.domain.Server;
 import org.jclouds.cloudsigma.domain.ServerInfo;
+import org.jclouds.cloudsigma.domain.StaticIPInfo;
+import org.jclouds.cloudsigma.domain.VLANInfo;
 import org.jclouds.cloudsigma.options.CloneDriveOptions;
 import org.jclouds.concurrent.Timeout;
 
@@ -40,7 +42,7 @@
  * @author Adrian Cole
  */
 @Timeout(duration = 60, timeUnit = TimeUnit.SECONDS)
-public interface CloudSigmaClient  {
+public interface CloudSigmaClient {
 
    /**
     * Get profile info
@@ -48,14 +50,14 @@
     * @return info or null, if not found
     */
    ProfileInfo getProfileInfo();
-   
+
    /**
     * list of server uuids in your account
     * 
     * @return or empty set if no servers are found
     */
    Set<String> listServers();
-   
+
    /**
     * Get all servers info
     * 
@@ -220,5 +222,88 @@
     */
    DriveInfo cloneDrive(String sourceUuid, String newName, CloneDriveOptions... options);
 
+   /**
+    * list of vlan uuids in your account
+    * 
+    * @return or empty set if no vlans are found
+    */
+   Set<String> listVLANs();
+
+   /**
+    * Get all vlans info
+    * 
+    * @return or empty set if no vlans are found
+    */
+   Set<? extends VLANInfo> listVLANInfo();
+
+   /**
+    * @param uuid
+    *           what to get
+    * @return null, if not found
+    */
+   VLANInfo getVLANInfo(String uuid);
+
+   /**
+    * create a new vlan
+    * 
+    * @param vlan
+    * @return newly created vlan
+    */
+   VLANInfo createVLAN(String name);
+
+   /**
+    * set vlan configuration
+    * 
+    * @param uuid
+    *           what vlan to change
+    * @param newName
+    *           what the new name is
+    * @return new data
+    */
+   VLANInfo renameVLAN(String uuid, String newName);
+
+   /**
+    * Destroy a vlan
+    * 
+    * @param uuid
+    *           what to destroy
+    */
+   void destroyVLAN(String uuid);
+
+   /**
+    * list of ip uuids in your account
+    * 
+    * @return or empty set if no ips are found
+    */
+   Set<String> listStaticIPs();
+
+   /**
+    * Get all ips info
+    * 
+    * @return or empty set if no ips are found
+    */
+   Set<? extends StaticIPInfo> listStaticIPInfo();
+
+   /**
+    * @param uuid
+    *           what to get
+    * @return null, if not found
+    */
+   StaticIPInfo getStaticIPInfo(String uuid);
+
+   /**
+    * create a new ip
+    * 
+    * @return newly created ip
+    */
+   StaticIPInfo createStaticIP();
+
+   /**
+    * Destroy a ip
+    * 
+    * @param uuid
+    *           what to destroy
+    */
+   void destroyStaticIP(String uuid);
 
 }
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/binders/BindNameToPayload.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/binders/BindNameToPayload.java
new file mode 100644
index 0000000..25df2ab
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/binders/BindNameToPayload.java
@@ -0,0 +1,44 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.jclouds.cloudsigma.binders;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Singleton;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.Binder;
+
+/**
+ * 
+ * @author Adrian Cole
+ * 
+ */
+@Singleton
+public class BindNameToPayload implements Binder {
+
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object payload) {
+      request.setPayload("name " + checkNotNull(payload, "name") + "\n");
+      request.getPayload().getContentMetadata().setContentType(MediaType.TEXT_PLAIN);
+      return request;
+   }
+}
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/StaticIPInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/StaticIPInfo.java
new file mode 100644
index 0000000..0285460
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/StaticIPInfo.java
@@ -0,0 +1,231 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not user 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.cloudsigma.domain;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Set;
+
+import javax.annotation.Nullable;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+public class StaticIPInfo {
+   public static class Builder {
+      protected String ip;
+      protected String user;
+      protected String netmask;
+      protected Set<String> nameservers = ImmutableSet.of();
+      protected String gateway;
+
+      public Builder ip(String ip) {
+         this.ip = ip;
+         return this;
+      }
+
+      public Builder user(String user) {
+         this.user = user;
+         return this;
+      }
+
+      public Builder nameservers(Iterable<String> nameservers) {
+         this.nameservers = ImmutableSet.copyOf(checkNotNull(nameservers, "nameservers"));
+         return this;
+      }
+
+      public Builder gateway(String gateway) {
+         this.gateway = gateway;
+         return this;
+      }
+
+      public Builder netmask(String netmask) {
+         this.netmask = netmask;
+         return this;
+      }
+
+      public StaticIPInfo build() {
+         return new StaticIPInfo(ip, user, netmask, nameservers, gateway);
+      }
+
+      @Override
+      public int hashCode() {
+         final int prime = 31;
+         int result = 1;
+         result = prime * result + ((gateway == null) ? 0 : gateway.hashCode());
+         result = prime * result + ((nameservers == null) ? 0 : nameservers.hashCode());
+         result = prime * result + ((netmask == null) ? 0 : netmask.hashCode());
+         result = prime * result + ((user == null) ? 0 : user.hashCode());
+         result = prime * result + ((ip == null) ? 0 : ip.hashCode());
+         return result;
+      }
+
+      @Override
+      public boolean equals(Object obj) {
+         if (this == obj)
+            return true;
+         if (obj == null)
+            return false;
+         if (getClass() != obj.getClass())
+            return false;
+         Builder other = (Builder) obj;
+         if (gateway == null) {
+            if (other.gateway != null)
+               return false;
+         } else if (!gateway.equals(other.gateway))
+            return false;
+         if (nameservers == null) {
+            if (other.nameservers != null)
+               return false;
+         } else if (!nameservers.equals(other.nameservers))
+            return false;
+         if (netmask == null) {
+            if (other.netmask != null)
+               return false;
+         } else if (!netmask.equals(other.netmask))
+            return false;
+         if (user == null) {
+            if (other.user != null)
+               return false;
+         } else if (!user.equals(other.user))
+            return false;
+         if (ip == null) {
+            if (other.ip != null)
+               return false;
+         } else if (!ip.equals(other.ip))
+            return false;
+         return true;
+      }
+   }
+
+   protected final String ip;
+   protected final String user;
+   protected final String netmask;
+   protected final Set<String> nameservers;
+   protected final String gateway;
+
+   public StaticIPInfo(String ip, String user, String netmask, Iterable<String> nameservers, String gateway) {
+      this.ip = checkNotNull(ip, "ip");
+      this.user = checkNotNull(user, "user");
+      this.netmask = checkNotNull(netmask, "netmask");
+      this.nameservers = ImmutableSet.copyOf(checkNotNull(nameservers, "nameservers"));
+      this.gateway = checkNotNull(gateway, "gateway");
+   }
+
+   /**
+    * 
+    * @return ip of the ip.
+    */
+   @Nullable
+   public String getAddress() {
+      return ip;
+   }
+
+   /**
+    * 
+    * @return user owning the ip
+    */
+   public String getUser() {
+      return user;
+   }
+
+   /**
+    * 
+    * @return netmask of the ip
+    */
+   public String getNetmask() {
+      return netmask;
+   }
+
+   /**
+    * 
+    * @return nameservers of the ip
+    */
+   public Set<String> getNameservers() {
+      return nameservers;
+   }
+
+   /**
+    * 
+    * @return gateway of the ip
+    */
+   public String getGateway() {
+      return gateway;
+   }
+
+   @Override
+   public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((gateway == null) ? 0 : gateway.hashCode());
+      result = prime * result + ((nameservers == null) ? 0 : nameservers.hashCode());
+      result = prime * result + ((netmask == null) ? 0 : netmask.hashCode());
+      result = prime * result + ((user == null) ? 0 : user.hashCode());
+      result = prime * result + ((ip == null) ? 0 : ip.hashCode());
+      return result;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      StaticIPInfo other = (StaticIPInfo) obj;
+      if (gateway == null) {
+         if (other.gateway != null)
+            return false;
+      } else if (!gateway.equals(other.gateway))
+         return false;
+      if (nameservers == null) {
+         if (other.nameservers != null)
+            return false;
+      } else if (!nameservers.equals(other.nameservers))
+         return false;
+      if (netmask == null) {
+         if (other.netmask != null)
+            return false;
+      } else if (!netmask.equals(other.netmask))
+         return false;
+      if (user == null) {
+         if (other.user != null)
+            return false;
+      } else if (!user.equals(other.user))
+         return false;
+      if (ip == null) {
+         if (other.ip != null)
+            return false;
+      } else if (!ip.equals(other.ip))
+         return false;
+      return true;
+   }
+
+   @Override
+   public String toString() {
+      return "[ip=" + ip + ", user=" + user + ", netmask=" + netmask + ", nameservers="
+            + nameservers + ", gateway=" + gateway + "]";
+   }
+
+}
\ No newline at end of file
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/VLANInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/VLANInfo.java
new file mode 100644
index 0000000..15d6d2a
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/VLANInfo.java
@@ -0,0 +1,166 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not user 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.cloudsigma.domain;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Nullable;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+public class VLANInfo {
+   public static class Builder {
+      protected String uuid;
+      protected String name;
+      protected String user;
+
+      public Builder uuid(String uuid) {
+         this.uuid = uuid;
+         return this;
+      }
+
+      public Builder name(String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder user(String user) {
+         this.user = user;
+         return this;
+      }
+
+      public VLANInfo build() {
+         return new VLANInfo(uuid, name, user);
+      }
+
+      @Override
+      public int hashCode() {
+         final int prime = 31;
+         int result = 1;
+         result = prime * result + ((name == null) ? 0 : name.hashCode());
+         result = prime * result + ((user == null) ? 0 : user.hashCode());
+         result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
+         return result;
+      }
+
+      @Override
+      public boolean equals(Object obj) {
+         if (this == obj)
+            return true;
+         if (obj == null)
+            return false;
+         if (getClass() != obj.getClass())
+            return false;
+         Builder other = (Builder) obj;
+         if (name == null) {
+            if (other.name != null)
+               return false;
+         } else if (!name.equals(other.name))
+            return false;
+         if (user == null) {
+            if (other.user != null)
+               return false;
+         } else if (!user.equals(other.user))
+            return false;
+         if (uuid == null) {
+            if (other.uuid != null)
+               return false;
+         } else if (!uuid.equals(other.uuid))
+            return false;
+         return true;
+      }
+   }
+
+   @Nullable
+   protected final String uuid;
+   protected final String name;
+   protected final String user;
+
+   public VLANInfo(String uuid, String name, String user) {
+      this.uuid = checkNotNull(uuid, "uuid");
+      this.name = checkNotNull(name, "name");
+      this.user = checkNotNull(user, "user");
+   }
+
+   /**
+    * 
+    * @return uuid of the vlan.
+    */
+   @Nullable
+   public String getUuid() {
+      return uuid;
+   }
+
+   /**
+    * 
+    * @return name of the vlan
+    */
+   public String getName() {
+      return name;
+   }
+
+   /**
+    * 
+    * @return user owning the vlan
+    */
+   public String getUser() {
+      return user;
+   }
+
+   @Override
+   public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((name == null) ? 0 : name.hashCode());
+      result = prime * result + ((user == null) ? 0 : user.hashCode());
+      return result;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      VLANInfo other = (VLANInfo) obj;
+      if (name == null) {
+         if (other.name != null)
+            return false;
+      } else if (!name.equals(other.name))
+         return false;
+      if (user == null) {
+         if (other.user != null)
+            return false;
+      } else if (!user.equals(other.user))
+         return false;
+
+      return true;
+   }
+
+   @Override
+   public String toString() {
+      return "[uuid=" + uuid + ", name=" + name + ", user=" + user + "]";
+   }
+
+}
\ No newline at end of file
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToStaticIPInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToStaticIPInfo.java
new file mode 100644
index 0000000..32d8f9a
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToStaticIPInfo.java
@@ -0,0 +1,53 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.jclouds.cloudsigma.functions;
+
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudsigma.domain.StaticIPInfo;
+import org.jclouds.http.HttpResponse;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Singleton
+public class KeyValuesDelimitedByBlankLinesToStaticIPInfo implements Function<HttpResponse, StaticIPInfo> {
+   private final ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet setParser;
+
+   @Inject
+   public KeyValuesDelimitedByBlankLinesToStaticIPInfo(ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet setParser) {
+      this.setParser = setParser;
+   }
+
+   @Override
+   public StaticIPInfo apply(HttpResponse response) {
+      Set<StaticIPInfo> drives = setParser.apply(response);
+      if (drives.size() == 0)
+         return null;
+      return Iterables.get(drives, 0);
+   }
+}
\ No newline at end of file
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfo.java
new file mode 100644
index 0000000..0856c2e
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfo.java
@@ -0,0 +1,53 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.jclouds.cloudsigma.functions;
+
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudsigma.domain.VLANInfo;
+import org.jclouds.http.HttpResponse;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Singleton
+public class KeyValuesDelimitedByBlankLinesToVLANInfo implements Function<HttpResponse, VLANInfo> {
+   private final ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet setParser;
+
+   @Inject
+   public KeyValuesDelimitedByBlankLinesToVLANInfo(ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet setParser) {
+      this.setParser = setParser;
+   }
+
+   @Override
+   public VLANInfo apply(HttpResponse response) {
+      Set<VLANInfo> drives = setParser.apply(response);
+      if (drives.size() == 0)
+         return null;
+      return Iterables.get(drives, 0);
+   }
+}
\ No newline at end of file
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet.java
new file mode 100644
index 0000000..a754299
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet.java
@@ -0,0 +1,60 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.jclouds.cloudsigma.functions;
+
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudsigma.domain.StaticIPInfo;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.http.functions.ReturnStringIf2xx;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Singleton
+public class ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet implements Function<HttpResponse, Set<StaticIPInfo>> {
+   private final ReturnStringIf2xx returnStringIf200;
+   private final ListOfKeyValuesDelimitedByBlankLinesToListOfMaps mapConverter;
+   private final MapToStaticIPInfo mapToProfile;
+
+   @Inject
+   ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet(ReturnStringIf2xx returnStringIf200,
+         ListOfKeyValuesDelimitedByBlankLinesToListOfMaps mapConverter, MapToStaticIPInfo mapToProfile) {
+      this.returnStringIf200 = returnStringIf200;
+      this.mapConverter = mapConverter;
+      this.mapToProfile = mapToProfile;
+   }
+
+   @Override
+   public Set<StaticIPInfo> apply(HttpResponse response) {
+      String text = returnStringIf200.apply(response);
+      if (text == null || text.trim().equals(""))
+         return ImmutableSet.<StaticIPInfo> of();
+      return ImmutableSet.copyOf(Iterables.transform(mapConverter.apply(text), mapToProfile));
+   }
+}
\ No newline at end of file
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.java
new file mode 100644
index 0000000..f87a496
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.java
@@ -0,0 +1,60 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.jclouds.cloudsigma.functions;
+
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudsigma.domain.VLANInfo;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.http.functions.ReturnStringIf2xx;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Singleton
+public class ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet implements Function<HttpResponse, Set<VLANInfo>> {
+   private final ReturnStringIf2xx returnStringIf200;
+   private final ListOfKeyValuesDelimitedByBlankLinesToListOfMaps mapConverter;
+   private final MapToVLANInfo mapToProfile;
+
+   @Inject
+   ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet(ReturnStringIf2xx returnStringIf200,
+         ListOfKeyValuesDelimitedByBlankLinesToListOfMaps mapConverter, MapToVLANInfo mapToProfile) {
+      this.returnStringIf200 = returnStringIf200;
+      this.mapConverter = mapConverter;
+      this.mapToProfile = mapToProfile;
+   }
+
+   @Override
+   public Set<VLANInfo> apply(HttpResponse response) {
+      String text = returnStringIf200.apply(response);
+      if (text == null || text.trim().equals(""))
+         return ImmutableSet.<VLANInfo> of();
+      return ImmutableSet.copyOf(Iterables.transform(mapConverter.apply(text), mapToProfile));
+   }
+}
\ No newline at end of file
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToStaticIPInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToStaticIPInfo.java
new file mode 100644
index 0000000..13e3fab
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToStaticIPInfo.java
@@ -0,0 +1,63 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.jclouds.cloudsigma.functions;
+
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudsigma.domain.StaticIPInfo;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Function;
+import com.google.common.base.Splitter;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Singleton
+public class MapToStaticIPInfo implements Function<Map<String, String>, StaticIPInfo> {
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   @Override
+   public StaticIPInfo apply(Map<String, String> from) {
+      if (from.size() == 0)
+         return null;
+      if (from.size() == 0)
+         return null;
+      StaticIPInfo.Builder builder = new StaticIPInfo.Builder();
+      builder.ip(from.get("resource"));
+      builder.user(from.get("user"));
+      builder.netmask(from.get("netmask"));
+      builder.nameservers(Splitter.on(' ').split(from.get("nameserver")));
+      builder.gateway(from.get("gateway"));
+
+      try {
+         return builder.build();
+      } catch (NullPointerException e) {
+         logger.trace("entry missing data: %s; %s", e.getMessage(), from);
+         return null;
+      }
+   }
+}
\ No newline at end of file
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToVLANInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToVLANInfo.java
new file mode 100644
index 0000000..0f6953a
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToVLANInfo.java
@@ -0,0 +1,59 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.jclouds.cloudsigma.functions;
+
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.inject.Singleton;
+
+import org.jclouds.cloudsigma.domain.VLANInfo;
+import org.jclouds.logging.Logger;
+
+import com.google.common.base.Function;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Singleton
+public class MapToVLANInfo implements Function<Map<String, String>, VLANInfo> {
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   @Override
+   public VLANInfo apply(Map<String, String> from) {
+      if (from.size() == 0)
+         return null;
+      if (from.size() == 0)
+         return null;
+      VLANInfo.Builder builder = new VLANInfo.Builder();
+      builder.uuid(from.get("resource"));
+      builder.name(from.get("name"));
+      builder.user(from.get("user"));
+     try {
+         return builder.build();
+      } catch (NullPointerException e) {
+         logger.trace("entry missing data: %s; %s", e.getMessage(), from);
+         return null;
+      }
+   }
+}
\ No newline at end of file
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlines.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlines.java
index b87fd5e..9c6cedd 100644
--- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlines.java
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlines.java
@@ -44,7 +44,7 @@
    private final ReturnStringIf2xx returnStringIf200;
 
    @Inject
-   SplitNewlines(ReturnStringIf2xx returnStringIf200) {
+   protected SplitNewlines(ReturnStringIf2xx returnStringIf200) {
       this.returnStringIf200 = returnStringIf200;
    }
 
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlinesAndReturnSecondField.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlinesAndReturnSecondField.java
new file mode 100644
index 0000000..0d098fd
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlinesAndReturnSecondField.java
@@ -0,0 +1,67 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.jclouds.cloudsigma.functions;
+
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.HttpResponse;
+import org.jclouds.http.functions.ReturnStringIf2xx;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicates;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Singleton
+public class SplitNewlinesAndReturnSecondField extends SplitNewlines {
+
+   @Inject
+   SplitNewlinesAndReturnSecondField(ReturnStringIf2xx returnStringIf200) {
+      super(returnStringIf200);
+   }
+
+   @Override
+   public Set<String> apply(HttpResponse response) {
+      return ImmutableSet.copyOf(Iterables.filter(
+            Iterables.transform(super.apply(response), new Function<String, String>() {
+
+               @Override
+               public String apply(String arg0) {
+                  if (arg0 == null)
+                     return null;
+                  Iterable<String> parts = Splitter.on(' ').split(arg0);
+                  if (Iterables.size(parts) == 2)
+                     return Iterables.get(parts, 1);
+                  else if (Iterables.size(parts) == 1)
+                     return Iterables.get(parts, 0);
+                  return null;
+               }
+
+            }), Predicates.notNull()));
+   }
+}
\ No newline at end of file
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java
index 99c499a..91f9636 100644
--- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java
@@ -64,6 +64,8 @@
             if ((command.getCurrentRequest().getEndpoint().getPath().endsWith("/info"))
                   || (message != null && message.indexOf("could not be found") != -1))
                exception = new ResourceNotFoundException(message, exception);
+            else if (message != null && message.indexOf("currently in use") != -1)
+               exception = new IllegalStateException(message, exception);
             else
                exception = new IllegalArgumentException(message, exception);
             break;
diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/util/Servers.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/util/Servers.java
index e452ee7..9234aed 100644
--- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/util/Servers.java
+++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/util/Servers.java
@@ -45,10 +45,28 @@
     * @return a builder for a persistent 1Ghz 512m server with DHCP enabled network.
     */
    public static Server.Builder small(String name, String driveUuuid, String vncPassword) {
+      return smallWithStaticIP(name, driveUuuid, vncPassword, "auto");
+   }
+
+   /**
+    * Helper to create a small persistent server
+    * 
+    * @param name
+    *           what to name the server
+    * @param driveUuuid
+    *           id of the boot drive
+    * @param vncPassword
+    *           password for vnc
+    * @param ip
+    *           static IP
+    * @return a builder for a persistent 1Ghz 512m server with DHCP enabled network.
+    */
+   public static Server.Builder smallWithStaticIP(String name, String driveUuuid, String vncPassword, String ip) {
       return new Server.Builder().name(name).cpu(1000).mem(512).persistent(true)
             .devices(ImmutableMap.of("ide:0:0", new IDEDevice.Builder(0, 0).uuid(driveUuuid).build()))
             .bootDeviceIds(ImmutableSet.of("ide:0:0"))
-            .nics(ImmutableSet.of(new NIC.Builder().model(Model.E1000).dhcp("auto").build()))
+            .nics(ImmutableSet.of(new NIC.Builder().model(Model.E1000).dhcp(ip).build()))
             .vnc(new VNC(null, vncPassword, false));
    }
+
 }
\ No newline at end of file
diff --git a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaAsyncClientTest.java b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaAsyncClientTest.java
index 8ea9198..6772a83 100644
--- a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaAsyncClientTest.java
+++ b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaAsyncClientTest.java
@@ -33,9 +33,14 @@
 import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToDriveInfo;
 import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToProfileInfo;
 import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToServerInfo;
+import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToStaticIPInfo;
+import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToVLANInfo;
 import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet;
 import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToServerInfoSet;
+import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet;
+import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet;
 import org.jclouds.cloudsigma.functions.SplitNewlines;
+import org.jclouds.cloudsigma.functions.SplitNewlinesAndReturnSecondField;
 import org.jclouds.cloudsigma.options.CloneDriveOptions;
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.filters.BasicAuthentication;
@@ -77,6 +82,7 @@
       checkFilters(httpRequest);
 
    }
+
    public void testListStandardDrives() throws SecurityException, NoSuchMethodException, IOException {
       Method method = CloudSigmaAsyncClient.class.getMethod("listStandardDrives");
       HttpRequest httpRequest = processor.createRequest(method);
@@ -208,8 +214,8 @@
 
    public void testSetDriveData() throws SecurityException, NoSuchMethodException, IOException {
       Method method = CloudSigmaAsyncClient.class.getMethod("setDriveData", String.class, DriveData.class);
-      HttpRequest httpRequest = processor.createRequest(method, "100",
-            new DriveData.Builder().name("foo").size(10000l).use(ImmutableList.of("production", "candy")).build());
+      HttpRequest httpRequest = processor.createRequest(method, "100", new DriveData.Builder().name("foo").size(10000l)
+            .use(ImmutableList.of("production", "candy")).build());
 
       assertRequestLineEquals(httpRequest, "POST https://api.cloudsigma.com/drives/100/set HTTP/1.1");
       assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
@@ -283,8 +289,7 @@
 
    public void testCreateServer() throws SecurityException, NoSuchMethodException, IOException {
       Method method = CloudSigmaAsyncClient.class.getMethod("createServer", Server.class);
-      HttpRequest httpRequest = processor.createRequest(method,
-            BindServerToPlainTextStringTest.SERVER);
+      HttpRequest httpRequest = processor.createRequest(method, BindServerToPlainTextStringTest.SERVER);
 
       assertRequestLineEquals(httpRequest, "POST https://api.cloudsigma.com/servers/create HTTP/1.1");
       assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
@@ -300,8 +305,7 @@
 
    public void testSetServerConfiguration() throws SecurityException, NoSuchMethodException, IOException {
       Method method = CloudSigmaAsyncClient.class.getMethod("setServerConfiguration", String.class, Server.class);
-      HttpRequest httpRequest = processor.createRequest(method, "100",
-            BindServerToPlainTextStringTest.SERVER);
+      HttpRequest httpRequest = processor.createRequest(method, "100", BindServerToPlainTextStringTest.SERVER);
 
       assertRequestLineEquals(httpRequest, "POST https://api.cloudsigma.com/servers/100/set HTTP/1.1");
       assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
@@ -438,6 +442,202 @@
 
    }
 
+   public void testListVLANs() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = CloudSigmaAsyncClient.class.getMethod("listVLANs");
+      HttpRequest httpRequest = processor.createRequest(method);
+
+      assertRequestLineEquals(httpRequest, "GET https://api.cloudsigma.com/resources/vlan/list HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      // now make sure request filters apply by replaying
+      httpRequest = Iterables.getOnlyElement(httpRequest.getFilters()).filter(httpRequest);
+      httpRequest = Iterables.getOnlyElement(httpRequest.getFilters()).filter(httpRequest);
+
+      assertRequestLineEquals(httpRequest, "GET https://api.cloudsigma.com/resources/vlan/list HTTP/1.1");
+      // for example, using basic authentication, we should get "only one"
+      // header
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\nAuthorization: Basic Zm9vOmJhcg==\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      // TODO: insert expected response class, which probably extends ParseJson
+      assertResponseParserClassEquals(method, httpRequest, SplitNewlinesAndReturnSecondField.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertExceptionParserClassEquals(method, null);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListVLANInfo() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = CloudSigmaAsyncClient.class.getMethod("listVLANInfo");
+      HttpRequest httpRequest = processor.createRequest(method);
+
+      assertRequestLineEquals(httpRequest, "GET https://api.cloudsigma.com/resources/vlan/info HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertExceptionParserClassEquals(method, null);
+
+      checkFilters(httpRequest);
+   }
+
+   public void testGetVLANInfo() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = CloudSigmaAsyncClient.class.getMethod("getVLANInfo", String.class);
+      HttpRequest httpRequest = processor.createRequest(method, "uuid");
+
+      assertRequestLineEquals(httpRequest, "GET https://api.cloudsigma.com/resources/vlan/uuid/info HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, KeyValuesDelimitedByBlankLinesToVLANInfo.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testCreateVLAN() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = CloudSigmaAsyncClient.class.getMethod("createVLAN", String.class);
+      HttpRequest httpRequest = processor.createRequest(method, "poohbear");
+
+      assertRequestLineEquals(httpRequest, "POST https://api.cloudsigma.com/resources/vlan/create HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
+      assertPayloadEquals(httpRequest, "name poohbear\n", "text/plain", false);
+
+      assertResponseParserClassEquals(method, httpRequest, KeyValuesDelimitedByBlankLinesToVLANInfo.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testRenameVLAN() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = CloudSigmaAsyncClient.class.getMethod("renameVLAN", String.class, String.class);
+      HttpRequest httpRequest = processor.createRequest(method, "100", "poohbear");
+
+      assertRequestLineEquals(httpRequest, "POST https://api.cloudsigma.com/resources/vlan/100/set HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
+      assertPayloadEquals(httpRequest, "name poohbear\n", "text/plain", false);
+
+      assertResponseParserClassEquals(method, httpRequest, KeyValuesDelimitedByBlankLinesToVLANInfo.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertExceptionParserClassEquals(method, MapHttp4xxCodesToExceptions.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testDestroyVLAN() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = CloudSigmaAsyncClient.class.getMethod("destroyVLAN", String.class);
+      HttpRequest httpRequest = processor.createRequest(method, "uuid");
+
+      assertRequestLineEquals(httpRequest, "POST https://api.cloudsigma.com/resources/vlan/uuid/destroy HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, ReleasePayloadAndReturn.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertExceptionParserClassEquals(method, ReturnVoidOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListStaticIPs() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = CloudSigmaAsyncClient.class.getMethod("listStaticIPs");
+      HttpRequest httpRequest = processor.createRequest(method);
+
+      assertRequestLineEquals(httpRequest, "GET https://api.cloudsigma.com/resources/ip/list HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      // now make sure request filters apply by replaying
+      httpRequest = Iterables.getOnlyElement(httpRequest.getFilters()).filter(httpRequest);
+      httpRequest = Iterables.getOnlyElement(httpRequest.getFilters()).filter(httpRequest);
+
+      assertRequestLineEquals(httpRequest, "GET https://api.cloudsigma.com/resources/ip/list HTTP/1.1");
+      // for example, using basic authentication, we should get "only one"
+      // header
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\nAuthorization: Basic Zm9vOmJhcg==\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      // TODO: insert expected response class, which probably extends ParseJson
+      assertResponseParserClassEquals(method, httpRequest, SplitNewlinesAndReturnSecondField.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertExceptionParserClassEquals(method, null);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testListStaticIPInfo() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = CloudSigmaAsyncClient.class.getMethod("listStaticIPInfo");
+      HttpRequest httpRequest = processor.createRequest(method);
+
+      assertRequestLineEquals(httpRequest, "GET https://api.cloudsigma.com/resources/ip/info HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertExceptionParserClassEquals(method, null);
+
+      checkFilters(httpRequest);
+   }
+
+   public void testGetStaticIPInfo() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = CloudSigmaAsyncClient.class.getMethod("getStaticIPInfo", String.class);
+      HttpRequest httpRequest = processor.createRequest(method, "uuid");
+
+      assertRequestLineEquals(httpRequest, "GET https://api.cloudsigma.com/resources/ip/uuid/info HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, KeyValuesDelimitedByBlankLinesToStaticIPInfo.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testCreateStaticIP() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = CloudSigmaAsyncClient.class.getMethod("createStaticIP");
+      HttpRequest httpRequest = processor.createRequest(method);
+
+      assertRequestLineEquals(httpRequest, "POST https://api.cloudsigma.com/resources/ip/create HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, KeyValuesDelimitedByBlankLinesToStaticIPInfo.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
+   public void testDestroyStaticIP() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = CloudSigmaAsyncClient.class.getMethod("destroyStaticIP", String.class);
+      HttpRequest httpRequest = processor.createRequest(method, "uuid");
+
+      assertRequestLineEquals(httpRequest, "POST https://api.cloudsigma.com/resources/ip/uuid/destroy HTTP/1.1");
+      assertNonPayloadHeadersEqual(httpRequest, "Accept: text/plain\n");
+      assertPayloadEquals(httpRequest, null, null, false);
+
+      assertResponseParserClassEquals(method, httpRequest, ReleasePayloadAndReturn.class);
+      assertSaxResponseParserClassEquals(method, null);
+      assertExceptionParserClassEquals(method, ReturnVoidOnNotFoundOr404.class);
+
+      checkFilters(httpRequest);
+
+   }
+
    @Override
    protected void checkFilters(HttpRequest request) {
       assertEquals(request.getFilters().size(), 1);
diff --git a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaClientLiveTest.java b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaClientLiveTest.java
index 2cf1514..513a053 100644
--- a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaClientLiveTest.java
+++ b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaClientLiveTest.java
@@ -42,6 +42,8 @@
 import org.jclouds.cloudsigma.domain.Server;
 import org.jclouds.cloudsigma.domain.ServerInfo;
 import org.jclouds.cloudsigma.domain.ServerStatus;
+import org.jclouds.cloudsigma.domain.StaticIPInfo;
+import org.jclouds.cloudsigma.domain.VLANInfo;
 import org.jclouds.cloudsigma.options.CloneDriveOptions;
 import org.jclouds.cloudsigma.predicates.DriveClaimed;
 import org.jclouds.cloudsigma.util.Servers;
@@ -72,7 +74,7 @@
  * 
  * @author Adrian Cole
  */
-@Test(groups = "live")
+@Test(groups = "live", sequential = true)
 public class CloudSigmaClientLiveTest {
    protected long driveSize = 8 * 1024 * 1024 * 1024l;
    protected int maxDriveImageTime = 300;
@@ -124,18 +126,58 @@
    }
 
    @Test
-   public void testListServers() throws Exception {
-      Set<String> servers = client.listServers();
-      assertNotNull(servers);
-   }
-
-   @Test
    public void testGetProfileInfo() throws Exception {
       ProfileInfo profile = client.getProfileInfo();
       assertNotNull(profile);
    }
 
    @Test
+   public void testListVLANs() throws Exception {
+      Set<String> vlans = client.listVLANs();
+      assertNotNull(vlans);
+   }
+
+   @Test
+   public void testListVLANInfo() throws Exception {
+      Set<? extends VLANInfo> vlans = client.listVLANInfo();
+      assertNotNull(vlans);
+   }
+
+   @Test
+   public void testGetVLAN() throws Exception {
+      for (String vlanUUID : client.listVLANs()) {
+         assert !"".equals(vlanUUID);
+         assertNotNull(client.getVLANInfo(vlanUUID));
+      }
+   }
+
+   @Test
+   public void testListStaticIPs() throws Exception {
+      Set<String> ips = client.listStaticIPs();
+      assertNotNull(ips);
+   }
+
+   @Test
+   public void testListStaticIPInfo() throws Exception {
+      Set<? extends StaticIPInfo> ips = client.listStaticIPInfo();
+      assertNotNull(ips);
+   }
+
+   @Test
+   public void testGetStaticIP() throws Exception {
+      for (String ipUUID : client.listStaticIPs()) {
+         assert !"".equals(ipUUID);
+         assertNotNull(client.getStaticIPInfo(ipUUID));
+      }
+   }
+
+   @Test
+   public void testListServers() throws Exception {
+      Set<String> servers = client.listServers();
+      assertNotNull(servers);
+   }
+
+   @Test
    public void testListServerInfo() throws Exception {
       Set<? extends ServerInfo> servers = client.listServerInfo();
       assertNotNull(servers);
@@ -223,6 +265,47 @@
       drive = drive2;
    }
 
+   @Test
+   public void testCreateAndDestroyVLAN() throws Exception {
+      VLANInfo vlan = client.createVLAN(prefix);
+      String id = vlan.getUuid();
+      try {
+         vlan = client.getVLANInfo(vlan.getUuid());
+         assertEquals(vlan.getName(), prefix);
+
+         vlan = client.renameVLAN(vlan.getUuid(), prefix + "2");
+         // test that rename didn't work :)
+         assertEquals(vlan.getName(), prefix);
+         vlan = client.getVLANInfo(vlan.getUuid());
+         assertEquals(vlan.getName(), prefix);
+      } finally {
+         client.destroyVLAN(id);
+      }
+   }
+
+   @Test
+   public void testCreateAndDestroyStaticIP() throws Exception {
+      StaticIPInfo ip = client.createStaticIP();
+      String id = ip.getAddress();
+      try {
+         ip = client.getStaticIPInfo(ip.getAddress());
+         assertNotNull(ip);
+         Logger.getAnonymousLogger().info("preparing drive");
+         prepareDrive();
+
+         Server serverRequest = Servers.smallWithStaticIP(prefix, drive.getUuid(), vncPassword, ip.getAddress())
+               .build();
+
+         Logger.getAnonymousLogger().info("starting server");
+         server = client.createServer(serverRequest);
+         assertEquals(server.getNics().get(0).getDhcp(), ip.getAddress());
+      } finally {
+         client.destroyServer(server.getUuid());
+         client.destroyDrive(drive.getUuid());
+         client.destroyStaticIP(id);
+      }
+   }
+
    protected ServerInfo server;
 
    @Test(dependsOnMethods = "testSetDriveData")
diff --git a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfoTest.java b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfoTest.java
new file mode 100644
index 0000000..6d75949
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfoTest.java
@@ -0,0 +1,50 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.jclouds.cloudsigma.functions;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.http.HttpResponse;
+import org.jclouds.io.Payloads;
+import org.testng.annotations.Test;
+
+import com.google.inject.Guice;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Test(groups = { "unit" })
+public class KeyValuesDelimitedByBlankLinesToVLANInfoTest {
+
+   private static final KeyValuesDelimitedByBlankLinesToVLANInfo FN = Guice.createInjector().getInstance(
+         KeyValuesDelimitedByBlankLinesToVLANInfo.class);
+
+   public void testNone() {
+      assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newStringPayload(""))), null);
+      assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newStringPayload("\n\n"))), null);
+      assertEquals(FN.apply(new HttpResponse(200, "", null)), null);
+   }
+
+   public void testOne() {
+      assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newInputStreamPayload(MapToVLANInfoTest.class
+            .getResourceAsStream("/vlan.txt")))), MapToVLANInfoTest.ONE);
+   }
+}
diff --git a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSetTest.java b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSetTest.java
new file mode 100644
index 0000000..11bba3b
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSetTest.java
@@ -0,0 +1,52 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.jclouds.cloudsigma.functions;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.cloudsigma.domain.VLANInfo;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.io.Payloads;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Guice;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Test(groups = { "unit" })
+public class ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSetTest {
+
+   private static final ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet FN = Guice.createInjector().getInstance(
+         ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.class);
+
+   public void testNone() {
+      assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newStringPayload(""))), ImmutableSet.<VLANInfo> of());
+      assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newStringPayload("\n\n"))), ImmutableSet.<VLANInfo> of());
+      assertEquals(FN.apply(new HttpResponse(200, "", null)), ImmutableSet.<VLANInfo> of());
+   }
+
+   public void testOne() {
+      assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newInputStreamPayload(MapToVLANInfoTest.class
+            .getResourceAsStream("/vlan.txt")))), ImmutableSet.<VLANInfo> of(MapToVLANInfoTest.ONE));
+   }
+}
\ No newline at end of file
diff --git a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/MapToVLANInfoTest.java b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/MapToVLANInfoTest.java
new file mode 100644
index 0000000..7c6f0ef
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/MapToVLANInfoTest.java
@@ -0,0 +1,56 @@
+/**
+ *
+ * Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ====================================================================
+ */
+
+package org.jclouds.cloudsigma.functions;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.jclouds.cloudsigma.domain.VLANInfo;
+import org.jclouds.util.Strings2;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Test(groups = { "unit" })
+public class MapToVLANInfoTest {
+   public static VLANInfo ONE = new VLANInfo.Builder()//
+         .uuid("6e2d1f6a-03c8-422b-bc8e-d744612cf46a")//
+         .name("My VLAN1").user("f2e19d5c-eaa1-44e5-94aa-dc194594bd7b").build();
+   private static final MapToVLANInfo MAP_TO_VLAN = new MapToVLANInfo();
+
+   public void testEmptyMapReturnsNull() {
+      assertEquals(MAP_TO_VLAN.apply(ImmutableMap.<String, String> of()), null);
+   }
+
+   public void test() throws IOException {
+
+      Map<String, String> input = new ListOfKeyValuesDelimitedByBlankLinesToListOfMaps().apply(
+            Strings2.toStringAndClose(MapToVLANInfoTest.class.getResourceAsStream("/vlan.txt"))).get(0);
+
+      assertEquals(MAP_TO_VLAN.apply(input), ONE);
+
+   }
+}
diff --git a/providers/cloudsigma-zrh/src/test/resources/vlan.txt b/providers/cloudsigma-zrh/src/test/resources/vlan.txt
new file mode 100644
index 0000000..f98a134
--- /dev/null
+++ b/providers/cloudsigma-zrh/src/test/resources/vlan.txt
@@ -0,0 +1,4 @@
+resource 6e2d1f6a-03c8-422b-bc8e-d744612cf46a
+type vlan
+user f2e19d5c-eaa1-44e5-94aa-dc194594bd7b
+name My VLAN1
\ No newline at end of file