diff --git a/dist/xosUiComponents.js b/dist/xosUiComponents.js
index 80de789..0384480 100644
--- a/dist/xosUiComponents.js
+++ b/dist/xosUiComponents.js
@@ -28,6 +28,8 @@
 
   angular.module('xos.uiComponents', ['chart.js', 'RecursionHelper', 'dndLists']);
 })();
+//# sourceMappingURL=../maps/ui_components/ui-components.module.js.map
+
 'use strict';
 
 /**
@@ -233,7 +235,7 @@
 
           // build form structure
           // TODO move in a pure function for testing purposes
-          props.forEach(function (p, i) {
+          props.forEach(function (p) {
             _this.formConfig.fields[p] = {
               label: LabelFormatter.format(p).replace(':', ''),
               type: XosFormHelpers._getFieldFormat(item[p])
@@ -247,6 +249,8 @@
     }]
   });
 })();
+//# sourceMappingURL=../../../maps/ui_components/smartComponents/smartTable/smartTable.component.js.map
+
 'use strict';
 
 /**
@@ -492,6 +496,8 @@
     }]
   });
 })();
+//# sourceMappingURL=../../../maps/ui_components/smartComponents/smartPie/smartPie.component.js.map
+
 'use strict';
 
 /**
@@ -586,6 +592,8 @@
     }
   });
 })();
+//# sourceMappingURL=../../../maps/ui_components/dumbComponents/validation/validation.component.js.map
+
 'use strict';
 
 /**
@@ -1016,106 +1024,8 @@
     };
   });
 })();
-'use strict';
+//# sourceMappingURL=../../../maps/ui_components/dumbComponents/table/table.component.js.map
 
-/**
- * © OpenCORD
- *
- * Visit http://guide.xosproject.org/devguide/addview/ for more information
- *
- * Created by teone on 4/15/16.
- */
-
-(function () {
-  'use strict';
-
-  angular.module('xos.uiComponents')
-
-  /**
-    * @ngdoc directive
-    * @name xos.uiComponents.directive:xosPagination
-    * @restrict E
-    * @description The xos-table directive
-    * @param {Number} pageSize Number of elements per page
-    * @param {Number} totalElements Number of total elements in the collection
-    * @param {Function} change The callback to be triggered on page change.
-    * * @element ANY
-    * @scope
-    * @example
-  <example module="samplePagination">
-    <file name="index.html">
-      <div ng-controller="SampleCtrl1 as vm">
-        <xos-pagination
-          page-size="vm.pageSize"
-          total-elements="vm.totalElements"
-          change="vm.change">
-        </xos-pagination>
-      </div>
-    </file>
-    <file name="script.js">
-      angular.module('samplePagination', ['xos.uiComponents'])
-      .controller('SampleCtrl1', function(){
-        this.pageSize = 10;
-        this.totalElements = 35;
-        this.change = (pageNumber) => {
-          console.log(pageNumber);
-        }
-      });
-    </file>
-  </example>
-  **/
-
-  .component('xosPagination', {
-    restrict: 'E',
-    bindings: {
-      pageSize: '=',
-      totalElements: '=',
-      change: '='
-    },
-    template: '\n      <div class="row" ng-if="vm.pageList.length > 1">\n        <div class="col-xs-12 text-center">\n          <ul class="pagination">\n            <li\n              ng-click="vm.goToPage(vm.currentPage - 1)"\n              ng-class="{disabled: vm.currentPage == 0}">\n              <a href="" aria-label="Previous">\n                  <span aria-hidden="true">&laquo;</span>\n              </a>\n            </li>\n            <li ng-repeat="i in vm.pageList" ng-class="{active: i === vm.currentPage}">\n              <a href="" ng-click="vm.goToPage(i)">{{i + 1}}</a>\n            </li>\n            <li\n              ng-click="vm.goToPage(vm.currentPage + 1)"\n              ng-class="{disabled: vm.currentPage == vm.pages - 1}">\n              <a href="" aria-label="Next">\n                  <span aria-hidden="true">&raquo;</span>\n              </a>\n            </li>\n          </ul>\n        </div>\n      </div>\n    ',
-    bindToController: true,
-    controllerAs: 'vm',
-    controller: ["$scope", function controller($scope) {
-      var _this = this;
-
-      this.currentPage = 0;
-
-      this.goToPage = function (n) {
-        if (n < 0 || n === _this.pages) {
-          return;
-        }
-        _this.currentPage = n;
-        _this.change(n);
-      };
-
-      this.createPages = function (pages) {
-        var arr = [];
-        for (var i = 0; i < pages; i++) {
-          arr.push(i);
-        }
-        return arr;
-      };
-
-      // watch for data changes
-      $scope.$watch(function () {
-        return _this.totalElements;
-      }, function () {
-        if (_this.totalElements) {
-          _this.pages = Math.ceil(_this.totalElements / _this.pageSize);
-          _this.pageList = _this.createPages(_this.pages);
-        }
-      });
-    }]
-  }).filter('pagination', function () {
-    return function (input, start) {
-      if (!input || !angular.isArray(input)) {
-        return input;
-      }
-      start = parseInt(start, 10);
-      return input.slice(start);
-    };
-  });
-})();
 'use strict';
 
 /**
@@ -1181,8 +1091,7 @@
     * @requires xos.uiComponents.XosFormHelpers
     * @requires xos.helpers._
     * @example
-    
-    Autogenerated form
+     Autogenerated form
    <example module="sampleForm">
     <file name="script.js">
       angular.module('sampleForm', ['xos.uiComponents'])
@@ -1368,11 +1277,115 @@
         }
         var diff = _.difference(Object.keys(model), _this.excludedField);
         var modelField = XosFormHelpers.parseModelField(diff);
-        _this.formField = XosFormHelpers.buildFormStructure(modelField, _this.config.fields, model);
+        _this.formField = XosFormHelpers.buildFormStructure(modelField, _this.config.fields, model, _this.config.order);
       });
     }]
   });
 })();
+//# sourceMappingURL=../../../maps/ui_components/dumbComponents/form/form.component.js.map
+
+'use strict';
+
+/**
+ * © OpenCORD
+ *
+ * Visit http://guide.xosproject.org/devguide/addview/ for more information
+ *
+ * Created by teone on 4/15/16.
+ */
+
+(function () {
+  'use strict';
+
+  angular.module('xos.uiComponents')
+
+  /**
+    * @ngdoc directive
+    * @name xos.uiComponents.directive:xosPagination
+    * @restrict E
+    * @description The xos-table directive
+    * @param {Number} pageSize Number of elements per page
+    * @param {Number} totalElements Number of total elements in the collection
+    * @param {Function} change The callback to be triggered on page change.
+    * * @element ANY
+    * @scope
+    * @example
+  <example module="samplePagination">
+    <file name="index.html">
+      <div ng-controller="SampleCtrl1 as vm">
+        <xos-pagination
+          page-size="vm.pageSize"
+          total-elements="vm.totalElements"
+          change="vm.change">
+        </xos-pagination>
+      </div>
+    </file>
+    <file name="script.js">
+      angular.module('samplePagination', ['xos.uiComponents'])
+      .controller('SampleCtrl1', function(){
+        this.pageSize = 10;
+        this.totalElements = 35;
+        this.change = (pageNumber) => {
+          console.log(pageNumber);
+        }
+      });
+    </file>
+  </example>
+  **/
+
+  .component('xosPagination', {
+    restrict: 'E',
+    bindings: {
+      pageSize: '=',
+      totalElements: '=',
+      change: '='
+    },
+    template: '\n      <div class="row" ng-if="vm.pageList.length > 1">\n        <div class="col-xs-12 text-center">\n          <ul class="pagination">\n            <li\n              ng-click="vm.goToPage(vm.currentPage - 1)"\n              ng-class="{disabled: vm.currentPage == 0}">\n              <a href="" aria-label="Previous">\n                  <span aria-hidden="true">&laquo;</span>\n              </a>\n            </li>\n            <li ng-repeat="i in vm.pageList" ng-class="{active: i === vm.currentPage}">\n              <a href="" ng-click="vm.goToPage(i)">{{i + 1}}</a>\n            </li>\n            <li\n              ng-click="vm.goToPage(vm.currentPage + 1)"\n              ng-class="{disabled: vm.currentPage == vm.pages - 1}">\n              <a href="" aria-label="Next">\n                  <span aria-hidden="true">&raquo;</span>\n              </a>\n            </li>\n          </ul>\n        </div>\n      </div>\n    ',
+    bindToController: true,
+    controllerAs: 'vm',
+    controller: ["$scope", function controller($scope) {
+      var _this = this;
+
+      this.currentPage = 0;
+
+      this.goToPage = function (n) {
+        if (n < 0 || n === _this.pages) {
+          return;
+        }
+        _this.currentPage = n;
+        _this.change(n);
+      };
+
+      this.createPages = function (pages) {
+        var arr = [];
+        for (var i = 0; i < pages; i++) {
+          arr.push(i);
+        }
+        return arr;
+      };
+
+      // watch for data changes
+      $scope.$watch(function () {
+        return _this.totalElements;
+      }, function () {
+        if (_this.totalElements) {
+          _this.pages = Math.ceil(_this.totalElements / _this.pageSize);
+          _this.pageList = _this.createPages(_this.pages);
+        }
+      });
+    }]
+  }).filter('pagination', function () {
+    return function (input, start) {
+      if (!input || !angular.isArray(input)) {
+        return input;
+      }
+      start = parseInt(start, 10);
+      return input.slice(start);
+    };
+  });
+})();
+//# sourceMappingURL=../../../maps/ui_components/dumbComponents/pagination/pagination.component.js.map
+
 'use strict';
 
 function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
@@ -1606,6 +1619,8 @@
     };
   });
 })();
+//# sourceMappingURL=../../../maps/ui_components/dumbComponents/field/field.component.js.map
+
 'use strict';
 
 /**
@@ -1741,6 +1756,8 @@
     }]
   });
 })();
+//# sourceMappingURL=../../../maps/ui_components/dumbComponents/alert/alert.component.js.map
+
 'use strict';
 
 (function () {
@@ -1813,7 +1830,7 @@
     * - _formatByUppercase
     * - _capitalize
     * - replace multiple space with a single one
-    * - append `:` at the end 
+    * - append `:` at the end
     * <br/>
     * Eg: `this_string` will became `This string:`<br/>
     * Eg: `thisString` will became `This string:`
@@ -1839,6 +1856,8 @@
     };
   }
 })();
+//# sourceMappingURL=../../../maps/services/helpers/ui/label_formatter.service.js.map
+
 'use strict';
 
 var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
@@ -1936,14 +1955,22 @@
     * ```
     **/
 
-    this.buildFormStructure = function (modelField, customField, model) {
+    this.buildFormStructure = function (modelField, customField, model, order) {
+
+      var orderedForm = {};
 
       modelField = angular.extend(modelField, customField);
       customField = customField || {};
 
-      return _.reduce(Object.keys(modelField), function (form, f) {
+      if (order) {
+        _.each(order, function (key) {
+          orderedForm[key] = {};
+        });
+      }
 
-        form[f] = {
+      _.each(Object.keys(modelField), function (f) {
+
+        orderedForm[f] = {
           label: customField[f] && customField[f].label ? customField[f].label + ':' : LabelFormatter.format(f),
           type: customField[f] && customField[f].type ? customField[f].type : _this._getFieldFormat(model[f]),
           validators: customField[f] && customField[f].validators ? customField[f].validators : {},
@@ -1951,21 +1978,21 @@
         };
 
         if (customField[f] && customField[f].options) {
-          form[f].options = customField[f].options;
+          orderedForm[f].options = customField[f].options;
         }
         if (customField[f] && customField[f].properties) {
-          form[f].properties = customField[f].properties;
+          orderedForm[f].properties = customField[f].properties;
         }
-        if (form[f].type === 'date') {
+        if (orderedForm[f].type === 'date') {
           model[f] = new Date(model[f]);
         }
 
-        if (form[f].type === 'number') {
+        if (orderedForm[f].type === 'number') {
           model[f] = parseInt(model[f], 10);
         }
+      });
 
-        return form;
-      }, {});
+      return orderedForm;
     };
 
     /**
@@ -1997,6 +2024,8 @@
     };
   }]);
 })();
+//# sourceMappingURL=../../../maps/services/helpers/ui/form.helpers.js.map
+
 'use strict';
 
 (function () {
@@ -2093,6 +2122,8 @@
     };
   }
 })();
+//# sourceMappingURL=../../../maps/services/helpers/ui/comparator.service.js.map
+
 'use strict';
 
 (function () {
@@ -2134,6 +2165,8 @@
     $resourceProvider.defaults.stripTrailingSlashes = false;
   }
 })();
+//# sourceMappingURL=maps/xosHelpers.module.js.map
+
 'use strict';
 
 (function () {
@@ -2149,6 +2182,8 @@
     return $resource('/api/service/vsg/');
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/vSG.js.map
+
 'use strict';
 
 (function () {
@@ -2166,6 +2201,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/vOLT.js.map
+
 'use strict';
 
 (function () {
@@ -2189,6 +2226,8 @@
     return $resource('/api/utility/logout/');
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Utility.js.map
+
 'use strict';
 
 (function () {
@@ -2206,6 +2245,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Users.js.map
+
 'use strict';
 
 (function () {
@@ -2223,6 +2264,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Truckroll.js.map
+
 'use strict';
 
 (function () {
@@ -2240,6 +2283,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Tenant.js.map
+
 'use strict';
 
 (function () {
@@ -2389,6 +2434,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Subscribers.js.map
+
 'use strict';
 
 (function () {
@@ -2426,6 +2473,8 @@
     };
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Slices_plus.js.map
+
 'use strict';
 
 (function () {
@@ -2443,6 +2492,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Slices.js.map
+
 'use strict';
 
 (function () {
@@ -2460,6 +2511,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Sites.js.map
+
 'use strict';
 
 (function () {
@@ -2477,6 +2530,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Services.js.map
+
 'use strict';
 
 (function () {
@@ -2492,6 +2547,8 @@
     return $resource('/api/service/onos/');
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/ONOS-Services.js.map
+
 'use strict';
 
 (function () {
@@ -2507,6 +2564,8 @@
     return $resource('/api/tenant/onos/app/');
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/ONOS-Apps.js.map
+
 'use strict';
 
 (function () {
@@ -2524,6 +2583,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Nodes.js.map
+
 'use strict';
 
 (function () {
@@ -2541,6 +2602,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Networkstemplates.js.map
+
 'use strict';
 
 (function () {
@@ -2558,6 +2621,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Networks.js.map
+
 'use strict';
 
 (function () {
@@ -2583,6 +2648,8 @@
     };
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Me.js.map
+
 'use strict';
 
 (function () {
@@ -2600,6 +2667,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Instances.js.map
+
 'use strict';
 
 (function () {
@@ -2617,6 +2686,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Images.js.map
+
 'use strict';
 
 (function () {
@@ -2634,6 +2705,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Flavors.js.map
+
 'use strict';
 
 (function () {
@@ -2649,6 +2722,8 @@
     return $resource('/api/service/exampleservice/');
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Example.js.map
+
 'use strict';
 
 (function () {
@@ -2666,6 +2741,8 @@
     });
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Deployments.js.map
+
 'use strict';
 
 (function () {
@@ -2697,6 +2774,8 @@
     return r;
   }]);
 })();
+//# sourceMappingURL=../../maps/services/rest/Dashboards.js.map
+
 'use strict';
 
 (function () {
@@ -2857,6 +2936,8 @@
     };
   }]);
 })();
+//# sourceMappingURL=../../maps/services/helpers/user-prefs.service.js.map
+
 'use strict';
 
 (function () {
@@ -2898,6 +2979,8 @@
     };
   }]);
 })();
+//# sourceMappingURL=../maps/services/service_graph.service.js.map
+
 'use strict';
 
 /* eslint-disable  angular/ng_window_service*/
@@ -2957,6 +3040,8 @@
     };
   }]);
 })();
+//# sourceMappingURL=../maps/services/notification.service.js.map
+
 'use strict';
 
 (function () {
@@ -2981,6 +3066,8 @@
     };
   }
 })();
+//# sourceMappingURL=../maps/services/noHyperlinks.interceptor.js.map
+
 'use strict';
 
 // TODO write tests for log
@@ -3040,6 +3127,8 @@
     return $delegate;
   }]);
 }]);
+//# sourceMappingURL=../maps/services/log.decorator.js.map
+
 'use strict';
 
 (function () {
@@ -3065,6 +3154,8 @@
     };
   }
 })();
+//# sourceMappingURL=../maps/services/csrfToken.interceptor.js.map
+
 /**
 * @ngdoc overview
 * @name ngXosLib
@@ -3078,4 +3169,5 @@
 * ## Issues
 * Please report issues at https://jira.opencord.org
 **/
-"use strict";
\ No newline at end of file
+"use strict";
+//# sourceMappingURL=maps/index.ngdoc.js.map
