diff --git a/eurekaclient/index.js b/eurekaclient/index.js
index 49d1969..b582390 100644
--- a/eurekaclient/index.js
+++ b/eurekaclient/index.js
@@ -7,39 +7,46 @@
 var debug = require('debug')('plugin:eurekeclient');
 var util = require('util');
 var os = require('os');
-var config = require('./eureka-client.json');
 
-const lookup = require('./servicelookup.json');
 const port = 8000;
 const Eureka = require('eureka-js-client').Eureka;
 
-
-function getIPAddr() {
-  var interfaces = os.networkInterfaces();
-  var addresses = [];
-  for (var k in interfaces) {
-      for (var k2 in interfaces[k]) {
-          var address = interfaces[k][k2];
-          if (address.family === 'IPv4' && !address.internal) {
-              addresses.push(address.address);
-          }
-      }
-  }
-  return addresses[0];  
-}
-
-config.instance.hostName = os.hostname();
-config.instance.ipAddr = getIPAddr();
-config.instance.port["$"] = port;
-config.instance.port["@enabled"] = true;
-config.instance.dataCenterInfo["@class"] = "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo";
-
-const client = new Eureka(config);
-
-client.start();
-
 module.exports.init = function (config, logger, stats) {
 
+  const lookup = config.servicemap;
+  
+  config.instance.hostName = os.hostname();
+  debug('local hostName: ' + config.instance.hostName);
+  config.instance.ipAddr = getIPAddr();
+  config.instance.port = {};
+  config.instance.port["$"] = port;
+  config.instance.port["@enabled"] = true;
+  config.instance.dataCenterInfo["@class"] = "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo";
+
+  const client = new Eureka(config);
+
+  try {
+    client.start();  
+  } catch (err) {
+    console.error(err);
+    client.stop();
+  }
+
+  function getIPAddr() {
+    var interfaces = os.networkInterfaces();
+    var addresses = [];
+    for (var k in interfaces) {
+        for (var k2 in interfaces[k]) {
+            var address = interfaces[k][k2];
+            if (address.family === 'IPv4' && !address.internal) {
+                addresses.push(address.address);
+            }
+        }
+    }
+    debug ('localhost ip: ' + addresses[0]);
+    return addresses[0];  
+  }
+
   function getAppName(url) {
     for (var index in lookup) {
       if (url.includes(lookup[index].uri) || url == lookup[index].uri) {
@@ -68,13 +75,19 @@
       var appInfo = getAppName(req.url);
       var endpoint = getTarget(appInfo.app, appInfo.secure);
 
-      req.targetHostname = endpoint.hostName;
-      req.targetPort = endpoint.port;
-      req.targetPath = req.url;
-      if (appInfo.secure) {
-        req.targetSecure = true;
+      if (endpoint.hostName) {
+        debug("target hostname: " + endpoint.hostName);
+        req.targetHostname = endpoint.hostName;
+        debug("target port: " + endpoint.port);
+        req.targetPort = endpoint.port;
+        req.targetPath = req.url;
+        if (appInfo.secure) {
+          req.targetSecure = true;
+        } else {
+          req.targetSecure = false;
+        }        
       } else {
-        req.targetSecure = false;
+        console.warn("Target enpoint from Eureka not found");
       }
       next();
     }   
