diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOperatingSystem.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOperatingSystem.java
new file mode 100644
index 0000000..b51d273
--- /dev/null
+++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOperatingSystem.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.dimensiondata.cloudcontrol.compute.functions;
+
+import com.google.common.base.Function;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.jclouds.compute.domain.OperatingSystem;
+
+import javax.annotation.Nullable;
+
+@Singleton
+public class OperatingSystemToOperatingSystem
+      implements Function<org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem, OperatingSystem> {
+
+   private final OperatingSystemToOsFamily operatingSystemToOsFamily;
+
+   @Inject
+   OperatingSystemToOperatingSystem(final OperatingSystemToOsFamily operatingSystemToOsFamily) {
+      this.operatingSystemToOsFamily = operatingSystemToOsFamily;
+   }
+
+   @Nullable
+   @Override
+   public OperatingSystem apply(@Nullable org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem from) {
+
+      OperatingSystem.Builder builder = OperatingSystem.builder();
+      builder.name(from.displayName());
+      builder.family(operatingSystemToOsFamily.apply(from));
+      builder.is64Bit(from.id().endsWith("64"));
+      builder.description(from.family() + " " + from.displayName());
+      return builder.build();
+   }
+}
diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardware.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardware.java
new file mode 100644
index 0000000..74eb367
--- /dev/null
+++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardware.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.dimensiondata.cloudcontrol.compute.functions;
+
+import com.google.common.base.Function;
+import com.google.common.collect.FluentIterable;
+import com.google.inject.Singleton;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.domain.Processor;
+import org.jclouds.compute.domain.Volume;
+import org.jclouds.compute.domain.VolumeBuilder;
+import org.jclouds.dimensiondata.cloudcontrol.domain.CPU;
+import org.jclouds.dimensiondata.cloudcontrol.domain.CpuSpeed;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Disk;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Server;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Singleton
+public class ServerToHardware implements Function<Server, Hardware> {
+
+   private static final int GB_TO_MB_MULTIPLIER = 1024;
+
+   @Override
+   public Hardware apply(final Server from) {
+      HardwareBuilder builder = new HardwareBuilder().ids(from.id()).name(from.name()).hypervisor("vmx")
+            .processors(buildProcessorList(from.cpu())).ram(from.memoryGb() * GB_TO_MB_MULTIPLIER);
+
+      if (from.disks() != null) {
+         builder.volumes(FluentIterable.from(from.disks()).transform(new Function<Disk, Volume>() {
+            @Override
+            public Volume apply(final Disk disk) {
+               return new VolumeBuilder().id(disk.id()).device(String.valueOf(disk.scsiId()))
+                     .size(Float.valueOf(disk.sizeGb())).type(Volume.Type.LOCAL).build();
+            }
+         }).toSet());
+      }
+      return builder.build();
+   }
+
+   private List<Processor> buildProcessorList(final CPU cpu) {
+      final List<Processor> processorList = new ArrayList<Processor>();
+      final double speed = CpuSpeed.fromDimensionDataSpeed(cpu.speed()).getSpeed();
+      for (int count = 0; count < cpu.count(); count++) {
+         processorList.add(new Processor(cpu.coresPerSocket(), speed));
+      }
+      return processorList;
+   }
+}
diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadata.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadata.java
new file mode 100644
index 0000000..6ffb9fe
--- /dev/null
+++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadata.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.dimensiondata.cloudcontrol.compute.functions;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import org.jclouds.collect.Memoized;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.NodeMetadataBuilder;
+import org.jclouds.compute.functions.GroupNamingConvention;
+import org.jclouds.dimensiondata.cloudcontrol.domain.NIC;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Server;
+import org.jclouds.dimensiondata.cloudcontrol.domain.State;
+import org.jclouds.dimensiondata.cloudcontrol.domain.internal.ServerWithExternalIp;
+import org.jclouds.domain.Location;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Strings.nullToEmpty;
+import static com.google.common.collect.Iterables.find;
+import static org.jclouds.location.predicates.LocationPredicates.idEquals;
+
+@Singleton
+class ServerWithNatRuleToNodeMetadata implements Function<ServerWithExternalIp, NodeMetadata> {
+
+   private static final Map<State, NodeMetadata.Status> serverStateToNodeStatus = ImmutableMap.<State, NodeMetadata.Status>builder()
+         .put(State.PENDING_DELETE, NodeMetadata.Status.PENDING).put(State.PENDING_CHANGE, NodeMetadata.Status.PENDING)
+         .put(State.FAILED_ADD, NodeMetadata.Status.ERROR).put(State.FAILED_CHANGE, NodeMetadata.Status.ERROR)
+         .put(State.FAILED_DELETE, NodeMetadata.Status.ERROR).put(State.DELETED, NodeMetadata.Status.TERMINATED)
+         .put(State.NORMAL, NodeMetadata.Status.RUNNING).put(State.UNRECOGNIZED, NodeMetadata.Status.UNRECOGNIZED)
+         .build();
+
+   private final Supplier<Set<? extends Location>> locations;
+   private final GroupNamingConvention nodeNamingConvention;
+   private final ServerToHardware serverToHardware;
+   private final OperatingSystemToOperatingSystem operatingSystemToOperatingSystem;
+
+   @Inject
+   ServerWithNatRuleToNodeMetadata(@Memoized final Supplier<Set<? extends Location>> locations,
+         final GroupNamingConvention.Factory namingConvention, final ServerToHardware serverToHardware,
+         final OperatingSystemToOperatingSystem operatingSystemToOperatingSystem) {
+      this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
+      this.locations = checkNotNull(locations, "locations");
+      this.serverToHardware = checkNotNull(serverToHardware, "serverToHardware");
+      this.operatingSystemToOperatingSystem = checkNotNull(operatingSystemToOperatingSystem,
+            "operatingSystemToOperatingSystem");
+   }
+
+   @Override
+   public NodeMetadata apply(final ServerWithExternalIp serverWithExternalIp) {
+      NodeMetadataBuilder builder = new NodeMetadataBuilder();
+      Server server = serverWithExternalIp.server();
+      builder.ids(server.id());
+      builder.name(server.name());
+      builder.location(find(locations.get(), idEquals(nullToEmpty(server.datacenterId()))));
+      builder.group(nodeNamingConvention.groupInUniqueNameOrNull(server.name()));
+      builder.hardware(serverToHardware.apply(serverWithExternalIp.server()));
+      builder.imageId(server.sourceImageId());
+      builder.operatingSystem(operatingSystemToOperatingSystem.apply(server.guest().operatingSystem()));
+      builder.status(serverStateToNodeStatus.get(server.state()));
+
+      Set<String> privateAddresses = new HashSet<String>();
+      if (server.networkInfo() != null) {
+         if (server.networkInfo().primaryNic() != null && server.networkInfo().primaryNic().privateIpv4() != null) {
+            privateAddresses.add(server.networkInfo().primaryNic().privateIpv4());
+         }
+         if (!server.networkInfo().additionalNic().isEmpty()) {
+            privateAddresses.addAll(Sets.newHashSet(
+                  Iterables.transform(server.networkInfo().additionalNic(), new Function<NIC, String>() {
+                     @Override
+                     public String apply(NIC nic) {
+                        return nic.privateIpv4();
+                     }
+                  })));
+         }
+      }
+      builder.privateAddresses(privateAddresses);
+      if (serverWithExternalIp.externalIp() != null) {
+         builder.publicAddresses(ImmutableSet.of(serverWithExternalIp.externalIp()));
+      }
+      return builder.build();
+   }
+}
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToHardwareTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToHardwareTest.java
index bc09d1c..ca90da2 100644
--- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToHardwareTest.java
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/BaseImageToHardwareTest.java
@@ -40,7 +40,7 @@
 
 import static org.testng.AssertJUnit.assertEquals;
 
-@Test(groups = "unit", testName = "ImageDescriptionToOsFamilyTest")
+@Test(groups = "unit", testName = "BaseImageToHardwareTest")
 public class BaseImageToHardwareTest {
 
    private BaseImageToHardware baseImageToHardware;
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOperatingSystemTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOperatingSystemTest.java
new file mode 100644
index 0000000..8fc8286
--- /dev/null
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/OperatingSystemToOperatingSystemTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.dimensiondata.cloudcontrol.compute.functions;
+
+import org.easymock.EasyMock;
+import org.jclouds.compute.domain.OperatingSystem;
+import org.jclouds.compute.domain.OsFamily;
+import org.testng.annotations.Test;
+
+import static org.easymock.EasyMock.expect;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+@Test(testName = "OperatingSystemToOperatingSystemTest")
+public class OperatingSystemToOperatingSystemTest {
+
+   private OperatingSystemToOsFamily operatingSystemToOsFamily;
+
+   public void testApply(){
+
+      String id = "Windows10x64";
+      String name = "testWindowsOS";
+      String family = "Windows";
+
+      org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem operatingSystem = org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem.builder().id(id).displayName(name).family(family).build();
+
+      operatingSystemToOsFamily = EasyMock.createNiceMock(OperatingSystemToOsFamily.class);
+      expect(operatingSystemToOsFamily.apply(operatingSystem)).andReturn(OsFamily.WINDOWS);
+
+      EasyMock.replay(operatingSystemToOsFamily);
+
+      OperatingSystem result = new OperatingSystemToOperatingSystem(operatingSystemToOsFamily).apply(operatingSystem);
+
+      assertNotNull(result);
+      assertEquals(result.getName(), operatingSystem.displayName());
+      assertEquals(result.getFamily(), OsFamily.WINDOWS);
+   }
+}
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardwareTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardwareTest.java
new file mode 100644
index 0000000..c5d0426
--- /dev/null
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerToHardwareTest.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.dimensiondata.cloudcontrol.compute.functions;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.Volume;
+import org.jclouds.dimensiondata.cloudcontrol.domain.CPU;
+import org.jclouds.dimensiondata.cloudcontrol.domain.CpuSpeed;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Disk;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Guest;
+import org.jclouds.dimensiondata.cloudcontrol.domain.NIC;
+import org.jclouds.dimensiondata.cloudcontrol.domain.NetworkInfo;
+import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Server;
+import org.jclouds.dimensiondata.cloudcontrol.domain.State;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import javax.xml.bind.DatatypeConverter;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+@Test(groups = "unit", testName = "ServerToHardwareTest")
+public class ServerToHardwareTest {
+
+   private ServerToHardware serverToHardware;
+
+   @BeforeMethod
+   public void setUp() throws Exception {
+      serverToHardware = new ServerToHardware();
+   }
+
+   @Test
+   public void testApplyServer() throws Exception {
+      final Server server = Server.builder().id("12ea8472-6e4e-4068-b2cb-f04ecacd3962").name("CentOS 5 64-bit")
+            .description("DRaaS CentOS Release 5.9 64-bit").guest(Guest.builder().osCustomization(false)
+                  .operatingSystem(
+                        OperatingSystem.builder().id("CENTOS564").displayName("CENTOS5/64").family("UNIX").build())
+                  .build()).cpu(CPU.builder().count(1).speed("STANDARD").coresPerSocket(1).build()).memoryGb(4)
+            .networkInfo(NetworkInfo.builder().primaryNic(
+                  NIC.builder().id("def96a04-d1ee-48b9-b07d-3993594724d2").privateIpv4("192.168.1.2")
+                        .vlanId("19737c24-259a-49e2-a5b7-a8a042a96108").build())
+                  .additionalNic(Lists.<NIC>newArrayList()).networkDomainId("testNetworkDomain").build()).disks(ImmutableList
+                  .of(Disk.builder().id("98299851-37a3-4ebe-9cf1-090da9ae42a0").scsiId(0).sizeGb(20).speed("STANDARD")
+                        .build())).softwareLabels(Lists.newArrayList())
+            .createTime(DatatypeConverter.parseDateTime("2016-06-09T17:36:31.000Z").getTime()).datacenterId("EU6")
+            .state(State.NORMAL).sourceImageId("1806fe4a-0400-46ad-a6ab-1fe3c9ebc947").started(false).deployed(true)
+            .build();
+      applyAndAssert(server);
+   }
+
+   private void applyAndAssert(Server server) {
+      final Hardware hardware = serverToHardware.apply(server);
+      assertEquals(server.memoryGb() * 1024, hardware.getRam());
+      assertEquals("vmx", hardware.getHypervisor());
+      assertEquals(server.id(), hardware.getId());
+      assertEquals(server.id(), hardware.getProviderId());
+      assertEquals(server.name(), hardware.getName());
+      assertEquals(server.disks().size(), hardware.getVolumes().size());
+      assertEquals(Float.valueOf(server.disks().get(0).sizeGb()), hardware.getVolumes().get(0).getSize());
+      assertEquals(Volume.Type.LOCAL, hardware.getVolumes().get(0).getType());
+      assertEquals(server.disks().get(0).id(), hardware.getVolumes().get(0).getId());
+      assertEquals(server.disks().get(0).scsiId().toString(), hardware.getVolumes().get(0).getDevice());
+      assertEquals(server.cpu().count(), hardware.getProcessors().size());
+      assertEquals(Double.valueOf(server.cpu().coresPerSocket()), hardware.getProcessors().get(0).getCores());
+      assertEquals(CpuSpeed.STANDARD.getSpeed(), hardware.getProcessors().get(0).getSpeed());
+   }
+
+}
diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadataTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadataTest.java
new file mode 100644
index 0000000..49fd60c
--- /dev/null
+++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/compute/functions/ServerWithNatRuleToNodeMetadataTest.java
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.dimensiondata.cloudcontrol.compute.functions;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import org.easymock.EasyMock;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.OsFamily;
+import org.jclouds.compute.functions.GroupNamingConvention;
+import org.jclouds.dimensiondata.cloudcontrol.domain.CPU;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Guest;
+import org.jclouds.dimensiondata.cloudcontrol.domain.NIC;
+import org.jclouds.dimensiondata.cloudcontrol.domain.NetworkInfo;
+import org.jclouds.dimensiondata.cloudcontrol.domain.OperatingSystem;
+import org.jclouds.dimensiondata.cloudcontrol.domain.Server;
+import org.jclouds.dimensiondata.cloudcontrol.domain.State;
+import org.jclouds.dimensiondata.cloudcontrol.domain.internal.ServerWithExternalIp;
+import org.jclouds.dimensiondata.cloudcontrol.features.ServerImageApi;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Set;
+
+import static org.easymock.EasyMock.expect;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+@Test(groups = "unit", testName = "ServerWithNatRuleToNodeMetadataTest")
+public class ServerWithNatRuleToNodeMetadataTest {
+
+   private ServerWithNatRuleToNodeMetadata serverWithNatRuleToNodeMetadata;
+   private ServerWithExternalIp serverWithExternalIp;
+
+   private GroupNamingConvention nodeNamingConvention;
+   private OperatingSystemToOperatingSystem operatingSystemToOperatingSystem;
+   private ServerToHardware serverToHardware;
+   private ServerImageApi serverImageApi;
+   private Image image;
+   private Hardware hardware;
+   private OperatingSystem os;
+   private NIC nic;
+   private Location location;
+   private CPU cpu;
+   private Server server;
+   private org.jclouds.compute.domain.OperatingSystem operatingSystem;
+
+   private String imageId = "imageId";
+   private String externalIp = "10.20.122.1";
+   private String datacenterId = "NA01";
+   private String serverName = "serverName";
+   private String networkDomainId = "NetworkDomain1";
+
+   @BeforeMethod
+   public void setUp() throws Exception {
+
+      location = new LocationBuilder().scope(LocationScope.REGION).id(datacenterId)
+            .iso3166Codes(new ArrayList<String>())
+            .metadata(ImmutableMap.<String, Object>of("version", "MCP 2.0", "state", "AVAILABLE"))
+            .description("locationDescription")
+            .parent(new LocationBuilder().id("us").description("USA").scope(LocationScope.PROVIDER).build()).build();
+      Supplier<Set<? extends Location>> locations = new Supplier<Set<? extends Location>>() {
+         @Override
+         public Set<? extends Location> get() {
+            return ImmutableSet.of(location);
+         }
+      };
+
+      nic = EasyMock.createNiceMock(NIC.class);
+      cpu = EasyMock.createNiceMock(CPU.class);
+      os = EasyMock.createNiceMock(OperatingSystem.class);
+      hardware = EasyMock.createNiceMock(Hardware.class);
+      operatingSystem = EasyMock.createNiceMock(org.jclouds.compute.domain.OperatingSystem.class);
+      serverToHardware = EasyMock.createNiceMock(ServerToHardware.class);
+      operatingSystemToOperatingSystem = EasyMock.createNiceMock(OperatingSystemToOperatingSystem.class);
+
+      GroupNamingConvention.Factory conventionFactory = EasyMock.createNiceMock(GroupNamingConvention.Factory.class);
+      nodeNamingConvention = EasyMock.createNiceMock(GroupNamingConvention.class);
+      serverImageApi = EasyMock.createNiceMock(ServerImageApi.class);
+      image = EasyMock.createNiceMock(Image.class);
+
+      expect(conventionFactory.createWithoutPrefix()).andReturn(nodeNamingConvention);
+      EasyMock.replay(conventionFactory);
+
+      server = Server.builder().id("serverId").name(serverName).datacenterId(datacenterId)
+            .networkInfo(NetworkInfo.create(networkDomainId, nic, new ArrayList<NIC>())).cpu(cpu).deployed(true)
+            .state(State.NORMAL).sourceImageId("imageId").started(false).createTime(new Date()).memoryGb(1024)
+            .guest(Guest.builder().osCustomization(false).operatingSystem(os).build()).build();
+
+      serverWithNatRuleToNodeMetadata = new ServerWithNatRuleToNodeMetadata(locations, conventionFactory,
+            serverToHardware, operatingSystemToOperatingSystem);
+   }
+
+   @Test
+   public void testApply() {
+
+      serverWithExternalIp = ServerWithExternalIp.create(server, externalIp);
+
+      org.jclouds.compute.domain.OperatingSystem operatingSystem = org.jclouds.compute.domain.OperatingSystem.builder()
+            .description("Windows 10 x64").name("Win10x64").is64Bit(true).family(OsFamily.WINDOWS).build();
+
+      expect(image.getId()).andReturn("imageId");
+      expect(image.getOperatingSystem()).andReturn(operatingSystem);
+      expect(nic.privateIpv4()).andReturn("192.168.1.1").anyTimes();
+      expect(nodeNamingConvention.groupInUniqueNameOrNull(serverName)).andReturn("[" + serverName + "]").anyTimes();
+      expect(serverToHardware.apply(server)).andReturn(hardware);
+      expect(operatingSystemToOperatingSystem.apply(os)).andReturn(operatingSystem);
+
+      EasyMock.replay(nodeNamingConvention, serverImageApi, image, nic, serverToHardware, operatingSystemToOperatingSystem);
+
+      assertNodeMetadata(serverWithNatRuleToNodeMetadata.apply(serverWithExternalIp), operatingSystem,
+            serverWithExternalIp.server().sourceImageId(), NodeMetadata.Status.RUNNING,
+            ImmutableSet.of(nic.privateIpv4()), ImmutableSet.of(externalIp));
+   }
+
+   @Test(dependsOnMethods = "testApply")
+   public void testApplyWithNullables() {
+
+      server = Server.builder().id("serverId").name(serverName).datacenterId(datacenterId)
+            .networkInfo(NetworkInfo.create(networkDomainId, nic, new ArrayList<NIC>())).cpu(cpu).deployed(true)
+            .state(State.DELETED).sourceImageId("imageId").started(false).createTime(new Date()).memoryGb(1024)
+            .guest(Guest.builder().osCustomization(false).operatingSystem(os).build()).build();
+
+      serverWithExternalIp = ServerWithExternalIp.create(server, null);
+
+      expect(nic.privateIpv4()).andReturn(null).anyTimes();
+      expect(nodeNamingConvention.groupInUniqueNameOrNull(serverName)).andReturn("[" + serverName + "]").anyTimes();
+      expect(serverToHardware.apply(server)).andReturn(hardware);
+
+      EasyMock.replay(nodeNamingConvention, serverImageApi, image, nic, serverToHardware, operatingSystemToOperatingSystem);
+
+      assertNodeMetadata(serverWithNatRuleToNodeMetadata.apply(serverWithExternalIp), null, "imageId",
+            NodeMetadata.Status.TERMINATED, ImmutableSet.<String>of(), ImmutableSet.<String>of());
+   }
+
+   private void assertNodeMetadata(NodeMetadata result, org.jclouds.compute.domain.OperatingSystem os, String imageId,
+         NodeMetadata.Status status, ImmutableSet<String> privateIpAddresses, ImmutableSet<String> publicIpAddresses) {
+      assertNotNull(result);
+      assertEquals(result.getId(), serverWithExternalIp.server().id());
+      assertEquals(result.getName(), serverWithExternalIp.server().name());
+      assertEquals(result.getHostname(), serverWithExternalIp.server().description());
+      assertEquals(result.getGroup(), "[" + serverName + "]");
+      assertEquals(result.getHardware(), hardware);
+      assertEquals(result.getOperatingSystem(), os);
+      assertEquals(result.getLocation(), location);
+      assertEquals(result.getImageId(), imageId);
+      assertEquals(result.getStatus(), status);
+      assertEquals(result.getPrivateAddresses(), privateIpAddresses);
+      assertEquals(result.getPublicAddresses(), publicIpAddresses);
+   }
+}
