diff --git a/src/config/config.js b/src/config/config.js
new file mode 100644
index 0000000..2671a26
--- /dev/null
+++ b/src/config/config.js
@@ -0,0 +1,37 @@
+(function () {
+  'use strict';
+  
+  // NOTE do we still need CLI args? 
+  // Won't be better to use NODE_ENV and the native node-yaml-config feature
+
+  const argv = require('yargs').argv;
+  const path = require('path');
+  const yaml_config = require('node-yaml-config');
+  const logger = require('../config/logger.js');
+
+  // if a config file is specified in as a CLI arguments use that one
+  const cfgFile = argv.config || 'config.yml';
+
+  let config;
+  try {
+    logger.log('debug', `Loading ${cfgFile}`);
+    config = yaml_config.load(path.join(__dirname, cfgFile));
+  }
+  catch(e) {
+    logger.log('debug', `No ${cfgFile} found, using default params`);
+  }
+
+  module.exports = {
+    xos: {
+      host: (config && config.xos) ? config.xos.host : 'xos',
+      port: (config && config.xos) ? config.xos.port : 9999
+    },
+    redis: {
+      host: (config && config.redis) ? config.redis.host : 'redis',
+      port: (config && config.redis) ? config.redis.port : 6379
+    },
+    gateway: {
+      port: (config && config.gateway) ? config.gateway.port : 3000
+    }
+  };
+})();
\ No newline at end of file
diff --git a/src/config/logger.js b/src/config/logger.js
new file mode 100644
index 0000000..df49409
--- /dev/null
+++ b/src/config/logger.js
@@ -0,0 +1,34 @@
+(function () {
+  'use strict';
+  
+  const winston = require('winston');
+  const fs = require('fs');
+  const path = require('path');
+  const level = process.env.LOG_LEVEL || 'warn';
+  winston.level = level;
+
+  const logFile = path.join(__dirname, '../../logs/xos-nb-rest');
+
+  // clear old logs
+  ['error', 'debug'].forEach(l => {
+    try {
+      fs.statSync(`${logFile}.${l}.log`)
+      fs.unlinkSync(`${logFile}.${l}.log`);
+    }
+    catch(e) {
+      // log does not exist
+    }
+  });
+
+  // create a custom logger with colorized console and persistance to file
+  const logger = new (winston.Logger)({
+    transports: [
+      new (winston.transports.Console)({level: level, colorize: true}),
+      new (winston.transports.File)({name: 'error-log', level: 'error', filename: `${logFile}.error.log`}),
+      new (winston.transports.File)({name: 'debug-log', level: 'debug', filename: `${logFile}.debug.log`})
+    ]
+  });
+
+  module.exports = logger;
+
+})();
\ No newline at end of file
diff --git a/src/controllers/clients.js b/src/controllers/clients.js
new file mode 100644
index 0000000..26270bc
--- /dev/null
+++ b/src/controllers/clients.js
@@ -0,0 +1,18 @@
+(function () {
+  'use strict';
+  const _ = require('lodash');
+  const clients = [];
+
+  exports.clients = clients;
+
+  exports.add = (client) => {
+    // TODO check id that client is already there
+    if(!_.find(clients, ({id: client.id}))) {
+      clients.push(client);
+    }
+  }
+
+  exports.remove = (client) => {
+    _.remove(clients, {id: client.id});
+  }
+})();
\ No newline at end of file
diff --git a/src/controllers/redis.js b/src/controllers/redis.js
new file mode 100644
index 0000000..0277cab
--- /dev/null
+++ b/src/controllers/redis.js
@@ -0,0 +1,57 @@
+(function () {
+  'use strict';
+  
+  const socketIo = require('./websocket.js');
+  const config = require('../config/config.js').redis;
+  const logger = require('../config/logger.js');
+  const socket = socketIo.get();
+
+  var redis = require('redis');
+  var client = redis.createClient({
+    host: config.host,
+    port: config.port
+  });
+
+  client.on('error', function (err) {
+    logger.log('error', err);
+  });
+
+  client.on('ready', function () {
+    logger.log('info', 'Redis connected');
+  });
+
+  client.on('subscribe', function (channel) {
+    logger.log('debug', `Subscribed to channel: ${channel}`);
+  });
+
+  client.on('message', function (channel, message) {
+    logger.log('debug', 'sub channel ' + channel + ': ' + message);
+
+    let msg;
+    try {
+      msg = JSON.parse(message);
+      // TODO find the user that needs to be notified for msg.object update
+      socket.emit('event', {model: channel, msg: msg});
+    }
+    catch(e) {
+      // send the event also if it is not JSON
+      msg = message;
+      socket.emit('event', {model: channel, msg: msg});
+    }
+
+  });
+
+  const watchedCollections = [
+    'Instance',
+    'Node',
+    'Service',
+    'Slice',
+    'Site',
+    'Subscriber',
+    'Tenant'
+  ];
+
+  watchedCollections.forEach(c => {
+    client.subscribe(c);
+  });
+})();
\ No newline at end of file
diff --git a/src/controllers/websocket.js b/src/controllers/websocket.js
new file mode 100644
index 0000000..e048419
--- /dev/null
+++ b/src/controllers/websocket.js
@@ -0,0 +1,39 @@
+(function () {
+  'use strict';
+
+  const clients = require('./clients.js');
+  const logger = require('../config/logger.js');
+
+  let io;
+
+  exports.create = function(server) {
+    // INSTANTIATE SOCKET.IO
+    // =============================================================================
+
+    io = require('socket.io').listen(server);
+
+    // LISTEN TO "CONNECTION" EVENT (FROM SOCKET.IO)
+    // =============================================================================
+
+    io.on('connection', function (socket) {
+      logger.log('debug', 'connect %j', socket.handshake.query);
+      clients.add(socket.handshake.query);
+
+      socket.emit('connected', {message : 'Welcome to XOS'});
+
+      socket.on('disconnect', function(reason) {
+        clients.remove(socket.handshake.query);
+        logger.log('debug', 'disconnect %s %j', reason, socket.handshake.query);
+      });
+    });
+
+  };
+
+  exports.get = () => io;
+
+  // USAGE
+  // const socketIo = require('./controllers/websocket.js');
+  // const socket = socketIo.get();
+  // socket.emit('eventName', data);
+
+})(); 
\ No newline at end of file
diff --git a/src/routes/core_proxy.js b/src/routes/core_proxy.js
new file mode 100644
index 0000000..0290347
--- /dev/null
+++ b/src/routes/core_proxy.js
@@ -0,0 +1,48 @@
+(function () {
+  'use strict';
+
+  const request = require('superagent');
+  const logger = require('../config/logger.js');
+
+  module.exports = function(app) {
+
+    const proxyRequest = (req, res) => {
+
+      const config = require('../config/config.js').xos;
+      // pick the correct method from superAgent
+      const makeReq = request[req.method.toLowerCase()];
+
+      // start the request
+      let sentReq = makeReq(`${config.host}:${config.port}${req.url}`);
+      
+      // if needed add a body to the request
+      if(req.method === 'POST' || req.method === 'PUT') {
+        sentReq = sentReq
+          .send(req.body)
+      }
+
+      // extend with auth info
+      sentReq = sentReq
+        .set('x-csrftoken', req.headers['x-csrftoken'] || null)
+        .set('cookie', req.headers.cookie || null)
+
+      // handle response
+      sentReq
+        .end((err, r) => {
+          if(err) {
+            logger.log('error', err);
+            return res.status(500).send(err);
+          }
+          logger.log('debug', r.status, r.body);
+          return res.status(r.status).type('json').send(r.body);
+        });
+    };
+
+    app.all('/api/core', proxyRequest);
+    app.all('/api/core/*', proxyRequest);
+    app.all('/api/services', proxyRequest);
+    app.all('/api/services/*', proxyRequest);
+    app.all('/api/utility', proxyRequest);
+    app.all('/api/utility/*', proxyRequest);
+  };
+})();
\ No newline at end of file
diff --git a/src/server.js b/src/server.js
new file mode 100644
index 0000000..da541ce
--- /dev/null
+++ b/src/server.js
@@ -0,0 +1,58 @@
+(function () {
+  'use strict';
+  
+  const express = require('express');
+  const app = express();
+  const config = require('./config/config.js').gateway;
+  const bodyParser = require('body-parser');
+  const cors = require('cors');
+  const socketIo = require('./controllers/websocket.js');
+  const logger = require('./config/logger.js');
+
+  // Apply middlewares
+  app.use(cors());
+  app.use(bodyParser.json());
+
+  // Load routes
+  require('./routes/core_proxy.js')(app);
+
+  app.get('/', function(req, res) {
+    res.send('Hello world');
+  });
+
+  const startServer = () => {
+
+    // if is running just return it
+    if(app.server) {
+      return app.server;
+    }
+
+    const server =  app.listen(config.port, function() {
+      logger.info(`Express is listening to http://localhost:${config.port}`);
+
+      // once server is ready setup WebSocket
+      socketIo.create(server);
+
+      // start redis
+      require('./controllers/redis.js');
+    });
+    app.server = server;
+    return server;
+  };
+
+  const stopServer = () => {
+    if(app.server) {
+      app.server.close();
+    }
+  }
+
+  if(!module.parent) {
+    startServer();
+  }
+
+  module.exports = {
+    app: app,
+    start: startServer,
+    stop: stopServer
+  };
+})();
\ No newline at end of file
