diff --git a/spec/core_proxy.spec.js b/spec/core_proxy.spec.js
new file mode 100644
index 0000000..c5bb9ad
--- /dev/null
+++ b/spec/core_proxy.spec.js
@@ -0,0 +1,183 @@
+(function () {
+  'use strict';
+  
+  const chai = require('chai');
+  const expect = chai.expect;
+  const sinonChai = require('sinon-chai');
+  const supertest = require('supertest');
+  const mockery = require('mockery');
+  chai.use(sinonChai);
+
+  const request = require('superagent');
+  const stub = require('./spec_helper.js');
+
+  const configMock = {
+    xos: {
+      host: 'http://test-xos-url',
+      port: '80'
+    }
+  };
+
+  let app;
+
+  describe('The core proxy routes', () => {
+
+    // stub for GET method
+    stub.makeStub('getSuccess', request, 'get', cb => {
+        cb(null, {
+        status: 200, 
+        body: {msg: 'successfully proxied'}
+      });
+    });
+
+    // stub for POST method
+    stub.makeStub('postSuccess', request, 'post', cb => {
+        cb(null, {
+        status: 201, 
+        body: {msg: 'successfully proxied'}
+      });
+    });
+
+    // stub for PUT method
+    stub.makeStub('putSuccess', request, 'put', cb => {
+        cb(null, {
+        status: 200, 
+        body: {msg: 'successfully proxied'}
+      });
+    });
+
+    // stub for DELETE method
+    stub.makeStub('deleteSuccess', request, 'delete', cb => {
+        cb(null, {
+        status: 204
+      });
+    });
+
+    // mocking the config.rest module
+    before(() => {
+      mockery.enable({
+        warnOnReplace: true,
+        warnOnUnregistered: false
+      });
+      mockery.registerMock('../config/config.js', configMock);
+
+      app = require('../src/server.js').app;
+    });
+
+    after(() => {
+      mockery.deregisterMock('../config/config.js');
+      mockery.disable();
+    });
+
+    it('should read XOS address from config.rest module', (done) => {
+      const myStub = stub.getStub('getSuccess');
+
+      supertest(app)
+      .get('/api/core/')
+      .end((err) => {
+        if (err) return done(err);
+        expect(myStub.get.called).to.be.true;
+        expect(myStub.get).to.have.been.calledWith('http://test-xos-url:80/api/core/');
+        done();
+      });
+    });
+
+    it('should pass token and cookies along with the request', (done) => {
+      const myStub = stub.getStub('getSuccess');
+
+      supertest(app)
+      .get('/api/core/')
+      .set('Accept', 'application/json')
+      .set('x-csrftoken', 'testToken')
+      .set('cookie', 'testCookie')
+      .end(function(err) {
+        if (err) return done(err);
+        expect(myStub.set.getCall(0)).to.have.been.calledWith('x-csrftoken', 'testToken');
+        expect(myStub.set.getCall(1)).to.have.been.calledWith('cookie', 'testCookie');
+        done();
+      });
+    });
+
+    it('should pass query paramenters along with the request', (done) => {
+      const myStub = stub.getStub('getSuccess');
+
+      supertest(app)
+      .get('/api/core/instances/?no_hyperlink=1&node=1')
+      .end((err) => {
+        if (err) return done(err);
+        expect(myStub.get.called).to.be.true;
+        expect(myStub.get).to.have.been.calledWith('http://test-xos-url:80/api/core/instances/?no_hyperlink=1&node=1');
+        done();
+      });
+    });
+
+    it('should proxy GET request to XOS', (done) => {
+      supertest(app)
+      .get('/api/core/')
+      .set('Accept', 'application/json')
+      .set('x-csrftoken', 'testToken')
+      .set('cookie', 'testCookie')
+      .end(function(err, res) {
+        if (err) return done(err);
+        expect(res.status).to.equal(200);
+        expect(res.body).to.deep.equal({msg: 'successfully proxied'});
+        done();
+      });
+    });
+
+    it('should proxy POST request to XOS', (done) => {
+
+      const myStub = stub.getStub('postSuccess');
+
+      supertest(app)
+      .post('/api/core/')
+      .send({foo: 'bar'})
+      .set('Accept', 'application/json')
+      .set('x-csrftoken', 'testToken')
+      .set('cookie', 'testCookie')
+      .end(function(err, res) {
+        if (err) return done(err);
+        expect(myStub.send.getCall(0)).to.have.been.calledWith({foo: 'bar'});
+        expect(res.status).to.equal(201);
+        expect(res.body).to.deep.equal({msg: 'successfully proxied'});
+        done();
+      });
+    });
+
+    it('should proxy PUT request to XOS', (done) => {
+
+      const myStub = stub.getStub('putSuccess');
+
+      supertest(app)
+      .put('/api/core/')
+      .send({foo: 'bar'})
+      .set('Accept', 'application/json')
+      .set('x-csrftoken', 'testToken')
+      .set('cookie', 'testCookie')
+      .end(function(err, res) {
+        if (err) return done(err);
+        expect(myStub.send.getCall(0)).to.have.been.calledWith({foo: 'bar'});
+        expect(res.status).to.equal(200);
+        expect(res.body).to.deep.equal({msg: 'successfully proxied'});
+        done();
+      });
+    });
+
+    it('should proxy DELETE request to XOS', (done) => {
+
+      const myStub = stub.getStub('deleteSuccess');
+
+      supertest(app)
+      .delete('/api/core/')
+      .set('Accept', 'application/json')
+      .set('x-csrftoken', 'testToken')
+      .set('cookie', 'testCookie')
+      .end(function(err, res) {
+        if (err) return done(err);
+        expect(myStub.send).not.to.have.been.called;
+        expect(res.status).to.equal(204);
+        done();
+      });
+    });
+  });
+})();
\ No newline at end of file
