diff --git a/src/app/components/login/login.component.ts b/src/app/components/login/login.component.ts
index 413290c..05cc11d 100644
--- a/src/app/components/login/login.component.ts
+++ b/src/app/components/login/login.component.ts
@@ -5,6 +5,8 @@
 import {StyleConfig} from '../../config/style.config';
 import {AuthService} from '../../services/rest/auth.service';
 
+import {AppConfig} from '../../config/app.config';
+
 export class Auth {
   constructor(
     public username,
diff --git a/src/app/hello.html b/src/app/hello.html
index 44631ae..5652063 100644
--- a/src/app/hello.html
+++ b/src/app/hello.html
@@ -4,4 +4,9 @@
 
 <xos-logout></xos-logout>
 
-<pre>{{ endpoints | json }}</pre>
+<div *ngFor="let instance of instances">
+  <b>{{instance.name}}</b>
+  <i>{{instance.isolation}}</i>
+  {{instance.slice}}
+  {{instance.node}}
+</div>
diff --git a/src/app/hello.spec.ts b/src/app/hello.spec.ts
index 30e8e79..a0cc5a4 100644
--- a/src/app/hello.spec.ts
+++ b/src/app/hello.spec.ts
@@ -8,6 +8,11 @@
 import { MockBackend } from '@angular/http/testing';
 import {CookieService} from 'angular2-cookie/services/cookies.service';
 import {Router} from '@angular/router';
+import {XosHttp} from './services/rest/xoshttp.service';
+import {InstanceStore} from './services/stores/instance.store';
+import {GlobalEvent} from './services/websockets/websocket.global';
+import {AuthService} from './services/rest/auth.service';
+import {InstanceService} from './services/rest/instance.service';
 
 describe('hello component', () => {
   beforeEach(async(() => {
@@ -30,7 +35,12 @@
         {
           provide: Router,
           useClass: class { navigate = jasmine.createSpy('navigate'); }
-        }
+        },
+        XosHttp,
+        InstanceStore,
+        GlobalEvent,
+        AuthService,
+        InstanceService
       ]
     });
     TestBed.compileComponents();
diff --git a/src/app/hello.ts b/src/app/hello.ts
index 554b2de..8757cc3 100644
--- a/src/app/hello.ts
+++ b/src/app/hello.ts
@@ -2,31 +2,39 @@
 import {Component, OnInit} from '@angular/core';
 import {StyleConfig} from './config/style.config';
 import {CoreService} from './services/rest/core.service';
+import {InstanceStore} from './services/stores/instance.store';
+import {IInstance} from './interfaces/instance.interface';
 
 @Component({
   selector: 'xos-app',
   template: require('./hello.html'),
-  providers: [CoreService],
+  providers: [CoreService, InstanceStore],
 })
 export class HelloComponent implements OnInit {
 
   // declare class properties
   public hello: string;
-  public endpoints: any[];
+  public instances: IInstance[];
 
-  constructor(private coreService: CoreService) {
+  constructor(
+    private coreService: CoreService,
+    private instanceStore: InstanceStore
+  ) {
     this.hello = `Hello ${StyleConfig.projectName}!`;
-    this.endpoints = [];
+    this.instances = [];
   }
 
   ngOnInit() {
     console.log('on init');
-    this.coreService.getCoreEndpoints()
+    this.instanceStore.query()
       .subscribe(
-        endpoints => {
-          this.endpoints = endpoints;
+        instances => {
+          console.log(instances);
+          this.instances = instances;
         },
-        err => console.log
+        err => {
+          console.warn(err);
+        }
       );
   }
 }
diff --git a/src/app/index.ts b/src/app/index.ts
index af804d3..b44673a 100644
--- a/src/app/index.ts
+++ b/src/app/index.ts
@@ -6,10 +6,19 @@
 
 import {routing, RootComponent} from './routes';
 
+// registering components
 import {HelloComponent} from './hello';
 import {LoginComponent} from './components/login/login.component';
+import {LogoutComponent} from './components/logout/logout.component';
+
+// registering directives
 import {ProtectedDirective} from './directives/protected.directive';
-import {LogoutComponent} from './components/logout/logout.component.ts';
+
+// registering services
+import {AuthService} from './services/rest/auth.service';
+import {XosHttp} from './services/rest/xoshttp.service';
+import {InstanceService} from './services/rest/instance.service';
+import {GlobalEvent} from './services/websockets/websocket.global';
 
 @NgModule({
   imports: [
@@ -25,7 +34,13 @@
     LogoutComponent,
     ProtectedDirective
   ],
-  providers: [CookieService],
+  providers: [
+    CookieService,
+    AuthService,
+    XosHttp,
+    InstanceService,
+    GlobalEvent
+  ],
   bootstrap: [RootComponent]
 })
 export class AppModule {}
diff --git a/src/app/interfaces/instance.interface.ts b/src/app/interfaces/instance.interface.ts
new file mode 100644
index 0000000..29a37f2
--- /dev/null
+++ b/src/app/interfaces/instance.interface.ts
@@ -0,0 +1,6 @@
+export interface IInstance {
+  id: number;
+  name: string;
+  backend_status: string;
+  created: string;
+}
diff --git a/src/app/interfaces/ws.interface.ts b/src/app/interfaces/ws.interface.ts
new file mode 100644
index 0000000..05de51b
--- /dev/null
+++ b/src/app/interfaces/ws.interface.ts
@@ -0,0 +1,8 @@
+export interface IWSEvent {
+ model: string;
+ msg: {
+   changed_fields: string[],
+   object?: any,
+   pk?: number
+ }
+}
diff --git a/src/app/services/rest/auth.service.ts b/src/app/services/rest/auth.service.ts
index c53e3f4..b5b00fb 100644
--- a/src/app/services/rest/auth.service.ts
+++ b/src/app/services/rest/auth.service.ts
@@ -3,7 +3,7 @@
 // Imports
 import {AppConfig} from '../../config/app.config';
 import {Injectable}     from '@angular/core';
-import {Http, Response} from '@angular/http';
+import {Http, Response, Headers} from '@angular/http';
 import {Observable} from 'rxjs/Rx';
 import {IAuthRequest, IAuthResponse} from '../../interfaces/auth.interface';
 import {CookieService} from 'angular2-cookie/core';
@@ -24,17 +24,25 @@
   isAuthenticated(): string {
     this.xosToken = this.cookieService.get('xoscsrftoken');
     this.xosSessionId = this.cookieService.get('xossessionid');
-    return this.xosToken;
+    return this.xosToken && this.xosSessionId;
+  }
+
+  // get auth info to authenticate API
+  getUserHeaders(): Headers{
+    const headers = new Headers();
+    headers.append('x-csrftoken', this.cookieService.get('xoscsrftoken'));
+    headers.append('x-sessionid', this.cookieService.get('xossessionid'));
+    return headers;
   }
 
   // save cookies
-  storeAuth(auth: IAuthResponse): void {
+  private storeAuth(auth: IAuthResponse): void {
     this.cookieService.put('xoscsrftoken', auth.xoscsrftoken);
     this.cookieService.put('xossessionid', auth.xossessionid);
   }
 
   // remove cookies
-  removeAuth(): void {
+  private removeAuth(): void {
     this.cookieService.remove('xoscsrftoken');
     this.cookieService.remove('xossessionid');
   }
diff --git a/src/app/services/rest/core.service.ts b/src/app/services/rest/core.service.ts
index 04097a6..3890c47 100644
--- a/src/app/services/rest/core.service.ts
+++ b/src/app/services/rest/core.service.ts
@@ -2,9 +2,10 @@
 
 // Imports
 import {AppConfig} from '../../config/app.config';
-import { Injectable }     from '@angular/core';
-import { Http, Response, Headers, RequestOptions } from '@angular/http';
+import {Injectable}     from '@angular/core';
+import {Response} from '@angular/http';
 import {Observable} from 'rxjs/Rx';
+import {XosHttp} from './xoshttp.service';
 
 // Import RxJs required methods
 import 'rxjs/add/operator/map';
@@ -12,19 +13,22 @@
 
 @Injectable()
 export class CoreService {
-  // Resolve HTTP using the constructor
-  constructor (private http: Http) {}
   // private instance variable to hold base url
   private baseUrl = AppConfig.apiEndpoint;
 
+  // Resolve HTTP using the constructor
+  constructor (private http: XosHttp) {}
+
   // Fetch all existing comments
   getCoreEndpoints() : Observable<any[]> {
 
+    const search = 'some=param';
+
     // ...using get request
-    return this.http.get(`${this.baseUrl}/core/`)
+    return this.http.get(`${this.baseUrl}/core/`, {search})
     // ...and calling .json() on the response to return data
-      .map((res:Response) => res.json())
-      //...errors if any
+      .map((res: Response) => res.json())
+      // ...errors if any
       .catch((error:any) => Observable.throw(error.json().error || 'Server error'));
 
   }
diff --git a/src/app/services/rest/instance.service.ts b/src/app/services/rest/instance.service.ts
new file mode 100644
index 0000000..c864e54
--- /dev/null
+++ b/src/app/services/rest/instance.service.ts
@@ -0,0 +1,25 @@
+/// <reference path="../../../../typings/index.d.ts"/>
+
+// Imports
+import {AppConfig} from '../../config/app.config';
+import {AuthService} from './auth.service';
+import { Injectable }     from '@angular/core';
+import { Http, Response, Headers } from '@angular/http';
+import {XosHttp} from './xoshttp.service';
+import {Observable} from 'rxjs/Rx';
+
+// Import RxJs required methods
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/catch';
+
+@Injectable()
+export class InstanceService {
+  private baseUrl = AppConfig.apiEndpoint;
+  constructor (private http: XosHttp, private authService: AuthService) {}
+  // Fetch all existing instances
+  query() : Observable<any[]> {
+    return this.http.get(`${this.baseUrl}/core/instances/`)
+      .map((res: Response) => res.json())
+      .catch((error: any) => Observable.throw(error.response.json().error || 'Server error'));
+  }
+}
diff --git a/src/app/services/rest/xoshttp.service.ts b/src/app/services/rest/xoshttp.service.ts
new file mode 100644
index 0000000..5572683
--- /dev/null
+++ b/src/app/services/rest/xoshttp.service.ts
@@ -0,0 +1,55 @@
+import {Http, RequestOptionsArgs, Response, URLSearchParams} from '@angular/http';
+import {Injectable} from '@angular/core';
+import {Observable} from 'rxjs';
+import {AuthService} from './auth.service';
+/**
+ * Created by teone on 12/6/16.
+ */
+@Injectable()
+export class XosHttp {
+  constructor(
+    private http: Http,
+    private authService: AuthService
+  ) {
+  }
+
+  private checkOptions(options?: RequestOptionsArgs): RequestOptionsArgs {
+    // if options are not there, create them
+    if(!options){
+      options = {};
+    }
+    return options;
+  }
+
+  private getHeaders(options: RequestOptionsArgs): RequestOptionsArgs {
+    // add auth headers
+    options.headers = this.authService.getUserHeaders();
+    return options;
+  }
+
+  private getParams(options: RequestOptionsArgs): RequestOptionsArgs {
+    // add the no_hyperlinks param
+    if (!options.search) {
+      options.search = new URLSearchParams();
+    }
+
+    if (options.search instanceof URLSearchParams) {
+      options.search.set('no_hyperlinks', '1');
+    }
+    else if (typeof options.search === 'string') {
+      options.search += '&no_hyperlinks=1';
+    }
+    return options;
+  }
+
+  get(url: string, options?: RequestOptionsArgs): Observable<Response> {
+
+    options = this.checkOptions(options);
+    options = this.getHeaders(options);
+    options = this.getParams(options);
+
+    return this.http.get(url, options)
+  }
+
+  // TODO add POST, PUT, DELETE declaration
+}
diff --git a/src/app/services/stores/instance.store.ts b/src/app/services/stores/instance.store.ts
new file mode 100644
index 0000000..a87630c
--- /dev/null
+++ b/src/app/services/stores/instance.store.ts
@@ -0,0 +1,54 @@
+/// <reference path="../../../../typings/index.d.ts"/>
+
+import {Injectable} from '@angular/core';
+import {BehaviorSubject} from 'rxjs/Rx';
+import {IInstance} from '../../interfaces/instance.interface';
+import {InstanceService} from '../rest/instance.service';
+import * as _ from 'lodash';
+import {IWSEvent} from '../../interfaces/ws.interface';
+import {GlobalEvent} from '../websockets/websocket.global';
+
+@Injectable()
+export class InstanceStore {
+  private _instances: BehaviorSubject<IInstance[]> = new BehaviorSubject([]);
+  constructor(private instanceService: InstanceService, private globalEvent: GlobalEvent) {
+    this.loadInitialData();
+    this.globalEvent.list()
+      .filter((e: IWSEvent) => {
+        console.log('filter', e);
+        return e.model === 'Instance';
+      })
+      .subscribe(
+        (event: IWSEvent) => {
+
+          const collection = this._instances.value;
+
+          const exist = _.find(collection, (i) => {
+            return i.id === event.msg.object.id;
+          });
+
+          // remove in order to update
+          if (exist) {
+            _.remove(collection, {id: event.msg.object.id});
+          }
+          collection.push(event.msg.object);
+          this._instances.next(collection);
+        }
+      );
+  }
+
+  loadInitialData() {
+    this.instanceService.query()
+      .subscribe(
+        res => {
+          this._instances.next(res);
+        },
+        err => console.log('Error retrieving Instances', err)
+      );
+  }
+
+  query() {
+    return this._instances.asObservable();
+  }
+
+}
diff --git a/src/app/services/websockets/websocket.global.ts b/src/app/services/websockets/websocket.global.ts
new file mode 100644
index 0000000..ee62c12
--- /dev/null
+++ b/src/app/services/websockets/websocket.global.ts
@@ -0,0 +1,29 @@
+/// <reference path="../../../../typings/index.d.ts"/>
+
+import {Injectable} from '@angular/core';
+import {BehaviorSubject} from 'rxjs/Rx';
+import * as io from 'socket.io-client';
+import {AppConfig} from '../../config/app.config';
+import {IWSEvent} from '../../interfaces/ws.interface';
+
+@Injectable()
+export class GlobalEvent {
+  private _events: BehaviorSubject<IWSEvent> = new BehaviorSubject<IWSEvent>({
+    model: 'XOS',
+    msg: {
+      changed_fields: []
+    }
+  });
+  private socket;
+  constructor() {
+    this.socket = io(AppConfig.websocketClient);
+    this.socket.on('event', (data: IWSEvent) => {
+      this._events.next(data);
+    });
+  }
+
+  list() {
+    return this._events.asObservable();
+  }
+
+}
