diff --git a/eurekaclient/eureka-client.json b/eurekaclient/eureka-client.json
new file mode 100644
index 0000000..9f18ea1
--- /dev/null
+++ b/eurekaclient/eureka-client.json
@@ -0,0 +1,15 @@
+{
+	"instance":{
+		"app": "microgateway",
+		"vipAddress": "microgateway",
+		"dataCenterInfo":{
+		  "name": "MyOwn"
+		},
+		"port": {}
+	},
+	"eureka":{
+		"host": "localhost",
+		"port": 8761,
+		"servicePath": "/eureka/apps/"
+	}	
+}
\ No newline at end of file
diff --git a/eurekaclient/index.js b/eurekaclient/index.js
new file mode 100644
index 0000000..49d1969
--- /dev/null
+++ b/eurekaclient/index.js
@@ -0,0 +1,82 @@
+'use strict';
+/**
+ * This plugin integrate with Eureka and gets the target
+ * endpoint dynamically. 
+ */
+
+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) {
+
+  function getAppName(url) {
+    for (var index in lookup) {
+      if (url.includes(lookup[index].uri) || url == lookup[index].uri) {
+        return {
+                  app: lookup[index].app,
+                  secure: lookup[index].secure
+               };
+      }
+    }
+    return "";
+  }
+
+  function getTarget(app, secure) {
+    var instances = client.getInstancesByAppId(app);
+
+    for (var index in instances) {
+      if (instances[index].status == "UP") {
+        return (secure == true) ? {"hostName": instances[index].hostName, "port": instances[index].securePort["$"]} : {"hostName": instances[index].hostName, "port":instances[index].port["$"]};
+      }
+    }
+    return "";
+  }
+
+  return {
+    onrequest: function(req, res, next) {
+      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;
+      } else {
+        req.targetSecure = false;
+      }
+      next();
+    }   
+  };
+}
diff --git a/eurekaclient/package.json b/eurekaclient/package.json
new file mode 100644
index 0000000..c3443bd
--- /dev/null
+++ b/eurekaclient/package.json
@@ -0,0 +1,14 @@
+{
+  "name": "eurekaclient",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "eureka-js-client": "^4.3.0"
+  }
+}
diff --git a/eurekaclient/servicelookup.json b/eurekaclient/servicelookup.json
new file mode 100644
index 0000000..958dfe4
--- /dev/null
+++ b/eurekaclient/servicelookup.json
@@ -0,0 +1 @@
+[{"uri": "/book", "app": "BOOK", "secure": false},{"uri":"/httpbin", "app": "BOOK", "secure": false}]
\ No newline at end of file
diff --git a/index.js b/index.js
index 5540030..01f90dd 100644
--- a/index.js
+++ b/index.js
@@ -11,5 +11,6 @@
   'quota-memory':require('./quota-memory'),
   spikearrest:require('./spikearrest'),
   'transform-uppercase':require('./transform-uppercase'),
-  accesscontrol:require('./accesscontrol')
+  accesscontrol:require('./accesscontrol'),
+  eurekaclient:require('./eurekaclient')
 }
diff --git a/oauth/index.js b/oauth/index.js
index 1e4162b..9521cee 100644
--- a/oauth/index.js
+++ b/oauth/index.js
@@ -3,7 +3,7 @@
 var debug = require('debug')('plugin:oauth');
 var url = require('url');
 var jwt = require('jsonwebtoken');
-var request = require('request');
+var requestLib = require('request');
 var _ = require('lodash');
 
 const authHeaderRegex = /Bearer (.+)/;
@@ -15,14 +15,39 @@
 module.exports.init = function (config, logger, stats) {
 
   var apiKeyCache = {};
+  var request = config.request ? requestLib.defaults(config.request) : requestLib;
 
   var middleware = function (req, res, next) {
 
     var authHeaderName = config['authorization-header'] ? config['authorization-header'] : 'authorization';
     var apiKeyHeaderName = config['api-key-header'] ? config['api-key-header'] : 'x-api-key';
     var keepAuthHeader = config['keep-authorization-header'] || false;
+    //support for enabling oauth or api key only
+    var oauth_only = config['allowOAuthOnly'] || false;
+    var apikey_only = config['allowAPIKeyOnly'] || false;
+    //
     var apiKey;
 
+    //support for enabling oauth or api key only
+    if (oauth_only) {
+      if (!req.headers['authorization']) {
+        debug('missing_authorization');
+        return sendError(req, res, next, logger, stats, 'missing_authorization', 'Missing Authorization header');
+      } else {
+        var header = authHeaderRegex.exec(req.headers['authorization']);
+        if (!header || header.length < 2) {
+          debug('Invalid Authorization Header');
+          return sendError(req, res, next, logger, stats, 'invalid_request', 'Invalid Authorization header');
+        }
+      }
+    }
+    else if (apikey_only) {
+      if (req.headers[authHeaderName]) {
+        debug('Invalid Authorization Type');
+        return sendError(req, res, next, logger, stats, 'invalid_auth', 'Invalid Authorization type');        
+      }
+    }
+    //leaving rest of the code same to ensure backward compatibility
     if (!req.headers[authHeaderName]) {
       if (apiKey = req.headers[apiKeyHeaderName]) {
         exchangeApiKeyForToken(req, res, next, config, logger, stats, middleware, apiKey);
