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
