diff --git a/src/app/hello.spec.ts b/src/app/hello.spec.ts
deleted file mode 100644
index d127a2a..0000000
--- a/src/app/hello.spec.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-/// <reference path="../../typings/index.d.ts"/>
-
-import { MockBackend } from '@angular/http/testing';
-import {TestBed, async} from '@angular/core/testing';
-import {Router} from '@angular/router';
-import {HelloComponent} from './hello';
-import {LogoutComponent} from './components/logout/logout.component';
-import {StyleConfig} from './config/style.config';
-import { Http, BaseRequestOptions } from '@angular/http';
-import {CookieService} from 'angular2-cookie/services/cookies.service';
-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';
-import {SliceService} from './services/rest/slices.service';
-
-describe('hello component', () => {
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [
-        HelloComponent,
-        LogoutComponent
-      ],
-      providers: [
-        {
-          provide: Http,
-          useFactory: (mockBackend, options) => {
-            return new Http(mockBackend, options);
-          },
-          deps: [MockBackend, BaseRequestOptions]
-        },
-        MockBackend,
-        BaseRequestOptions,
-        CookieService,
-        {
-          provide: Router,
-          useClass: class { navigate = jasmine.createSpy('navigate'); }
-        },
-        XosHttp,
-        InstanceStore,
-        GlobalEvent,
-        AuthService,
-        InstanceService,
-        SliceService
-      ]
-    });
-    TestBed.compileComponents();
-  }));
-
-  it('should render hello world', () => {
-    const fixture = TestBed.createComponent(HelloComponent);
-    fixture.detectChanges();
-    const hello = fixture.nativeElement;
-    expect(hello.querySelector('h1').textContent).toBe(`Hello ${StyleConfig.projectName}!`);
-  });
-});
diff --git a/src/app/services/helpers/store.service.spec.ts b/src/app/services/helpers/store.service.spec.ts
deleted file mode 100644
index d70d649..0000000
--- a/src/app/services/helpers/store.service.spec.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-
-import {ObservableCollectionHandler} from './store.service';
-import {IWSEvent} from '../../interfaces/ws.interface';
-import {BehaviorSubject} from 'rxjs';
-
-describe('Service: Observable Collection Handler', () => {
-
-  let subject: BehaviorSubject<any>;
-  let observable;
-
-  beforeEach(() => {
-    subject = new BehaviorSubject([]);
-    observable = subject.asObservable();
-  });
-
-  it('Should have an update method', () => {
-    expect(ObservableCollectionHandler.update).toBeDefined();
-  });
-
-  it('should add an element to the observable', (done) => {
-    const event: IWSEvent = {
-      model: 'Test',
-      msg: {
-        pk: 1,
-        changed_fields: [],
-        object: {id: 1, foo: 'bar'}
-      }
-    };
-
-    ObservableCollectionHandler.update(event, subject);
-
-    subject.subscribe(
-      (collection: any[]) => {
-        expect(collection.length).toBe(1);
-        expect(collection[0].foo).toEqual('bar');
-        done();
-      }
-    );
-  });
-
-  describe('when the subject already have content', () => {
-    beforeEach(() => {
-      subject.next([{id: 1, foo: 'bar'}, {id: 2, foo: 'baz'}]);
-    });
-
-    it('should update an element', (done) => {
-      const event: IWSEvent = {
-        model: 'Test',
-        msg: {
-          pk: 1,
-          changed_fields: [],
-          object: {id: 1, foo: 'updated'}
-        }
-      };
-
-      ObservableCollectionHandler.update(event, subject);
-
-      subject.subscribe(
-        (collection: any[]) => {
-          expect(collection.length).toBe(2);
-          expect(collection[0].foo).toEqual('updated');
-          done();
-        }
-      );
-    });
-
-    it('should delete an element', (done) => {
-      const event: IWSEvent = {
-        model: 'Test',
-        msg: {
-          pk: 1,
-          changed_fields: ['deleted'],
-          object: {id: 1, foo: 'deleted'}
-        }
-      };
-
-      ObservableCollectionHandler.update(event, subject);
-
-      subject.subscribe(
-        (collection: any[]) => {
-          expect(collection.length).toBe(1);
-          expect(collection[0].foo).toEqual('baz');
-          done();
-        }
-      );
-    });
-  });
-});
diff --git a/src/index.spec.js b/src/index.spec.js
index e2bdbd0..1b6bb82 100644
--- a/src/index.spec.js
+++ b/src/index.spec.js
@@ -11,16 +11,34 @@
 require('zone.js/dist/jasmine-patch');
 require('zone.js/dist/async-test');
 require('zone.js/dist/fake-async-test');
+
+// loading app files
 const context = require.context('./app', true, /\.(js|ts|tsx)$/);
-// context.keys().forEach(context);
-context.keys().forEach(function(path) {
-  try {
-    context(path);
-  } catch(err) {
-    console.error('[ERROR] WITH SPEC FILE: ', path);
-    console.error(err);
-  }
-});
+context.keys().forEach(context);
+
+// use this for debug
+// context.keys().forEach(function(path) {
+//   try {
+//     context(path);
+//   } catch(err) {
+//     console.error('[ERROR] WITH SPEC FILE: ', path);
+//     console.error(err);
+//   }
+// });
+
+// loading specs
+const specFiles = require.context('../spec', true, /\.(js|ts|tsx)$/);
+specFiles.keys().forEach(specFiles);
+// use this for debug
+// specFiles.keys().forEach(function(path) {
+//   try {
+//     specFiles(path);
+//   } catch(err) {
+//     console.error('[ERROR] WITH SPEC FILE: ', path);
+//     console.error(err);
+//   }
+// });
+
 const testing = require('@angular/core/testing');
 const testingBrowser = require('@angular/platform-browser-dynamic/testing');
 
