diff --git a/src/app/core/services/helpers/config.helpers.ts b/src/app/core/services/helpers/config.helpers.ts
new file mode 100644
index 0000000..44d3cdc
--- /dev/null
+++ b/src/app/core/services/helpers/config.helpers.ts
@@ -0,0 +1,107 @@
+import * as _ from 'lodash';
+import * as pluralize from 'pluralize';
+import {IXosTableColumn} from '../../table/table';
+
+export interface IXosModelDefsField {
+  name: string;
+  type: string;
+}
+
+export interface IXosConfigHelpersService {
+  modeldefToTableCfg(fields: IXosModelDefsField[]): any[]; // TODO use a proper interface
+  pluralize(string: string, quantity?: number, count?: boolean): string;
+  toLabel(string: string, pluralize?: boolean): string;
+}
+
+export class ConfigHelpers {
+
+  constructor() {
+    pluralize.addIrregularRule('xos', 'xosses');
+    pluralize.addPluralRule(/slice$/i, 'slices');
+  }
+
+  pluralize(string: string, quantity?: number, count?: boolean): string {
+    return pluralize(string, quantity, count);
+  }
+
+  toLabel(string: string, pluralize?: boolean): string {
+
+    if (angular.isArray(string)) {
+      return _.map(string, s => {
+        return this.toLabel(s, pluralize);
+      });
+    }
+
+    if (pluralize) {
+      string = this.pluralize(string);
+    }
+
+    string = this.fromCamelCase(string);
+    string = this.fromSnakeCase(string);
+    string = this.fromKebabCase(string);
+
+    return this.capitalizeFirst(string);
+  }
+
+  modeldefToTableCfg(fields: IXosModelDefsField[]): IXosTableColumn[] {
+    const excluded_fields = [
+      'created',
+      'updated',
+      'enacted',
+      'policed',
+      'backend_register',
+      'deleted',
+      'write_protect',
+      'lazy_blocked',
+      'no_sync',
+      'no_policy',
+      'omf_friendly',
+      'enabled'
+    ];
+    const cfg =  _.map(fields, (f) => {
+      if (excluded_fields.indexOf(f.name) > -1) {
+        return;
+      }
+      const col: IXosTableColumn =  {
+        label: this.toLabel(f.name),
+        prop: f.name
+      };
+
+      if (f.name === 'backend_status') {
+        col.type = 'icon';
+        col.formatter = (item) => {
+          if (item.backend_status.indexOf('1') > -1) {
+            return 'check';
+          }
+          if (item.backend_status.indexOf('2') > -1) {
+            return 'exclamation-circle';
+          }
+          if (item.backend_status.indexOf('0') > -1) {
+            return 'clock-o';
+          }
+        };
+      }
+      return col;
+    })
+      .filter(v => angular.isDefined(v));
+
+    return cfg;
+  };
+
+  private fromCamelCase(string: string): string {
+    return string.split(/(?=[A-Z])/).map(w => w.toLowerCase()).join(' ');
+  }
+
+  private fromSnakeCase(string: string): string {
+    return string.split('_').join(' ').trim();
+  }
+
+  private fromKebabCase(string: string): string {
+    return string.split('-').join(' ').trim();
+  }
+
+  private capitalizeFirst(string: string): string {
+    return string.slice(0, 1).toUpperCase() + string.slice(1);
+  }
+}
+
