diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
index 3e4b5ab..f4947f0 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
@@ -55,12 +55,10 @@
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
-import org.openstack4j.model.network.ExternalGateway;
 import org.openstack4j.model.network.Port;
 import org.openstack4j.model.network.Router;
 import org.openstack4j.model.network.RouterInterface;
 import org.openstack4j.model.network.Subnet;
-import org.openstack4j.openstack.networking.domain.NeutronIP;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -70,7 +68,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
@@ -85,6 +82,8 @@
 import static org.onosproject.openstacknetworking.api.Constants.GW_COMMON_TABLE;
 import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_INTERNAL_ROUTING_RULE;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.externalIpFromSubnet;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.externalPeerRouterFromSubnet;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -320,30 +319,19 @@
                 // this is a request to an external network
                 log.trace("Icmp request to external {} from {}", dstIp, srcIp);
 
-                RouterInterface routerInterface = routerInterface(srcSubnet);
-                if (routerInterface == null) {
-                    log.warn(ERR_REQ + "failed to get router interface");
-                    return false;
-                }
-
-                ExternalGateway externalGateway = externalGateway(routerInterface);
-                if (externalGateway == null) {
-                    log.warn(ERR_REQ + "failed to get external gateway");
-                    return false;
-                }
-
-                ExternalPeerRouter externalPeerRouter = osNetworkService.externalPeerRouter(externalGateway);
-                if (externalPeerRouter == null) {
-                    log.warn(ERR_REQ + "failed to get external peer router");
-                    return false;
-                }
-
-                IpAddress externalIp = getExternalIp(externalGateway, routerInterface);
+                IpAddress externalIp = externalIpFromSubnet(srcSubnet, osRouterService, osNetworkService);
                 if (externalIp == null) {
                     log.warn(ERR_REQ + "failed to get external ip");
                     return false;
                 }
 
+                ExternalPeerRouter externalPeerRouter =
+                        externalPeerRouterFromSubnet(srcSubnet, osRouterService, osNetworkService);
+                if (externalPeerRouter == null) {
+                    log.warn(ERR_REQ + "failed to get external peer router");
+                    return false;
+                }
+
                 String icmpInfoKey = icmpInfoKey(icmp,
                         externalIp.toString(),
                         IPv4.fromIPv4Address(ipPacket.getDestinationAddress()));
@@ -369,24 +357,6 @@
                     .concat(srcIp)
                     .concat(dstIp);
         }
-        private RouterInterface routerInterface(Subnet subnet) {
-            checkNotNull(subnet);
-            return osRouterService.routerInterfaces().stream()
-                    .filter(i -> Objects.equals(i.getSubnetId(), subnet.getId()))
-                    .findAny().orElse(null);
-        }
-
-        private ExternalGateway externalGateway(RouterInterface osRouterIface) {
-            checkNotNull(osRouterIface);
-            Router osRouter = osRouterService.router(osRouterIface.getId());
-            if (osRouter == null) {
-                return null;
-            }
-            if (osRouter.getExternalGatewayInfo() == null) {
-                return null;
-            }
-            return osRouter.getExternalGatewayInfo();
-        }
 
         private boolean handleEchoReply(IPv4 ipPacket, ICMP icmp) {
             String icmpInfoKey = icmpInfoKey(icmp,
@@ -432,38 +402,6 @@
             return routableGateways.contains(dstIp);
         }
 
-        private IpAddress getExternalIp(ExternalGateway externalGateway, RouterInterface osRouterIface) {
-            checkNotNull(externalGateway);
-            checkNotNull(osRouterIface);
-
-            Router osRouter = osRouterService.router(osRouterIface.getId());
-            if (osRouter == null) {
-                return null;
-            }
-
-            Port exGatewayPort = osNetworkService.ports(externalGateway.getNetworkId())
-                    .stream()
-                    .filter(port -> Objects.equals(port.getDeviceId(), osRouter.getId()))
-                    .findAny().orElse(null);
-            if (exGatewayPort == null) {
-                final String error = String.format(ERR_REQ +
-                                "no external gateway port for router (ID:%s, name:%s)",
-                        osRouter.getId(), osRouter.getName());
-                throw new IllegalStateException(error);
-            }
-            Optional<NeutronIP> externalIpAddress =
-                    (Optional<NeutronIP>) exGatewayPort.getFixedIps().stream().findFirst();
-            if (!externalIpAddress.isPresent() || externalIpAddress.get().getIpAddress() == null) {
-                final String error = String.format(ERR_REQ +
-                                "no external gateway IP address for router (ID:%s, name:%s)",
-                        osRouter.getId(), osRouter.getName());
-                log.warn(error);
-                return null;
-            }
-
-            return IpAddress.valueOf(externalIpAddress.get().getIpAddress());
-        }
-
         private void processRequestForGateway(IPv4 ipPacket, InstancePort instPort) {
             ICMP icmpReq = (ICMP) ipPacket.getPayload();
             icmpReq.setChecksum((short) 0);
