diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java
index 672c81f..baff814 100644
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java
+++ b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java
@@ -15,18 +15,33 @@
  */
 package org.onosproject.xosclient.impl;
 
+import com.google.common.collect.Maps;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onosproject.xosclient.api.OpenStackAccess;
 import org.onosproject.xosclient.api.VtnPort;
 import org.onosproject.xosclient.api.VtnPortApi;
 import org.onosproject.xosclient.api.VtnPortId;
 import org.onosproject.xosclient.api.VtnServiceId;
 import org.onosproject.xosclient.api.XosAccess;
+import org.openstack4j.api.OSClient;
+import org.openstack4j.model.network.IP;
+import org.openstack4j.model.network.Port;
+import org.openstack4j.openstack.OSFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.util.Map;
 import java.util.Set;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * Provides CORD VTN port APIs.
  */
-public class DefaultVtnPortApi extends XosApi implements VtnPortApi {
+public final class DefaultVtnPortApi extends XosApi implements VtnPortApi {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
 
     /**
      * Default constructor.
@@ -55,4 +70,72 @@
         // TODO implement this when XOS provides this information
         return null;
     }
+
+    @Override
+    // TODO remove this when XOS provides this information
+    public VtnPort vtnPort(String portName, OpenStackAccess osAccess) {
+        checkNotNull(osAccess);
+
+        OSClient osClient = getOpenStackClient(osAccess);
+        Port osPort = osClient.networking().port().list()
+                .stream()
+                .filter(p -> p.getId().contains(portName.substring(3)))
+                .findFirst().orElse(null);
+        if (osPort == null) {
+            log.warn("Failed to get OpenStack port for {}", portName);
+            return null;
+        }
+        return getVtnPort(osPort);
+    }
+
+    @Override
+    // TODO remove this when XOS provides this information
+    public VtnPort vtnPort(VtnPortId portId, OpenStackAccess osAccess) {
+        checkNotNull(osAccess);
+
+        OSClient osClient = getOpenStackClient(osAccess);
+        Port osPort = osClient.networking().port().get(portId.id());
+        if (osPort == null) {
+            log.warn("Failed to get OpenStack port {}", portId);
+            return null;
+        }
+        return getVtnPort(osPort);
+    }
+
+    // TODO remove this when XOS provides this information
+    private VtnPort getVtnPort(Port osPort) {
+        checkNotNull(osPort);
+
+        // assumes all vtn port has single IP address
+        IP ipAddr = osPort.getFixedIps().stream().findFirst().orElse(null);
+        if (ipAddr == null) {
+            log.warn("Failed to get IP address for {}", osPort);
+            return null;
+        }
+
+        Map<IpAddress, MacAddress> addressPairs = Maps.newHashMap();
+        osPort.getAllowedAddressPairs().stream().forEach(
+                pair -> addressPairs.put(IpAddress.valueOf(pair.getIpAddress()),
+                                         MacAddress.valueOf(pair.getMacAddress())));
+
+        return new VtnPort(VtnPortId.of(osPort.getId()),
+                           osPort.getName(),
+                           VtnServiceId.of(osPort.getNetworkId()),
+                           MacAddress.valueOf(osPort.getMacAddress()),
+                           IpAddress.valueOf(ipAddr.getIpAddress()),
+                           addressPairs);
+    }
+
+    // TODO remove this when XOS provides this information
+    private OSClient getOpenStackClient(OpenStackAccess osAccess) {
+        checkNotNull(osAccess);
+
+        // creating a client every time must be inefficient, but this method
+        // will be removed once XOS provides equivalent APIs
+        return OSFactory.builder()
+                .endpoint(osAccess.endpoint())
+                .credentials(osAccess.user(), osAccess.password())
+                .tenantName(osAccess.tenant())
+                .authenticate();
+    }
 }
