diff --git a/src/app/core/link-wrapper/link-wrapper.ts b/src/app/core/link-wrapper/link-wrapper.ts
index add8d48..0f03ecb 100644
--- a/src/app/core/link-wrapper/link-wrapper.ts
+++ b/src/app/core/link-wrapper/link-wrapper.ts
@@ -2,7 +2,7 @@
 export function xosLinkWrapper(): IDirective {
   return {
     template: `
-    <a ng-if="col.link" href="{{col.link(item)}}">
+    <a ng-if="col.link" ui-sref="{{col.link(item)}}">
       <div ng-transclude></div>
     </a>
     <div ng-transclude ng-if="!col.link"></div>
diff --git a/src/app/core/services/helpers/config.helpers.spec.ts b/src/app/core/services/helpers/config.helpers.spec.ts
index eca43d9..837491a 100644
--- a/src/app/core/services/helpers/config.helpers.spec.ts
+++ b/src/app/core/services/helpers/config.helpers.spec.ts
@@ -61,6 +61,20 @@
       })
       .value('ModelStore', {
 
+      })
+      .value('$state', {
+        get: () => {
+          return [
+            {
+              name: 'xos.core.tests',
+              data: {model: 'Test'}
+            },
+            {
+              name: 'xos.core.slices',
+              data: {model: 'Slices'}
+            }
+          ];
+        }
       });
     angular.mock.module('test');
   });
@@ -116,6 +130,30 @@
     });
   });
 
+  describe('the navigation methods', () => {
+    describe('urlFromCoreModels', () => {
+      it('should return the URL for a given model', () => {
+        expect(service.urlFromCoreModel('Test')).toBe('/core/tests');
+      });
+    });
+    describe('stateFromCoreModels', () => {
+
+      let state: ng.ui.IStateService;
+
+      beforeEach(angular.mock.inject(($state) => {
+        state = $state;
+      }));
+
+      it('should return the state for a given model', () => {
+        expect(service.stateFromCoreModel('Test')).toBe('xos.core.tests');
+      });
+
+      it('should return the state with params for a given model', () => {
+        expect(service.stateWithParams('Test', {id: 1})).toBe('xos.core.tests({id: 1})');
+      });
+    });
+  });
+
   describe('the modelFieldsToColumnsCfg method', () => {
     it('should return an array of columns', () => {
       const cols = service.modelFieldsToColumnsCfg(model.fields, 'testUrl/:id?');
@@ -188,7 +226,7 @@
   });
 
   describe('the private methods', () => {
-    let modelStoreMock, toastr, auth;
+    let modelStoreMock, toastr, auth, stateMock;
 
     beforeEach(angular.mock.inject((_toastr_, AuthService) => {
       modelStoreMock = {
@@ -202,6 +240,9 @@
       };
       toastr = _toastr_;
       auth = AuthService;
+      stateMock = {
+        get: ''
+      };
     }));
 
     const field: IXosModelDefsField = {
@@ -218,7 +259,7 @@
         test: 2
       };
       it('should add the formatted data to the column definition', () => {
-        service = new ConfigHelpers(toastr, auth, modelStoreMock);
+        service = new ConfigHelpers(stateMock, toastr, auth, modelStoreMock);
         service['populateRelated'](item, item.test, field);
         expect(item['test-formatted']).toBe('second');
       });
@@ -234,7 +275,7 @@
       };
 
       it('should add the available choice to the select', () => {
-        service = new ConfigHelpers(toastr, auth, modelStoreMock);
+        service = new ConfigHelpers(stateMock, toastr, auth, modelStoreMock);
         service['populateSelectField'](field, input);
         expect(input.options).toEqual([
           {id: 1, label: 'test'},
diff --git a/src/app/core/services/helpers/config.helpers.ts b/src/app/core/services/helpers/config.helpers.ts
index e4c10b6..fd5e8e0 100644
--- a/src/app/core/services/helpers/config.helpers.ts
+++ b/src/app/core/services/helpers/config.helpers.ts
@@ -5,6 +5,7 @@
 import {IXosFormConfig, IXosFormInput} from '../../form/form';
 import {IXosAuthService} from '../../../datasources/rest/auth.rest';
 import {IModelStoreService} from '../../../datasources/stores/model.store';
+import {IXosState} from '../../../../index';
 
 export interface IXosModelDefsField {
   name: string;
@@ -20,16 +21,19 @@
 export interface IXosConfigHelpersService {
   excluded_fields: string[];
   modelFieldsToColumnsCfg(fields: IXosModelDefsField[], baseUrl: string): IXosTableColumn[]; // TODO use a proper interface
-  modelToTableCfg(model: IModeldef, baseUrl: string): IXosTableCfg;
+  modelToTableCfg(model: IModeldef, modelName: string): IXosTableCfg;
   modelFieldToInputCfg(fields: IXosModelDefsField[]): IXosFormInput[];
   modelToFormCfg(model: IModeldef): IXosFormConfig;
   pluralize(string: string, quantity?: number, count?: boolean): string;
   toLabel(string: string, pluralize?: boolean): string;
   toLabels(string: string[], pluralize?: boolean): string[];
+  urlFromCoreModel(model: string): string;
+  stateFromCoreModel(name: string): string;
+  stateWithParams(name: string, model: any): string;
 }
 
 export class ConfigHelpers {
-  static $inject = ['toastr', 'AuthService', 'ModelStore'];
+  static $inject = ['$state', 'toastr', 'AuthService', 'ModelStore'];
 
   excluded_fields = [
     'created',
@@ -51,6 +55,7 @@
   ];
 
   constructor(
+    private $state: ng.ui.IStateService,
     private toastr: ng.toastr.IToastrService,
     private AuthService: IXosAuthService,
     private ModelStore: IModelStoreService
@@ -87,7 +92,7 @@
 
   public modelToTableCfg(model: IModeldef, baseUrl: string): IXosTableCfg {
     const cfg = {
-      columns: this.modelFieldsToColumnsCfg(model.fields, baseUrl),
+      columns: this.modelFieldsToColumnsCfg(model.fields, model.name),
       filter: 'fulltext',
       order: {field: 'id', reverse: false},
       actions: [
@@ -116,7 +121,7 @@
     return cfg;
   }
 
-  public modelFieldsToColumnsCfg(fields: IXosModelDefsField[], baseUrl: string): IXosTableColumn[] {
+  public modelFieldsToColumnsCfg(fields: IXosModelDefsField[], modelName: string): IXosTableColumn[] {
 
     const columns =  _.map(fields, (f) => {
       if (this.excluded_fields.indexOf(f.name) > -1) {
@@ -128,8 +133,9 @@
       };
 
       if (f.name === 'id' || f.name === 'name') {
+        col.link = item => this.stateWithParams(modelName, item);
         // NOTE can we find a better method to generalize the route?
-        col.link = item => `#/core${baseUrl.replace(':id?', item.id)}`;
+        // col.link = item => `#/core${baseUrl.replace(':id?', item.id)}`;
       }
 
       // if the field identify a relation, create a link
@@ -140,7 +146,8 @@
           this.populateRelated(item, item[f.name], f);
           return item[f.name];
         };
-        col.link = item => `#${this.urlFromCoreModel(f.relation.model)}/${item[f.name]}`;
+        col.link = item => this.stateWithParams(f.relation.model, item);
+        // col.link = item => `#${this.urlFromCoreModel(f.relation.model)}/${item[f.name]}`;
       }
 
       if (f.name === 'backend_status') {
@@ -166,9 +173,25 @@
   };
 
   public urlFromCoreModel(name: string): string {
+
     return `/core/${this.pluralize(name.toLowerCase())}`;
   }
 
+  public stateFromCoreModel(name: string): string {
+    const state: ng.ui.IState = _.find(this.$state.get(), (s: IXosState) => {
+      if (s.data) {
+        return s.data.model === name;
+      }
+      return false;
+    });
+    return state.name;
+  }
+
+  public stateWithParams(name: string, model: any): string {
+    const state = this.stateFromCoreModel(name);
+    return `${state}({id: ${model['id']}})`;
+  }
+
   public modelFieldToInputCfg(fields: IXosModelDefsField[]): IXosFormInput[] {
 
     return _.map(fields, (f: IXosModelDefsField) => {
